php - 如何有效地处理cURL在POST中发送大型json数据?

时间:2017-10-12 11:00:42

标签: php json curl

以下是该方案。有一种从DB表中获取156000行的方法。 我需要将此数据发送到另一个php文件,该文件使用phpexcel将其转换为Excel文件。

以下是curl发布请求的代码。

if($_SERVER['SERVER_NAME'] === 'localhost'){
        $domain = $_SERVER['REMOTE_ADDR'].':'.$_SERVER['SERVER_PORT'];
    }else{
        $domain = $_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'];
    }
    $prefix = $_SERVER['HTTPS'] ? 'https://' : 'http://';
    $relative   = '/rest/ExportExcelCsv.php';
    error_log($prefix.$domain.$relative);

    // converting array of returned rows into json
    $postData = json_encode($utilDataArray['tableData']);       

    $defaults = array(             
        CURLOPT_URL => $prefix.$domain.$relative, 
        CURLOPT_HEADER => 0, 
        CURLOPT_RETURNTRANSFER => TRUE, 
        CURLOPT_TIMEOUT => 500,
        CURLOPT_PROXY => "<proxy_url>",
        CURLOPT_PROXYPORT => 80,
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => array('data' => $postData)
    );

    $ch = curl_init(); 
    curl_setopt_array($ch, ($defaults));
    // curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
    // curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

    $result = curl_exec($ch);
    if( !$result ) 
    { 
        trigger_error(curl_error($ch)); 
    }
    var_dump($result);

    curl_close($ch);

在一个声明中,CURLOPT_POSTFIELDS => array('data' => $postData),我在一个包含关键数据的数组中传递postData,因为ExportExcelCsv.php以json_decode($_POST['data'], true)的格式获取后期数据。

第一个问题是“POST Content-Length”的大小。所以,我在两个php文件中都使用语句ini_set('post_max_size', '100M'); ini_set('upload_max_filesize', '100M');来增加它。它仍然没有用。帖子内容的大小几乎是42MB。

如何在curl post请求中发送如此大的json数据?如何有效地处理它?无论如何以块的形式发送数据?如果是,那么如何在生成excel文件时处理该数据呢?

1 个答案:

答案 0 :(得分:0)

首先,post_max_sizeupload_max_filesize需要位于.htaccess,vhost或php.ini中,而不是ini_set。必须在脚本开始之前设置这些以及一些其他ini值。

您还可以通过首先将json数据转储到文本文件并通过curl发送文件而不是直接发送数据来简化过程。关于如何通过curl发送文件的书面答案可以在这里找到:https://stackoverflow.com/a/15200804/4027341