Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内存泄漏AWS S3 SDK PHP_Php_Amazon Web Services_Amazon S3 - Fatal编程技术网

内存泄漏AWS S3 SDK PHP

内存泄漏AWS S3 SDK PHP,php,amazon-web-services,amazon-s3,Php,Amazon Web Services,Amazon S3,我需要从S3存储桶下载数千张图片。我正在使用用于AWS S3的PHPSDK,但是我找不到一种方法来删除下载图像时使用的内存 $keyname = 'XXXXXXXXXX'; $bucket = 'XXXXXXXXXX'; $region = 'eu-west-1'; $credentials = new Aws\Credentials\Credentials('XXXXXXXXXX', 'XXXXXXXXXX');

我需要从S3存储桶下载数千张图片。我正在使用用于AWS S3的PHPSDK,但是我找不到一种方法来删除下载图像时使用的内存

        $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和$iddownloadeImage的set(),甚至执行$result['Body']->\uuu destruct(),但我仍然不知道为什么它会将图像存储在内存中

只有在脚本末尾强制执行gc_collect_cycles()才能释放内存。

从中,Amazon建议在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();
   }
]);

当您使用
SaveAs
选项调用
getObject
时,我怀疑PHP SDK是否在内存中保留了对象。它只是将对象直接流式传输到磁盘上的文件。您是否有内存泄漏的证据,特别是在AWS PHP SDK中?我认为发生的情况是,在我删除下载图像的文件夹的内容之前,图像的信息会保留在内存中,因为我正在进行测试。我想把它们分200块下载,然后复制到另一个目录,然后从我下载的目录中删除它们。目前,这似乎是唯一有效的方法,我不明白为什么将文件从磁盘上的一个位置移动到另一个位置会对PHP内存使用产生任何影响。也许您可以研究使用meminfo来确定随着时间的推移实际的内存使用情况?尝试识别泄漏的对象或循环引用。这并不完全是通过移动它们,而是通过将文件复制到另一个目录,然后删除SDK创建的文件。这就好像存储在内存中的信息被链接到了图像上。关于meminfo,我从来没有使用过它,也不知道如何提供有关它的信息。你需要用PHP来做这件事吗?有几种工具可以让您从S3存储桶下载大量内容,比如S3Browser。