2012-07-08 62 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)完成 - 即使你設置非阻塞執行。