我试图解决一个非常微不足道的问题,但是没有运气。
我希望在从PHP WebServer将文件上传到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(只是为了测试我的删除工作流程),该文件会被删除而没有任何问题。
请帮忙。!
答案 0 :(得分:3)
问题出现在https://github.com/aws/aws-sdk-php/issues/841
上尝试使用gc_collect_cycles()函数,它解决了我的问题。请参阅上面的页面以获得进一步的参考。
此致 安道尔
答案 1 :(得分:0)
也许您需要在php.ini中设置upload_max_filesize和post_max_size的值:
上传文件的最大允许大小。 upload_max_filesize = 40M
必须大于或等于upload_max_filesize post_max_size = 40M
修改php.ini文件后,需要重启HTTP服务器以使用新配置。
答案 2 :(得分:0)
如果其他人也坚持这一点,我将nginx服务器部署移至CentOS,并且没有发现此问题。
答案 3 :(得分:0)
waitUntil&#39; ObjectExists&#39;默认情况下有超时/最大尝试次数。
您可以使用以下方式进行更改:
$s3Client->waitUntil('ObjectExists', array(
'Bucket' => AWS_BUCKET_NAME,
'Key' => $file_name,
'waiter.interval' => 10,
'waiter.max_attempts' => 6
));