2012-07-08 26 views
4

我想从php-cgi执行php-cli脚本
我下面得到的内容在cgi中无法使用。
然而,当我直接从shell执行它时,它确实有效。
有没有办法做到这一点?如何从php-cgi使用nohup执行php-cli

<?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); 
    } 

} 
?> 

回答

0

明白了实际工作,这一切只是一个小错误

改变了这一点:

require '../boot.php'; 

这样:

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

你有你的类的调用(Logger::mailit())将您的类的定义(class Logger)之后。

+0

当我从CLI执行它它的工作原理,所以那不是。 – RoboTamer 2012-07-08 11:39:32

-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)完成 - 即使你设置非阻塞执行。