有這樣一個需求。使用者想註冊網域名稱,但是呢,通常想的好的,都被人註冊了。
這時候,程式自動的產生一定數量的網域名稱,假設產生100個。然後在自動的查詢
這100個網域名稱是否被註冊,從產生開始,網域名稱就已經顯示給了使用者,然後
ajax來即時的更新每一個網域名稱是否被註冊的狀態。
這時候,一個使用者,就會帶來100個並發查詢,而且查網域名稱狀態,是需要串連whois伺服器,有一個網路傳輸的過程
也就是這100個ajax查後台,就會帶來100個php去發出whois的查詢,等待結果,分析結果,返回給ajax調用
一般情況下,有幾個使用者同時一查。php的處理進程 就被佔滿了。整個網站的其他需要php實現都要處於等待狀態了。。
這種情況下,要怎麼最佳化呢?
我想的方案是:
1,將查詢網域名稱狀態這事拿出去,放到另一個伺服器上做。
2,查詢網域名稱狀態不使用這種同步的方式,改用node.js這種非同步模型的實現來做。
回複內容:
有這樣一個需求。使用者想註冊網域名稱,但是呢,通常想的好的,都被人註冊了。
這時候,程式自動的產生一定數量的網域名稱,假設產生100個。然後在自動的查詢
這100個網域名稱是否被註冊,從產生開始,網域名稱就已經顯示給了使用者,然後
ajax來即時的更新每一個網域名稱是否被註冊的狀態。
這時候,一個使用者,就會帶來100個並發查詢,而且查網域名稱狀態,是需要串連whois伺服器,有一個網路傳輸的過程
也就是這100個ajax查後台,就會帶來100個php去發出whois的查詢,等待結果,分析結果,返回給ajax調用
一般情況下,有幾個使用者同時一查。php的處理進程 就被佔滿了。整個網站的其他需要php實現都要處於等待狀態了。。
這種情況下,要怎麼最佳化呢?
我想的方案是:
1,將查詢網域名稱狀態這事拿出去,放到另一個伺服器上做。
2,查詢網域名稱狀態不使用這種同步的方式,改用node.js這種非同步模型的實現來做。
nodejs暴力做是一種方法,另一種思路是做一個任務隊列,控制總的並發量,比如最高並發50,然後每個使用者查詢的時候就push100個任務進隊列,隊列太長的時候可以告訴使用者系統忙這樣
不過無論如何做,首先要做的是把100個ajax改成1個……
你可以最佳化一下,不用每個使用者都發送100個ajax請求,可以合并成一個ajax請求返回100個網域名稱的狀態。
php後端根據要查詢的100個網域名稱並發(批量)向whois伺服器請求資料,並發的擷取結果。
php並發(批量)http請求例子是這樣的
這樣能保證一個php進程並發的查詢網域名稱狀態,而不是一個一個阻塞的去查,非常高效。設定逾時時間,就不會導致進程因為網路io給阻塞佔滿了。
https://github.com/visionmedia/batch 根據你的實際情況調節下參數就行了。