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

时间:2015-06-18 15:01:43

标签: php amazon-web-services amazon-s3 unlink

我试图解决一个非常微不足道的问题,但是没有运气。

我希望在从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(只是为了测试我的删除工作流程),该文件会被删除而没有任何问题。

请帮忙。!

4 个答案:

答案 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
));