|
Posted by Jerry Stuckle on 11/23/06 22:32
Sandman wrote:
> In article <4565b82b$0$325$e4fe514c@news.xs4all.nl>,
> Erwin Moller
> <since_humans_read_this_I_am_spammed_too_much@spamyourself.com>
> wrote:
>
>
>>First: Prefetching all members into memory for each page where you need one
>>or two members is absolutely a no-go. You must change that of course.
>>Just fetch the information you need WHEN you need it.
>
>
> Yes, but if I need to fetch information for 100 members on one page
> making 100 individual SQL queries is also a no-go.
>
This is the part I don't understand. I don't make 100 individual SQL
queries.
>
>>If I understand correctly your main problem lies in the fact you must fetch
>>the online/offline information for each possible user.
>>Correct?
>
>
> No, there are lots of other information also being fetched. The
> online/offline status is kept in a seperate db and isn't a problem at
> all actually. Nicknames, labels, ages, full name and such things are
> what is needed. All of that is in the member DB
>
OK, that's the problem. They should be in the same DB, but perhaps in
different tables. Then a JOIN should get you everything you want in one
query.
>
>>This is how I solved this problem when I was in a similar situation:
>>(a rough quick overview to show the idea)
>>
>>1) Create a table like
>>CREATE TABLE tblOnlineUsers(
>> userid integer REFERENCES tbluser.userid,
>> lastActive timestamp
>>)
>>
>>2) Whenever a logged-in user does something, update the timestamp in this
>>table for that userid.
>
>
> That's exactly what I'm doing.
>
>
>>3) When you are on a page that needs to know the status of online users,
>>just load it into a array with a query like:
>>SELECT userid FROM tblOnlineUsers WHERE (
>> lastActive > XXX
>>)
>>
>>Where XXX is (now - your sessiontimeout).
>>
>>Now you need some logic to delete the userids for stale users.
>
>
> I do that in my five minute aggregation script (that aggregates lots
> of stuff for the site). There I delete from member.surfers where
> datetime < date_sub(now(), interval 10 minute)
>
>
>>(Users that didn't log out, but just closed their browser or walked away to
>>get a nice good lunch of three hours)
>>eg
>>When a random number between 0 and 1 is smaller than 0.1 you delete all
>>records older than the sessiontimeout.
>>
>>You also need to make sure the userid in that table is unique.
>>
>>But this solution has the advantage that:
>>- You don't load all users into memory for each scriptinvocation
>>- Your tblOnlineUsers can be searched very quickly.
>
>
> Yeah, I'm already doing that. I still need some way to get information
> about arbitrary user X whenever I need it. One way would be to just
> print "[[MEMBERINFO:123]]" and then save "123" in an array, fetch
> information about all id's in that array and then preg_replace() them
> all in the output buffer. But that's not very intelligent either,
> since a SQL query with "select x, x, x from member where id in(<list
> of 100's of ids>)" isn't very good.
>
> So, basically, I need a function to get information about user X from
> a member count of tens of thousands while not being time consuming if
> I do it one time on a page or if I do it 100 times on a page.
>
>
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================
Navigation:
[Reply to this message]
|