PHP может асинхронно использовать сокеты?

Какая операционная система?

машины окон For, если Вы пишете сервер для масштабирования хорошо и поэтому используете Порты Завершения ввода-вывода и асинхронный ввод-вывод, тогда основное ограничение, являются количеством пула неподкачиваемой памяти, который Вы используете для каждого активного соединения. Это переводит непосредственно в предел на основе объема памяти, который Ваша машина установила (пул неподкачиваемой памяти является конечной суммой фиксированного размера, которая основана на установленной общей памяти).

Для соединений, которые не видят много трафика, который можно уменьшить, делают их более эффективными путем регистрации 'нулевых побайтовых чтений', которые не используют пул неподкачиваемой памяти и не влияют на заблокированный предел страниц (другой потенциально ограниченный ресурс, который может предотвратить Вас имеющий много открытых сокетных соединений).

Кроме того, ну, в общем, необходимо будет представить, но мне удалось надеть больше чем 70 000 параллельных соединений скромно указанный (память 760 МБ) сервер; посмотрите здесь http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html для получения дополнительной информации.

, Очевидно, если Вы используете менее эффективную архитектуру, такую как 'поток для каждого подключения' или 'выбираете' тогда, необходимо ожидать достигать менее впечатляющих чисел; но по моему скромному мнению, нет просто никакой причины выбрать такую архитектуру для серверов сокета окон.

Редактирование: посмотрите здесь http://blogs.technet.com/markrussinovich/archive/2009/03/26/3211216.aspx ; способ, которым вычисляется количество пула неподкачиваемой памяти, изменил в Vista и Сервере 2008, и там теперь намного более доступно.

20
задан Robinicks 16 September 2009 в 12:05
поделиться

3 ответа

Ага, вот для чего нужен socket_set_nonblock () . Ваш код взаимодействия с сокетом должен быть написан по-другому, принимая во внимание особые значения, которые предполагают коды ошибок 11, EWOULDBLOCK и 115, EINPROGRESS .

Вот несколько - вымышленный пример кода из цикла опроса синхронизирующего сокета PHP, в соответствии с запросом:

$buf = '';
$done = false;
do {
    $chunk = socket_read($sock, 4096);
    if($chunk === false) {
        $error = socket_last_error($sock);
        if($error != 11 && $error != 115) {
            my_error_handler(socket_strerror($error), $error);
            $done = true;
        }
        break;
    } elseif($chunk == '') {
        $done = true;
        break;
    } else { 
        $buf .= $chunk;
    }
} while(true);
18
ответ дан 30 November 2019 в 00:52
поделиться

Как мне сделать то же самое асинхронно? чтобы я мог отвечать на данные в данных полученное событие вместо опроса для данные и т. д.

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

4
ответ дан 30 November 2019 в 00:52
поделиться

AFAIK PHP строго однопоточный, что означает, что вы не можете делать это асинхронно, потому что выполнение скрипта всегда линейно.

Я давно не делал это, но, насколько я помню, вы можете только открыть сокет, и скрипт продолжит выполнение после получения данных.

0
ответ дан 30 November 2019 в 00:52
поделиться
Другие вопросы по тегам:

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