2017-05-05 152 views
0

我使用AWS PHP SDK将文件从我们的服务器移动到S3,移动后我想删除它们以节省我们服务器上的空间。但是当我尝试这样做时,我得到一个PHP警告:Text file busy in /path/to/filePHP - 移至AWS S3后删除本地文件 - 文本文件繁忙错误

如果我理解正确,我假设当我试图删除它时文件仍然被上传到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后删除一个目录或文件?

回答

0

要从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中,当你想删除一个目录时,你必须确保你删除了所有的co它包含的内容:文件,内部目录等。您必须从最深层次开始删除第一层。

+0

是的,这是我在做什么:'array_map('unlink',glob(“$ options ['dir'] /*.*”));'。这是失败的。 –

+0

@MP_Webby我用递归函数更新了我的答案,该函数删除目录中的目录和文件 –