Многопоточный сервер на основе сокетов - возможно в php? - PullRequest
1 голос
/ 07 октября 2011

Моя терминология здесь может быть далека, поэтому не обращайте на меня внимания:

У нас есть несколько сценариев в стиле клиента, которые закодированы в php.

Некоторые из этих служб используют ftpдля отправки данных в удаленные местоположения.

То, как все настроено, происходит довольно часто:

a) Script start
b) Connect to ftp @ remote location
c) Send data
d) Close ftp connection
e) Terminate script
f) Return to A, repeat, within a short amount of time and send to the same target, but different data.

Проблема заключается в том, что накладных расходов довольно много (читай: замедление) из-за шага b, где он сначала должен подключиться к серверу ftp, войти в систему, убедиться, что папка существует, если она не создана, и т. д. и т. д.эти переводы в одиночные толчки ... Но это гораздо сложнее, чем это.Отсюда я упростил примерно 30-40 шагов.

Итак, я надеялся создать такую ​​систему:

[ CRON CLI SCRIPT ] --->

[ LOCALLY HOSTED SOCKET BASED SERVER THAT KEEPS THE FTP CONNECTIONS OPEN ] --->

[ REMOTE FTP ]

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

При настройке системы «по одному» вPHP довольно тривиален, и раньше я никогда не делал его максимально приближенным к многопоточному.

Где, когда, сокет открывается (например, 127.0.0.1:10000), и несколько запросов могутЗаходите. При необходимости, «потомки» создаются, создаются новые ftp-соединения и т. д. и т. д.

Может кто-нибудь пролить свет на создание этого многопоточного кода в php, ИЛИ, если есть другое лучшее решение?Perl это вариант.Прошло много лет (ЛЕТ ...) с тех пор, как я прикоснулся к нему, но я уверен, что пара дней перед некоторыми хорошими документами приведут меня в достаточную скорость, чтобы это произошло.

Ответы [ 2 ]

3 голосов
/ 07 октября 2011

Мы создали систему, которая делает более или менее то, что вы хотите. Таким образом, определенно возможно создать многопроцессорное приложение на PHP.

Это, однако, не тривиально. Если вы fork отключили дочерний процесс, вам нужно очень тщательно управлять удаленными подключениями, чтобы избежать проблем. (используйте socket _ * семейство функций вместо fsockopen для лучшего контроля)

Кроме того, сигналы, как правило, прерывают ваш обычный программный поток. Это, конечно, нормально, но PHP не был создан с учетом этого -> будьте готовы к неожиданным результатам.

0 голосов
/ 14 июня 2013

попытайтесь использовать gearman, вы можете справиться с самым дорогим использованием процессора с помощью gearman, gearman создаст новую нить для каждого процесса.

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