crontab 无法读取 php 脚本中的目录 '../'

crontab cannot read dir '../' in php script

为什么 crontab 不能读取脚本中的 '../' 目录,但是如果我通过浏览器访问脚本它可以并且没有问题。

示例:file.php

<?php

include('../config.php');
?>

如果我 运行 通过终端 config.php 脚本无法读取 '/usr/bin/php /home/example.com/public_html/cron/file.php', 而如果我通过浏览器打开它 运行 则很顺利 https://example.com/cron/file.php

我用php7.4和os分os7

.. 引用脚本执行位置的父目录。在这两种情况下,它可能是不同的。在您的 crontab 中尝试 cd /home/example.com/public_html/cron && /usr/bin/php file.php,以便您在与网页相同的目录中执行它。

这是一个完美的用例,说明了为什么您应该避免使用相对路径,而是在包含其他 scripts/files 时坚持使用 绝对 路径。 PHP 根据 CWD(当前工作目录)解析相对路径,这在您的 Web 服务器和终端之间会有所不同。对于 Web 服务器,它取决于调用解释器的脚本(在您的情况下是 /home/example.com/public_html/cron/file.php)。在终端中,它取决于在 shell 中从哪个目录加载解释器。在 crontab 的情况下,它是在拥有 crontab 的用户的主目录中设置的 $PWD 变量(因此很可能是 /home/{username})。当然,这两个解析到完全不同的路径。

因此,代替 所有这些猜测工作,而不是尝试更改 CWD adhoc(这涉及进一步的猜测工作),您可以始终使用绝对路径。

<?php
include __DIR__ . '/../config.php';

这允许你做的是将绝对路径设置为神奇的 __DIR__ 常量,这是一个编译时常量,设置为使用它的脚本的路径(在你的例子中这个是 /home/example.com/public_html/cron)。然后,您可以相对地从该绝对路径向下一个目录,以到达 /home/example.com/public_html,您现在可以从该目录安全地访问 config.php ,而不管 您如何调用脚本和给定的 CWD。