0

我有一个在 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我们有一个打开文件的句柄,里面有响应。然后这个句柄被用来构造一个迭代器并遍历响应行。

4

0 回答 0