Простой PHP слишком длинный скрипт чата, слишком простой?

Я работаю над простым приложением чата, вероятно, от 10 до 20 пользователей на комнату.

Скрипт, который запрашивает в базе данных новые сообщения, выглядит слишком простым для всех запросов, которыми он будет получение.

Ниже приведен блок кода, который зацикливается на новые сообщения, остальная часть сценария просто получает переменные, конструкцию запроса и объект ответа json:

$sleepTime = 1; //Seconds
$data = "";
$timeout = 0;

//Query database for data
while(!$data and $timeout < 10){
    $data = getQuery($sql);
    if(!$data){
        //No new messages on the chat
        flush();
        //Wait for new Messages
        sleep($sleepTime);          
        $timeout += 1;
    }else{
        break;
    }
}

Приведенный выше блок будет запрашивать базу данных для новых сообщения каждую секунду в течение 10 секунд, если по истечении 10 секунд новые сообщения отсутствуют, он уведомляет об этом браузер. Браузер ждет 5 секунд, а затем отправляет другой запрос Скрипт, который запрашивает в базе данных новые сообщения, выглядит слишком простым для всех запросов, которые он получит. Ниже приведен блок ...

Я работаю над простым приложением чата, вероятно, от 10 до 20 пользователей на комнату.

Скрипт, который запрашивает в базе данных новые сообщения, выглядит слишком простым для всех запросов, которыми он будет получение.

Ниже приведен блок кода, который зацикливается на новые сообщения, остальная часть сценария просто получает переменные, конструкцию запроса и объект ответа json:

$sleepTime = 1; //Seconds
$data = "";
$timeout = 0;

//Query database for data
while(!$data and $timeout < 10){
    $data = getQuery($sql);
    if(!$data){
        //No new messages on the chat
        flush();
        //Wait for new Messages
        sleep($sleepTime);          
        $timeout += 1;
    }else{
        break;
    }
}

Приведенный выше блок будет запрашивать базу данных для новых сообщения каждую секунду в течение 10 секунд, если по истечении 10 секунд новые сообщения отсутствуют, он уведомляет об этом браузер. Браузер ждет 5 секунд, а затем отправляет другой запрос Скрипт, который запрашивает в базе данных новые сообщения, выглядит слишком простым для всех запросов, которые он получит. Ниже приведен блок ...

Я работаю над простым приложением чата, вероятно, от 10 до 20 пользователей на комнату.

Скрипт, который запрашивает в базе данных новые сообщения, выглядит слишком простым для всех запросов, которыми он будет получение.

Ниже приведен блок кода, который зацикливается на новые сообщения, остальная часть сценария просто получает переменные, конструкцию запроса и объект ответа json:

$sleepTime = 1; //Seconds
$data = "";
$timeout = 0;

//Query database for data
while(!$data and $timeout < 10){
    $data = getQuery($sql);
    if(!$data){
        //No new messages on the chat
        flush();
        //Wait for new Messages
        sleep($sleepTime);          
        $timeout += 1;
    }else{
        break;
    }
}

Приведенный выше блок будет запрашивать базу данных для новых сообщения каждую секунду в течение 10 секунд, если по истечении 10 секунд новые сообщения отсутствуют, он уведомляет об этом браузер. Браузер ждет 5 секунд, а затем отправляет другой запрос вероятно, от 10 до 20 пользователей на комнату.

Скрипт, который запрашивает базу данных для новых сообщений, выглядит слишком простым для всех запросов, которые он будет получать.

Ниже приведен блок кода, который зацикливается на новые сообщения, остальные сценария просто получает переменные, конструкцию запроса и объект ответа json:

$sleepTime = 1; //Seconds
$data = "";
$timeout = 0;

//Query database for data
while(!$data and $timeout < 10){
    $data = getQuery($sql);
    if(!$data){
        //No new messages on the chat
        flush();
        //Wait for new Messages
        sleep($sleepTime);          
        $timeout += 1;
    }else{
        break;
    }
}

Приведенный выше блок будет запрашивать в базе данных новые сообщения каждую секунду в течение 10 секунд, если по истечении 10 секунд новых сообщений не будет, уведомить браузер. Браузер ждет 5 секунд, а затем отправляет другой запрос вероятно, от 10 до 20 пользователей на комнату.

Скрипт, который запрашивает базу данных для новых сообщений, выглядит слишком простым для всех запросов, которые он будет получать.

