2010-09-17 3 views
3

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

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

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

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

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

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

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

также - когда я пытаюсь получить обратный или выходное значение из 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 ограничить память дочернего процесса? есть ли другая настройка для этого где-то?

помощь!

+0

Хехе слишком поздно, что вы уже решили проблему, но все же я думаю, что вы должны использовать redis, из-за того, что многие пользователи одновременно называют этот сценарий, использование вашей памяти будет за пределами графика, а производительность ваших компьютеров серьезно ухудшится. – Alfred

ответ

1

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

0

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

+0

это VPS, поэтому я могу изменить php.ini, если это исправит. подскажите, что это может быть? тоже может быть что-то в апаче? поскольку php -f работает нормально, но не через веб-url для одного и того же сценария? или они могут быть настроены для использования разных ini-файлов? – dan

0

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

[Пт Сен 17 20:00:57 2010] [ошибка] Unhandled Java Exception: [Пт 17 сентября 20:00: 57 2010] [ошибка] java.lang.OutOfMemoryError [пт 17 сентября 20:00:57 2010] [ошибка] <>

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

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

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

Вы сделали что-то вроде этого? http://www.wallpaperama.com/forums/how-to-change-memory-limit-php-apache-server-t53.html

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

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

+0

Я тоже думал, что это тоже странно, но с сервером ничего не происходило, и это было единственное, что могло бы быть. моя единственная догадка заключается в том, что у pdftk есть какая-то java в его ядре? – dan

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