【问题标题】:Cron job is not running the php scriptCron 作业没有运行 php 脚本
【发布时间】:2018-06-11 01:41:56
【问题描述】:

我使用以下命令在我的 cpanel 中创建了一个 cron 作业:

/usr/bin/php -q /home/user/public_html/folder/subfolder/sync.php

syns.php 的内容差不多是这样的。当我使用 domain.com/folder/subfolder/sync.php 之类的域运行它时,它可以正常工作,但是当 cron 作业应该运行时我看不到预期的结果,这意味着 cron 作业没有运行脚本。那么谁能告诉我可能是什么问题?

<?php

$dir = str_replace("public_html","", $_SERVER["DOCUMENT_ROOT"]);
$dir = $dir . "configuration.php";

if (file_exists($dir)) 
{
    require_once($dir);
    sync();
} 
else
{
    // echo ("Can't find the access data.");
}

function sync()
{
    $connection = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
    if(mysqli_connect_errno())
    {
        // echo ("Failed to connect the database.");
        exit();
    }
    else
    {
        if(mysqli_ping($connection))
        {
            $query = "SELECT OR UPDATE WHATEAVER FROM TABLE;";
            $result = mysqli_multi_query($connection, $query);
            if($result)
            {
                // Do stuff
            }
            else
            {
                // echo("Failed to excute the query.");
            }
        }
        else
        {
            // echo("Failed to ping the connection.");
        }
    }
    mysqli_close($connection);
}

?>

【问题讨论】:

    标签: php cron


    【解决方案1】:

    $_SERVER['DOCUMENT_ROOT'] 由您的网络服务器(例如 Apache)在调用 PHP 之前创建。如果您通过 cronjob 运行脚本,您将绕过您的网络服务器,DOCUMENT_ROOT 将不存在。

    您应该以另一种方式确定配置文件的位置。一种方法是使用 PHP 的内置常量作为文件位置,例如 __FILE____DIR__

    $dir = __DIR__ . "/configuration.php";
    

    __DIR__ 指的是包含当前文件的文件夹,所以它会变成/home/user/public_html/folder/subfolder/configuration.php

    从你对$_SERVER['DOCUMENT_ROOT'] 的操作来看,我假设你的配置文件是public_html 的一个文件夹,所以你可以这样做:

    $dir = __DIR__ . "/../../../configuration.php";
    

    【讨论】:

    • 我更改了 $dir 但仍然没有。但它每次尝试运行时都会向我发送一封电子邮件,并且电子邮件显示“无法打开输入文件”。有什么建议吗?
    • 这听起来像是 bash 错误,而不是 PHP 错误。检查以确保 PHP 实际上在 /usr/bin/php 中,并在您的 cron 设置中仔细检查您的 sync.php 文件的完整路径。另外,您能否通过 SSH 连接到服务器并尝试从那里执行完整的命令?
    最近更新 更多