PHP:我可以使用内置的curl函数通过gunzip传递curl输出吗?

时间:2019-04-18 12:22:17

标签: php curl libcurl php-curl

我正在研究一个脚本,该脚本下载大文件,将其解压缩,然后解析内容,然后将我喜欢的数据插入sql。我已将该脚本升级为以多线程类型的方式工作,它可以下载一个文件,解压缩另一个文件并一次解析另一个文件。但可惜,我的硬盘驱动器已成为瓶颈。

##php的帮助下,我意识到我可以使用以下命令将curl的输出直接传递到gunzip以将磁盘的I / O减少一半(不包括SQL) :

  

卷曲https://example.com/path/to/large_file.gz | gunzip -c> / large_temp_files / large_file

经过测试并确认,该方法将未压缩的数据直接写入磁盘,而无需先写入压缩的数据。

所以我的问题是,有什么方法可以使用curl函数中的php构建类似的数据?

对于常规文件,您可以打开文件指针并将该指针设置为curl_setopt选项之一,以将文件下载到磁盘,而不是将数据设置为变量。

这些是5 GB的文件,因此无法正常工作。我所有其他代码都对HTTP请求使用了内置函数,因此,如果可能,我会坚持这样做,以确保一致性和可读性。

1 个答案:

答案 0 :(得分:1)

我尚未对此进行实际测试,但我认为可以通过将自定义CURLOPT_WRITEFUNCTION与inflate_init()&co结合使用来实现,例如

$decompressor = inflate_init(ZLIB_ENCODING_DEFLATE);
$fp = fopen("decompressed", "wb");
$ch = curl_init("http://url.com/large_file.zip");
curl_setopt_array($ch, array(
    CURLOPT_WRITEFUNCTION => function ($ch, string $compressed) use (&$fp, &$decompressor) {
        fwrite($fp, inflate_add($decompressor, $compressed));
        return strlen($compressed);
    }
));
curl_exec($ch);
curl_close($ch);
fclose($fp);
unset($fp,$ch,$decompressor); // don't know how to clean up the decompressor, hopefully GC will do it.

btw如果您真的想花哨的话,可以直接从deflate_add()调用中解析数据并将其插入到SQL数据库中,而无需将解压缩后的数据写入磁盘,这可能会更快(与读取相比)从硬盘驱动器读取RAM是 VERY 快:))