为什么PHP_SAPI从cron作业调用时不等于“cli”?
这是我的cron工作中的台词...
*/5 * * * * php /home/user/public_html/index.php --uri=minion --task=emailassets
当我的脚本从这个cron作业运行时,PHP常量PHP_SAPI等于“cgi-fcgi”。为什么PHP_SAPI不等于“cli”?
这是我的cron工作中的台词...
*/5 * * * * php /home/user/public_html/index.php --uri=minion --task=emailassets
当我的脚本从这个cron作业运行时,PHP常量PHP_SAPI等于“cgi-fcgi”。为什么PHP_SAPI不等于“cli”?
从 php.net 手册:
当您想要确定接口类型时,该函数非常有用。但是,在设计应用程序或将其部署到未知服务器时,您还需要注意一个陷阱。php_sapi_name()
每当某些事情取决于接口类型时,请确保您的检查是决定性的。特别是当您想要区分命令行界面 (CLI) 和通用网关接口 (CGI) 时。
请注意,php-cgi 二进制文件可以从命令行、shell 脚本或 Cron Job 调用!如果是这样,将始终返回相同的值(即“”),而不是您可以期望的“”。php_sapi_name()
cgi-fcgi
cli
不要总是期望 /usr/bin/php 是 php-cli 二进制文件的链接。
幸运的是,和超全局数组的内容取决于php-cgi二进制文件是从命令行界面(通过shell脚本,Cron Job等)调用的,还是由某些HTTP服务器(即Lighttpd)调用的。$_SERVER
$_ENV
所有的功劳都归于@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 命令。