gpt4 book ai didi

php - 处理大 curl 响应 - PHP

转载 作者:行者123 更新时间:2023-12-04 15:52:56 26 4
gpt4 key购买 nike

我编写了一个 PHP 脚本,它使用 curl 发出 HTTP POST 请求并执行以下操作,

  • 准备后变量
  • 初始化 curl
  • 设置客户端 cookie 以在请求中使用
  • 将 POST 变量设置为查询字符串
  • 设置其他 curl 选项
  • 执行 curl

代码如下:

    $ch = curl_init ( $url );

curl_setopt ( $ch, CURLOPT_COOKIE, "cookie=cookie");
curl_setopt ( $ch, CURLOPT_POST, 1);
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_string);
curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ( $ch, CURLOPT_HEADER, 0);
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec( $ch );
// this point
extr ( $response, $param_1, $param_2);

问题是,有时响应大于 1GB,因此 PHP 代码暂停,直到收到完整的响应(在代码中显示为 //this point),如果有格式错误的 HTML 接收, PHP 会产生错误,这里的所有事情都需要从头开始。

这里是其余的功能:

function extr($string = '',$a,$b)
{
$doc = new DOMDocument;
@$doc -> loadHTML($string);
$table = $doc -> getElementById('myTableId');

if(is_object($table)):
foreach ($table->getElementsByTagName('tr') as $record)
{
$rec = array();
foreach ($record->getElementsByTagName('td') as $data)
{
$rec[] = $data -> nodeValue;
}
if ($rec)
{
put_data($rec);
}
}
else:
{
echo 'Skipped: Param1:'.$a.'-- Param2: '.$b.'<br>';
}
endif;
}

function put_data($one = array())
{
$one = json_encode($one) . "\n";
file_put_contents("data.json", $one, FILE_APPEND);
}

ini_set('max_execution_time', 3000000);
ini_set('memory_limit', '-1');

我能想到的替代方案是在收到数据时处理数据,如果可能的话,使用 curl,或者从之前的状态继续之前的 curl 请求。

是否有任何可能的解决方法?

我需要为此切换到 PHP 以外的任何其他语言吗?

最佳答案

您可以使用带有回调的 CURLOPT_WRITEFUNCTION 选项来分块处理数据:

curl_setopt($ch, CURLOPT_WRITEFUNCTION, function(&$ch, $data) {
echo "\n\nchunk received:\n", $data; // process your chunk here
return strlen($data); // returning non-positive number aborts further transfer
});

正如评论中已经提到的那样,如果您的响应内容类型是您正在加载到 DOMDocument 中的 HTML,无论如何您首先需要完整的数据。

关于php - 处理大 curl 响应 - PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30334827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com