【问题标题】:PHP not working with CRONPHP 不适用于 CRON
【发布时间】:2016-01-21 11:00:18
【问题描述】:

我正在使用 crontab 调用一个 php 脚本。

在这个脚本中有

error_log('test');

当脚本从http或直接命令行执行时

php -f script.php

一切都很好,我的错误是日志。

但是当从 cron 调用时它不起作用。

这是我的 cron

* * * * * -u www-data /full_path_to/php -f /full_path_to/script.php

这是我尝试过的:

  • 带参数的error_log:

    error_log('test', 3, '/full_path_to/error.log');
    
  • 更改错误报告:

    error_reporting(E_ALL);
    ini_set('display_errors','On');
    ini_set('error_log', '/full_path_to/error.log');
    
  • cron 调用以 > /full_path_to/error.log 2>&1 结尾(不知道是否有用)

对于 http,error_log 路径是从 htaccess 设置的。 我迷失了 php cli...

我可以看到每分钟执行一次 cron (syslog),所以应该是 PHP 配置问题?

如果您能提供帮助,非常感谢。

编辑:使用“-u www-data”执行 Cron

这是我在 syslog 中看到的调用:

CRON[13921]: (www-data) CMD (-u www-data /usr/bin/php -f /fullpath/script.php > /fullpath/error.log 2>&1)

【问题讨论】:

  • 脚本 only 是否包含该日志行?还是有更多您没有向我们展示的背景信息?因为就其本身而言,这应该有效。所以这告诉我很可能缺少 context 。最常见的陷阱是使用包含相对路径。
  • 是的,知道有 4 行:错误报告行和 error_log。创建文件也不起作用(我尝试了 fopen/fwrite 和 file_put_contents)
  • 听起来像是权限问题。尝试在有权访问所需路径的用户下运行 cron(或作为 root,但这应该是最后的手段)。
  • cron 作为 www-data 运行。这个 AFAIK 与运行 apache 的用户相同。相同的用户,相同的组...我会尝试将 chmod 设置为 777
  • 不要那样做,chmod 777 总是一个坏主意。 特别是当它涉及网络可访问文件时。另见How will a server become vulnerable with chmod 777?

标签: php cron


【解决方案1】:

我遇到了同样的问题,但在阅读了 php 的手册后能够修复它。

一开始我有这样的设置:

/usr/bin/php -f /path/to/php/script.php -c 1426 >> /tmp/script.php.log 2>&1

我可以通过将行更改为:

/usr/bin/php -f /path/to/php/script.php -- -c 1426 >> /tmp/script.php.log 2>&1

根据手册条目,语法是:

php [options] [ -f ] file [[--] args...]

还有,

args...        Arguments passed to script. Use '--' args when first argument starts with '-' or script is read from stdin

这样,我的 cron 命令变成:

/usr/bin/php -f /path/to/php/script.php -- -c 1426 >> /tmp/script.php.log 2>&1

它有效!

【讨论】:

    【解决方案2】:

    您必须知道有用户特定 crontab 和系统范围 crontab。

    当您以用户 foo 登录并在控制台中键入 crontab -e 时,这将允许您编辑自己的用户特定 crontab。所有定义的 cron 任务将作为用户 foo 执行。对于用户root 来说也是如此。 AFAIK 这样您就无法更改将运行 cron 任务的用户

    完全不同的是文件/etc/crontab。这是系统范围的 crontab。在该文件中,您可以像这样更改 cron 任务的用户:

    * * * * * www-data /full_path_to/php -f /full_path_to/script.php
    

    【讨论】:

      【解决方案3】:

      其实我有两个问题:

      1) 我的 cron 是用 php.ini for php-cli 执行的。我使用 -c 标志来加载好的标志。

      2) 我依靠 $_SERVER 来使用 cli 模式中不存在的变量来声明重要的常量。现在,如果未设置这些变量,我将使用 getopt() 解析命令行变量

      【讨论】:

        猜你喜欢
        • 2015-10-29
        • 2013-04-09
        • 2011-03-08
        • 1970-01-01
        • 2014-10-26
        • 1970-01-01
        • 2016-07-17
        • 2013-02-06
        • 2014-09-19
        相关资源
        最近更新 更多