0

我必须在后台执行一个 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';
}
?>

它返回“成功”但它不执行 a.php

一个.php:

<?
file_put_contents(date("s"),"");
sleep(5);
file_put_contents(date("s"),"");
sleep(5);
file_put_contents(date("s"),"");
?>

a.php 每 5 秒写入一个文件,它工作正常,除非我尝试使用第一个脚本在后台执行它。

4

3 回答 3

1

您可以尝试改编 mi 脚本。查看命令 shell_exec() 而不是 exec()。首先返回 all ,第二个最后一行。

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");
}
于 2013-06-29T16:20:56.970 回答
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

干杯

于 2013-04-17T12:54:59.467 回答
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 进行测试,以便脚本可以写入文件?

为了测试,我创建了一个子目录“输出”并更改了 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);
?>

在我向输出文件夹授予写入权限之前,它无法写入文件

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
于 2013-04-16T21:38:40.163 回答