使用cli时没有定义PHP常量,但通过apache可以工作。

问题描述 投票:0回答:1

我有一个场景,在一个包含文件中的静态函数会看到我的 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();
php apache command-line-interface const
1个回答
0
投票

这个问题已经解决了。在某些时候,我把设置文件(一个隐藏的文件)复制到我的主目录下scp,由于某些原因,当从cron触发时,这个脚本(不在同一路径)正在使用该设置文件,当我删除该副本(不是链接)cron立即开始使用活文件。我仍然不知道为什么要使用那个副本,因为实际的include路径是相对路径到绝对的codebase根,无论如何都找不到那个文件。我很迷茫,怎么,影子文件处理?在Linux上?没听说过。不过现在可以用了。

© www.soinside.com 2019 - 2024. All rights reserved.