Сокеты так медленны в PHP? - PullRequest
2 голосов
/ 03 декабря 2009

Я использую этот код для сокетов. Консоль говорит, что страница обрабатывается в течение очень небольшого промежутка времени, но Chrome говорит, что страница загружается в течение ~ 1 секунды!

    $this->serv_sock = socket_create(AF_INET, SOCK_STREAM, 0); 

    socket_bind($this->serv_sock, $this->serv, $this->port) or die("Could not bind to address\n");

    socket_listen($this->serv_sock);

    while (1) {
        echo "Waiting...\n";        
        $client = socket_accept($this->serv_sock); 

        $start_mtime = microtime(true);

        echo "Accepted at ".$start_mtime.".\n";

        $input = '';

        $len = 0;

        do {
            //echo "Reading.\n";
            $inp = socket_read($client, 1024);
            $input .= $inp;

            if (strpos($input, "\n\n") === false && strpos($input, "\r\n\r\n") === false)
                continue;

            if (!$len) {
                if (!preg_match("/Content-Length: (\d+)/", $input, $matches)) {
                    break;
                }
                $len = $matches[1];
                if (!$len)
                    break;
                echo "We want $len bytes.\n";
            }

            if (strpos($input, "\n\n") !== false)
                list($headers, $content) = explode("\n\n", $input);
            else 
                list($headers, $content) = explode("\r\n\r\n", $input);

            if (strlen($content) >= $len)
                break;
        } while ($inp);

        echo "Calling callback as ".microtime(true).".\n";

        if (strpos($input, "\n\n") !== false)
            list($headers, $content) = explode("\n\n", $input);
        else 
            list($headers, $content) = explode("\r\n\r\n", $input);

        $output = $this->translate($callback, $headers, $content); // nothing slow here

        $time_end = microtime(true);
        echo "Sending output at ".$time_end." (total ".($time_end - $start_mtime).")\n\n";

        $output = "HTTP/1.0 Ok\n".
        "Content-Type: text/html; charset=utf-8\n".
        "Content-Length: ".strlen($output)."\n".
        "Connection: close\n\n".
        $output;

        socket_write($client, $output);

        socket_close($client);
    }

1 Ответ

0 голосов
/ 27 ноября 2010

Если я понимаю, что вы говорите. Насколько я знаю, есть разница между временем обработки сервера и временем обработки клиента.

Время, которое фактически требуется для обработки информации на сервере, всегда будет меньше. Как только сервер заканчивает обработку информации, данные все еще должны быть отправлены в браузер и должны быть отображены. Я подозреваю, что время получения данных и отображения в браузере объясняется тем, что Chrome сообщает, что это занимает ~ 1 секунду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...