内存泄漏AWS S3 SDK PHP
我需要从S3存储桶下载数千张图片。我正在使用用于AWS S3的PHPSDK,但是我找不到一种方法来删除下载图像时使用的内存内存泄漏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');
$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。