【问题标题】:Cannot get PHP cron script to run无法让 PHP cron 脚本运行
【发布时间】:2018-03-26 23:50:08
【问题描述】:

我有一个 PHP 脚本,我需要每分钟运行一次。我已确保脚本可以从命令行运行,并且我使用绝对路径来避免任何环境问题:

/usr/bin/php -q /var/www/myapp/services/myservice.php

从命令行以 root 身份手动运行它可以正常工作,正如我从脚本写入的日志文件中看到的那样。可以肯定的是,该脚本也具有执行权限。

但是,当在 cron 中放置相同的命令时:

* * * * * /usr/bin/php -q /var/www/myapp/services/myservice.php

它没有运行,或者至少看起来是这样。我也尝试将输出重定向到另一个日志文件:

* * * * * /usr/bin/php -q /var/www/myapp/services/myservice.php >> /mylog.log 2>&1

还是什么都没有。我没有任何迹象表明正在运行脚本。我想它没有,但我不知道还要寻找什么。我什至重新启动了 cron 守护进程。

我知道 StackOverflow 上有类似的问题,但没有一个答案对我来说是一个解决方案。这真的让我发疯了,我将非常感谢任何帮助。

【问题讨论】:

  • 这是在 Linux 还是类似的操作系统上?

标签: php command-line cron


【解决方案1】:

我找到了解决问题的方法:

https://serverfault.com/questions/97828/php-from-command-line-path-problems/97881#97881

原来我需要 cd(更改目录)进入脚本目录,然后调用它。令人惊讶的是,因为我使用的是绝对路径,但它确实有效。感谢那些花时间回复的人。

【讨论】:

    【解决方案2】:

    通常需要做很多事情才能将可执行文件从命令行移动到 cron 作业。

    默认情况下,cron 作业会获得一个最小的环境,它几乎肯定不会拥有您的登录会话所拥有的完整路径(以及许多其他环境变量)。您也可能不在同一个目录中(正如您所发现的那样)。

    我倾向于做的是执行:

    env | sed 's/^/export /' >$HOME/cron.env
    

    从登录会话获取完整环境,然后确保我的 cron 作业在尝试执行实际工作之前执行该脚本。生成的脚本可能需要进行少量整理(引用、删除瞬态环境变量,如 _ 和 PWD 等)。

    这样我可以确定登录和 cron 环境是相同的。

    【讨论】:

    • 你说得对,我确实必须在脚本本身中“重置”一些路径变量。
    【解决方案3】:

    您错过了running user 部分:

    * * * * * nobody  /usr/bin/php -q /var/www/myapp/services/myservice.php >> /mylog.log 2>&1
    

    【讨论】:

    • /etc/crontab 在我的 freebsd 和 ubuntu 盒子上告诉我。我不知道您是否可以在不指定正在运行的用户的情况下运行 crontab。但是,我总是做的是,设置谁应该运行脚本。
    【解决方案4】:

    这可能被认为是“不好的做法”,但它对我有用。

    用 curl 运行它

    * * * * * curl -s http://www.domain.com/services/myservice.php
    

    【讨论】:

    • 不管是不是坏习惯,我从来没有找到任何其他方法来做到这一点。特别是如果你想打 DB 之类的。必须为此付出一切。 (见 paxdiablo 的回答。)
    • 我特别不想使用 curl 有两个原因:1)它涉及 TCP/IP 和 Web 服务器开销,而此脚本不需要。 2) 我有一个受 htaccess 保护的开发环境,我不想在 curl 命令中发送纯文本密码。请在下面检查我自己的答案,我现在可以正常使用 cron 了 :)
    猜你喜欢
    • 1970-01-01
    • 2012-06-03
    • 2011-08-10
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    相关资源
    最近更新 更多