PHP — Может ли кто-нибудь объяснить мне функцию pfsockopen? (постоянный сокет)

#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, однако у каждого дочернего процесса будет свой собственный постоянный сокет.