php - unlink throws error:资源暂时不可用

Abh*_*ddy 6 php amazon-s3 unlink

这是一段代码:

public function uploadPhoto(){
    $filename = '../storage/temp/image.jpg';  
    file_put_contents($filename,file_get_contents('http://example.com/image.jpg'));
    $photoService->uploadPhoto($filename);
    echo("If file exists: ".file_exists($filename));
    unlink($filename);
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试做以下事情:

  1. 从URL获取照片并将其保存在我的服务器的临时文件夹中.这很好用.创建图像文件并在If file exists: 1何时回显echo("If file exists: ".file_exists('../storage/temp/image.jpg'));.
  2. 将该文件传递给另一个将文件上传到Amazon s3存储桶的函数.该文件存储在我的s3存储桶中.
  3. 删除存储在临时文件夹中的照片.这不起作用!我收到一个错误说:

unlink(../ storage/temp/image.jpg):资源暂时不可用

如果我使用rename($filename,'../storage/temp/renimage.jpg');而不是unlink($filename);我得到一个错误:

重命名(../ storage/temp/image.jpg,../storage/temp/renimage.jpg):进程无法访问该文件,因为它正由另一个进程使用.(代码:32)

如果我删除函数调用$photoService->uploadPhoto($filename);,一切都很好.

如果该文件正由另一个进程使用,如何在完成该进程并且该文件不再被任何进程使用后如何取消链接?我不想使用计时器.

请帮忙!提前致谢.

Hue*_*Man 8

最简单的解决方案:

gc_collect_cycles();
unlink($file);
Run Code Online (Sandbox Code Playgroud)

对我有用吗!将文件上传到亚马逊 S3 后,它允许我直接删除服务器上的文件。

请参阅此处:https : //github.com/aws/aws-sdk-php/issues/841

GuzzleHttp\Stream 对象持有一个资源句柄,直到它的 __destruct 方法被调用。通常,这意味着一旦流超出范围就会释放资源,但有时,根据 PHP 版本以及脚本是否已填充垃圾收集器的缓冲区,垃圾收集可以推迟。gc_collect_cycles 将强制收集器运行并在所有无法访问的流对象上调用 __destruct。

:)


小智 7

只是不得不处理类似的错误。

似乎您$photoService出于某种原因保留了图像......由于您没有共享 的代码$photoService,我的建议是做这样的事情(假设您不再需要$photoService):

[...]
echo("If file exists: ".file_exists($filename));
unset($photoService);
unlink($filename);
}
Run Code Online (Sandbox Code Playgroud)

unset()方法将销毁给定的变量/对象,因此它不能“使用”(或无论它做什么)任何文件。