我正在尝试从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)完成——即使您设置了非阻塞执行。