【问题标题】:set up Cron job to run PHP script设置 Cron 作业以运行 PHP 脚本
【发布时间】:2015-09-21 19:03:00
【问题描述】:

我知道以前有人问过这个问题,但没有一个答案对我有用。 我试图在每晚午夜运行一个简单的 PHP 脚本。我创建了一个名为“autoDelete.php”的文件,其中仅包含以下代码:

<?php 
  include 'my-database-connection.php';
  mysql_query("DELETE FROM meetings WHERE indexDate < NOW()");
?>

我知道这个脚本正在运行,因为如果我在浏览器中导航到它,它会做它应该做的。

然后我将 Cron 作业(通过 GoDaddy cPanel)设置为每分钟运行一次,并使用以下命令运行脚本:

* * * * /usr/bin/php -q /home/username/public_html/autoDelete.php

但是,这不起作用。我怀疑这与命令中“/home”之前的任何内容有关。

【问题讨论】:

    标签: php cron


    【解决方案1】:

    需要检查的一些事项:

    1) cron 作业的默认“工作目录”是他们正在运行的用户 ID 的主目录。在这种情况下,这很可能是/home/username。这意味着如果您有任何相对路径的include/require 命令,它们将与/home/username 相关,而不是/home/username/public_html。确保所有必要的文件都可以访问。

    2) 您只是假设查询调用成功。那是完全错误的做法。对外部资源(尤其是数据库)的调用只有一种成功的方法,而失败的方法几乎是无限的。始终检查失败,并将成功视为惊喜。

    结合这两者(未能包含您的连接脚本,并且未能检查失败),您最终会得到您所拥有的:“什么都没有”发生。至少尝试类似

    mysql_query(...) or die(mysql_error());
                    ^^^^^^^^^^^^^^^^^^^^^^
    

    错误消息将成为您脚本的输出,并通过电子邮件发送到控制帐户的邮箱。

    【讨论】:

    • OK Marc,我添加了“mysql_error”行。这是命令行:/usr/bin/wget /home/cPanel-username/public_html/admin/autoDelete.php 这是错误消息:/home/cPanel-username/public_html/admin/autoDelete.php:缺少方案.
    【解决方案2】:

    我过去在尝试直接调用 PHP 二进制文件时,在 cron 作业中运行 PHP 脚本时遇到过问题。我的解决方案是在 cron 作业中使用 wget,因为无论如何 Apache 都可以使用该脚本(0 0 * * * wget url/of/script.php)。 Apache 已经设置了正确的 PHP 环境,所以不妨让它来处理这项工作。

    【讨论】:

    • 我确实尝试过“wget”——当我每分钟运行一次 cron 时它确实有效。但是当我将它调整为比每分钟更长的时间时 - 它不起作用!我什至有一个 GoDaddy 技术检查它。他们不是很有帮助(因为,平心而论,这超出了他们愿意支持的范围)——除了建议我应该使用“php -q”。
    • 这没有意义。如果它适用于每分钟一次的间隔,它也应该适用于每天一次的间隔。日常工作是不是这样:0 0 * * * wget /url/of/script.php?
    • 字符串末尾没有问号。这是我所拥有的: wget /home/username/public_html/admin/autoDelete.php
    • 大声笑,这不是工作的一部分。如果它看起来完全一样,那么它应该工作。与确实有效的工作完全相同,但间隔不同。您是否尝试过与午夜稍有不同的时间,也许是凌晨 1 点? GoDaddy 的托管可能有些奇怪。我从不将它们用于任何事情。
    • 我每 30 分钟和每 5 分钟尝试一次 - 除了每分钟,基本上没有任何效果。再一次 - 技术也有点神秘,但她自己的工作没有问题,所以假设我的代码很糟糕。