PHP API的大响应被破坏了

时间:2013-08-29 12:18:55

标签: http curl nginx php

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

0 个答案:

没有答案