如何使用nohup从PHPCGI执行PHPCLI

如何使用nohup从PHPCGI执行PHPCLI,php,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 funct

我正在尝试从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);
    }

}
?>


您必须将类的调用(
Logger::mailit()
)放在类的定义(
class Logger
)之后。

您可以删除CLI检查
if(PHP_SAPI=='CLI')
,或者包括文件和调用
require'../boot.PHP';Logger::mailit()你自己。或者,您可以查看(或…)以将脚本作为自己的进程执行。如果您需要沙箱,这可能是必要的


您是否尝试过类似于
exec('your/script.php&')
?()


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


如果我没有弄错的话,您的父进程(在您的例子中是php cgi)会一直运行,直到子进程(在您的例子中是php cli)完成—即使您设置了非阻塞执行。

让它实际工作,这只是一个小错误

更改为:

require '../boot.php';
为此:

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