4

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

}
?>
4

3 回答 3

0

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

于 2012-07-08T11:23:31.413 回答
0

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

改变了这个:

require '../boot.php';

对此:

require __dir__.'/../boot.php';
于 2012-07-08T11:55:12.073 回答
-1

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


你试过类似的东西exec('your/script.php &')吗?(诺胡普


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

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

于 2012-07-08T11:33:47.033 回答