我试图按照这些帖子中的建议限制我的cURL响应:Retrieve partial web page和PHP CURLOPT_WRITEFUNCTION doesn’t appear to be working.我们的想法是将响应限制为回调函数中指定的4000个字符.
我编写了以下函数,但我已经知道它没有意义,因为回调函数定义中的参数在循环内不会像在函数调用中那样变化.到实际调用函数时,$key的值是固定的,因此我对该索引的引用不会改变.
似乎我需要为每个循环创建一个新的闭包函数,每个循环都需要引用它自己的$full_length变量.但是,我不明白这是怎么可能的.为了做到这一点,似乎我必须以某种方式引用闭包对象以指定特定的$full_length变量.
任何帮助,将不胜感激.谢谢.
function get_headers($urls){
$curly = array();
$result = array();
$mh = curl_multi_init();
$obj = $this;
foreach ($urls as $key => $url) {
$this->full_length[$key] = 0;
$callback = function ($ch, $string) use ($obj, $key){
$length = strlen($string);
$obj->full_length[$key] += $length;
if($obj->full_length[$key] >= 4000){
return -1;
}
return $length;
};
$curly[$key] = curl_init
curl_setopt($curly[$key], CURLOPT_URL, $url);
curl_setopt($curly[$key], CURLOPT_HEADER, 0);
curl_setopt($curly[$key], CURLOPT_WRITEFUNCTION, $callback);
curl_setopt($curly[$key], CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($mh, $curly[$key]);
}
$running = null;
do {
curl_multi_exec($mh, $running);
} while($running > 0);
foreach($curly as $key => $cnt) {
$content = curl_multi_getcontent($cnt);
curl_multi_remove_handle($mh, $cnt);
if (strlen($content) > 0){
$result[$key] = $content;
} else {
curl_multi_close($mh);
return FALSE;
}
}
curl_multi_close($mh);
return $result;
}
编辑:
我发现了一篇确实正在尝试做的帖子,但它是在javascript中:
closure inside a for loop – callback with loop variable as parameter .我编写了以下函数来尝试在PHP中执行相同的操作:
function get_write_function($key){
$this->full_length[$key] = 0;
$obj = $this;
$funky = function ($ch, $str) use ($obj, $key){
$length = strlen($str);
$obj->full_length[$key] += $length;
if($obj->full_length[$key] >= 4000){
return -1;
}
return $length;
};
return $funky;
}
代码运行没有错误,但它仍然没有做我想要的.关闭我的cURL句柄后,我转储了$full_length数组,它只显示:
array([0] => 0, [1] => 0)
这表明它们是由get_write_function初始化的(因为我没有初始化类声明中的任何内容),但之后的值从未更新过.
解决方法:
我终于搞清楚了.最大的问题是cURL忽略了WRITEFUNCTION,直到我把它作为指定的最后一个选项,我在这里发布:cURL WRITEFUNCTION not Being Called.我实际上不需要返回传输,因为我将输出写入类变量.这是必要的,因为当回调返回-1时,不会返回任何内容.以下代码非常有用:
var $full_length = array();
var $result = array();
function get_headers($urls){
$curly = array();
$mh = curl_multi_init();
foreach ($urls as $key => $url) {
$callback = $this->get_write_function($key);
$curly[$key] = curl_init
curl_setopt($curly[$key], CURLOPT_URL, $url);
curl_setopt($curly[$key], CURLOPT_HEADER, 0);
curl_setopt($curly[$key], CURLOPT_WRITEFUNCTION, $callback);
curl_multi_add_handle($mh, $curly[$key]);
}
$running = null;
do {
curl_multi_exec($mh, $running);
} while($running > 0);
foreach($curly as $key => $cnt) {
curl_multi_remove_handle($mh, $cnt);
}
curl_multi_close($mh);
return $this->result;
}
function get_write_function($key){
$this->full_length[$key] = 0;
$this->result[$key] = '';
$obj = $this;
$funky = function ($ch, $str) use ($obj, $key){
$obj->result[$key] .= $str;
$length = strlen($str);
$obj->full_length[$key] += $length;
if($obj->full_length[$key] >= 4000){
return -1;
}
return $length;
};
return $funky;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。