Vict0r
Новичок
PHP-демон с дочерними процессами
Здравствуйте. Обращаюсь к вам, PHP-гуру, т.к. сам зашел в тупик. Стоит задача написать демона на PHP, который бы принимал входящие соединения, некоторые из которых оставлял бы активными и периодически отсылал в них какие-то данные, а в некоторые отправлял бы данные и сразу же их закрывал. Сама по себе задача очень простая, но есть одна загвоздка. Клиенты, при подключении, передают демону кодовое слово (например, «big» или «small»). В зависимости от этого слова демон должен послать клиенту маленький объем данных (порядка сотен байт), либо большой объем данных (порядка десятков килобайт). Запросы со словом «small» идут очень часто, в то время как запросы на вывод большого объема данных приходят намного реже. Эффективно обрабатывать такие запросы одним процессом невозможно, возникает необходимость переложить вывод больших объемов данных на дочерние процессы, в то время как процесс-родитель будет обрабатывать «быстрые» запросы. Т.е…
1. На процесс-родитель приходит запрос со словом «small».
2. Процесс-родитель обрабатывает его, а дальше либо оставляет соединение открытым для дальнейшего взаимодействия, либо закрывает его.
1. На процесс-родитель приходит запрос со словом «big».
2. Процесс-родитель создает дочерний процесс, а сам продолжает принимать входящие соединения и обрабатывать запросы на вывод малых объемов данных.
3. Дочерний процесс выводит клиенту большой объем данных, закрывает соединение с клиентом и умирает.
Упрощенно, алгоритм такой:
Все, о чем я прошу – это подсказать, как правильно составить алгоритм взаимодействия процесса-родителя и дочернего процесса с клиентом. Т.е. в какой момент родителю надо сделать pcntl_fork(), что родителю делать потом с текущим соединением и как корректно дочернему процессу обработать запрос и умереть. Уже долгое время изучаю материалы на данную тему, но никак не пойму, как это все сделать. Нужны идеи. Заранее благодарен за любую полезную информацию.
Здравствуйте. Обращаюсь к вам, PHP-гуру, т.к. сам зашел в тупик. Стоит задача написать демона на PHP, который бы принимал входящие соединения, некоторые из которых оставлял бы активными и периодически отсылал в них какие-то данные, а в некоторые отправлял бы данные и сразу же их закрывал. Сама по себе задача очень простая, но есть одна загвоздка. Клиенты, при подключении, передают демону кодовое слово (например, «big» или «small»). В зависимости от этого слова демон должен послать клиенту маленький объем данных (порядка сотен байт), либо большой объем данных (порядка десятков килобайт). Запросы со словом «small» идут очень часто, в то время как запросы на вывод большого объема данных приходят намного реже. Эффективно обрабатывать такие запросы одним процессом невозможно, возникает необходимость переложить вывод больших объемов данных на дочерние процессы, в то время как процесс-родитель будет обрабатывать «быстрые» запросы. Т.е…
1. На процесс-родитель приходит запрос со словом «small».
2. Процесс-родитель обрабатывает его, а дальше либо оставляет соединение открытым для дальнейшего взаимодействия, либо закрывает его.
1. На процесс-родитель приходит запрос со словом «big».
2. Процесс-родитель создает дочерний процесс, а сам продолжает принимать входящие соединения и обрабатывать запросы на вывод малых объемов данных.
3. Дочерний процесс выводит клиенту большой объем данных, закрывает соединение с клиентом и умирает.
Упрощенно, алгоритм такой:
PHP:
socket_create();
socket_bind();
socket_listen();
while( true )
{
socket_select();
socket_accept();
socket_read();
if( “small” )
{
/* обработка и отправка данных */
socket_close();
}
elseif( “big” )
{
pcntl_fork();
/* на этом месте тупик */
}
}