【问题标题】:$_SERVER['DOCUMENT_ROOT'] does not work in the php script running through cron$_SERVER['DOCUMENT_ROOT'] 在通过 cron 运行的 php 脚本中不起作用
【发布时间】:2011-01-07 05:13:07
【问题描述】:

我使用 $_SERVER['DOCUMENT_ROOT']."/lib/sft_required.php";在 PHP 脚本中包含“sft_required”文件。当我使用浏览器运行此文件时,它可以正常工作,但是当我将其作为 cron 作业运行时,它不起作用。当我们通过cron运行脚本时,似乎没有包含该文件。

【问题讨论】:

    标签: php cron


    【解决方案1】:

    在使用 CLI 解释器运行 PHP 脚本时,不能期望$_SERVER 包含任何正常值。要么将路径放在环境变量中,要么将其作为命令行参数传递给脚本。

    【讨论】:

      【解决方案2】:

      假设您直接通过 cron 运行脚本(而不是从由 cronjob 触发的 HTTP 请求访问的 Web 服务器(例如,通过运行 wget 的 cron)),那么它当然不起作用。

      没有服务器,所以$_SERVER没有设置。

      【讨论】:

      • 实际上设置了$_SERVER 超全局但它包含不同的值。
      • “当然”?为什么服务器会“忘记”DOCUMENT_ROOT 是什么?不是很明显(其实几年后我还是不明白为什么DOC_ROOT是空白的(REMOTE_ADDR等比较明显)
      • @Martijn — 服务器不会忘记任何事情。 PHP 不是由 Web 服务器运行,而是由 cron 运行。
      【解决方案3】:

      您可以自行填充 $_SERVER['DOCUMENT_ROOT']

      $_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__);
      

      如果 cron 文件在文档根目录中

      $_SERVER['DOCUMENT_ROOT'] = dirname(dirname(__FILE__));
      

      如果 cron 文件是文档根目录之上的一个目录

      【讨论】:

      • 此答案应标记为已接受,因为它为 OP 的问题提供了实用的解决方案...
      • 在PHP7中dirname(dirname(__FILE__))可以改写为dirname(__FILE__, 2)
      【解决方案4】:

      我回答了一个类似的问题here。正如人们所提到的,超全局 $_SERVER 没有在 CLI 情况下定义。链接中是(到目前为止)获取 DOCUMENT_ROOT 位置的万无一失的方法。希望它被证明是有用的。

      【讨论】:

        【解决方案5】:
        define('DOCROOT', substr(str_replace(pathinfo(__FILE__, PATHINFO_BASENAME), '', __FILE__), 0, -1));
        

        这将为您提供与 $_SERVER['DOCUMENT_ROOT'] 相同的 cronjobs 数据。

        【讨论】:

          【解决方案6】:

          示例 1:
          /var/www/site.com/ - DOCUMENT_ROOT;
          /var/www/site.com/cron/script.php - CRON PHP 脚本;

          <?php
          /** DOCUMENT_ROOT -> /var/www/site.com/ */
          $_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../');
          ?>
          

          示例 2:
          /var/www/site.com/ - DOCUMENT_ROOT;
          /var/www/site.com/sub_dir/cron/script.php - CRON PHP 脚本;

          <?php
          /** DOCUMENT_ROOT -> /var/www/site.com/ */
          $_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../../');
          ?>
          

          【讨论】:

            【解决方案7】:

            我有同样的问题.. 我在互联网上找到的解决方案不适用于我的网络服务器 cron,所以我需要找到另一种方法来轻松更改该路径..

            而且问题不大,当你有 1-2 个 cron 文件(如果需要可以轻松编辑文件路径),但我有 20 个 cron 文件并且当我需要更改服务器或路径更改或 smt 时,我必须更改所有这些文件,更改它们的文件路径...

            所以我找到了至少 FOR ME 出色的解决方案:在 cron 文件夹中创建了一个文件 path.php,并将其与 cron 文件放在同一个文件夹中,然后您可以将其包含在内而不会出错。

            path.php 我有$path = '/server/root/path';

            然后我将 path.php 包含到我的 cron 文件中(我有 20 个左右的 cron 文件)

            现在我在我的 cron 文件中使用该 $path,如下所示:

            include 'path.php';
            include $path.'/includes/db.php';
            

            现在如果我需要更改路径,那么我只需打开 path.php 文件,更改它即可。

            希望我帮助了某人,因为解决方案让我的生活变得更轻松! 它仍然不是完美的,当一切都自动运行时,它会完美,但对我来说这比以前的系统要容易得多,所以我坚持我会分享我的经验,也许我可以帮助某人:)!

            【讨论】:

              【解决方案8】:

              这是我处理过的类似问题的解决方案。

              $site_root_directory = substr( __DIR__, 0, strpos( __DIR__, "wp-content" ) );

              就我而言,我正在运行一个在我的主题内执行文件的 cron。 (我不为玉米加载 WordPress,所以我无权访问 ABSPATH 之类的东西。

              这样,我通过使用通向我的脚本的根目录中的 first 子文件夹来获取我的“根目录”,而不是从脚本目录返回。

              /var/more_directories/public_html/wp-content/themes/theme-name/includes/cron-jobs /var/more_directories/public_html/

              这意味着我不必担心移动我的脚本,因为它总是在第一个子文件夹下的某个地方。

              【讨论】:

                【解决方案9】:

                在我的情况下,这个问题是由$_SERVER['DOCUMENT_ROOT'] 路径在正常站点操作期间具有斜杠而在 cron 作业期间没有斜杠造成的。

                我不确定导致这种情况发生的原因,但作为一种解决方法,我将代码切换为使用 ABSPATH,因为它似乎返回了一致的值。

                所以,换句话说,我改变了这个:

                $private_folder = realpath($_SERVER['DOCUMENT_ROOT'] . "../private_html");
                

                到这里:

                $private_folder = realpath(ABSPATH . "../private_html");
                

                对于这个问题还有其他几种解决方案,例如使用str_replacertrim

                【讨论】:

                  【解决方案10】:

                  这个解决方案对我有用:

                  $site_root_directory = substr( __DIR__, 0, strpos( __DIR__, "public_html" ) ).'public_html';
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-09-08
                    • 2019-07-23
                    • 1970-01-01
                    • 2020-02-28
                    • 1970-01-01
                    • 2021-03-07
                    • 2015-10-03
                    • 1970-01-01
                    相关资源
                    最近更新 更多