Ниже приведен блок кода, который зацикливается на новые сообщения, остальные сценария просто получает переменные, конструкцию запроса и объект ответа json:

$sleepTime = 1; //Seconds
$data = "";
$timeout = 0;

//Query database for data
while(!$data and $timeout < 10){
    $data = getQuery($sql);
    if(!$data){
        //No new messages on the chat
        flush();
        //Wait for new Messages
        sleep($sleepTime);          
        $timeout += 1;
    }else{
        break;
    }
}

Приведенный выше блок будет запрашивать в базе данных новые сообщения каждую секунду в течение 10 секунд, если по истечении 10 секунд новых сообщений не будет, уведомить браузер. Браузер ждет 5 секунд, а затем отправляет другой запрос

$sleepTime = 1; //Seconds
$data = "";
$timeout = 0;

//Query database for data
while(!$data and $timeout < 10){
    $data = getQuery($sql);
    if(!$data){
        //No new messages on the chat
        flush();
        //Wait for new Messages
        sleep($sleepTime);          
        $timeout += 1;
    }else{
        break;
    }
}

Приведенный выше блок будет запрашивать в базе данных новые сообщения каждую секунду в течение 10 секунд, если по истечении 10 секунд новые сообщения не поступают, он уведомляет об этом браузер. Браузер ждет 5 секунд, а затем отправляет другой запрос

$sleepTime = 1; //Seconds
$data = "";
$timeout = 0;

//Query database for data
while(!$data and $timeout < 10){
    $data = getQuery($sql);
    if(!$data){
        //No new messages on the chat
        flush();
        //Wait for new Messages
        sleep($sleepTime);          
        $timeout += 1;
    }else{
        break;
    }
}

Приведенный выше блок будет запрашивать в базе данных новые сообщения каждую секунду в течение 10 секунд, если по истечении 10 секунд новые сообщения не поступают, он уведомляет об этом браузер. Браузер ждет 5 секунд, а затем отправляет другой запрос чтобы получать новые сообщения.

Однако, если скрипт находит новые сообщения, браузер немедленно запросит больше новых сообщений, как только он получит ответ с новыми сообщениями от сервера.

Этот процесс продолжается и продолжается ..

Так, как я могу оптимизировать этот процесс дальше? Это так хорошо, как это получается? Is working fine on my local server, but im afraid that just a few users could overload a live server(shared host) with all the requests and the loopings.

Here is live DEMO you can check with firebug http://pixbush.com/chat/chat.php

8
задан Pablo 2 September 2010 в 01:45
поделиться

1 ответ

Вы можете попробовать использовать файлы, помеченные в соответствии с идентификатором разговора, вместо базы данных и просто проверить, не был ли файл «тронут». Кроме того, используйте usleep и set_time_limit (для сервера Windows), чтобы установить интервал в миллисекундах и увеличить время сна. На самом деле Usleep задерживает использование ЦП, но все равно срабатывает мгновенно, если файл был изменен.

Вот фрагмент моего скрипта чата. =)

define('SUCCESS', '__SUCCESS__');
define('FAILED', '__FAILED__');

$tmpLib = $TMPFOLDER;
$msgPath = $MSGFILE;

$timeout = $POLLSPEEDSEC;

$acct = new Account($tmpLib, $_GET['key']);

if (false === $acct) {
    return false;
}

$msg = new Message($msgPath, $acct);

$lastMod = !empty($_GET['ts']) ? $_GET['ts']: 0;
$lastMod = substr($lastMod, 0, 10);
$lastMod = (int)$lastMod;

$result = array();

$start = gettimeofday();
$prevMsg = $acct->getTemp('cache');

do{
    usleep(10000);

    if ($acct->getFileTime() >= $lastMod) {
        $result['account'] = $acct->getAllOnline();
    }

    if($msg->getFileTime() >= $lastMod) {
        $result['message'] = $msg->fetch();
    }

    if (!empty($result)) {
        $theMsg = json_encode($result);
        if ($theMsg != $prevMsg) {
            $acct->setTemp('cache', $theMsg);
            echo $theMsg;
            flush();
            exit;
        }
        $result = array();
        $lastMod = time();
    }

    $end = gettimeofday();
} while($timeout > ($end['sec'] - $start['sec']));

echo FAILED;
0
ответ дан 5 December 2019 в 22:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: