php抓取之fread結束判斷

2021-08-30 05:59:05 字數 1194 閱讀 7969

楠哥給了個程式,不知道為什麼用fsocket鏈結,然後用fread或fgets讀資料,每一步都是跟手冊一致,但是feof總是沒有辦法正確判斷已經到檔案尾部,必須要等到超時才推出……所以速度超級慢……

構造頭部部分及鏈結部分手冊有很多例子,不再贅述……

解決辦法如下:

$sock = fsockopen($host_url,80,$errno,$errstr,5);

stream_set_timeout($sock, 1);//設定流超時,如果對方伺服器緩慢的話你可以設的值大一些~~

$temp='';

while (($temp=fread($sock,8096)))

echo $body;

ok,很簡單吧~~~

設定流超時為1秒,然後每次判斷fread獲取的是否為空,若為空的話則說明已經讀取結束,若不設定流超時,預設可能要等待60秒吧……

終於知道為什麼之前沒辦法判斷結束了……

在構造頭部的時候沒有加入connection: closernrn這一句做結束,所以feof就總是無法判斷結束,貌似是持久鏈結的問題,具體rfc描述如下:

一些客戶機和伺服器可能希望和一些對以前實現http/1.0持續連線的客戶機和伺服器相容。單個持續連線不是預設的行為的時候,它就被明確的越過。http/1.0持續連線的實驗性實現是有缺陷的,在http/1.1中設計新的簡單的來糾正這些問題。問題是一些現有的1.0客戶機可能傳送keep-alive給乙個不明白這種連線的**伺服器,那麼就錯誤地將它傳向下乙個接收伺服器,它將建立乙個keep-alive連線並導致乙個掛著的http/1.0**等待關閉的應答。結果是http/1.0客戶機必須禁止使用keep-alive和**交談。 然而,和**交談是持續連線最重要的用處,所以禁止很明顯是無法接受的。因此,我們需要一些其它的機制來表明渴望持續連線,甚至當和乙個忽略connection的老**交談這樣使用也是安全的。對http/1. 0訊息持續連線是預設的;我們引入乙個新的關鍵字(connection:close)來申明非持續。

最新測試發現只要傳遞connection: 任意字元甚至可以為空rnrn都feof都能正常獲取結束標誌……看來是頭部構造的不完整……

不知道,我也不知道,哪位大仙知道為啥跟我說一下吧~~~~

發個正確的函式(不是我寫~~~)

function get_content($url) else

fclose($fp); } }

資料抓取之requests總結

python 爬蟲之requests總結 requests 讓http服務人類 requests唯一的乙個非轉基因的python http庫,人類可以安全享用 requests繼承了urllib2的所有特性。requests支援http連線保持和連線池,支援使用cookie保持會話,支援檔案上傳,支...

資料抓取之Countly的安裝

最新穩定版 wget qo bash開發版 wget qo bash s deverror failed to download chromium r549031 set puppeteer skip chromium download env variable to skip download.n...

Python列印scrapy蜘蛛抓取樹結構的方法

通過下程式設計客棧面這段 可以一目了然的知道scrapy的抓取頁面結構,呼叫也非常簡單 usr bin env python import fileinput,re from collections import defaultdict def print urls allurls,referer,...