为什么PHP_SAPI从cron作业调用时不等于“cli”?

2022-08-30 17:55:07

这是我的cron工作中的台词...

*/5 * * * * php /home/user/public_html/index.php --uri=minion --task=emailassets

当我的脚本从这个cron作业运行时,PHP常量PHP_SAPI等于“cgi-fcgi”。为什么PHP_SAPI不等于“cli”?


答案 1

php.net 手册

当您想要确定接口类型时,该函数非常有用。但是,在设计应用程序或将其部署到未知服务器时,您还需要注意一个陷阱。php_sapi_name()

每当某些事情取决于接口类型时,请确保您的检查是决定性的。特别是当您想要区分命令行界面 (CLI) 和通用网关接口 (CGI) 时。

请注意,php-cgi 二进制文件可以从命令行、shell 脚本或 Cron Job 调用!如果是这样,将始终返回相同的值(即“”),而不是您可以期望的“”。php_sapi_name()cgi-fcgicli

不要总是期望 /usr/bin/phpphp-cli 二进制文件的链接。

幸运的是,和超全局数组的内容取决于php-cgi二进制文件是从命令行界面(通过shell脚本,Cron Job等)调用的,还是由某些HTTP服务器(即Lighttpd)调用的。$_SERVER$_ENV


答案 2

所有的功劳都归于@mopsyd,但由于唯一的答案没有提供解决方案,我想在这里发布这个,以便它易于阅读,而不必查看评论。

tl;dr:你已经安装了cPanel,它用Perl脚本替换了PHP二进制文件。

使用 /usr/local/bin/php 而不是 /usr/bin/php。

您可以像这样测试:

$ diff /usr/bin/php /usr/local/bin/php
2c2
< # cpanel - php-cgi                                 Copyright 2018 cPanel, L.L.C.
---
> # cpanel - php-cli                                 Copyright 2018 cPanel, L.L.C.
7c7
< package ea_php_cli::cgi;
---
> package ea_php_cli::cli;
19c19
< my $bin = "php-cgi";
---
> my $bin = "php";

如您所见,/usr/bin/php 用于 CGI 请求,/usr/local/bin/php 用于 CLI 命令。


推荐