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

时间:2012-06-04 18:46:13

标签: php linux cron cgi

这是我的cron工作中的一行...

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

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

2 个答案:

答案 0 :(得分:4)

从php.net(https://www.php.net/manual/en/function.php-sapi-name.php

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

无论什么时候取决于接口的类型,请确保您的检查是结论性的。尤其是当您要将命令行界面(CLI)与通用网关界面(CGI)区分开时。

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

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

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

答案 1 :(得分:0)

所有功劳都归功于@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 命令。