我编写了一个PHP脚本,该脚本使用curl
发出HTTP POST请求,并执行以下操作:
准备发布变量
初始化卷曲
设置客户端Cookie以在请求中使用
将POST变量设置为查询字符串
设置其他卷曲选项
执行卷曲
这是代码:
$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,那么无论如何您都将首先需要完整的数据。