Утечки памяти AWS S3 SDK PHP - PullRequest
0 голосов
/ 09 февраля 2020

Мне нужно загрузить тысячи изображений из корзины S3. Я использую PHP SDK для AWS S3, но не могу найти способ удалить память, используемую при загрузке изображений.

        $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 и даже сделать $ result ['Body'] -> __ destruct (), но я до сих пор не знаю, почему он хранит изображения в памяти.

Память освобождается только путем принудительного выполнения gc_collect_cycles () в конце скрипта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...