[英]Memory leaks AWS S3 SDK PHP
我需要從 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() 才能釋放內存。
從文檔 中,亞馬遜建議在 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();
}
]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.