【问题标题】:PHP - Delete local file after moving to AWS S3 - Text File Busy ErrorPHP - 移动到 AWS S3 后删除本地文件 - 文本文件忙错误
【发布时间】:2017-10-04 00:19:24
【问题描述】:

我正在使用 AWS PHP SDK 将文件从我们的服务器移动到 S3,在它们被移动后,我想删除它们以节省我们服务器上的空间。但是当我尝试这样做时,我会收到一个 PHP 警告:Text file busy in /path/to/file

如果我理解正确,我假设在我尝试删除文件时该文件仍在上传到 S3。我已经为 S3 寻找某种回调,例如 uploadComplete,但找不到任何东西。

这是我的代码示例:

  //Upload dir:
  $result = false;

  try{
      $result = $this->aws['s3']->uploadDirectory(
        $options['dir'],
        $options['bucket'],
        $options['key'], array(
        'before' => function(\AWS\Command $command){
                $command['ACL'] = 'public-read';
        })
      );    
   } catch (S3Exception $e) {
      error_log('AWS ERR, failed to add object to bucket: '.$e->getMessage());
   }

  if ($result) {       
    //remove local copy
    array_map('unlink', glob("$options['dir']/*.*"));
    rmdir($options['dir']);        
  }

那么,如何在上传到 S3 后删除目录或文件?

【问题讨论】:

    标签: php amazon-web-services amazon-s3 unlink


    【解决方案1】:

    要从 php 中删除目录,您必须递归删除每个文件和内部目录。 或exec("rm -rf directory_path"); 但要小心这个

    后期编辑:

    当我想删除一个目录时,我总是使用递归函数:

    /**
     * @param string $path
     * 
     * @return void
     */
    function recursiveRemove($path)
    {
        if (file_exists($path) === false) {
            return;
        }
        if (is_file($path)) {
            unlink($path);
            return;
        }
    
        $files = scandir($path);
    
        foreach ($files as $item) {
            if ($item === '.' || $item === '..') {
                continue;
            }
    
            $fullPath = $path . '/' . $item;
    
            if (is_dir($fullPath)) {
                recursiveRemove($fullPath);
            }
    
            if (is_file($fullPath)) {
                unlink($fullPath);
            }
        }
    
        rmdir($path);
    }
    

    用法:

    recursiveRemove('/path/to/directory');
    

    在 PHP 中,当你想删除一个目录时,你必须确保你删除了它所有的内容:文件、内部目录等。你必须从最深层次开始删除。

    【讨论】:

    • 是的,这就是我正在做的事情:array_map('unlink', glob("$options['dir']/*.*"));。正是这条线失败了。
    • @MP_Webby 我用递归函数更新了我的答案,该函数删除了目录中的目录和文件
    【解决方案2】:

    在删除文件之前,尝试调用:

    gc_collect_cycles();
    

    【讨论】:

      猜你喜欢
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 2023-04-02
      • 2022-01-01
      • 2015-12-27
      • 1970-01-01
      • 2017-05-25
      相关资源
      最近更新 更多