Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell命令在命令行上工作,但在PHP exec中不工作_Php_Shell_Command Line - Fatal编程技术网

Shell命令在命令行上工作,但在PHP exec中不工作

Shell命令在命令行上工作,但在PHP exec中不工作,php,shell,command-line,Php,Shell,Command Line,我有一个命令,当在命令行上直接运行时,它会按预期工作。它运行超过30秒,不会抛出任何错误。当通过PHP脚本通过PHP函数exec()调用同一命令(包含在由cron调用的脚本中)时,会抛出以下错误: 最长执行时间为30秒 超过 我们有很多服务器,我在一个非常相似的服务器上运行了这个命令,使用完全相同的数据集,没有任何问题,所以我很高兴没有脚本级别的问题。我越来越倾向于认为这与服务器级别的某些东西有关——无论是在PHP设置中还是在某种程度上与服务器设置有关,但实际上不确定应该在哪里查找。对于感兴趣的

我有一个命令,当在命令行上直接运行时,它会按预期工作。它运行超过30秒,不会抛出任何错误。当通过PHP脚本通过PHP函数exec()调用同一命令(包含在由cron调用的脚本中)时,会抛出以下错误:

最长执行时间为30秒 超过

我们有很多服务器,我在一个非常相似的服务器上运行了这个命令,使用完全相同的数据集,没有任何问题,所以我很高兴没有脚本级别的问题。我越来越倾向于认为这与服务器级别的某些东西有关——无论是在PHP设置中还是在某种程度上与服务器设置有关,但实际上不确定应该在哪里查找。对于感兴趣的用户,两台服务器的最大执行时间均为30秒

命令本身被称为这样的-

从命令行中选择:

root@server>php -q /path/to/file.php
这很有效

并通过PHP文件中的cron,如下所示:

exec("php -q /path/to/file.php");
这将抛出最大执行时间错误。我一直认为,从命令行运行PHP时没有执行时间限制

我应该指出的是,被调用的脚本调用了许多其他脚本,并且是其中一个脚本出错。看看我的日志,最大执行时间错误实际上也发生在30秒之前!因此,在被调用后不到30秒,一个脚本被一个cron脚本调用,该脚本似乎正在运行,因为CLI抛出了一个max execution错误

要检查脚本是否按预期运行(作为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,这正好证明了我的想法,我真的不明白为什么这个脚本在最大执行时间上失败

似乎您的脚本执行时间太长,请尝试

设定时限,

或查看此帖子:

命令行上的命令是否需要30秒以上?您是否尝试在php.ini中增加执行超时?

您可以通过在脚本顶部包含此项来临时设置超时。当在安全模式下运行时,这将不起作用,如用于设置的文档中所指定


文件中需要注意的一点是:

从命令行运行PHP时 默认设置为0


php-v|grepcli从shell和cron加载的php文件显示的exec命令中运行什么


明确地键入
/usr/bin/php
(根据需要修改)有什么区别吗?

我已经找到了问题所在(有点)。似乎这可能是PHP报告
max\u execution\u time
的一个错误,当错误实际发生在
max\u input\u time


我尝试将exec调用更改为
php-d max_execution\u time=0-q/path/to/file.php
,结果出现错误“超出了0秒的最大执行时间”,这毫无意义,我将代码更改为
php-d max_input\u time=0-q/path/to/file.php
,代码运行时没有出错。不幸的是,10分钟后它仍在运行。至少这证明了问题在于
max\u input\u time
,尽管我很惊讶上面没有人真正对完成的exec调用进行计时。问题是exec(x)比命令行x花费的时间要长得多。我有一个非常复杂的perl脚本(具有8级内部递归),从命令行执行大约需要40秒。在php脚本中使用exec调用同一个perl程序需要大约300秒的执行时间,也就是说,执行时间延长了大约7倍。这是一个如此意外的结果,以至于人们没有充分增加他们的最大执行时间来完成他们的程序。因此,他们对超时感到困惑。(顺便说一句,我在一台名为8个CPU的快速机器上运行WAMP,我的php程序的其余部分基本上很简单,因此时差必须完全在exec中。)

创建wrapper.sh文件,如下所示
导出显示=:0
xhost+2>>/var/www/err.log
/usr/bin/php”/var/www/read_sms1.php“2>>/var/www/err.log
并将其放入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);  
bash/var/www/wrapper.sh
y read_sms1.php包含
$ping_ex=exec(“/usr/local/bin/gnokii--getsms SM 1 end”,$exec_result,$pr);

上面的解决方案在ubuntu 12.04中对我来说效果很好,如果你从命令行而不是从cron运行PHP脚本会怎么样?你说“当直接在命令行上运行时效果很好”,但这还不够:尽管在shell提示符下运行很好,PHP的max/exec/time设置(忘记确切的名称)显然设置为需要30秒吗?@George-我假设通过exec()运行脚本这是否等同于在CLI下运行它?不是这样吗?我修改了这个问题,因为尽管有人多次询问脚本从命令行执行需要多长时间,但出于某种原因,他拒绝回答。@George-有点苛刻,因为我是afk,我没有拒绝回答任何问题!。从命令行运行脚本需要30秒以上,但它不像给定的脚本那么简单,该脚本称为调用脚本,该脚本反过来调用许多其他脚本,并调用抛出错误的脚本。我假设使用exec运行脚本等同于在CLI下运行脚本。也许情况并非如此?如果是这样的话,那么由cron调用的PHP脚本(因此使用CLI)使用exec()调用PHP脚本应该没有最大执行时间?@snaken-这正是我所想的,使用/usr/bin/PHP会得到同样的结果,这很奇怪-您尝试了
exec('s)
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>
 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);