#php #sockets
#php #сокеты
Вопрос:
Из PHP.net:
http://www.php.net/manual/en/function.pfsockopen.php
Я понимаю суть того, что выполняет эта функция, но мне все еще неясно, выполнит ли это то, чего я бы хотел. Вот мой сценарий:
У меня есть большое PHP-приложение, которое используется многими пользователями одновременно. В приложении я открываю сокет TCP для удаленного сервера для регистрации сообщений и т.д… Я надеялся, что смогу использовать pfsockopen для того, чтобы нужно было открывать гораздо меньше соединений. Например, пользователь1 входит в систему — открывается сокет. Пользователь2 входит в систему, сокет не открывается, потому что он может «выполнить контурную привязку» к сокету, открытому пользователем 1.
Возможно ли это?
Ответ №1:
pfsockopen
действительно, сокет будет оставаться открытым, когда скрипт завершится, позволяя повторно использовать его от запроса к другому, эффективно открывая меньше соединений, как вы ожидаете. Однако это совместимо не со всеми SAPI.
Сохранение происходит для каждого процесса. Таким образом, pfsockopen
запущенный в CLI SAPI будет закрывать и повторно открывать сокет при каждом выполнении, потому что сценарий CLI выполняется в одном процессе, который запускается, открывает сокет и завершается (закрывая сокет вместе с процессом).
В режиме CGI с одним процессом на скрипт это тоже верно.
В Apache SAPI это зависит от того, какой тип многопроцессорного модуля (MPM) используется. mpm-prefork
при каждом запросе запускается новый процесс, поэтому он, скорее всего, его не поддерживает. mpm-worker
однако, порождает потоки, так что, вероятно, там это сработает. mpm-winnt
это вариант многопоточного MPM для Windows, поэтому он тоже должен работать.
Худшее, что может случиться, это то, что вызов будет выполнен как обычный fsockopen
вызов.
Комментарии:
1. pfsockopen работает с Prefork MPM, однако у каждого дочернего процесса будет свой собственный постоянный сокет.