我有一个在 Nginx + PHP-FPM 上运行的服务器。上面有一个 PHP 脚本,它获取一个 HTTP 请求并使用从 DB (MongoDB) 获取的大量数据(假设是 10 万条记录)对其进行响应。
响应是逐条记录形成的,每条记录后跟换行符并回显给客户端并立即刷新。
这里的客户端是类似平台上的另一台服务器。HTTP 请求是由设置了 CURLOPT_FILE 的 CURL 发出的,因此我们不会尝试将所有数据存储在内存中。
文件中包含响应的某些行已损坏(它们包含大量 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
我们有一个打开文件的句柄,里面有响应。然后这个句柄被用来构造一个迭代器并遍历响应行。