【问题标题】:What would cause unlink to return 'Resource Temporarily Unavailable'?什么会导致取消链接返回“资源暂时不可用”?
【发布时间】:2018-02-08 13:01:49
【问题描述】:

我想创建一个 .zip 存档,将其上传到 Amazon S3,然后从服务器中删除创建的 .zip。步骤 1 和 2 运行良好,但删除步骤正在返回:

unlink(temp/file.zip): Resource temporarily unavailable

我已经尝试unset所有相关的变量和资源,但我仍然收到错误。

代码如下:

$zipFile = 'temp/file.zip';

// create the zip archive:
$z = new \ZipArchive();
$z->open($zipFile, \ZipArchive::CREATE);
$z->addEmptyDir('testdirectory');

// add a file
$filename = 'fileName.txt';
$content = 'Hello World';
$z->addFromString('testdirectory/' . $filename, $content);
$z->close();

// upload to S3
$s3 = AWS::createClient('s3');
$result = $s3->putObject(array(
    'Bucket'        =>  'my-bucket-name',
    'Key'           =>  basename($zipFile),
    'SourceFile'    =>  $zipFile
));

// check to see if the file was uploaded
if ($result['@metadata']['statusCode'] == "200") {
    $uploaded = true;
}

// delete the temp file
if ($uploaded) {
    unset($result);
    unset($s3);
    unset($z);
    if (file_exists($zipFile)) {
        unlink($zipFile);
    }
}

一些额外的细节:我正在使用 Lumen 5.4 和 aws-sdk-php-laravel 包。

任何见解将不胜感激!谢谢。

【问题讨论】:

  • $z->close() 返回的是什么?它返回一个bool。检查是否关闭成功。
  • $z->close(); 返回bool(true)
  • 奇怪。我测试了代码(没有 S3),它对我有用。棘手的一个。您能否在没有 S3 代码的情况下运行脚本,看看是否可行。
  • 在没有 S3 的情况下运行它,它按预期工作。必须与 s3 客户端有关。将继续调试。谢谢。
  • 原来这是一个 Windows 问题。在 Mac 上运行相同的代码没有任何问题,并且文件被正确删除。

标签: php amazon-s3 php-zip-archive


【解决方案1】:

S3 正在持有资源,因此我们必须强制清除 gc(垃圾收集器)。

只需在删除该文件之前执行gc_collect_cycles()

【讨论】:

  • 在我的情况下没有帮助(PHP 7.1)。
  • 在我的案例中有所帮助(PHP 7.1.1)
  • 这解决了我在 PHP 版本 7.2.11 上的问题。有关收集 cyles 的更多信息,请访问此处collecting-cycles
猜你喜欢
  • 2020-06-10
  • 2012-12-31
  • 1970-01-01
  • 2017-08-23
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2019-11-11
相关资源
最近更新 更多