PHP 当我从 VS 代码提供页面时,header() 重定向有效,但当我从 cron 作业或 Cli 触发脚本时无效

PHP header() redirect is working when I serve the page from VS code, but not when I fire the script from a cron job or a Cli

我有一个简单的 PHP 脚本,它查询 MySQL 数据库并在满足条件(到期时间戳)时从上传文件夹中删除(取消链接)文件。然后它重定向到另一个 PHP 脚本。我已经为 运行 第一个脚本自动设置了一个 cron 作业,这工作正常并从上传文件夹中删除需要的文件,但是当我的 if-else 语句被触发时它不会重定向。如果我手动将文件路径粘贴到浏览器,脚本 运行s 会按照我的预期删除和重定向。 (如果我从 CLI 运行 PHP 文件也不会重定向)。任何帮助将不胜感激。

include_once 'db.php';

date_default_timezone_set("Asia/Bangkok");
$date = date('Y-m-d H:i:s');
$sql = "SELECT name FROM files WHERE expiry <= '$date'";
$result = mysqli_query($conn, $sql);

if (!$result) {
    echo('Could not get data: '.mysqli_error());
}
while ($row = mysqli_fetch_array($result)) {
    $delete = ("assets/uploads/{$row['name']}");
    if (file_exists($delete)) {
        unlink($delete);
    } else {
        header("Location: expire.php", 
            true, 301);
        exit();
    }
}

mysqli_close($conn);

header 函数仅发出一个 HTTP 响应 header,以便在脚本结束时发送回客户端。显然,这仅在 HTTP 请求的上下文中才有意义。

再次希望 self-evident 运行通过 CLI 或 cron 运行脚本不是 HTTP 上下文。因此,发出任何类型的响应 header,例如 Location,都不会产生任何影响。请记住,您通常在网站上看到的那种重定向实际上是由浏览器 完成的 - 服务器只是告诉浏览器(通过位置 header)它希望浏览器到哪里下一步。

在您的 CLI/cron 情况下,如果您想 运行 另一个脚本,一个选择就是 require 它,例如

else {
   require "expire.php";
   exit();
}

这意味着它将作为当前脚本的延续执行。