我在 Ubuntu 13.04 上使用此代码,
$cmd = "sleep 20 &> /dev/null &";
exec($cmd, $output);
虽然它实际上在那里等待了 20 秒并等待:/ 通常它在&
用于将进程发送到后台时工作正常,但是在这台机器上 php 就不会这样做:/
可能是什么原因造成的?
我在 Ubuntu 13.04 上使用此代码,
$cmd = "sleep 20 &> /dev/null &";
exec($cmd, $output);
虽然它实际上在那里等待了 20 秒并等待:/ 通常它在&
用于将进程发送到后台时工作正常,但是在这台机器上 php 就不会这样做:/
可能是什么原因造成的?
尝试
<?PHP
$cmd = '/bin/sleep';
$args = array('20');
$pid=pcntl_fork();
if($pid==0)
{
posix_setsid();
pcntl_exec($cmd,$args,$_ENV);
// child becomes the standalone detached process
}
echo "DONE\n";
我对其进行了测试,因为它有效。在这里,您首先 fork php 进程,然后执行您的任务。
或者,如果 pcntl 模块不可用,请使用:
<?PHP
$cmd = "sleep 20 &> /dev/null &";
exec('/bin/bash -c "' . addslashes($cmd) . '"');
不起作用的原因是exec()
执行您传递给它的字符串。由于&
被 shell 解释为“在后台执行”,但您没有在exec
调用中执行 shell,因此&
只是将其传递20
给/bin/sleep
可执行文件——它可能只是忽略了这一点。
这同样适用于输出的重定向,因为它也由 shell 解析,而不是在 exec 中。
因此,您需要找到一种方法来分叉您的进程(如上所述),或者找到一种将子进程作为 shell 运行的方法。
我在 ubuntu 13.04 上使用 Apache2 和任何版本的 PHP 执行此操作的解决方法:
libssh2-php
,我只是nohup $cmd &
在使用 PHP 的本地 SSH 会话中使用它并且它在后台运行得很好,当然这需要放置某些安全协议,例如启用webserver 用户的 SSH 访问权限,因此它将具有类似 exec 的权限,然后只允许 localhost 登录到 webserver ssh 帐户。