gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

嘗試怎么將Laravel改成Swoole版

本篇文章給大家Laravel和Swoole的相關知識,主要內容是教大家怎么將Laravel改成Swoole版(嘗試學習,不建議更改現有項目),下面一起來看看吧,希望對大家有所幫助!

前言

不建議生產環境使用

創建一個新的 laravel 項目

laravel new swoole-laravel
登錄后復制

將 Laravel 改成 Swoole 版

Laravel 的根目錄創建一個 swoole_server.php 文件,然后把 public/index.php 中的代碼復制過來【推薦學習:laravel視頻教程】

<?php use IlluminateContractsHttpKernel; use IlluminateHttpRequest; define('LARAVEL_START', microtime(true)); require __DIR__.'/../vendor/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php'; $kernel = $app->make(Kernel::class); $response = $kernel->handle(     $request = Request::capture() )->send(); $kernel->terminate($request, $response);
登錄后復制

第一步,框架文件的加載是肯定的,而且應該是在主進程中就加載好的,不需要子進程或者協程再去重復加載。因此,上面的 require 都不太需要動。

第二步,我們要啟動一個 HTTP 的 Swoole 服務,這個之前已經講過很多次了,注意,在 onRequest 中,我們應該將 $kernel 相關的代碼放入進去。

$http = new SwooleHttpServer('0.0.0.0', 9501); $http->on('Request', function ($req, $res) use($app) {     try {         $kernel = $app->make(Kernel::class);         $response = $kernel->handle(             $request = Request::capture()         )->send();         $kernel->terminate($request, $response);     }catch(Exception $e){         print_r($e->getMessage());     } }); echo "服務啟動", PHP_EOL; $http->start();
登錄后復制

這樣就可以了嗎?要不你先試試看。正常情況下可能你是獲得不了任何的輸入和輸出的,這是為啥?

第三步,解決輸入問題,其實就是超全局變量在 Swoole 中是不起作用的,所以 $_GET 之類的變量都會失效,Laravel 中 Request 相關的對象都無法獲得數據了。這怎么辦呢?我們從 onRequest 的參數中拿這些數據,然后再放回到當前進程協程中的 $_GET 中就好啦。

$http->on('Request', function ($req, $res) use($app) {     $_SERVER = [];     if(isset($req->server)){         foreach($req->server as $k => $v){             $_SERVER[strtoupper($k)] = $v;         }     }     $_GET = [];     if(isset($req->get)){         foreach ($req->get as $k => $v){             $_GET[$k] = $v;         }     }     $_POST = [];     if(isset($req->post)){         foreach ($req->post as $k => $v){             $_POST[$k] = $v;         }     }     try {         $kernel = $app->make(Kernel::class);         $response = $kernel->handle(             $request = Request::capture()         )->send();         $kernel->terminate($request, $response);     }catch(Exception $e){         print_r($e->getMessage());     } });
登錄后復制

上面三段代碼,分別解決了 $_SERVER、$_GET 和 $_POST 的問題。現在你再試試,參數是可以接收到了,但輸出怎么是打印在控制臺的?

第四步,解決輸出問題,將框架中的所有輸出放到輸出緩沖區,然后再用 Swoole 的 Response 返回。

