2008-10-02 2 views
1

У меня есть PHP-скрипт, который использует вызов system() для выполнения других (потенциально длительных) программ (для интересов: NCBI BLAST, phrap, primer3 и другие программы для анализа и сборки последовательности ДНК).PHP 4 и 5, Ctrl-C, system() и дочерние процессы

Я бегу под Windows XP, используя версию CLI для PHP из командной строки или в качестве службы. (В любом случае я общаюсь с ним через очередь задач в таблице базы данных).

Под PHP4: когда я ударил Ctrl + C скрипт останавливается и любой дочерний процесс работает в то время также останавливается. В PHP5: когда я ударил Ctrl + C сценарий останавливается, но ребенок остается включенным.

Аналогично, при запуске скрипта в качестве службы остановка службы при запуске с PHP4 останавливает его, а с PHP5 ребенок продолжает работать.

Я попытался написать минимальное тестовое приложение и нашел то же поведение. Тестовый скрипт PHP просто использует system() для выполнения программы C (которая просто спит в течение 30 секунд), а затем ждет нажатия клавиши.

Я посмотрел источник для PHP 4.4.9 и 5.2.6, но не видел различий в коде system(), который выглядел так, как если бы это вызвало это. Я также быстро просмотрел код запуска для приложения CLI и не видел различий в обработке сигналов.

Любые намеки на то, что могло вызвать это, или обходной путь, будут оценены.

Спасибо.

+0

Какое требуемое поведение? – Glomek 2008-10-02 23:10:42

ответ

1

Эта проблема возникает, по крайней мере, в PHP 5.1.2.

Когда SIGINT отправляется через CTRL + C или CTRL + BREAK, вызывается обработчик. Если этот обработчик отправляет SIGTERM другим детям, сигналы не принимаются.

SIGINT может быть отправлен через posix_kill(), и он работает точно так, как ожидалось. Это применяется только при инициировании с помощью жесткого перерыва.

От: http://php.oregonstate.edu/manual/en/function.pcntl-signal.php

Документ имеет образец кода для захвата CTRL + C и отправка posix_kill детям. У этого есть много другого кода и информации о дочерних прецессиях и сигналах.

Смежные вопросы