php - 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
解决方案
这是一个完美的用例,说明为什么在包含其他脚本/文件时应避免使用相对路径,而应坚持使用绝对路径。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。
推荐阅读
- javascript - 如何在 Javascript 中选择文档正文
- javascript - 如何将 Javascript 对象转换为具有键和值数组的对象?
- flutter - Flutter'sTry Catch 永远不起作用
- c# - 类对象实例的数据绑定
- sql - Oracle SQL 正则表达式:提取字符串的每个实例和前面/后面的字符
- node.js - 如果触发其他 azure 函数,则超时 Azure 函数
- c++ - 如何计算函数的搜索复杂度
- oracle - Oracle 12c - DBA_USERS 表 - LAST_LOGIN 是指上次成功登录还是上次尝试登录?
- javascript - TextField v-on 动作在附加图标上激活
- html - p-tableCheckbox 默认勾选