Laravist群友雜談 --- 內(nèi)存泄露與Supervisor與爬蟲

這一次好像離上次發(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ò)盲人摸象般自己閉門造車


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市硝逢,隨后出現(xiàn)的幾起案子姨拥,更是在濱河造成了極大的恐慌,老刑警劉巖趴捅,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垫毙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拱绑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門丽蝎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)猎拨,“玉大人,你說(shuō)我怎么就攤上這事屠阻『焓。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵国觉,是天一觀的道長(zhǎng)吧恃。 經(jīng)常有香客問(wèn)我,道長(zhǎng)麻诀,這世上最難降的妖魔是什么痕寓? 我笑而不...
    開(kāi)封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蝇闭,結(jié)果婚禮上呻率,老公的妹妹穿的比我還像新娘。我一直安慰自己呻引,他們只是感情好礼仗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著逻悠,像睡著了一般元践。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上童谒,一...
    開(kāi)封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天单旁,我揣著相機(jī)與錄音,去河邊找鬼惠啄。 笑死慎恒,一個(gè)胖子當(dāng)著我的面吹牛任内,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播融柬,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼死嗦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柄粹!你這毒婦竟也來(lái)了俯渤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤态辛,失蹤者是張志新(化名)和其女友劉穎外盯,沒(méi)想到半個(gè)月后摘盆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饱苟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年孩擂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箱熬。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡类垦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出城须,到底是詐尸還是另有隱情蚤认,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布糕伐,位于F島的核電站砰琢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏良瞧。R本人自食惡果不足惜陪汽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莺褒。 院中可真熱鬧掩缓,春花似錦、人聲如沸遵岩。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尘执。三九已至舍哄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間誊锭,已是汗流浹背表悬。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丧靡,地道東北人蟆沫。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓籽暇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親饭庞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戒悠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 這幾天群里來(lái)了安正超大神,一下子群情'波'濤洶涌呀,什么?你不知道超神是誰(shuí),這是他的個(gè)人網(wǎng)站可以去瞧一瞧. ......
    鄭方方閱讀 836評(píng)論 3 8
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,520評(píng)論 25 707
  • 1. Nginx的模塊與工作原理 Nginx由內(nèi)核和模塊組成舟山,其中绸狐,內(nèi)核的設(shè)計(jì)非常微小和簡(jiǎn)潔,完成的工作也非常簡(jiǎn)單...
    rosekissyou閱讀 10,197評(píng)論 5 124
  • 漆黑的夜累盗,獨(dú)自走在一條小路上寒矿,路邊的路燈照著我的影子一會(huì)兒濃重,一會(huì)兒黯淡若债,一會(huì)兒在前符相,一會(huì)兒在后,調(diào)皮得像一個(gè)小...
    Avanta閱讀 425評(píng)論 8 7
  • Piyitian is my favourite person. He likes read book. He c...
    5535吉智勛閱讀 250評(píng)論 0 2