Php exec () не работает - выходить на раннее? Нет ошибки?

StackOverflow https://stackoverflow.com/questions/3739670

Вопрос

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

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

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

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

Обновление: также попробовал запустить PHP -F TEST.PHP (который только что в нее линейка Exec Exec). которые выводят весь файл правильно. Но даже если я пойду к http://mydomain.com/test.php. Я получаю только часть файла.

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

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

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

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

FRI SEP 17 20:00:57 2010] [Ошибка] Необработанное исключение Java: [FRI 17 20:00:57 2010] [Ошибка] Java.lang.OutofmemoryError [FRI Сенту 17 20:00:57 2010] [Ошибка ] <>

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

помощь!

Это было полезно?

Решение

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

Другие советы

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

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

FRI SEP 17 20:00:57 2010] [Ошибка] Необработанное исключение Java: [FRI 17 20:00:57 2010] [Ошибка] Java.lang.OutofmemoryError [FRI Сенту 17 20:00:57 2010] [Ошибка ] <>

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

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

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

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

Обновление: также попробовал запустить PHP -F TEST.PHP (который только что в нее линейка Exec Exec). которые выводят весь файл правильно. Но даже если я пойду к http://mydomain.com/test.php. Я получаю только часть файла.

У меня есть решение для вас, которое также не будет убивать вашего веб-сервера (VPS) на высокой нагрузке. С сайта (сторона WebServer) вы должны протолкнуть его в блокирующем списке (редис) с использованием предисы PHP-клиентская библиотека, поскольку она поддерживает все необходимые команды NECCESSARY REDIS (BLPOP / LPUSH). Из PHP Deamon (PHP -F), который всегда работает, вы должны попнуть из списка блокировки и выполнять команды (PDFTK).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top