内存泄漏 AWS S3 开发工具包 PHP



我需要从 S3 存储桶下载数千张图像。我正在使用适用于 AWS S3 的 PHP 开发工具包,但找不到删除下载映像时使用的内存的方法。

$keyname = 'XXXXXXXXXX';
$bucket = 'XXXXXXXXXX';
$region = 'eu-west-1';
$credentials = new AwsCredentialsCredentials('XXXXXXXXXX', 'XXXXXXXXXX');
$s3 = new AwsS3S3Client([
'version' => 'latest',
'region'  => $region,
'credentials' => $credentials,
]);
$idDownloadedImages = array();
do {
$files = $this->check_new_images();
if ( !empty( $files ) ) {
foreach ( $files as $file ) {

$UrlMedia = basename( $file->UrlMedia );
$pathFile = $pathToPlugin . 'images/' . $UrlMedia;
$object = $keyname . $UrlMedia;
try {
// Get the object.
$result = $s3->getObject([
'Bucket' => $bucket,
'Key'    => $object,
'SaveAs' => $pathFile,
]);
//gc_collect_cycles();
//xdebug_debug_zval('result');
$idDownloadedImages[] = $file->idMedia;

} catch ( S3Exception $e ) {
$errorCode = '(Error Code: ' . $e->getStatusCode() . ') ' . $e->getAwsErrorMessage();

}
//unset($result);
$result['Body']->__destruct();
}
$idDownloadedImages = implode( ',', $idDownloadedImages );
$wpdb->query( 'UPDATE wp_icat_Media
SET error=0
WHERE idMedia IN (' . $idDownloadedImages .')' );
$idDownloadedImages = array();
}
} while ( $this->check_new_images() );

我试图在每次下载图像时强制PHP垃圾收集器,执行$result和$idDownloadedImages的set((,甚至执行$result['Body']->__destruct((,但我仍然不知道为什么它将图像存储在内存中。

只有通过在脚本末尾强制使用 gc_collect_cycles(( 来释放内存。

从文档中,亚马逊建议在before_upload事件上调用gc_collect_cycles。

下面是示例代码:

$uploader = new MultipartUploader($client, $source, [
'bucket' => 'your-bucket',
'key' => 'your-key',
'before_upload' => function(AwsCommand $command) {
gc_collect_cycles();
}
]);

相关内容

最新更新