首页 > 解决方案 > crontab 无法读取 php 脚本中的 dir '../'

问题描述

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

示例:文件.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 centos7

标签: phpcroncentos7

解决方案


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

因此,无需进行所有这些猜测工作,也无需尝试更改 CWD adhoc(这涉及进一步的猜测工作),您可以始终简单地使用绝对路径。

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

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


推荐阅读