2015-06-25 7 views
2

У меня есть родительский PHP-скрипт, который может быть выполнен из браузера. Это порождает дочерний процесс через exec('/full/path/to/php -f /full/path/to/child_script.php args &> debug.log &'), а затем возвращает ответ браузеру. В дочернем процессе создается куча файлов PDF с использованием Plates и mPDF. Когда вы вызываете через браузер exec, дочерний скрипт получает около 10% -20% от способа создания PDF-файлов, а затем загадочно останавливается без каких-либо выходных данных, за исключением любых операторов echo, которые я, возможно, использовал для отладки.PHP-скрипт выходит из строя при вызове из exec()

  • ребенок скрипт работает при вызове из командной строки, используя точную ту же команду , используемый браузером
  • exec() вызов работает на моей локальной машине и наш QA-сервер, но только не в производстве
  • безопасный режим выключен
  • у меня есть chmod 0777 «эд ребенка сценарий и все файлы/каталоги, она работает на
  • display_errors, log_errors, track_errors являются Л.Л. на
  • error_reporting = E_ALL | E_STRICT
  • max_execution_time = 600
  • exec не disable_functions
  • называется set_time_limit(0) в детском сценарии

Я действительно тупик. Что может быть причиной этого? Или какие дальнейшие шаги следует предпринять для отладки?

UPDATE

Проблема не с вызовом exec (или shell_exec) сама по себе, так как я могу вызвать родительский сценарий, который затем вызывает главный сценарий через exec из командной строки. Проблема возникает только при попытке выполнить через Интернет.

+0

Если его печатные эхо-сообщения, как вы знаете, что он остановился? – cjds

+0

Он прекращает генерировать PDF-файлы. В принципе, это цикл, который выполняется 250 раз, генерируя один PDF за итерацию. Я получаю инструкции эха для первых 30-70 итераций через равные промежутки времени, затем ничего. – blcook223

+0

Лично, если бы мне пришлось использовать 'exec()' в сценарии, я бы удостоверился, что он не был доступен через окно браузера и сделать его заданием cron, если это применимо. –

ответ

0

Некоторые из комментариев были на правильном пути. Обсудив это с моей хостинговой компанией, похоже, что они убивают скрипт после 120-секундного времени процессора. Вот почему я не получал сообщений об ошибках по времени от PHP, и реальное время выполнения не было согласованным.

Моим решением будет реорганизовать это как задание cron, где сервер допускает более длительные лимиты. Спасибо всем за предложения.

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