如何使用nohup从php-cgi执行php-cli

时间:2012-07-08 11:06:58

标签: php

我正在尝试从php-cgi执行php-cli脚本 我从下面得到的内容不适用于cgi 但是,当我直接从shell执行它时,它确实有用 有没有办法实现这个目标?

<?php 

if (PHP_SAPI === 'cli')
{
    require '../boot.php';
    Logger::mailit();
    exit;
}

class Logger {

    private static $instance = NULL;

    private function __construct(){}

    public function __destruct()
    {
        if (PHP_SAPI != 'cli')
        {
            exec('nohup php '. __FILE__ .' &');
        }
    }


    public static function mailit(){

        // Database stuff ...

        mail( $row->email, $row->subject, $row->message, $row->headers);
    }

}
?>

3 个答案:

答案 0 :(得分:0)

您必须在课程定义(Logger::mailit())之后拨打课程的电话(class Logger)。

答案 1 :(得分:0)

让它真正起作用,这只是一个小小的错误

改变了这个:

require '../boot.php';

到此:

require __dir__.'/../boot.php';

答案 2 :(得分:-1)

您可以删除CLI检查if (PHP_SAPI === 'cli'),也可以包含该文件并自行致电require '../boot.php'; Logger::mailit();。或者您可以查看exec()(或proc_open(),...)以将脚本作为自己的进程执行。如果您需要沙盒,这可能是必要的。


你试过像exec('your/script.php &')这样的事吗? (NOHUP


使用proc_open(),您可以为脚本设置环境(包括时髦的文件描述符)。使用proc_get_status(),您可以获得proc_open()启动的进程的PID。使用posix_kill(),您可以向流程发送信号。

如果我没有误会,你的父进程(在你的情况下是php-cgi)一直运行,直到子进程(在你的情况下为php-cli)完成 - 即使你设置了非阻塞执行。