PHP + S3:使用 unlink() 删除文件时权限被拒绝

PHP + S3: Permission denied while deleting a file using unlink()

我一直在尝试解决一个极其微不足道的问题,但一直没有成功。

我想在从 PHP Web 服务器上传到 AWS S3 后立即删除文件。以下是步骤:

//Upload file to S3 using PHP SDK's S3Client::putObject method:
$result = $s3_client->putObject( array(
                'Bucket' => AWS_BUCKET_NAME,
                'Key'    => $file_name,
                'SourceFile' => $file_path,
                'Metadata'   => array(
                    'metadata_field' => 'metadata_value'
                )
            ));

//Poll the object until it is accessible
$s3_client->waitUntil('ObjectExists', array(
    'Bucket' => AWS_BUCKET_NAME,
    'Key'    => $file_name
));

//Delete the file
unlink( $file_path );

如果我上传一个小文件 (~500KB),这些步骤非常有效。 但是,如果我上传更大的文件 (5MB-10MB),我会收到以下 错误

Warning: unlink(<Complete Path to File>): Permission denied in <Complete path to uploader.php> on line N

我正在 Windows 并尝试提升目录和文件的用户权限。 (使用 chmod、chown php 命令并确保该目录可写且可访问)

似乎 AWS S3 PutObject 方法没有释放文件句柄(仅针对大文件)。我也试过添加 sleep() 但不是运气。!

此外,如果我跳过将文件上传到 S3(只是为了测试我的删除工作流程),文件将被删除而不会出现任何问题。

请帮忙!

也许您需要在 php.ini 中设置 upload_max_filesize 和 post_max_size 的值:

;上传文件的最大允许大小。 upload_max_filesize = 40M

;必须大于或等于 upload_max_filesize post_max_size = 40M

修改 php.ini 个文件后,您需要重新启动 HTTP 服务器才能使用新配置。

为了防止其他人也卡在这个问题上,我将 nginx 服务器部署移到了 CentOS 并且没有观察到这个问题。

waitUntil 'ObjectExists' 默认有 timeout/max 次尝试。

您可以使用以下方式更改:

$s3Client->waitUntil('ObjectExists', array(
    'Bucket' => AWS_BUCKET_NAME,
    'Key'    => $file_name,
    'waiter.interval'     => 10,
    'waiter.max_attempts' => 6
));

问题已在 https://github.com/aws/aws-sdk-php/issues/841

上提出

尝试使用 gc_collect_cycles() 函数,它解决了我的问题。请参阅上面的页面以获取更多参考。

此致, 安多