Inspirra
Новичок
Как правильно fork'нутся на php4?
Подсобите пожалуйста!
Задача на первый взгляд тривиальная:
1. Запускается скрипт
2. Форкается (pcntl_fork)
3. Родитель пишет в броузер нечто и завершается - разрывая соединение с броузером
4. А потомок продолжает работать до самостоятельного завершения, или же его убъет другой скрипт-слежения через posix_kill.
А проблемы следующие:
Если PHP как модуль:
1. если потомок завершился по "exit", то:
- если раньше чем родитель, то он закрывает соединение и от родителя в броузер уже ничего не попадает.
- а так же начинают плодится httpd-процессы в виде потомков
2. если потомка завершить через "posix_kill", или он сам завершится через "pcntl_exec", то от него остаются зомби (zombie).
Если PHP как CGI:
Переконфигурил apache/php так, что бы php работал как cgi. В результате зомби не порождаются и лишние процессы тоже, но возникли другие проблемы:
- родитель завершается, а соединение с браузером не закрывается пока на завершится потомок.
- и до кучи, по завершение потомка (если тот завершился по exit), он выкидывает в браузер свой заголовок который и отображается "X-Powered-By: PHP/4.4.2 Content-type: text/html"
Т.о. получается:
- В обоих случаях (модуль||CGI), и потомок, и родитель сбрасывают данные в браузер,
- но в первом случае (модуль), процесс закончившийся первым разрывает соединение с браузером,
- а во втором случае (cgi), соединение не закрывается пока оба не завершатся.
Как же все таки правильно fork'нутся?
Главное что бы завершение родителя, разрывало связь с браузером, а потомок продолжал работать до победного конца.
Всего наилучшего
Андрей М.
P.S.
PHP 4.4.2, FreeBSD-6.1
Подсобите пожалуйста!
Задача на первый взгляд тривиальная:
1. Запускается скрипт
2. Форкается (pcntl_fork)
3. Родитель пишет в броузер нечто и завершается - разрывая соединение с броузером
4. А потомок продолжает работать до самостоятельного завершения, или же его убъет другой скрипт-слежения через posix_kill.
А проблемы следующие:
Если PHP как модуль:
1. если потомок завершился по "exit", то:
- если раньше чем родитель, то он закрывает соединение и от родителя в броузер уже ничего не попадает.
- а так же начинают плодится httpd-процессы в виде потомков
2. если потомка завершить через "posix_kill", или он сам завершится через "pcntl_exec", то от него остаются зомби (zombie).
Если PHP как CGI:
Переконфигурил apache/php так, что бы php работал как cgi. В результате зомби не порождаются и лишние процессы тоже, но возникли другие проблемы:
- родитель завершается, а соединение с браузером не закрывается пока на завершится потомок.
- и до кучи, по завершение потомка (если тот завершился по exit), он выкидывает в браузер свой заголовок который и отображается "X-Powered-By: PHP/4.4.2 Content-type: text/html"
Т.о. получается:
- В обоих случаях (модуль||CGI), и потомок, и родитель сбрасывают данные в браузер,
- но в первом случае (модуль), процесс закончившийся первым разрывает соединение с браузером,
- а во втором случае (cgi), соединение не закрывается пока оба не завершатся.
Как же все таки правильно fork'нутся?
Главное что бы завершение родителя, разрывало связь с браузером, а потомок продолжал работать до победного конца.
Всего наилучшего
Андрей М.
P.S.
PHP 4.4.2, FreeBSD-6.1

