4

我正在尝试使用 exec() 函数触发 PHP 脚本在后台运行,但我无法让它工作。我已经阅读了关于堆栈溢出和其他论坛的无数帖子,并尝试了许多变体均无济于事。

服务器信息:

Operating System: Linux
PHP: 5.2.17 
Apache Version: 2.2.23
Home Directory: /home1/username

我目前正在使用代码:

exec("/home1/username/php /home1/username/public_html/myscript.php > /dev/null &");

当我运行上述脚本时,我的 cPanel 错误日志中没有 error_log 并且没有错误,但是该脚本肯定不会执行。当我浏览到http://www.mydomain.com/myscript.php时,它会立即运行并向我发送电子邮件。知道为什么这不起作用/我如何找出正在产生什么错误?

更新 cPanel 进程管理器输出

exec("php /home1/username/php /home1/username/public_html/myscript.php > /dev/null &");

产生:

27183   php /home1/username/php /home1/username/public_html/myscript.php
27221   [sh]
27207   php /home1/username/php /home1/username/public_html/myscript.php
27219   php /home1/username/php /home1/username/public_html/myscript.php
27222   php /home1/username/php /home1/username/public_html/myscript.php
27224   php /home1/username/php /home1/username/public_html/myscript.php
27249   sh -c php /home1/username/php /home1/username/public_html/myscript.php > /dev/null &

这正常吗?脚本似乎停留了很长时间,即使它应该执行得非常快。

4

3 回答 3

4

无法让 exec 使用 php。即使我获得了对服务器的 shell 访问权限,该命令也只是挂起。我决定改用 wget 来完成同样的事情。效果很好:)

exec("wget http://www.mydomain.com/myscript.php > /dev/null &");
于 2012-09-23T16:55:23.570 回答
1

您是否尝试过直接调用 php CLI?

exec("php /home1/username/php /home1/username/public_html/myscript.php > /dev/null &");

您将不需要 #!,如果通过 Apache 调用它会输出到浏览器。

编辑。看起来您的脚本正在运行,但您在后台执行的 PHP 脚本挂起(未退出)。试试这个变化:

exec("php /home1/username/php /home1/username/public_html/myscript.php > /dev/null 2>&1 &");

“> /dev/null 2>&1” 是什么意思?

于 2012-09-23T04:08:23.627 回答
0

since you want to run the myscript from your command line, wy not do this:

exec('(/home1/username/public_html/myscript.php) > /dev/null &',$r,$s);

And write this as a first line in the myscript.php:

#!/home1/username/php -n
<?php
    //script goes here
?>

That should work. The hashbang tells the system what programme to use to run the script that follows, so you don't need to add that to your exec call. Also, it's safer (and therefore better) to put brackets around the full script call, just so PHP knows what output has to be redirected to what stream, to avoid any issues that might occur. Especially when libs or packages like PHP-GTK are installed on the server (hence the -n option).

于 2012-09-23T03:04:40.230 回答