我需要从S3存储桶下载数以千计的图像。我正在使用AWS S3的PHP,但我找不到一种方法来删除它在下载图像时使用的内存。
$keyname = 'XXXXXXXXXX';
$bucket = 'XXXXXXXXXX';
$region = 'eu-west-1';
$credentials = new Aws\Credentials\Credentials('XXXXXXXXXX', 'XXXXXXXXXX');
$s3 = new Aws\S3\S3Client([
'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()才能释放内存。
发布于 2020-08-25 06:25:46
在documentation中,亚马逊建议在before_upload事件上调用gc_collect_cycles。
以下是示例代码:
$uploader = new MultipartUploader($client, $source, [
'bucket' => 'your-bucket',
'key' => 'your-key',
'before_upload' => function(\Aws\Command $command) {
gc_collect_cycles();
}
]);https://stackoverflow.com/questions/60139157
复制相似问题