当前位置: 首页 > 后端技术 > PHP

Swoole+Lumen:同步编程风格调用MySQL异步查询

时间:2023-03-30 05:36:12 PHP

缃戠粶缂栫▼涓€鐩存槸PHP鐨勭煭鏉裤€傝櫧鐒禨woole鐨勬墿灞曞讥琛ヤ簡杩欎釜缂虹偣锛屼絾鏄畠鐨勭紪绋嬮鏍煎亸鍚戜簬NodeJS鎴朑oLang锛岃繖涓庡師鏉ョ殑鍚屾缂栫▼椋庢牸鏈夊緢澶х殑涓嶅悓銆?鐩墠PHP鐨勪富娴佸簲鐢ㄦ鏋跺ぇ澶氳繕鏄悓姝ョ紪绋嬮鏍硷紝鎵€浠ユ垜浠竴鐩村湪鎺㈢储Swoole鍜屽悓姝ョ紪绋嬬粨鍚堢殑鏂瑰紡銆俵umen-swoole-http鍙槸涓€涓繛鎺ュ悓姝ョ紪绋婰umen鍜屽紓姝ョ紪绋婼woole鐨勬ˉ姊併€傛湁鍏磋叮鐨勫彲浠ュ叧娉ㄤ竴涓嬨€侺NMP鐨勭己鐐筁NMP鏄竴涓粡鍏哥殑web搴旂敤鏋舵瀯缁勫悎銆傝櫧鐒讹紙Linux銆丯ginX銆丮ySQL鍜孭HP-FPM锛夐兘鏄紭绉€鐨勭郴缁熸垨杞欢锛屼絾缁勫悎璧锋潵鐨勬暣浣撴€ц兘骞朵笉灏藉浜烘剰銆傛樉鐒朵笉鏄?+1+1+1>4锛岃€屾槸4+3+2+1<1銆侺inux绯荤粺娌℃湁闂锛屼富瑕侀棶棰樻槸锛氫粠NginX鍒癙HP-FPMNginX浣跨敤浜咺O澶氳矾澶嶇敤鏈哄埗epoll锛屽ぇ澶у噺灏戜簡IO闃诲鍜岀瓑寰咃紝杞绘澗搴斿C10K銆傜劧鑰岋紝NginX姣忔灏嗙敤鎴疯姹備紶閫掔粰PHP-FPM鏃讹紝PHP-FPM鎬绘槸闇€瑕侀噸鏂板姞杞絇HP椤圭洰浠g爜锛氬垱寤烘墽琛岀幆澧冦€佽鍙朠HP鏂囦欢鍜屼唬鐮佽В鏋愩€佺紪璇戠瓑鎿嶄綔涓€娆℃閲嶅锛屽鑷翠笉蹇呰鐨勫皬娑堣垂銆備粠PHP-FPM鍒癕ySQL鐢变簬PHP浠g爜鏈韩鏄悓姝ユ墽琛岀殑锛屽綋PHP-FPM杩炴帴MySQL鏌ヨ鏁版嵁鏃讹紝鍙兘闂茬疆绛夊緟MySQL杩斿洖鏌ヨ缁撴灉銆傛煡璇㈣鍙ョ殑鎵ц鏃堕棿鍙兘闇€瑕佸嚑绉掗挓銆傚湪姝ゆ湡闂达紝濡傛灉PHP-FPM鑳藉鏆傛椂鏀句笅褰撳墠鐢ㄦ埛鐨勬參鏌ヨ璇锋眰锛屽幓澶勭悊鍏朵粬鐢ㄦ埛鐨勮姹傦紝鏁堢巼鑲畾浼氭湁鎵€鎻愬崌銆?!--more-->SwooleHTTPserverSwooleHTTPserver鍚屾牱閲囩敤epoll鏈哄埗锛岃繍琛屾€ц兘涓嶅NginX锛屼絾涔熺浉宸笉杩溿€傝€孲wooleHTTP鏈嶅姟鍣ㄤ綔涓哄叾涓殑涓€閮ㄥ垎宓屽叆鍒癙HP涓紝鍙互鐩存帴杩愯PHP锛屽畬鍏ㄥ彲浠ユ浛浠ginX+PHP-FPM鐨勭粍鍚堛€備互鐩墠娴佽鐨勬鏋禠umen锛圠aravel鐨勪竴涓瓙妗嗘灦锛変负渚嬶紝浣跨敤SwooleHTTP鏈嶅姟鍣ㄨ繍琛孡umen椤圭洰闈炲父绠€鍗曪紝鍙渶$worker->onRequest($request,$response)锛堝綋鎺ユ敹鍒颁竴涓敤鎴疯姹傦級灏嗚姹備紶閫掔粰Lumen澶勭悊锛?response灏哃umen鐨勫鐞嗙粨鏋滆繑鍥炵粰鐢ㄦ埛锛孡umen椤圭洰浠g爜鍦?worker鐨勬暣涓敓鍛藉懆鏈熷唴鍙細鍔犺浇涓€娆★紝娌℃湁涓嶅繀瑕佺殑纾佺洏IO鍜孭HP浠g爜缂栬瘧寮€閿€銆傚帇鍔涙祴璇曞湪4GB+4Core铏氭嫙鏈轰笅锛屾祴璇旽TTP鏈嶅姟鍣ㄩ潤鎬佽緭鍑猴細2000涓鎴风骞跺彂鍙戦€?0涓囦釜璇锋眰锛屾湭寮€鍚疕TTPKeepalive锛屽钩鍧嘠PS锛歂ginX+HTMLQPS锛?5883.44NginX+PHP-FPM+LumenQPS锛?28.36Swoole+LumenQPS锛?3647.752000瀹㈡埛绔苟鍙戝彂閫?00000涓姹傦紝寮€鍚疕TTPKeepalive锛屽钩鍧嘠PS锛歂ginX+HTMLQPS锛?6843.11NginX+PHP-FPM+LumenQPS锛?94.06Swoole+LumenQPS锛?8183.43鍙互鐪嬪埌Swoole+Lumen缁勫悎鐨勬墽琛屾晥鐜囨瘮NginX+PHP-FPM+Lumen鐨勭粍鍚堣楂樺緢澶氥€備笂闈㈢殑寮傛MySQL瀹㈡埛绔兘鏄紡绗旓紝涓嬮潰鎵嶆槸鏁寸瘒鏂囩珷鐨勯噸鐐逛互MySQL鏁版嵁搴撲负渚嬶紝鍦ㄥ彧鏈変竴涓狿HP杩涚▼鐨勬儏鍐典笅锛?0涓敤鎴疯姹傛墽琛宻electsleep(1);锛堣€楁椂1绉掞級鏌ヨ璇彞銆傚鏋滀娇鐢∕ySQL鍚屾鏌ヨ锛屾€昏€楁椂鑷冲皯10绉掋€?濡傛灉浣跨敤MySQL寮傛鏌ヨ锛屾€昏€楁椂鍙兘浼氬帇缂╁埌1~2绉掍互鍐呫€傚彧鏈夊湪PHP搴旂敤涓疄鐜板紓姝ユ暟鎹簱鏌ヨ锛屾墠鑳界獊鐮存€ц兘鐡堕銆係woole铏界劧鎻愪緵浜嗗紓姝ySQL瀹㈡埛绔紝浣嗘槸鍏跺紓姝ョ紪绋嬮鏍间笌Lumen鐨勫悓姝ョ紪绋嬮鏍奸」鐩鏋舵湁鍐茬獊锛岄偅涔堟槸鍚﹀彲浠ュ湪鍚屾缂栫▼椋庢牸鐨勪唬鐮佷腑璋冪敤寮傛MySQL瀹㈡埛绔憿锛熻捣鍒濇垜璁や负杩欐槸涓嶅彲鑳界殑锛岀洿鍒版垜鐪嬪埌杩欑瘒鏂囩珷锛欳ooperativemultitaskingusingcoroutines(inPHP!)銆傚綋鐒剁湅浜嗕腑鏂囩増鐨勶細鍒╃敤PHP鍗忕▼瀹炵幇澶氫换鍔¤皟搴︼紝鏂囦腑鎻愬埌浜哖HP5.5鏂板鐨勪竴涓姛鑳斤細yield銆倅ielyield鏄竴涓姩璇嶏紝鎰忔€濇槸鈥滅敓鎴愨€濓紝鑰寉ield鍦≒HP涓骇鐢熺殑涓滆タ鍙仛Generator锛屾剰鎬濇槸鈥滃彂鐢垫満鈥濔煒傪煒傪煒傘€傛垜鐨勭悊瑙f槸锛歽ield杩斿洖褰撳墠鎵ц涓婁笅鏂囦綔涓哄綋鍓嶅嚱鏁扮殑缁撴灉锛坹ield蹇呴』鍦ㄥ嚱鏁颁腑浣跨敤锛夈€傚湪绯荤粺灞傞潰锛屽悇杩涚▼鐨勮繍琛岄『搴忕敱CPU璋冨害锛涙湁浜唝ield锛屽湪PHP杩涚▼涓紝绋嬪簭鍛樺彲浠ヨ嚜鐢卞畨鎺掓瘡涓唬鐮佸潡鐨勬墽琛岄『搴忋€備緥濡傦紝褰撲綘鈥滃彂鐜扳€濆綋鍓嶇敤鎴疯姹傜殑MySQL鏌ヨ浼氳€楁椂杈冮暱鏃讹紝浣犲彲浠ヨ褰曞綋鍓嶆墽琛屼笂涓嬫枃锛屼氦缁欏紓姝ySQL瀹㈡埛绔鐞嗭紙鐩稿叧鐨?request鍜?response鐢ㄦ埛璇锋眰涔熶紶閫掔粰)锛岃€屼富杩涚▼缁х画澶勭悊涓嬩竴涓敤鎴疯姹傘€傚崗璁0鏄庡墠浣跨敤浜嗏€滃彂鐜扳€濅竴璇嶃€傚綋鐒讹紝绋嬪簭鏃犳硶鏅鸿兘鍦板彂鐜版湭鎵ц鐨勬煡璇㈣鍙ュ皢鏄參鏌ヨ銆傛垜浠渶瑕佷竴浜涘崗璁拰澹版槑銆侺umen妗嗘灦鏄竴涓粡鍏哥殑MVC妯″瀷銆傛垜浠害瀹欳锛屽嵆Controller锛屾槸澶勭悊鐢ㄦ埛璇锋眰鐨勬渶鍚庝竴姝モ€斺€擟ontroller鎺ュ彈鐢ㄦ埛璇锋眰$request锛岃繑鍥炲搷搴?response銆傚悓鏃讹紝鎴戜滑澹版槑涓€涓悕涓篠lowQuery鐨勭被锛岃繖涓被寰堢畝鍗曪紙璇﹁SlowQuery.php锛夛細sql=$sql;}}姣斿Lumen椤圭洰涓湁杩欐牱涓€涓狢ontroller锛??phpnamespaceApp\Http\Controllers;useApp\Http\Controllers\Controller;useDB;classTestControllerextendsController{publicfunctiontest(){$a=DB::select('閫夋嫨鐫$湢(1);');鍝嶅簲()->json($a);}}涓婇潰DB::select浣跨敤鐨勫悓姝ySQL瀹㈡埛绔煡璇紝鎴戜滑鐢⊿lowQuery瀵硅薄浠f浛锛??phpnamespaceApp\Http\Controllers;useApp\Http\Controllers\Controller;useBL\SwooleHttp\Database\SlowQuery;classTestControllerextendsController{publicfunctiontest(){$a=yieldnewSlowQuery('selectsleep(1);');鍝嶅簲()->json($a);}}褰撶敤SwooleHTTP鏈嶅姟鍣ㄨ繍琛孡umen椤圭洰鏃讹紝鎴戜滑涓€瀹氫細寰楀埌Controller杩斿洖鐨勭粨鏋溿€侰ontroller鐨勮繑鍥炵粨鏋滀竴鑸彲浠ョ洿鎺ユ墦鍖呮垚Lumenresponse杩斿洖缁欑敤鎴凤紝浣嗘槸濡傛灉杩斿洖缁撴灉鏄竴涓狦enerator瀵硅薄锛屽畠鐨勫綋鍓嶅€兼槸涓€涓猄lowQuery瀵硅薄锛岄偅涔堟垜浠彲浠ユ妸SlowQuery瀵硅薄锛屼氦缁橝synchronousMySQL瀹㈡埛绔墽琛岋紱鍦ㄥ紓姝ユ煡璇㈢殑鍥炶皟鍑芥暟涓紝灏嗘煡璇㈢粨鏋滄斁鍥炲埌Generator瀵硅薄瀛樺偍鐨勪笂涓嬫枃涓紝鏈€缁堢粨鏋滆繑鍥炵粰鐢ㄦ埛锛涘湪涓昏繘绋嬫湭琚樆濉炵殑鎯呭喌涓嬶紝瀹冨彲浠ョ户缁鐞嗗叾浠栫敤鎴疯姹傘€傚綋鐒讹紝濡傛灉瑕佷娇鐢‥loquentORM锛屼篃寰堢畝鍗曪細鎴戜滑鍏堢户鎵縇umen鐨凪odel锛屽皝瑁呮垚涓€涓柊鐨凪odel绫伙紙璇﹁Model.php锛夈€傚簲鐢ㄤ腑鐨勬暟鎹ā鍨嬮兘鏄户鎵胯嚜鏂扮殑Model锛孋ontroller鍙互杩欐牱鍐欙細yieldGet();//娉ㄦ剰User蹇呴』缁ф壙鑷猏BL\SwooleHttp\Database\Modelresponse()->json($a);}}浠ヤ笂涓変釜Controller鏈€缁堜骇鐢熺殑鐢ㄦ埛鍝嶅簲鏄竴鏍风殑锛屼絾鏄悗涓よ€呬娇鐢ㄥ紓姝ySQL瀹㈡埛绔紝鏁堢巼鏇撮珮銆備换鍔¤皟搴﹀櫒褰撶劧锛屾垜浠繕闇€瑕佷竴涓换鍔¤皟搴﹀櫒鏉ユ墽琛岃繖浜涚敓鎴愬櫒銆備换鍔¤皟搴﹀櫒鐨勫疄鐜版柟娉曟槸浣跨敤PHP涓殑鍗忕▼鏉ュ疄鐜板浠诲姟璋冨害銆傚湪鏂囩珷鐨勨€滃浠诲姟鍗忓悓鈥濅竴绔犱腑鏈変粙缁嶏紝杩欓噷涓嶅啀灞曞紑銆侺umen妗嗘灦涓殑浠g爜淇濇寔鍚屾缂栫▼椋庢牸锛岃€屽湪浠诲姟璋冨害鍣ㄤ腑浣跨敤寮傛缂栫▼椋庢牸璋冪敤寮傛MySQL瀹㈡埛绔€備换鍔¤皟搴﹀櫒鍦⊿wooleHTTPserver灞傞潰浣跨敤锛岃瑙丼ervice.php銆傝繛鎺ラ檺鍒跺叾瀹炴瘡娆℃墦寮€涓€涓猄woole寮傛MySQL瀹㈡埛绔紝涓昏繘绋嬮兘浼氭柊寤轰竴涓嚎绋嬭繛鎺ySQL銆傚鏋滃缓绔嬭繃澶氱殑杩炴帴锛堢嚎绋嬶級锛屼細澧炲姞鑷韩鏈嶅姟鍣ㄥ拰MySQL鏁版嵁搴撴湇鍔″櫒鐨勫帇鍔涖€傝繖绉嶉€氳繃yield璋冪敤寮傛MySQL瀹㈡埛绔鐞嗘參鏌ヨ鑰屼骇鐢熺殑绾跨▼锛屾殏涓旂О涔嬩负鈥滄參鏌ヨ鍗忕▼鈥濄€備负浜嗛檺鍒舵暟鎹簱杩炴帴鏁帮紝鎴戜滑鍙互璁剧疆涓€涓叏灞€鍙橀噺鏉ヨ褰曟柊澧炴參鏌ヨ鍗忕▼鐨勪釜鏁癕AX_COROUTINE锛屽紑鍚紓姝ySQL瀹㈡埛绔椂鍑忎竴锛屽叧闂紓姝ySQL瀹㈡埛绔椂鍔犱竴锛涘綋鐢ㄦ埛璇锋眰鎱㈡煡璇㈡椂锛屽鏋淢AX_COROUTINE澶т簬0锛屽垯鐢卞紓姝ySQL瀹㈡埛绔鐞嗭紝濡傛灉MAX_COROUTINE绛変簬0锛屽垯鐢变富杩涚▼鑷澶勭悊銆?GB+4Core铏氭嫙鏈轰笅鍘嬪姏娴嬭瘯锛屾祴璇旽TTP鏈嶅姟鍣ㄥ拰鏁版嵁搴撹鍐欙細涓€鑸揩鏌ヨ蹇啓娴嬭瘯锛?00骞跺彂5涓囪姹傝锛屼娇鐢℉TTPKeepalive锛屽钩鍧嘠PS锛歂ginX+PHP-FPM+Lumen+MySQLQPS锛?21.56Swoole+Lumen+MySQLQPS锛?509.99200骞跺彂50000璇锋眰鍐欏叆锛屼娇鐢℉TTPKeepalive锛屽钩鍧嘠PS锛歂ginX+PHP-FPM+Lumen+MySQLQPS锛?49.44Swoole+Lumen+MySQLQPS锛?253.93鎱㈡煡璇㈠崗绋嬫祴璇曪細SwooleHTTP鏈嶅姟鍣?6worker骞跺彂鎵цselectsleep(1)锛涜姹傜殑鏈€澶ф晥鐜囦负15.72rps锛?6workerx10coroutine鐨凷wooleHTTPserver骞跺彂鎵цselectsleep(1)锛涜姹傜殑鏈€澶ф晥鐜囦负151.93rps銆備负浠€涔堟垜浠湪杩欓噷璇存渶澶ф晥鐜囷紵鍥犱负褰撳苟鍙戦噺杩滃ぇ浜巜orker鏁伴噺x鍗忕▼鏁伴噺鏃讹紝鍙互寮€鍚參鏌ヨ鍗忕▼鐨凷wooleHTTP鏈嶅姟鍣ㄧ殑鏁堢巼浼氶€愭笎涓嬮檷鍒版櫘閫歋wooleHTTP鏈嶅姟鍣ㄧ殑鏁堢巼銆傞€夋嫨鐫$湢锛?锛夛紱鏌ヨ璇彞鑰楁椂1绉掞紝姣忎釜鐢ㄦ埛璇锋眰鑰楁椂1绉掑鐞嗭紱浣嗘槸16涓繘绋嬶紝姣忎釜杩涚▼鍙互寮€鍚?0涓參鏌ヨ鍗忕▼鐨凷wooleHTTP鏈嶅姟鍣ㄦ渶澶氬彲浠ュ鐞?60涓敤鎴疯姹傦紝鑰屾櫘閫氱殑16涓繘绋嬬殑SwooleHTTP鏈嶅姟鍣ㄦ瘡绉掓渶澶氬彧鑳藉鐞?6涓敤鎴疯姹傘€傚叾瀹烇紝閫氳繃浣跨敤yield锛屾垜浠繕鍙互瀹炵幇鍚勭鈥滃崗绋嬧€濄€傛瘮濡係woole2.1寮€濮嬫敮鎸乬o鍑芥暟鍜宑hannels銆備互鍚庢垜浠彲鑳借繕浼氬皢LumenController涓殑涓€浜汭O闃诲鎿嶄綔鐨勪笂涓嬫枃绉诲埌鍑芥暟涓幓鎵ц锛屾棦淇濈暀浜嗗悓姝ョ紪绋嬬殑椋庢牸锛屽張瀹炵幇浜嗗紓姝ユ墽琛屻€傝〃鐜般€傛渶鍚庡湪lumen-swoole-http椤圭洰涓疄鐜颁簡浠ヤ笂鐞嗚銆俵umen-swoole-http鏄繛鎺ュ悓姝ョ紪绋婰umen鍜屽紓姝ョ紪绋婼woole鐨勬ˉ姊侊紝鍙互甯姪鍘熺敓PHPLumen搴旂敤椤圭洰蹇€熻縼绉诲埌SwooleHTTP鏈嶅姟鍣紱褰撶劧涔熷彲浠ュ揩閫熻縼绉诲洖鏉ヰ煒傘€傛湁鍏磋叮鐨勫悓瀛﹀彲浠ュ皾璇曚娇鐢細Installandconfigureslowquerycoroutines...