Команда оболочки работает в командной строке, но не в PHP exec - PullRequest
1 голос
/ 11 августа 2010

У меня есть команда, которая при запуске напрямую в командной строке работает, как ожидалось. Он работает более 30 секунд и не выдает никаких ошибок. Когда та же команда вызывается через скрипт PHP через функцию php exec () (которая содержится в скрипте, вызываемом cron), она выдает следующую ошибку:

Максимальное время выполнения 30 секунд превышено

У нас есть несколько серверов, и я выполнил эту команду на очень похожем сервере с точно таким же набором данных без каких-либо проблем, поэтому я рад, что нет проблем на уровне сценариев. Я становлюсь более склонным думать, что это связано с чем-то на уровне сервера - либо в настройке PHP, либо в настройке сервера каким-то образом, но на самом деле не уверен, где искать. Для тех, кто заинтересован, оба сервера имеют максимальное время выполнения 30 секунд.

сама команда называется так -

из командной строки как:

root@server>php -q /path/to/file.php

это работает ...

и через cron в файле PHP как:

exec("php -q /path/to/file.php");

это выдает ошибку максимального времени выполнения. я всегда понимал, что при запуске PHP из командной строки не было ограничений по времени выполнения.

Я должен указать, что вызываемый скрипт вызывает ряд других скриптов, и он является ошибочным. Глядя на мои журналы, ошибка максимального времени выполнения на самом деле происходит раньше, чем через 30 секунд! Таким образом, менее чем через 30 секунд после вызова сценарий, вызываемый сценарием cron, который, по-видимому, выполняется, поскольку CLI выдает ошибку максимального выполнения.

Чтобы проверить, что скрипт работает так, как я ожидал (как CLI без максимального времени выполнения), я выполнил следующую проверку:

PHP-скрипт, содержащий этот код:

// test.php
echo exec("php test2.php");

, где test2.php содержит:

echo ini_get('max_execution_time');

и этот скрипт запускается так:

root@server> php test.php
// returns 0

Это доказывает, что скрипт, вызываемый таким образом, работает под CLI с максимальным временем выполнения 0, что только подтверждает мои мысли, я действительно не могу понять, почему этот скрипт не работает в течение максимального времени выполнения!

Ответы [ 7 ]

1 голос
/ 12 августа 2010

Я действительно нашел, в чем проблема (вроде).Кажется, что это может быть ошибка с сообщением PHP max_execution_time, которое будет превышено, когда ошибка на самом деле с max_input_time , как описано здесь

Я попытался изменить вызов exec на php -d max_execution_time=0 -q /path/to/file.phpи я получил ошибку «Превышено максимальное время выполнения 0 секунд», которая не имеет смысла, я изменил код на php -d max_input_time=0 -q /path/to/file.php, и код работал без ошибок.К сожалению, он все еще работает через 10 минут.По крайней мере, это доказывает, что проблема с max_input_time хотя

1 голос
/ 12 августа 2010

Что означает php -v | grep cli, запускается как из оболочки, так и из команды exec из загруженного cron файла php?

Имеет ли какое-либо значение явное введение /usr/bin/php (изменить соответствующим образом)?

1 голос
/ 11 августа 2010

Вы можете временно установить время ожидания, указав это в верхней части скрипта. Это не будет работать при работе в безопасном режиме, как указано в документах для настройки max_execution_time с ini_set().

<?php
    ini_set('max_execution_time', 60);  // Set to be longer than 
                                        // 60 seconds if needed

    // Rest of script...
?>

В документах следует отметить следующее:

При запуске PHP из командной строки по умолчанию установлено значение 0.

1 голос
/ 11 августа 2010

Требуется ли команда более 30 секунд в командной строке?Вы пытались увеличить время ожидания в php.ini?

1 голос
/ 11 августа 2010

похоже, что выполнение вашего скрипта занимает слишком много времени, попробуйте

установить ограничение по времени, http://php.net/manual/en/function.set-time-limit.php

или проверьте этот пост: Асинхронная оболочка в PHP1007 *

0 голосов
/ 25 августа 2014

создайте файл wrapper.sh, как показано ниже

export DISPLAY=:0<br>
xhost + 2>>/var/www/err.log<br>
/usr/bin/php "/var/www/read_sms1.php" 2>>/var/www/err.log<br>

и поместите его в cron, как показано ниже

 bash  /var/www/wrapper.sh<br>
y read_sms1.php  contain<br>
$ping_ex = exec("/usr/local/bin/gnokii --getsms SM 1 end  ", $exec_result, $pr);  

и выше, решение для меня отлично работает в ubuntu 12.04

0 голосов
/ 15 декабря 2013

Я удивлен, что никто из вышеперечисленных фактически не рассчитал время выполнения 10000 * exec exec. Проблема в том, что exec (x) занимает намного больше времени, чем командная строка x. У меня очень сложный Perl-скрипт (с 8 уровнями внутренней рекурсии), выполнение которого из командной строки занимает около 40 секунд. Использование exec внутри php-скрипта для вызова одной и той же perl-программы занимает около 300 секунд для выполнения, т.е. в 7 раз больше времени. Это настолько неожиданный эффект, что люди не увеличивают максимальное время выполнения настолько, чтобы завершить свои программы. В результате они мистифицированы таймаутом. (Кстати, я работаю на WAMP на быстрой машине с номинальным числом 8 процессоров, а остальная часть моей программы php по сути тривиальна, поэтому разница во времени должна быть полностью в исполнении.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...