【发布时间】:2016-12-31 19:52:29
【问题描述】:
我正在尝试从 php 创建 cronjob,我将其添加到 crotanb:
sudo crontab -u www-data -l:
*/1 * * * * /usr/bin/php /var/www/html/service_script/cronTest.php
cronTest.php
<?php
echo 'it works';
include_once('../core/external_init.php');
这是输出:
it works
PHP Warning: include_once(../core/external_init.php): failed to open stream: No such file or directory in /var/www/html/service_script/cronTest.php on line 3
PHP Warning: include_once(): Failed opening '../core/external_init.php' for inclusion (include_path='.:/usr/share/php') in /var/www/html/service_script/cronTest.php on line 3
PHP Fatal error: Uncaught Error: Class 'pluginClassManagement' not found in /var/www/html/service_script/cronTest.php:6
Stack trace:
#0 {main}
thrown in /var/www/html/service_script/cronTest.php on line 6
当我从浏览器运行这个 cronTest.php 时,它可以工作。 如果我将 /usr/bin/php 更改为 /usr/lib/php 我会收到此错误:
/bin/sh: 1: /usr/lib/php: Permission denied
我真的不知道这里应该是什么路径。
我有 php7,我尝试了各种方法来完成这项工作,设置权限,使脚本可执行等,但现在我坚持这个,不知道该怎么做
【问题讨论】:
-
当您从 cron 运行时,最好使用绝对路径。如果您使用 cli 运行,则相对路径将引用您当前的工作目录。至于
/usr/bin/php部分,你可以放php,比如php /var/www/... -
@frz3993 绝对路径很少是个好主意。它使您的代码无缘无故地不可移植。相对路径对此非常适用,这就是包含路径设置的用途。请注意,您(通常)有单独的 php.ini 文件用于 http 服务器和 php 的命令行版本。这允许定义不同的包含路径。这使得该设置特定于本地系统,这非常有意义。
-
/usr/lib/php没有任何意义。请记住,您希望从 cron 作业中执行 php 解释器。所以你需要一个可执行文件,一个可以“启动”或执行的独立“程序”。检查 php cli 可执行文件在系统上的位置。为此使用您的系统软件管理系统。 -
@arkascha,谢谢,我忘记了包含路径。因为通常我会使用
__DIR__、dirname()或两者的组合来创建路径。 -
@frz3993 也有问题,因为这样您就可以通过本地配置阻止在不同已安装模块或库之间进行更改的选项。但肯定比在脚本中使用硬编码的绝对路径更好!