簡體   English   中英

內存泄漏 AWS S3 SDK PHP

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM