這一次好像離上次發(fā)布時(shí)間間隔有點(diǎn)久了,剛好今天是清明節(jié),放假就來(lái)整理下前陣子群里的聊天.
主角還是Ab兄與Little兄,還有在群里沒(méi)怎么說(shuō)話的AceForce
這個(gè)話題我很難整理,因?yàn)槎际且粏?wèn)一答,剛開(kāi)始想按照自己的想法整合,但覺(jué)得還是保留原對(duì)話.(絕對(duì)不是我懶,真的,看我真摯的眼神爆存!0-0 )
Abraham 問(wèn) Little
想使用 php 來(lái)抓取一個(gè)外部資源衷蜓,資源更新頻率比較高阵子,預(yù)計(jì) 50 個(gè) token, 每個(gè)抓取的頻率大概都是 1 分鐘一次籍铁。 有值得推薦的調(diào)配工具或 php 方面的寫法么... @little? 如果方便的話能指點(diǎn)下嗎
Little 回答 Abraham
@Abraham. 如果你只是要高并發(fā)抓取,好辦涮母,有swoole這樣的multi curl網(wǎng)絡(luò)庫(kù)挟冠,隨便單機(jī)都能開(kāi)十幾萬(wàn)個(gè)線程抓。但是你要有token什么的巩梢,我就沒(méi)搞過(guò)了创泄,也許redis里加個(gè)計(jì)數(shù)器,造個(gè)token池子這樣的弄弄看
Abraham 回應(yīng) AceForce
@AceForce 不會(huì) Python且改,之前用的是 php 和 cron验烧,覺(jué)得維護(hù)麻煩,后來(lái)不做了又跛,現(xiàn)在想重新把那個(gè)網(wǎng)站再開(kāi)開(kāi)碍拆,尋思弄的更“偷懶”一點(diǎn)。laravel 有日程處理慨蓝,但是 cli 沒(méi)辦法用 mysql 持久連接感混,這個(gè)必須得用,因?yàn)榕老x機(jī)配置高的話成本有點(diǎn)高礼烈。
Abraham
@little cli 是不能持久連接的吧弧满?
little
可以用
AceForce
@Abraham. cli是可以長(zhǎng)連接的,打開(kāi)一個(gè)連接不要關(guān)此熬,一直丟數(shù)據(jù)就行
Abraham
@AceForce 每個(gè)請(qǐng)求執(zhí)行一次庭呜,請(qǐng)求之間也能共享連接嗎?
Little 回答 Abraham
@Abraham. php與mysql的持久連接犀忱,是基于進(jìn)程的募谎,無(wú)論是 php-fpm 還是 php-cli。只要你不把這個(gè)進(jìn)程退出關(guān)掉阴汇,那就是在這個(gè)進(jìn)程之內(nèi)的所有循環(huán)都能用這條連接数冬。
當(dāng)然 php-cli 的mysql持久連接意義并不大,你完全可以 $conn = DB::Connection搀庶,然后把 $conn 暫時(shí)存起來(lái)或者放到類屬性什么的拐纱,類不銷毀铜异、變量不銷毀,這個(gè)連接也就在秸架。
php-fpm 是因?yàn)榭缌硕啻?HTTP 請(qǐng)求揍庄,變量會(huì)完全銷毀。而 cli 就沒(méi)有這個(gè)問(wèn)題嘛咕宿。
我只是分割線
Abraham
@little 是這樣的币绩, 我是直接 cron 一分鐘一次的 php -f awesome.php
這種情況是不是就是把這個(gè)進(jìn)程關(guān)掉的意思?
little
那不行府阀,進(jìn)程退出缆镣,什么都沒(méi)了。
little
php awesome.php试浙,常駐內(nèi)存董瞻,自己在 awesome.php里循環(huán),sleep什么的,
然后進(jìn)程管理用 supervisor?,用 supervisor? 就不用 nohup 或者 & 打后臺(tái)了田巴。想起多少個(gè)進(jìn)程配置下就行钠糊。
AceForce
awesome.php常開(kāi),一分鐘開(kāi)一個(gè)子進(jìn)程讓去處理壹哺,
little
自己管理進(jìn)程多累抄伍,supervisor?幫你考慮了一切
AceForce
workerman?不就是這么搞的?
little
搞了子進(jìn)程管宵,要pcntl_fork?截珍,子進(jìn)程掛了怎么辦,內(nèi)存超了怎么辦
Abraham
兩年前用過(guò)箩朴,我都完全不記得了:)?這個(gè)就是我打算重啟的東東岗喉。
little
你只需要在?awesome.php里,寫while?true死循環(huán)炸庞,循環(huán)里計(jì)數(shù)钱床,超過(guò)?10萬(wàn)次?exit?進(jìn)程,避免內(nèi)存泄露埠居。剩下的讓?supervisor?幫你監(jiān)控管理查牌。
AceForce
其實(shí)你還是不太信任你自己嘛。代碼寫得夠健壯滥壕,還怕進(jìn)程掛內(nèi)存超僧免?
Abraham
@little?當(dāng)初好像是用?supervisor?重啟腳本的,用?cron?總退.
little
我怕?vendor捏浊,我怕哪個(gè)擴(kuò)展內(nèi)存泄露,這說(shuō)不準(zhǔn)的撞叨。
vendor在前一篇 談笑風(fēng)生 提及過(guò)
Abraham
是呀金踪,我雖然記不清了浊洞,但是恍惚感覺(jué),好像?php?真的出錯(cuò)過(guò)胡岔。
cli?直接輸出?max?memory
little
php-fpm里的這個(gè)配置也是這個(gè)意思法希,總還是要定個(gè)值,避免問(wèn)題的靶瘸。
Abraham
雖然作者說(shuō)?7?改善了?gc?但還是沒(méi)底苫亦。
little
php擴(kuò)展里搞出個(gè)內(nèi)存泄露,我們是阻止不了的
AceForce
cli大變量大數(shù)組使用完記得unset下怨咪,不然不銷毀,就會(huì)超內(nèi)存
AceForce
fpm下可以不unset屋剑,生命周期不一樣嘛
little
自己寫的代碼我都不太擔(dān)心,cli 寫在循環(huán)里诗眨,每次循環(huán)都賦值的話唉匾,理論上也是會(huì)被 gc 清理,只是更慢些匠楚。
我最擔(dān)心的就是擴(kuò)展里的代碼巍膘,比如裝個(gè) php redis 擴(kuò)展,底層好像依賴 lib c redis 庫(kù)吧芋簿,只要這中間哪個(gè)環(huán)節(jié)有一丁點(diǎn)內(nèi)存泄露峡懈,循環(huán)幾十萬(wàn)次下來(lái),也就很大了与斤。
以前服務(wù)器遇到過(guò)問(wèn)題肪康,老是內(nèi)存占滿了服務(wù)器,最后仔細(xì)debug幽告,發(fā)現(xiàn)就是 memcached 擴(kuò)展內(nèi)部弄出來(lái)的泄露梅鹦。連這種最廣泛的擴(kuò)展的某個(gè)穩(wěn)定版本都有內(nèi)存泄露,不要指望每個(gè)擴(kuò)展的質(zhì)量都很高了冗锁。
爬蟲的話題
Abraham
supervisor?遠(yuǎn)程控制用的是自帶的?http?服務(wù)器齐唆,怎樣讓他支持?https?知道嗎?
Abraham
我突然靈感一現(xiàn)冻河,暈了箍邮,不支持可以裝個(gè)?NGINX?做代理嘛
supervisor是管理進(jìn)程的工具,提供了一個(gè) xml rpc 接口可以遠(yuǎn)程監(jiān)控線程狀態(tài)叨叙,控制線程啟動(dòng)關(guān)閉之類的锭弊。
littlehz
@Abraham.你理解錯(cuò)了,supervisor的http是supervisorctl進(jìn)程管理supervisord進(jìn)程用的擂错,跟業(yè)務(wù)沒(méi)關(guān)系
Abraham
@littlehz有人實(shí)現(xiàn)的這個(gè)味滞。
Abraham.?上午?12:20:16
我也想做個(gè)類似的,這樣在國(guó)內(nèi)的網(wǎng)站后臺(tái)就能看蜘蛛狀態(tài)了,可以嗎剑鞍?
littlehz
那也只是內(nèi)網(wǎng)的昨凡,管理下多臺(tái)服務(wù)器的進(jìn)程,沒(méi)必要放外網(wǎng)吧
Abraham
只是不想登陸爬蟲機(jī)蚁署,文檔上可以配置 9001 接口的 http ,提供了 xml-rpc 難道不就是為了遠(yuǎn)程訪問(wèn)嘛
然后我用?guzzle?跟他交互便脊,不一定非得是內(nèi)網(wǎng)
littlehz
我覺(jué)得爬蟲機(jī)應(yīng)該這么做。一堆的服務(wù)器光戈、一堆的進(jìn)程在爬哪痰,你有一堆的出口IP或者代理IP,爬的進(jìn)程根據(jù)IP池幾分鐘的使用次數(shù)決定用哪個(gè)出口IP久妆。然后通過(guò)supervisor管理這么多服務(wù)器晌杰,管理接口最好放同一個(gè)內(nèi)網(wǎng)更安全,做個(gè)web管理界面限制下訪問(wèn)ip用戶名密碼
Abraham
這個(gè)機(jī)器抓?twitter?必須得放外面,因?yàn)橹蛔浊€(gè)用戶镇饺,估計(jì)?500M??內(nèi)存足夠了,twitter?提供一個(gè)?streaming?api乎莉,長(zhǎng)連接的,資源占用非常少
但是網(wǎng)站(管理端和內(nèi)容展現(xiàn)的地方)鐵定是國(guó)內(nèi)的奸笤,我尋思在網(wǎng)站后臺(tái)能看到一些進(jìn)程運(yùn)行情況和基本的日志會(huì)比較有幫助
littlehz
沒(méi)有這么多出口IP惋啃,就不用想了。有些網(wǎng)站比較傻监右,你偽造個(gè)X-REAL-IP也許就能過(guò)去
Abraham
不是爬知乎的那種互相斗法的爬边灭,是完全在?rate?limit?限制之下的合法的爬呀:)
你說(shuō)的根據(jù)?ip?使用調(diào)整抓取的方式的,類似策略性的東西我也考慮過(guò)健盒,比如說(shuō)根據(jù)特定時(shí)間窗口?api?次數(shù)的盈余情況去多爬一些頭像更新绒瘦,粉絲數(shù)量更新】垩ⅲ或者根據(jù)對(duì)方現(xiàn)在的時(shí)間動(dòng)態(tài)調(diào)整下頻率惰帽,但是初期考慮不了那么多,太復(fù)雜了. 現(xiàn)在想的的確就是怎樣更安全的問(wèn)題父虑,不過(guò)如果把所有端口都關(guān)了该酗,禁止外部任何的連接是不是應(yīng)該沒(méi)問(wèn)題?
因?yàn)閿?shù)據(jù)庫(kù)和國(guó)內(nèi)的是互為主從的士嚎,如果爬蟲機(jī)被黑了呜魄,給我刪庫(kù),國(guó)內(nèi)的數(shù)據(jù)還得恢復(fù)莱衩,就麻煩死了爵嗅。之前爬過(guò)一次?twitter?大概是兩三年前吧,當(dāng)時(shí)它們沒(méi)提供?streaming?api笨蚁,我是用大量的號(hào)睹晒,每個(gè)號(hào)關(guān)注好多個(gè)號(hào)趟庄,然后爬這些號(hào)的時(shí)間線。現(xiàn)在提供的?streaming?api?據(jù)說(shuō)是?limit?大幅的提升册招,推薦抓大量用戶的人用這個(gè)接口岔激,打算試試。是掰。。
說(shuō)回?supervisor辱匿,@littlehz你覺(jué)得只有一臺(tái)機(jī)器的話键痛,用這種遠(yuǎn)程控制的方法不可靠嗎,其實(shí)控制的可能性小匾七,我盡量讓蜘蛛智能點(diǎn)絮短,主要就是看一下重啟頻率那些指標(biāo)性的東西,我還不知道支不支持遠(yuǎn)程讀日志昨忆,不支持的話丁频,?supervisor?可以把日志寫到?mysql?里嗎?
littlehz
問(wèn)題是supervisor的http接口并沒(méi)有任何安全限制邑贴,端口放出去了席里,別人也能連上這個(gè)端口發(fā)送個(gè)停止進(jìn)程的指令哦。只能依靠防火墻限制下ip
Abraham
是呀拢驾,有個(gè)密碼還是基于?basic?的奖磁,用?nginx?搭個(gè)代理可行嗎?然后把?supervisor?的?http?設(shè)置成本機(jī)訪問(wèn)的,讓你說(shuō)的好怕怕的感覺(jué)
littlehz
那也可以繁疤,但要我做還是把supervisor?http接口放內(nèi)網(wǎng)咖为。自己做個(gè)網(wǎng)頁(yè)管理工具放外網(wǎng)。把supervisor?http放外網(wǎng)或者代理下放外網(wǎng)都是一個(gè)意思稠腊,感覺(jué)就像是把mysql?3306放到外網(wǎng)都可以訪問(wèn)一樣匣摘。
Abraham
那樣就要兩臺(tái)機(jī)器了
littlehz
怎么就要兩臺(tái)機(jī)器呢酌予?
Abraham
屏蔽?twitter?上的藝術(shù),體育,學(xué)術(shù)帳號(hào)讓很多不fq的人不得不去消化二手消息瞬场。?看著它們天天迷什么鹿什么掏糞我的心都碎了
Abraham
我打算抓回來(lái),在國(guó)內(nèi)開(kāi)個(gè)?web?頁(yè)面更新它們呀央渣,那樣不?fq?的人也可以得到公眾人物的消息
@littlehz現(xiàn)在最最初期的設(shè)計(jì)涩惑,得5臺(tái),感覺(jué)這就心理能承受的極限许昨。懂盐。。
倆?mysql糕档,?一個(gè)?web莉恼,一個(gè)爬蟲拌喉,一個(gè)搜索引擎做時(shí)間線
看數(shù)據(jù)量和訪問(wèn)量吧,最開(kāi)始基礎(chǔ)版的不到?1000?吧
littlehz
有優(yōu)質(zhì)線路俐银,網(wǎng)頁(yè)用https尿背,一臺(tái)就夠了吧,放香港就是. HK的ping值一般不會(huì)超過(guò)70ms,大多數(shù)情況是40ms
Abraham
用的?ecs捶惜,?多開(kāi)幾個(gè)實(shí)例田藐,出錯(cuò)了好排查
hk?的沒(méi)考慮,看看再說(shuō)吧吱七,?不排除汽久,以前用?hk?的代理總出錯(cuò),出陰影了
littlehz
沒(méi)多少訪問(wèn)量的時(shí)候怕什么踊餐,訪問(wèn)量上去了景醇,在國(guó)內(nèi)加個(gè)反向代理緩存下
Abraham
我心理一直感覺(jué)美國(guó)線路比亞洲的穩(wěn)定,是錯(cuò)覺(jué),今晚也一直在考慮吝岭,要不要把整個(gè)?web?都放外面...
littlehz
全部放國(guó)外吧三痰,架構(gòu)更簡(jiǎn)單,沒(méi)有國(guó)際優(yōu)質(zhì)線路就在國(guó)內(nèi)加個(gè)nginx?cache咯,相當(dāng)于自建cdn,這個(gè)架構(gòu)比數(shù)據(jù)庫(kù)跨國(guó)主從好做多了
異地主從窜管、多中心這樣的架構(gòu)就不用考慮散劫,太復(fù)雜,一般業(yè)務(wù)根本駕馭不了微峰。用單中心+異地實(shí)時(shí)及定點(diǎn)備份+多地cache/cdn這樣的方案舷丹。
某天早晨........
Abraham
星期日 上午 7:29:17
@littlehz??上次你說(shuō)?web?和?crawler?都放到?hk?我思考了一陣子,感覺(jué)是比較可行的做法蜓肆,降低了數(shù)據(jù)庫(kù)復(fù)雜颜凯,?現(xiàn)在初步打算這么做,?還沒(méi)開(kāi)機(jī)器仗扬,?可能還得測(cè)一下?ping?的速度症概。?有一個(gè)問(wèn)題,?大陸現(xiàn)在?cdn?基本都要備案早芭,?你感覺(jué)機(jī)器放外面彼城,?域名仍舊備案,是比較合適的選擇嗎退个,
littlehz
上午?8:12:51
@Abraham.?如果你所有機(jī)器都放HK募壕,那測(cè)下ping,看看穩(wěn)定性语盈,國(guó)內(nèi)都不用再放反代舱馅。速度不會(huì)有問(wèn)題。
當(dāng)然也可以真機(jī)放國(guó)外任意機(jī)房刀荒,你熟悉的就好代嗤。在HK或者國(guó)內(nèi)找個(gè)反代棘钞。這樣你萬(wàn)一遇到投訴,最多把你反代機(jī)器端走干毅,不至于一鍋全端宜猜。反代機(jī)器有1核1g裝個(gè)nginx都能支持很大的量
增長(zhǎng)見(jiàn)識(shí),開(kāi)拓視野,縱使路漫漫且曲折,亦勝過(guò)盲人摸象般自己閉門造車