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();