首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存泄漏AWS S3 SDK PHP

内存泄漏AWS S3 SDK PHP
EN

Stack Overflow用户
提问于 2020-02-10 01:12:24
回答 1查看 485关注 0票数 0

我需要从S3存储桶下载数以千计的图像。我正在使用AWS S3的PHP,但我找不到一种方法来删除它在下载图像时使用的内存。

代码语言:javascript
复制
        $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()才能释放内存。

EN

回答 1

Stack Overflow用户

发布于 2020-08-25 06:25:46

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

以下是示例代码:

代码语言:javascript
复制
$uploader = new MultipartUploader($client, $source, [
   'bucket' => 'your-bucket',
   'key' => 'your-key',
   'before_upload' => function(\Aws\Command $command) {
      gc_collect_cycles();
   }
]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60139157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档