PHP exec () не работает - выход рано?Нет ошибок? - PullRequest
3 голосов
/ 18 сентября 2010

Я использую PHP для запуска exec () над сценарием, который выглядит следующим образом:

exec("pdftk xx.pdf fill_form xx.fdf output xx.pdf flatten");

Самое странное, что когда я захожу в ssh и ввожу команду вручную - все работает нормально!это выводит 224 КБ PDF.но когда я использую команду exec (), получаются только первые 36k скрипта.(я проверил - первые 36k хорошего файла идентичны плохому файлу)

нет, вот странная вещь - это работало нормально с exec (), пока я не добавил еще несколько переменных в файл fdf, делаяэто дольше.я думал, что это проблема с fdf из-за новых данных - но почему этот процесс работает нормально из ssh?

update: также я попытался запустить php -f test.php (который только что имел один execлиния в нем).что выводит весь файл правильно.но даже если я перейду к http://mydomain.com/test.php, я получу только часть файла.

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

это не может быть проблема с разрешениями (ssh входит в систему как root), потому что он все еще может записать файл

также - когда я пытаюсь получить значение возврата или выхода из execили passthru, я ничего не получаю.возвращаемое значение всегда равно 0.

обновление: в журналах ошибок apache я получаю

[Пт 17 сентября, 20:00:57 2010] [ошибка] Необработанное исключение Java: [Пт17 сентября 20:00:57 2010] [ошибка] java.lang.OutOfMemoryError [Пт 17 сентября 20:00:57 2010] [ошибка] <>

я изменил php_ini с 32M до 64M - все еще получаюЭто.учитывая, что это все крошечные файлы, я не думаю, что это все.но сможет ли PHP ограничить память дочернего процесса таким образом?где-то еще есть настройки?

help!

Ответы [ 3 ]

1 голос
/ 18 сентября 2010

Оказывается, это проблема с памятью. В Apache RLimitMEM был установлен в основном файле конфигурации, который я сейчас отключил. Теперь это работает как шарм. Хотя было установлено около 89 МБ, и, поскольку эти файлы меньше мегабайта, я не вижу, как это приложение будет использовать столько памяти.

0 голосов
/ 18 сентября 2010

обновление: в журналах ошибок apache я получаю

[пт 17 сен 20:00:57 2010] [ошибка] Необработанное исключение Java: [пт 17 сен 20:00:572010] [ошибка] java.lang.OutOfMemoryError [Пт. 17 сентября 20:00:57 2010] [ошибка] <>

Я не понимаю, почему apache выдает ошибки java?Не могли бы вы уточнить это с нами?Я нахожу это очень странным.

Я изменил php_ini с 32M до 64M - все еще получаю.учитывая, что это все крошечные файлы, я не думаю, что это все.но сможет ли PHP ограничить память дочернего процесса таким образом?где-то есть другие настройки для этого?

У меня также есть ощущение, что это может быть связано с памятью, которую использует ваше приложение, потому что она вызывает pdftk, что может привести к превышению лимита памяти?Сколько памяти использует pdftk на пике?Может быть, вам стоит поднять память еще больше?

Вы делали что-то подобное?http://www.wallpaperama.com/forums/how-to-change-memory-limit-php-apache-server-t53.html

update: также я попытался запустить php -f test.php (в котором была только одна строка exec).что выводит весь файл правильно.но даже если я зайду на http://mydomain.com/test.php, я получу только часть файла.

У меня есть для вас решение, которое также не убьет ваш веб-сервер (VPS) при высокой нагрузке,Со страницы (со стороны веб-сервера) вы должны поместить его в список блокировки ( redis ), используя predis php клиентскую библиотеку, поскольку она поддерживает все необходимые команды redis ( BLPOP / LPUSH).Из PHP-демона (php -f), который всегда работает, вы должны выскочить из списка блокировки и выполнить команды (pdftk).

0 голосов
/ 18 сентября 2010

Я предполагаю, что вы работаете с общего веб-хоста, и в этом случае вам следует остерегаться: многие хосты используют собственный файл php.ini, который ограничивает то, что делает exec () (например, предотвращает его использование вообще).) или может быть какая-то система на месте, которая препятствует запуску процессов, порожденных exec, более чем на пару секунд, поэтому она может нормально работать из оболочки, но не в контексте PHP.

...