$http->on('Request', function ($req, $res) use($app) {     $_SERVER = [];     if(isset($req->server)){         foreach($req->server as $k => $v){             $_SERVER[strtoupper($k)] = $v;         }     }     $_GET = [];     if(isset($req->get)){         foreach ($req->get as $k => $v){             $_GET[$k] = $v;         }     }     $_POST = [];     if(isset($req->post)){         foreach ($req->post as $k => $v){             $_POST[$k] = $v;         }     }     //把返回放到一個緩沖區里     ob_start();     try {         $kernel = $app->make(Kernel::class);         $response = $kernel->handle(             $request = Request::capture()         )->send();         $kernel->terminate($request, $response);     }catch(Exception $e){         print_r($e->getMessage());     }     $ob = ob_get_contents();     ob_end_clean();     $res->end($ob); });
登錄后復制

最后的 ob_start () 這些內容,也是我們之前學習過的內容,也就不多做解釋了。

全部代碼

<?php use IlluminateContractsHttpKernel; use IlluminateHttpRequest; define('LARAVEL_START', microtime(true)); require __DIR__.'/vendor/autoload.php'; $app = require_once __DIR__.'/bootstrap/app.php'; $http = new SwooleHttpServer('0.0.0.0', 9501); $http->on('Request', function ($req, $res) use($app) {     $_SERVER = [];     if(isset($req->server)){         foreach($req->server as $k => $v){             $_SERVER[strtoupper($k)] = $v;         }     }     $_GET = [];     if(isset($req->get)){         foreach ($req->get as $k => $v){             $_GET[$k] = $v;         }     }     $_POST = [];     if(isset($req->post)){         foreach ($req->post as $k => $v){             $_POST[$k] = $v;         }     }     //把返回放到一個緩沖區里     ob_start();     try {         $kernel = $app->make(Kernel::class);         $response = $kernel->handle(             $request = Request::capture()         )->send();         $kernel->terminate($request, $response);     }catch(Exception $e){         print_r($e->getMessage());     }     $ob = ob_get_contents();     ob_end_clean();     $res->end($ob); }); echo "服務啟動", PHP_EOL; $http->start();
登錄后復制

至此,我們最簡單的框架改造就完成了,趕緊試試效果吧。

運行

php swoole_server.php
登錄后復制

訪問

http://47.113.xxx.xx:9501/
登錄后復制

試試協程效果

先定義一個路由。或者我們直接改造一下默認的路由。

Route::get('/', function () {     echo SwooleCoroutine::getCid(), "<br/>";     print_r(SwooleCoroutine::stats());     SwooleCoroutine::sleep(10);     echo "<br/>";     echo getmypid(), "<br/>"; //    return view('welcome'); });
登錄后復制

打印了一堆東西,不過應該都比較熟悉吧,前兩個是協程 ID 和協程信息的輸出,然后我們 SwooleCoroutine::sleep () 了 10 秒,再打印一下進程 ID 。

然后我們打開瀏覽器,準備兩個標簽一起訪問。

// 第一個訪問的頁面 1 Array (     [event_num] => 2     [signal_listener_num] => 0     [aio_task_num] => 0     [aio_worker_num] => 0     [aio_queue_size] => 0     [c_stack_size] => 2097152     [coroutine_num] => 1     [coroutine_peak_num] => 1     [coroutine_last_cid] => 1 ) 1468 // 第二個訪問的頁面 2 Array (     [event_num] => 2     [signal_listener_num] => 0     [aio_task_num] => 0     [aio_worker_num] => 0     [aio_queue_size] => 0     [c_stack_size] => 2097152     [coroutine_num] => 2     [coroutine_peak_num] => 2     [coroutine_last_cid] => 2 ) 1468
登錄后復制

看出來了嗎?每個 onRequest 事件其實都是開了一個新的協程來處理請求所以它們的協程 ID 不同。同時,第二個請求不會因為第一個請求阻塞而等到 20 秒后才返回。最后在協程狀態中,我們還看到了第二個請求中顯示 coroutine_num 有兩個,說明當前有兩個協程在處理任務。最后,進程是相同的,它們都是走的同一個進程。

試試多進程效果

默認情況下,上面的代碼是一個主進程,一個 Worker 進程,然后再使用了協程能力。其實這樣的效果已經能秒殺普通的 PHP-FPM 效果了。但我們要充分利用多核機器的性能,也就是說,我們來開啟多進程,使用多進程 + 多協程的超強處理模式。最簡單的方式,直接設置 HTTP 服務的進程 Worker 數量即可。

$http->set(array(     'worker_num' => 4,       // 'worker_num' => 1,單進程 ));
登錄后復制

現在運行起服務器,可以看到多了幾個進程了。然后我們再新建一個測試路由

Route::get('/a', function () {     echo SwooleCoroutine::getCid(), "<br/>";     print_r(SwooleCoroutine::stats());     echo "<br/>";     echo getmypid(), "<br/>"; });
登錄后復制

現在再次訪問首頁和這個 /a 頁面。

// 首頁一 1 Array (     [event_num] => 2     [signal_listener_num] => 0     [aio_task_num] => 0     [aio_worker_num] => 0     [aio_queue_size] => 0     [c_stack_size] => 2097152     [coroutine_num] => 1     [coroutine_peak_num] => 1     [coroutine_last_cid] => 1 ) 1562 // 首頁二 1 Array (     [event_num] => 2     [signal_listener_num] => 0     [aio_task_num] => 0     [aio_worker_num] => 0     [aio_queue_size] => 0     [c_stack_size] => 2097152     [coroutine_num] => 1     [coroutine_peak_num] => 1     [coroutine_last_cid] => 1 ) 1563 // /a 頁面 1 Array (     [event_num] => 2     [signal_listener_num] => 0     [aio_task_num] => 0     [aio_worker_num] => 0     [aio_queue_size] => 0     [c_stack_size] => 2097152     [coroutine_num] => 1     [coroutine_peak_num] => 1     [coroutine_last_cid] => 1 ) 1564
登錄后復制

發現沒有,它們的進程 ID 也都不同了吧,如果沒有阻塞,會優先切換進程,如果所有進程都有阻塞,則再循環創建協程進行進程內的處理。

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
国产中文字幕在线免费观看| 中文字幕第22页| 亚洲高潮无码久久| 久久精品国产99久久99久久久| 午夜精品久久久内射近拍高清| av无码久久久久久不卡网站| 男女h黄动漫啪啪无遮挡软件| 国产无色aaa| 三级性生活视频| 午夜av中文字幕| 天天综合五月天| 97超碰免费观看| 久久久精品高清| 福利视频999| 免费成人深夜夜行网站视频| 免费的av在线| 日本欧美黄色片| 99久久激情视频| 天天操天天干天天做| 艳母动漫在线免费观看| 欧美图片激情小说| 人妻熟女一二三区夜夜爱| 国产小视频精品| 色乱码一区二区三区熟女| 97在线国产视频| 国产免费又粗又猛又爽| 日本女人高潮视频| aa免费在线观看| 久久久久久久久久毛片| 男女私大尺度视频| 免费日韩中文字幕| 法国空姐在线观看免费| 91专区在线观看| 制服丝袜中文字幕第一页| 欧美一级中文字幕| 制服丝袜综合网| 亚洲精品无码国产| 亚洲综合色在线观看| 欧美狂野激情性xxxx在线观| 国产一级做a爰片久久| 成人午夜免费剧场| 亚洲第一狼人区| a在线视频观看| 7777在线视频| 玖玖爱视频在线| 日韩一级免费在线观看| 国产日韩亚洲欧美在线| 天堂视频免费看| 北条麻妃在线观看| 性高湖久久久久久久久aaaaa| 久久黄色片网站| 东京热加勒比无码少妇| av中文字幕av| 97人人模人人爽人人澡| 成人中文字幕av| 成人免费在线小视频| 日韩成人三级视频| 日本中文字幕在线不卡| 精品久久久噜噜噜噜久久图片| 成年人看的毛片| 污污污污污污www网站免费| 欧美激情第四页| www.色.com| 99亚洲精品视频| 日本一本草久p| 可以免费看的黄色网址| 日本一区二区免费高清视频| 日本高清免费在线视频| 中文字幕日韩综合| 日本新janpanese乱熟| 欧美牲交a欧美牲交aⅴ免费真 | 中文字幕第21页| 五月天亚洲视频| 中文字幕中文在线| www.污污视频| 国产性生活一级片| 永久av免费在线观看| 免费看污污视频| 成人一对一视频| www.日本xxxx| 黄色片免费网址| 50度灰在线观看| 你懂的av在线| 热久久精品免费视频| 日本黄大片一区二区三区| 亚洲va在线va天堂va偷拍| 久久精品视频在线观看免费| 国产永久免费网站| 久久人妻无码一区二区| 免费av观看网址| 日本xxxx黄色| 男人草女人视频| 无码无遮挡又大又爽又黄的视频| av网站在线不卡| 国产尤物av一区二区三区| 苍井空浴缸大战猛男120分钟| 日韩大片一区二区| 久艹在线免费观看| 亚洲精品怡红院| 免费观看国产视频在线| 116极品美女午夜一级| 91日韩精品视频| 国产手机免费视频| 五月天婷婷影视| 免费欧美一级视频| 91制片厂免费观看| 欧美亚洲日本在线观看| www.男人天堂网| 99免费视频观看| 免费一级淫片aaa片毛片a级| 看欧美ab黄色大片视频免费 | 三年中文在线观看免费大全中国| 午夜探花在线观看| 37pao成人国产永久免费视频| mm131亚洲精品| 成年人视频网站免费观看| 三级av免费看| 色婷婷成人在线| 国产精品99久久免费黑人人妻| 777久久精品一区二区三区无码| 熟妇人妻va精品中文字幕| www.男人天堂网| 天天爱天天做天天操| 污网站免费在线| 免费看国产黄色片| 日韩精品无码一区二区三区免费| 丝袜人妻一区二区三区| 亚洲一区 在线播放| 日韩欧美中文在线视频| 欧美女同在线观看| av网站在线不卡| 久久婷婷综合色| 中文字幕久久av| 亚洲综合av在线播放| 欧美成人福利在线观看| 天天爽夜夜爽一区二区三区| 亚洲五月天综合| 91插插插插插插插插| 男操女免费网站| 男女无套免费视频网站动漫| av网站在线观看不卡| 5月婷婷6月丁香| 无码内射中文字幕岛国片| 一区二区在线播放视频| 91精品无人成人www| 日本人69视频| 黄瓜视频免费观看在线观看www| 九九热精品国产| 青青草原网站在线观看| 日本免费成人网| 成人免费aaa| 亚洲欧美另类动漫| 思思久久精品视频| 一级全黄肉体裸体全过程| av影院在线播放| 国产xxxxx视频| 一级黄色录像免费看| 免费无遮挡无码永久视频| 91在线视频观看免费| 四虎4hu永久免费入口| 国产91在线免费| 日韩精品视频网址| 亚洲自偷自拍熟女另类| 亚洲激情在线看| 国产乱淫av片杨贵妃| 黑人粗进入欧美aaaaa| 美女av免费观看| 三级视频中文字幕| 成年人网站国产| 99国产精品久久久久久| 国产成人永久免费视频| 深夜黄色小视频| 草b视频在线观看| 亚洲午夜精品一区| www.浪潮av.com| 美女av免费观看| 色婷婷一区二区三区av免费看| av在线观看地址| 污色网站在线观看| 欧美日韩成人免费视频| 手机在线视频一区| 手机在线看福利| 日韩五码在线观看| 六月婷婷激情网| 性chinese极品按摩| 日韩av黄色网址| 国产传媒久久久| 日本一级淫片演员| 亚洲娇小娇小娇小| 国产亚洲综合视频| 亚洲色欲久久久综合网东京热| 加勒比av中文字幕| 亚洲综合欧美激情| 中文字幕第80页| 成人在线看视频| 日韩免费毛片视频| 精品久久久久av| 日韩欧美国产免费| 黄色片视频在线播放| 国产精品视频一区二区三区四区五区|