swoole httpServer

swoole 內置實現了一個簡單的httpServer類。swoole版的http server相對于php-fpm,最大優(yōu)勢在于高性能,代碼一次載入內存,后續(xù)無需再解釋執(zhí)行,但是swoole_http_server對Http協議的支持并不完整,實際生產環(huán)境,一般是前面加一層Nginx,由Nginx解析一些靜態(tài)css、js文件,php文件請求交由swoole處理

示意圖:


1、http_server本質是swoole_server,不過在協議的解析部分固定使用的是http協議解析

2、完整的http協議請求會被解析并封裝在swoole_http_request對象當中

3、所有的http響應都通過swoole_http_response對象進行封裝和發(fā)送


$server = new Swoole\Http\Server('0.0.0.0','9800');

$server->on('request',function ($request,$response){

? ? //Chrome瀏覽器會自動請求一次favicon.ico,所以服務器會收到2個Request

? ? $uri = $request->server['request_uri'];

? ? if ($uri == '/favicon.ico') {

? ? ? ? $response->status(404);

? ? ? ? $response->end();

? ? }else{

? ? ? ? //application/x-www-form-urlencoded格式的Http POST請求? $request->post

? ? ? ? print_r($request->header["content-type"]);

? ? ? ? if($request->header["content-type"]=="application/x-www-form-urlencoded/"){

? ? ? ? ? ? print_r($request->post);

? ? ? ? }else{

? ? ? ? ? ? print_r($request->rawContent());

? ? ? ? }

? ? ? ? //rawContent

? ? ? ? $response->end('http server');

? ? }

});

$server->start();


注意事項:

1.Swoole的HttpServer可以接受application/x-www-form-urlencoded/form-data類型的POST參數,并且會將解析后的參數存放在swoole_server_request對象的post成員變量內。

對于application/json或者其他類型的請求參數,Swoole底層并不會自動解析。但是Swoole的swoole_server_request提供了rawContent方法可以獲得原始的POST字符串,我們可以根據Content-type類型做相應的解析。


swoole_http_response

注意事項:

?請在end()之前設置相應的響應頭、狀態(tài)等等,end操作后將向客戶端瀏覽器發(fā)送內容,并銷毀request/response對象



//$server = new\swoole\http\server();

//

//注意事項:1

//Swoole的HttpServer可以接受application/x-www-form-urlencoded/form-data類型的POST參數,

//并且會將解析后的參數存放在swoole_server_request對象的post成員變量內。

//對于application/json或者其他類型的請求參數,Swoole底層并不會自動解析。

//但是Swoole的swoole_server_request提供了rawContent方法可以獲得原始的POST字符串,我們可以根據Content-type類型做相應的解析。

//2.POST/文件上傳需要設置臨時文件位置(upload_tmp_dir),并且需要設置包的大小,最大尺寸受到?package_max_length

//配置項限制,默認為2M,調用$response->end后會自動刪除,在end之后操作上傳文件會拋出文件不存在錯誤。

//

$server = new swoole_http_server('0.0.0.0',9800);

$server->set([

? ? 'worker_num' =>5,

? ? 'package_max_length'=>1024*1024*2,//2M默認為 2M

? ? 'upload_tmp_dir'=>__DIR__.'/upload',

]);

/**

addlistener 可以實現多端口監(jiān)聽 但是 http 的不能監(jiān)聽tcp 的似乎 回調函數無法區(qū)分

監(jiān)聽1024以下的端口需要root權限

主服務器是WebSocket或Http協議,新監(jiān)聽的TCP端口默認會繼承主Server的協議設置。必須單獨調用set方法設置新的協議才會啟用新協議

* 設置worker_num數量的時候這里的worker進程不會另外創(chuàng)建

* swoole_server_port設置worker_num是不生效的

* */

$port = $server->addlistener('192.168.10.10',9501,SWOOLE_SOCK_TCP);

$port->set([

? ? 'worker_num' =>6,

]);

$port->on('receive', function ($serv, $fd, $from_id, $data) {

? ? $servInfo = $serv->connection_info($fd,$from_id);

? ? if($servInfo['server_port']=='9501'){

? ? ? ? //echo '內網';

? ? }

});

$port->on('close', function ($serv, $fd) {

? // echo '內網';

});

$server->on('request',function ($request , $response){

? ? var_dump($request);

? ? $response->header("content-type",? "text/html");

? ? $response->header("Charset",? "utf-8");

? ? $response->cookie('user','lee');

? ? //根據不同的相應類型返回不同的數據格式

? ? var_dump($request->header['content-type']);

? ? if($request->header['content-type']=='application/x-www-form-urlencoded'){

? ? ? ? var_dump($request->post);

? ? }else{

? ? ? ? var_dump($request->rawContent());//原始數據

? ? }

? ? $response->end('http? response');

? ? //$response->end('http? response'); 下面這個是不能相應的

});

$server->on('workerStart', function ($serv, $fd) {

? ? echo 1;

});

$server->start();

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • //$server = new\swoole\http\server(); // //注意事項:1 //Swool...
    lijiefeng閱讀 351評論 0 0
  • 目標 了解swoole的http_server的使用 了解swoole的tcp服務開發(fā) 實際項目中問題如粘包處理、...
    JunChow520閱讀 4,161評論 0 9
  • http server 通過傳遞參數平滑啟動服務 服務應該在另外一個文件中,在服務被workerstart是引入,...
    濟夏閱讀 1,171評論 0 49
  • HttpServer 介紹 HttpServer 本質是swoole_server, 其協議解析部分固定使用Htt...
    zshanjun閱讀 441評論 0 0
  • 在php11版本還沒出來之前。。。swoole的橫空出世確實給php插上一雙飛上天的翅膀,emmmm...都這么說...
    Koln_781a閱讀 887評論 0 0

友情鏈接更多精彩內容