摘要:接到一個需求,兩個項目之間需要以接口形式通訊。在無法并發只能排隊請求的情況下,第一個請求依賴于第二個請求的結果第二個請求卻排在后面一直等待第一個請求執行完畢。
接到一個需求,兩個項目之間需要以接口形式通訊。我心想curl輕松解決,Easy!
啪嗒啪嗒啪嗒……代碼擼完了,本地測試一下
瀏覽器一直轉圈圈直到超時……
沒有任何錯誤提示信息,日志也沒有任何新記錄
用POSTMAN調試了一下剛寫出的接口,沒問題啊?
再試一次結果依舊,重啟環境后再試也依舊
經過一番測試,我懷疑是不是我本地環境無法并發?
我訪問項目是一個請求,項目訪問另一項目的接口則是第二個請求。在無法并發只能排隊請求的情況下,第一個請求依賴于第二個請求的結果;第二個請求卻排在后面一直等待第一個請求執行完畢。這就導致互相依賴產生死循環,也就說得通了
怎么解決?nginx以高并發聞名,怎么偏偏默認不支持并發?
谷歌找了很多關于nginx并發的文章,挨個兒嘗試設置,全都以失敗告終
WTF!?這是鬧哪樣?該加該改的都弄了,理論上并發能力爆棚了啊
又是一番嘔心瀝血的谷歌,終于讓我找到了答案——
Windows下PHP_FCGI_CHILDREN無效
(具體參見PHP BUG#49859)
一般情況下Windows下Nginx的配置都是fastcgi_pass 127.0.0.1:9000;
也就是說cgi根本不會自動產生新進程去處理并發請求,只能排隊
那要怎么辦?既然不能自動生成,那就只好手動咯
我準備額外啟動3個php-cgi去處理并發請求
首先在nginx.conf中進行如下配置:
upstream phpfastcgi_proxy { server 127.0.0.1:9000; server 127.0.0.1:9001; server 127.0.0.1:9002; server 127.0.0.1:9003; # 或更多…… }
再把所有
fastcgi_pass 127.0.0.1:9000;
改為
fastcgi_pass phpfastcgi_proxy;
保存,重啟Nginx。
現在,Nginx會自動將請求轉發給9000-9003其中一個空閑端口中,接下來我們還需要啟動對應數量的php-cgi去監聽端口
快捷鍵Win+R打開運行,輸入cmd進入命令行,錄入以下代碼:
E:/php/php-cgi.exe -b 127.0.0.1:9001 -c E:/php/php.ini
(其中路徑部分需要換為你本機實際路徑)
回車后看似沒反應,任務管理器中會發現多了一個php-cgi進程,netstat -a也能夠看到9001端口被監聽了
注意不要把命令行關掉了,而是要繼續打開一個新的命令行
此時你已成功了一次,你還需要繼續成功兩次才能監聽到9002和9003……
額外的3個php-cgi進程啟動成功后,你就擁有了一個并發數為4的本地環境
誒呀媽,不就想整個并發,真累人……
(后來還寫了個小程序專門用來自動啟動3個php-cgi進程,省事兒多了)
并發問題看似是終于解決了
為啥說“看似”呢?因為在后來的實際測試中,自己啟動的php-cgi似乎不穩定啊,將近有50%的幾率會掛掉,導致接口返回內容依然為空,很奇怪啊不明覺厲,是不是我哪里配置錯了呢?
至此我已經在這個問題上折騰了好幾個小時了,再折騰下去我老大估計要打我了。算了,辣雞Windows!我只好啟動了塵封已久的Ubuntu虛擬機……如果廣大讀者有明白這個問題的,還望不吝賜教,謝謝
本文同時刊登于我的博客 超能小紫,如果喜歡請常來玩哦
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/39299.html
摘要:接到一個需求,兩個項目之間需要以接口形式通訊。在無法并發只能排隊請求的情況下,第一個請求依賴于第二個請求的結果第二個請求卻排在后面一直等待第一個請求執行完畢。 接到一個需求,兩個項目之間需要以接口形式通訊。我心想curl輕松解決,Easy!啪嗒啪嗒啪嗒……代碼擼完了,本地測試一下瀏覽器一直轉圈圈直到超時…… Why!? 沒有任何錯誤提示信息,日志也沒有任何新記錄用POSTMAN調試了...
摘要:然而當你嘗試請求這樣的靜態文件時卻完全沒有問題。打開中的命令,可以看到本地的端口的狀態為,表示該進程在聯機處理中。與函數的原因也相同。這時需給另一個分配不同的端口,比如。因此這些人純粹是不學無術的騙子。 注意:本文為轉載,原文鏈接:Windows下PHP服務nginx不能使用file_get_contents/curl/fopen的原因! 一、問題說明 在Windows環境下搭建了一...
摘要:然而當你嘗試請求這樣的靜態文件時卻完全沒有問題。打開中的命令,可以看到本地的端口的狀態為,表示該進程在聯機處理中。與函數的原因也相同。這時需給另一個分配不同的端口,比如。因此這些人純粹是不學無術的騙子。 注意:本文為轉載,原文鏈接:Windows下PHP服務nginx不能使用file_get_contents/curl/fopen的原因! 一、問題說明 在Windows環境下搭建了一...
閱讀 5286·2021-09-22 15:50
閱讀 1875·2021-09-02 15:15
閱讀 1172·2019-08-29 12:49
閱讀 2552·2019-08-26 13:31
閱讀 3469·2019-08-26 12:09
閱讀 1218·2019-08-23 18:17
閱讀 2745·2019-08-23 17:56
閱讀 2936·2019-08-23 16:02