|
LXXXI. Функции управления процессом
Поддержка функций управления процессом в РНР реализует создание процесса в
стиле Unix, выполнение программы, обработку сигналов и окончание процесса.
Управление процессом не должно включаться в окружении
web-сервера, и могут быть неожиданные результаты, если функции управления
процессом будут выполняться внутри среды web-сервера.
Эта документация призвана разъяснить общие принципы использования каждой из
функций управления процессом. Детальную информацию об управлении процессом в Unix
мы рекомендуем вам найти в вашей системной документации, включая fork(2), waitpid(2)
и signal(2), или в исчерпывающем справочнике, таком как Advanced Programming in the
UNIX Environment, автор W. Richard Stevens (Addison-Wesley).
Поддержка управления процессом в PHP по умолчанию не включена. Вам
необходимо использовать опцию конфигурации --enable-pcntl при компилировании PHP, чтобы включить эту поддержку.
Примечание: в настоящее время этот модуль не работает на не-Unix платформах (Windows).
Следующий список сигналов поддерживается функциями управления процессом.
См. man-страницу signal(7) вашей системной документации о поведении по
умолчанию этих сигналов. Таблица 1. Поддерживаемые сигналы
SIGFPE | SIGCONT |
SIGKILL | SIGSTOP | SIGUSR1 | SIGTSTP |
SIGHUP | SIGUSR2 | SIGTTIN | SIGINT |
SIGSEGV | SIGTTOU | SIGQUIT | SIGPIPE |
SIGURG | SIGILL | SIGALRM | SIGXCPU |
SIGTRAP | SIGTERM | SIGXFSZ | SIGABRT |
SIGSTKFLT | SIGVTALRM | SIGIOT | SIGCHLD |
SIGPROF | SIGBUS | SIGCLD | SIGWINCH |
SIGPOLL | SIGIO | SIGPWR | SIGSYS |
| |
Этот пример разветвляет процесс демона/daemon с обработчиком сигнала.
Пример 1. Управление процессом
<?php
$pid = pcntl_fork();
if ($pid == -1) {
die("could not fork");
} else if ($pid) {
exit(); // мы родитель
} else {
// мы потомок
}
// отсоединиться от терминала управления
if (!posix_setsid()) {
die("could not detach from terminal");
}
// настроить обработчики сигнала
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
// проходить по циклу, выполняя задачи
while(1) {
// здесь делать что-нибудь интересное
}
function sig_handler($signo) {
switch($signo) {
case SIGTERM:
// обработать задачи отключения
exit;
break;
case SIGHUP:
// обработать задачи рестарта
break;
default:
// обработать все другие сигналы
}
}
?> |
|
- Содержание
- pcntl_exec - выполняет специфицированную программу в пространстве текущего процесса
- pcntl_fork - разветвляет текущий процесс
- pcntl_signal - инсталирует обработчик сигнала
- pcntl_waitpid - ожидает или возвращает статус разветвлённого потомка
- pcntl_wexitstatus - возвращает return-код завершённого потомка
- pcntl_wifexited - возвращает TRUE, если статус-код представляет успешный выход
- pcntl_wifsignaled - возвращает TRUE, если статус-код представляет окончание по сигналу
- pcntl_wifstopped - возвращает TRUE, если дочерний процесс в данный момент остановлен
- pcntl_wstopsig - возвращает сигнал, который заставляет потомка остановиться
- pcntl_wtermsig - возвращает сигнал, который заставляет потомка закончить работу
| |