Архив метки: форк

Многопоточность в PHP

Ну как известно штатно её нет (с). А иногда очень хочется. Предлагаемая пока альтернатива разработчками — функция Fork() которая по сути создает дочерний процесс, куда передает все открытые соединения, значения переменных и т.п. и продолжает в дочернем процессе с того момента с которого процесс в «родителе» начат.  Один нюанс — при завершении дочернего процесса — все соединения закрываются. Обходить этот нюанс можно посылая сигнал posix_kill(posix_getpid(), SIGHUP);  в дочернем процессе в случае нужды его завершить.

Таким образом «эталонная» реализация «многопоточности» в PHP будет выглядеть примерно так:

какойто код...
какойто код...
//предстоит длительная трудоемкая задача
$child_pid = pcntl_fork();
if ($child_pid==0){
	//длительная ресурсоемкая задача
	echo "--завершил дочерний процесс\n";
	posix_kill(posix_getpid(), SIGHUP);
} else {
	echo "--стартовал дочерний процесс\n";
};

 

Форк db2dhcp

Есть такой проект db2dhcp, автором к сожалению заброшенный, но выложенный с исходными кодами. Фактически это dhcp сервер, с возможностью выборки из БД MySQL или Postgree различных критериев для отдачи. Например: выдача определенному свичу, определенному порту определенного IP, В основном этот проект конечно интересен мелким провайдерам или крупным организациям.. Что не умеет делать этот проект? А не умеет писать в БД историю авторизации. Вот это я и поправил. Плюс добавил возможность сборки по FreeBSD 10. Скачать можно здесь: https://github.com/donpadlo/dhcp2db