如何在没有内存开销的情况下在PHP curl中发布大量数据?

时间:2015-09-17 09:49:44

标签: php post curl

我目前正在使用PHP curl扩展来与某些HTTP API进行通信。

我使用批量加载程序一次执行大量操作。必须使用POST方法调用批量端点,因此我使用如下代码:

<?php
$h = curl_init($url);
curl_setopt(CURLOPT_POST, true);
curl_setopt(CURLOPT_POSTFIELDS, $data);
curl_setopt(CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($h);
curl_close($h);

批量端点允许我发送大量数据(一次超过200Mo)。目前我需要在变量中加载数据,这需要PHP能够使用足够的内存......

我需要将memory_limit设置为高值,仅用于批量加载......

有没有办法使用文件流来发送带有curl PHP扩展的数据?我看到了CURLOPT_INFILECURLOPT_READFUNCTION,但它似乎无法使用POST方法......

我还看到curl命令行工具能够执行--data "@/path/to/file/content"这似乎是我需要的......

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

使用CURLOPT_INFILE

$curl = curl_init();
curl_setopt( $curl, CURLOPT_PUT, 1 );
curl_setopt( $curl, CURLOPT_INFILESIZE, filesize($tmpFile) );
curl_setopt( $curl, CURLOPT_INFILE, ($in=fopen($tmpFile, 'r')) );
curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, 'POST' );
curl_setopt( $curl, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json' ] );
curl_setopt( $curl, CURLOPT_URL, $url );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
$result = curl_exec($curl);
curl_close($curl);
fclose($in);