I faced this problem when I was developing a comet server but it can happen with any script that needs too many time. I have done a comet process. This process is very simple. Basically is a PHP script who looks the modification date of a file. When it changes, the script ends but if nothing happens the script ends after 30 seconds and start again (with a JavaScript loop). The script worked perfectly on sandbox. In production also worked (brilliant isn’t it?). But the problem appears when I open other tabs in the browser. The application became slow. Very slow. Every click, even really simple operations turned into unusable operations. I realized this behavior appear only when comet was enabled.
A small skeleton of comet server (the code ):
for ($i=0; $i<10; $i++) {
if (checkSomething()) {
echo getData();
flush();
}
sleep(1);
}
The problem was in the authentication. The comet server uses session for authentication. The session are stored as files. The system worked perfectly but I realized I didn’t use session_write_close. That’s means server open session file and frees it when the script ends. Normally script takes one second or less but the comet server may take 20-30 seconds.
auth();
for ($i=0; $i<10; $i++) {
if (checkSomething()) {
echo getData();
flush();
}
sleep(1);
}
In this case the solution was easy. The auth process was only in the beginning of the script so I only need to use session_write_close after authentication process. With this simple command the server doesn’t lock user sessions and I can ope as many tabs as I need.
auth();
session_write_close(); // this command is on auth function but I put it here for legibility purposes
for ($i=0; $i<10; $i++) {
if (checkSomething()) {
echo getData();
flush();
}
sleep(1);
}
There are other storage to session files instead of filesystem (it’s the default one). In relational database, non-relational database and even in memory with mm