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選項,計量單位是位元組,可以通過如下方式來設定:
curl_setopt($ch, CURLOPT_RANGE, '0-799');
但是這個不一定管用的,它只是發送了一個要求標頭,具體如何返回資料還是由發送方決定的,如果發送方支援分區返回則會生效,否則還是完整返回。通過stream也可以實現,也是發送range的頭資訊,所以結果應該是一樣的:
$context = stream_context_create(array('http' => array ('header'=> 'Range: bytes=0-799')));$data = file_get_contents("http://example.com/file.html", FALSE, $context);
關於range header的rfc文檔:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35
可以這樣..不過每次讀取,有可能會超過你規定的數值,判斷一下就好了.
$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;
根據你只想取得頁面 title 的需求,使用 file_get_contents 函數是不是更合適?
$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);</code></pre>