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


How do I execute a php-cli from php-cgi with nohup

我正在尝试从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)之后。

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

更改为:

require '../boot.php';

到此:

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

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


你试过exec('your/script.php &')吗?(NOHUP)


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

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