Heim  >  Artikel  >  Backend-Entwicklung  >  libcurl - php的curl里面在获取页面html数据的时候能指定获取的字节数吗?

libcurl - php的curl里面在获取页面html数据的时候能指定获取的字节数吗?

WBOY
WBOYOriginal
2016-06-06 20:46:091151Durchsuche

RT
本来用的 fopen + fread($fp,读取字节数) 获取数据 SAE 不支持 就想改为curl
我只需要匹配出来title的值就行 去文件的前 800字节就ok了,curl参数众多,不知道该设置哪个。
毕竟获取整个html文件会消耗大量时间,只要前800字节就行,这样应该会节省点时间吧,我用microtime 测试出来的时间差别不大但是还是有差别的

回复内容:

RT
本来用的 fopen + fread($fp,读取字节数) 获取数据 SAE 不支持 就想改为curl
我只需要匹配出来title的值就行 去文件的前 800字节就ok了,curl参数众多,不知道该设置哪个。
毕竟获取整个html文件会消耗大量时间,只要前800字节就行,这样应该会节省点时间吧,我用microtime 测试出来的时间差别不大但是还是有差别的

cURL有一个range选项,计量单位是字节,可以通过如下方式来设定:

<code>curl_setopt($ch, CURLOPT_RANGE, '0-799');
</code>

但是这个不一定管用的,它只是发送了一个请求头,具体如何返回数据还是由发送方决定的,如果发送方支持分片返回则会生效,否则还是完整返回。通过stream也可以实现,也是发送range的头信息,所以结果应该是一样的:

<code>$context = stream_context_create(array('http' => array ('header'=> 'Range: bytes=0-799')));
$data = file_get_contents("http://example.com/file.html", FALSE, $context);
</code>

关于range header的rfc文档:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35

可以这样..不过每次读取,有可能会超过你规定的数值,判断一下就好了.

<code class="lang-php"><?php error_reporting(E_ALL);

$data = '';
$url = 'http://segmentfault.com/q/1010000000482129';

$ch = curl_init();
curl_setopt_array($ch, array(
    CURLOPT_URL => $url,
    CURLOPT_WRITEFUNCTION => 'receivePartial', 
));
curl_exec($ch);
curl_close($ch);

function receivePartial($ch, $chunk) {
    global $data;
    $data .= $chunk;

    $len = strlen($chunk);
    echo 'had receive ', $len, ' bytes', PHP_EOL;
    //判断每次读取,如果总数大于1000,就不再往下读了.
    if (strlen($data) >= 1000) {
        return -1;
    }    
    //返回值是告知CURL,是否已够了,要不要再读啦.
    return $len;
}

echo $data;
</code>

根据你只想取得页面 title 的需求,使用 file_get_contents 函数是不是更合适?

<code>$content = file_get_contents('http://www.baidu.com',  false, null, -1, 800);

if(mb_detect_encoding($content) == 'GB2312')
    $content = iconv('GB2312', 'UTF-8', $content);

preg_match("/<title>.*/", $content, $title);
</title></code>
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:一个mysql多表查询的问题Nächster Artikel:php 静态方法问题