我有一个场景,在一个包含文件中的静态函数会看到我的 defined
值,但当我通过web-request触发该代码时,当通过cron启动的计划触发完全相同的代码时,该代码的 defined
值不被视为定义。我将我的代码方案简化为最简单的形式,如下所示。
更新 我把一个 error_log(print_r(get_defined_constants(true),true));
在文件中,比较了web执行和cron执行的结果,唯一不同的是我在cron端缺少了常量,而在cron web端缺少了pcntl扩展常量。
笔记:所有的网络请求都需要这个设置文件,没有问题。笔记: 我有其他的 预定的 的文件,可以看到定义的值 笔记: 我有其他的网页文件,利用这个 阶层 及其功能没有问题。
已确认: 包含设置文件 证实: 正在调用该函数
我觉得我好像漏掉了一些很明显或者很深奥的东西。
//-- settings file
...
define("NEED_THIS_CONST","DOODLYDOO");
...
//-- class file
class vendor {
public static function dothis() {
error_log("reached the file");
if(!defined("NEED_THIS_CONST")) {
error_log("not defined");
else
error_log("defined");
}
}
}
//-- requested file
...
require_once("settings.php");
include_once("vendor.php");
vendor::dothis();
这个问题已经解决了。在某些时候,我把设置文件(一个隐藏的文件)复制到我的主目录下scp,由于某些原因,当从cron触发时,这个脚本(不在同一路径)正在使用该设置文件,当我删除该副本(不是链接)cron立即开始使用活文件。我仍然不知道为什么要使用那个副本,因为实际的include路径是相对路径到绝对的codebase根,无论如何都找不到那个文件。我很迷茫,怎么,影子文件处理?在Linux上?没听说过。不过现在可以用了。