目前用workerman/http-client來異步請(qǐng)求,折騰了一段時(shí)間發(fā)現(xiàn)雖然可以異步請(qǐng)求,但還是不能滿足我的需求。
workerman/http-client只能是get或者是post其他服務(wù)器,現(xiàn)在服務(wù)器的fm框架也可以多進(jìn)程呀,如果我把服務(wù)器的進(jìn)程數(shù)限制為1,那么還是會(huì)出現(xiàn)堵塞。
測(cè)試步驟:
設(shè)置了三個(gè)請(qǐng)求 a b c
a sleep(10)
b sleep(5)
c 立即輸出
服務(wù)器的子進(jìn)程設(shè)置為1
那么就開始閉塞了,依次出來的是 a b c 。
異步或者協(xié)程 GO java 是可以做到不創(chuàng)建子進(jìn)程 直接按實(shí)際請(qǐng)求時(shí)間出來的 也就是 c b a 這個(gè)順序
大佬們 有沒有辦法沒?我是跟thinkphp 5 集成用的
改GuzzleHttp試試
這個(gè)沒有本質(zhì)的區(qū)別,就算異步,目標(biāo)服務(wù)器還是會(huì)需要子進(jìn)程的,所以異步應(yīng)該不是這樣用的
異步應(yīng)該是按需使用,例如用戶注冊(cè),然后需要給用戶發(fā)一條郵件,那么在用戶注冊(cè)后,先吧注冊(cè)的基本資料返回給前端,然后發(fā)郵件+積分或者其他邏輯就異步的處理
像你說的這個(gè)郵件的情況其實(shí)可以用消息隊(duì)列去做,就包括發(fā)送郵件都可以放到隊(duì)列去,java沒用過,golang他是開辟一個(gè)輕量級(jí)的線程去做異步或者并發(fā)操作的,但PHP是多進(jìn)程單線程,你開單進(jìn)程他肯定阻塞了啊,要么開多進(jìn)程,要么扔到隊(duì)列里去吧
我在mac上測(cè)試,單進(jìn)程http-client請(qǐng)求也不會(huì)阻塞啊,workerman應(yīng)該每一個(gè)進(jìn)程都能支持很多連接
是的沒錯(cuò),異步用異步消息列隊(duì)可以處理,但跟樓下說的那樣,tp是基于fpm的,必須要依靠子進(jìn)程。其實(shí)我想問有沒有類似于swoole的方案,可以優(yōu)化并自定義進(jìn)程,讓進(jìn)程使用靈活一點(diǎn)的方案。
沒太理解你說的類似于swoole的啥方案,但是webman本身支持自定義進(jìn)程的啊
http://www.wtbis.cn/doc/webman/process.html
thinkphp 5是基于php-fpm的,php-fpm的機(jī)制就是那樣,只開一個(gè)進(jìn)程的話所有請(qǐng)求排隊(duì)處理。
php-fpm開多進(jìn)程就好了