我必须在后台执行php脚本(a.php)。我尝试了这个,但它不起作用:
<?
$cmd = "php /home/megad404/www/prove/a.php &> /dev/null &";
exec('/bin/bash -c "'.$cmd.'"',$output,$return);
if($return===0)
{
echo 'Successful';
}
else
{
echo 'Unsuccessful';
}
?>
返回“Successful”但不执行a.php
a.php只会:
<?
file_put_contents(date("s"),"");
sleep(5);
file_put_contents(date("s"),"");
sleep(5);
file_put_contents(date("s"),"");
?>
a.php每5秒写一个文件,它工作正常,除非我尝试在后台用第一个脚本执行它。
答案 0 :(得分:1)
您可以尝试改编mi脚本。 查看命令shell_exec()而不是exec()。首先返回全部,仅次于最后一行。
function run_in_background($Command, $Priority = 0) {
if($Priority)
$PID = shell_exec("nohup nice -n $Priority $Command > /dev/null & echo $!");
else
$PID = shell_exec("nohup $Command > /dev/null & echo $!");
return($PID);
}
//Verifies if a process is running in linux
function is_process_running($PID) {
exec("ps $PID", $ProcessState);
return(count($ProcessState) >= 2);
}
和示例
$PIDPHP=run_in_background("php -S 127.0.0.1:18086 ".__DIR__."/index.php"); // or any other process.
if (is_process_running($PIDPHP)){
exec("kill $PIDPHP");
}
答案 1 :(得分:0)
这对我有用:
<?php
$cmd = "/usr/bin/php /home/auser/a.php &> /dev/null &";
exec($cmd,$output,$return);
sleep(30);
if($return===0)
{
echo 'Successful';
}
else
{
echo 'Unsuccessful';
}
?>
我把它保存为runa.php并从命令窗口以php runa.php运行它。 它产生了3个文件。
运行a.php也可以从cron工作开始:
]$ crontab -l
18 * * * * /usr/bin/php /home/auser/a.php
我把脚本放在一个web目录中,发现我有一些写作问题。你能在服务器日志中看到什么?
sudo tail -f /var/log/httpd/error_log
如果你从网络浏览器点击a.php怎么办?因为你提到的脚本是755,但目录怎么样。也许它需要775或777进行测试,以便脚本可以写一个文件?
为了测试,我创建了一个子目录“output”并更改了a.php
<?php
ini_set('date.timezone','America/New_York'); //without this it makes extra messages
error_log("a.php putting contents", 0);
file_put_contents("output/".date("s"),"");
sleep(5);
file_put_contents("output/".date("s"),"");
sleep(5);
file_put_contents("output/".date("s"),"");
error_log("a.php done", 0);
?>
在我向ouput文件夹
发出写入权限之前,无法写入文件sudo chmod 777 /var/www/html/output
然后我发现apache用户正在编写文件:
~]$ sudo ls -l /var/www/html/output/
total 0
-rw-r--r--. 1 apache apache 0 Apr 18 11:38 00
-rw-r--r--. 1 apache apache 0 Apr 18 11:38 05
-rw-r--r--. 1 apache apache 0 Apr 18 11:37 55
所以我改变了输出的所有者,以便再次降低权限。
~]$ sudo ls -lu /var/www/html/ | grep output
drwxr-xr-x. 2 apache root 4096 Apr 18 12:21 output
现在也可以使用:
~]$ sudo ls -l /var/www/html/output
total 0
-rw-r--r--. 1 apache apache 0 Apr 18 12:21 44
-rw-r--r--. 1 apache apache 0 Apr 18 12:21 49
-rw-r--r--. 1 apache apache 0 Apr 18 11:37 55
答案 2 :(得分:0)
您还可以考虑使用真正的Posix / PCNTL功能将脚本实际分离到背景,例如。使用pcntl_exec和pcntl_fork()。这是我认为处理运行较长时间的后台脚本的正确方法,因为您可以与子/进程通信以获取更新,状态等,甚至让他们了解真实的信号处理。
PCNTL - http://www.php.net/manual/en/book.pcntl.php
POSIX - http://www.php.net/manual/en/book.posix.php
干杯