我有一个在Nginx + PHP-FPM上运行的服务器。上面有一个PHP脚本,它获取一个HTTP请求,并使用大量数据(让它为100K记录)对其进行响应,取自DB(MongoDB)。
按记录形成响应记录,每条记录后跟换行符并回显给客户端并立即刷新。
此处的客户端是类似平台上的另一台服务器。 CURL使用CURLOPT_FILE设置HTTP请求,因此我们不会尝试将所有数据存储在内存中。
文件中包含响应的某些行被破坏(它们包含大量NUL字节,后跟正常查看的数据)。这种情况发生在缝合随机响应线上,对于1K响应线约为一次。
如果有人向我暗示至少可能存在错误,我会很感激,所以我找到了解决方案。
此代码发送响应:
set_time_limit(self::TIME_LIMIT);
header('Content-Type: text/plain');
//clear the buffers
if (ob_get_level())
{
while (@ob_end_flush());
}
findAndProcessRecord($this->request, function(RecordClass $record) {
echo $this->packRecord($record) . "\n";
flush();
});
packRecord()
方法基本上加密数据,然后base64_encode()
s
此代码通过CURL发出请求:
$url = $project->apiUrl . '?' . http_build_query($requestParams);
$responseFile = fopen('php://temp', 'w+');
ini_set('memory_limit', self::MEM_LIMIT . 'M');
set_time_limit(self::TIME_LIMIT);
$curlResource = curl_init($url);
curl_setopt_array(
$curlResource,
[
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_TIMEOUT => self::CURL_TIMEOUT,
CURLOPT_RETURNTRANSFER => false,
CURLOPT_FILE => $responseFile,
CURLOPT_HEADER => false,
]
);
curl_exec($curlResource);
在$responseFile
中,我们有一个打开文件的句柄,里面有响应。然后,此句柄用于构造迭代器并遍历响应行。