【问题标题】:PHP: rename() fails silently but returns truePHP:rename() 静默失败但返回 true
【发布时间】:2016-04-26 14:20:49
【问题描述】:

我有一个在服务器上执行的脚本。 此脚本重命名文件以将其移动到嵌套目录。

脚本位于: /var/www/vhosts/XXXXX/httpdocs/XXXXX/import_export/orders

该文件应该被移动并重命名为: /var/www/vhosts/XXXXX/httpdocs/XXXXX/import_export/orders/backup

备份目录的权限为 755

这是我的代码:

$now = time();
$dateString = date('d-m-Y', $now);
$newFileName = '/var/www/vhosts/XXXXX/httpdocs/XXXXX/import_export/orders/backup/orders-' . $dateString . '.csv';
$result = rename('orders.csv', $newFileName);
var_dump($result);

此代码返回 true,但文件仍然存在于源文件夹中,并且尚未移动到备份文件夹中。

如果我在本地主机上执行脚本,重命名和移动就可以了。

怎么了?

【问题讨论】:

  • 注意:$now 业务毫无意义。如果您不提供时间值,date() 默认使用“现在”。
  • 您是否尝试过为 orders.csv 指定完整路径?
  • 当您询问有关错误的问题时,总是,发布错误日志。要为您的 php 代码启用错误报告,请在脚本顶部附加 error_reporting(E_ALL); ini_set('display_errors', '1');,它会返回什么?
  • 您是服务器的所有者吗?并且您是否有权通过运行代码来移动文件。我认为它的权限问题。

标签: php rename


【解决方案1】:

您应该尝试在两个参数中提供完整路径,例如

$basePath = '/var/www/vhosts/XXXXX/httpdocs/XXXXX/import_export/orders';
$currentFileName = $basePath . '/order.csv';
$newFileName = $basePath . '/backup/orders-' . $dateString . '.csv';
$result = rename($currentFileName, $newFileName);

【讨论】:

  • 最好包含一个代码示例或更深入地解释您认为如何解决问题。否则您的答案可能会被标记为低质量。
【解决方案2】:

最好事先使用file_exists()is_writable() 进行一些安全检查,如下所示。如果rename() 返回false,您还可以使用error_get_last() 显示错误,如下所示:

if (!rename('orders.csv', $newFilename)) {
  $error = error_get_last();
  // TODO: DO something with $error
}

【讨论】:

    【解决方案3】:

    PHP: rename() 静默失败,但返回 true

    设置error_reporting(E_ALL);ini_set('display_errors', '1'); 以便正确调试您的脚本,即:

    <?php
    //comment on production mode
    error_reporting(E_ALL);
    ini_set('display_errors', '1');
    // the rest of the code...
    

    您的rename 块似乎缺少原始文件的完整路径,而且date 块是冗余。您可能想在使用rename() 之前检查目标目录is _writable(),这就是我要做的:

    <?php
    date_default_timezone_set( "Europe/Lisbon" ); // Set the default timezone to avoid warnings
    $dateString = date('d-m-Y'); // no neeed for $now here, it's redundant
    $destDir = "/var/www/vhosts/XXXXX/httpdocs/XXXXX/import_export/orders/backup/";
    $destFn = "orders-{$dateString}.csv";
    if(is_writable($destDir)){ //check if the destination dir is writable
       $result = rename('/full/path/to/orders.csv', $destDir.$destFn); // we need to set the full path of "orders.csv"
       var_dump($result);
    }else{
        echo "destination dir not writable";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 2017-01-10
      相关资源
      最近更新 更多