我正在尝试从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);
}
}
?>
答案 0 :(得分:0)
您必须在课程定义(Logger::mailit()
)之后拨打课程的电话(class Logger
)。
答案 1 :(得分:0)
让它真正起作用,这只是一个小小的错误
改变了这个:
require '../boot.php';
到此:
require __dir__.'/../boot.php';
答案 2 :(得分:-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)完成 - 即使你设置了非阻塞执行。