【问题标题】:cronjob execution php errorcronjob执行php错误
【发布时间】: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 也有问题,因为这样您就可以通过本地配置阻止在不同已安装模块或库之间进行更改的选项。但肯定比在脚本中使用硬编码的绝对路径更好!

标签: php ubuntu cron crontab


【解决方案1】:

尝试使用绝对包含路径(如 /var/www/path/to/core/external_init.php)。我很确定,它作为 cron 运行时使用了错误的工作目录。

【讨论】:

  • 请参阅我上面对此的评论。要修复“工作目录”,您应该使用cd 命令或php cli 选项更改它。但更好的方法是使用 php 提供的包含路径功能,这是有充分理由的。
  • @DBX12 谢谢,成功了!我必须修复一堆其他错误,但这让它工作了。
猜你喜欢
  • 2012-08-07
  • 2015-11-30
  • 2023-03-20
  • 2021-12-04
  • 2017-12-06
  • 2015-09-06
  • 2018-02-10
  • 2015-04-17
  • 1970-01-01
相关资源
最近更新 更多