rmdir/unlink 无法通过 cron 工作

rmdir/unlink not working through cron

我写了一个 cron 作业,它将使用 DateTime.

删除日期早于 today - 14 days 的文件夹(及其中的文件)

在我的服务器上,如果我在网络浏览器中浏览到文件 (cleanup.php),它会正常删除文件夹和文件。

cron 作业运行是因为我得到了第一个 mail。我在想这是一个权限问题?谁能建议?

CRON 命令是 运行:

php /home/myUserName/public_html/file-transfer/uploads/cleanup.php

<?php
mail('myEmail@gmail.com','cron bon', 'cleanup starting');

date_default_timezone_set('America/Los_Angeles');

$ignore = array(
  '.',
  '..',
  '.htaccess',
  'cleanup.php'
);

function rrmdir($dir)
{
  if (is_dir($dir))
  {
    $objects = scandir($dir);
    foreach ($objects as $object)
    {
      if ($object != "." && $object != "..")
      {
        if (filetype($dir . "/" . $object) == "dir") rrmdir($dir . "/" . $object); else unlink($dir . "/" . $object);
      }
    }
    reset($objects);
    rmdir($dir);
  }
}

$today = DateTime::createFromFormat('m-d-Y', date('m-d-Y', strtotime('today')));
$dirs = scandir('./');

foreach ($dirs as $dir)
{
  if (!in_array($dir, $ignore))
  {
    $dirDate = DateTime::createFromFormat('m-d-Y', $dir);
    $interval = $dirDate->diff($today);

    if ($interval->format('%r%a') > 14)
    {
      rrmdir($dir);
    }
  }
}

mail('myEmail@gmail.com','cron bon', 'cleanup has ran');
?>

我不知道如何调试它,因为 cron 正在启动它

编辑

@SuperJer 最初在与 ./ 有关的问题上是正确的,我已经更新了我的代码,现在它正在作为 cron 作业工作。

<?php
date_default_timezone_set('America/Los_Angeles');

$ignore = array(
  '.',
  '..',
  '.htaccess',
  'cleanup.php'
);

$fullPath = dirname(__FILE__) . '/'; //-- Added this line and added it to my rrmdir function

function rrmdir($dir)
{
  if (is_dir($dir))
  {
    $objects = scandir($dir);
    foreach ($objects as $object)
    {
      if ($object != "." && $object != "..")
      {
        if (filetype($dir . "/" . $object) == "dir") rrmdir($dir . "/" . $object); else unlink($dir . "/" . $object);
      }
    }
    reset($objects);
    rmdir($dir);
  }
}

$today  = DateTime::createFromFormat('m-d-Y', date('m-d-Y', strtotime('today')));
$dirs   = scandir($fullPath);
$msg    = '';

foreach ($dirs as $dir)
{
  if (!in_array($dir, $ignore))
  {
    $dirDate  = DateTime::createFromFormat('m-d-Y', $dir);
    $interval = $dirDate->diff($today);
    if ($interval->format('%r%a') > 14) rrmdir($fullPath . $dir);
  }
}
?>

我认为问题可能是 php 在 apache 下和命令行(或 cron)下 运行 解析文件路径的方式不同。

如果您的应用程序允许,请不要使用 ./,而是使用完整路径,例如 /home/myUserName/public_html/file-transfer/uploads/

您还可以使用 dirname(__FILE__) 获取当前 运行 脚本的完整系统路径,这将使它更便携。

此外,这种差异也会影响 includerequire 路径。