php swoole 安裝與使用


swoole 安裝
用的是centOS
php安裝目錄:/usr/local/php
php.ini配置文件路徑:/usr/local/php/etc/php.ini
1、安裝swoole
cd /usr/local/src
wget https://github.com/swoole/swoole-src/archive/v1.9.1-stable.tar.gz   #版本不一樣   https://github.com/swoole/swoole-src/releases
tar zxvf v1.9.1-stable.tar.gz
cd swoole-src-1.9.1-stable
/usr/local/php/bin/phpize
                #查找對應的php-config find / -name php-config
./configure --with-php-config=/usr/local/php/bin/php-config make make install 2、配置php支持swoole vi /usr/local/php/etc/php.ini 添加 extension=swoole.so 3、重啟php-fpm service php-fpm restart 在phpinfo頁面可以看到關於swoole的選項,說明安裝成功。 搭建tcp 服務器 <?php //創建服務器 $host = '0.0.0.0'; $port = 9501; $serv = new swoole_server($host,$port) ; /* $host:127.0.0.1 本地ip 可以監聽多個ip 使用0.0.0.0 $port:端口號 1024端口以下需要root權限 $mode : SWOOLE_PROCESS 多進程的方式 $socke_type:SWOOLE_SPCL_TCP / //使用 // bool $swoole_server->on(string $event,mixed $callback) /* $event: connect: 當建立連接的時候 $serv 服務器信息 $fd:客戶端信息 receive: 當接受到的數據$serv 服務器信息,$fd 客戶端,$from_id ID,$data 數據 close:關閉連接 */ $serv->on('connect',function($serv,$fd){ echo "連接成功" }); $serv->on('receive',function($serv,$fd,$from_id,$data){ echo "接收到的數據"; var_dump($data); //打印接收到的數據 }); $serv->on('close',function($serv,$fd){ echo"連接關閉"; }) $serv->start();//啟動服務 ?> 上傳到 服務器后 php index.php 啟動 ps -ajft 查看進程來查看啟動成功沒 使用網絡調試助手來進行調試查看tcp服務是否好用 UDP服務器創建 udp.php <?php $serv = new swoole_server("0.0.0.0",9502,SWOOLE_PROCESS,SWOOLE_SOCK_UDP) //監聽數據接收事件 /* $serv:服務器信息 $data:數據,接收到的數據 $fd:客戶端信息 */ $serv->on('packet',function($serv,$data,$fd){ //發送數據到相應的客戶端,反饋信息 $serv->sendto($fd['address'],$fd['port'],"Server: $data"); var_dump($fd); } ); $serv->start() ?> web 服務器 <?php //創建web服務器 $serv = new swoole_http_server("0.0.0.0",9501); // 獲取請求 /* $request:請求信息 $response:返回信息 */ $serv->on('request',function($request,$response){ var_dump($request); $response->header("Content-Type","text/html;charset=utf-8");//設置返回頭信息 $response->end("hello word".rand(100,999)); }); $serv->start(); ?> 實現websocket <?php //創建webscork 服務器 $ws =new swoole_websocket_server //on //open 建立連接 $ws 服務器, $request:客戶端信息 $ws ->on('open',function($ws,$request){ var_dump($request); $ws->push($request->fd,"welcome \n"); }) //message 接收信息 $ws ->on('message',function($ws,$request){ echo "Message: $request->data"; $ws->push($request->fd,"get it message"); }); //close 關閉連接 $ws->on('close',function($ws,$request){ echo "close\n"; }) $ws->start(); ?> webscork.html <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <script> //指的服務器webscort服務器 var wsServer="ws://192.168.0.1:9501;" var webSocket = new WebSocket(wsServer); webSocket.onopen = function(evt){ console.log("連接成功"); } webSocket.onclose = function(evt){ console.log("關閉") } webSocket.onmessage = function(evt){ console.log(data); } webSocket.onerror = function(evt,e){ console.log("error") } </script> </body> </html> <?php //循環執行定時器 swoole_time_tick(2000,function($timer_id){ echo "執行 $timer_id \n"; }); //單次執行 swoole_time_after(3000,function(){ echo "3 秒后執行" }) ?> <?php //task() 函數 投遞異步任務 //on('事件',function(){}) 處理函數 執行異步函數 //finish()函數, 任務處理完成后結果 //異步TCP服務器 //創建TCP服務器 $serv = new swoole_server("0.0.0.0",9501); //設置異步 進程工作數 $serv ->set(array('task_worker_num' =>4 )); // 投遞異步任務 $serv->on("receive",function($serv,$fd,$from_id,$data){ $task_id = $serv->tack($data);//獲取異步ID echo "異步ID: $task_id\n"; }); //處理異步任務 $serv -> on('task',functino($serv,$task_id,$from_id,$data){ echo "執行 異步ID:$task_id"; $serv-finish("$data->ok"); }); //處理結果 $serv ->on('finish',function($serv,$task_id,$data){ echo "執行完成"; }) $serv->start(); ?> <?php //進程創建 /* new swoole_process() 參數1: mixed $function 子進程創建成功后執行的函數 參數2: $redirect_stdin_stdout 重定向子進程的標准輸入和輸出。啟用此選項后,在進程內echo將不是打印屏幕。而是寫入到管道 讀取鍵盤輸入將變成從管道中讀取。默認為阻塞讀取 $create_pipe 是否創建管道。啟用 $redirect_stdin_stdout后,此選項將忽略用戶參數,強制為true,如果子進程內沒有進程間通信,可以設置為false */ //創建進程 //進程對應的執行函數 function doProcess(swoole_process $worker){ echo "PID",$worker->pid,"\n"; sleep(10); } //創建進程 //創建多個進程 $process = new swoole_process("doProcess"); $pid = $process->start(); $process = new swoole_process("doProcess"); $pid = $process->start(); //等待結束 swoole_process::wait(); ?> <?php //進程事件 //swoole_event_add() /*參數1:int_$sock int 文件描述 mixed $read callback 就是 stream_socket_client/fsockopen創建資源 sockets 就是sockets擴展中socket_create創建的資源,需要在編譯時候加入 ./configure --enable-sockets */ $workers = [];//進程數組 $worker_num =3;//創建進程的數量 //創建啟動進程 for ($i = 0;$i<$worker_num;$i++){ $process =new swoole_process('doProcess');//創建單獨的新進程 $pid = $process->start();//啟動進程,獲取進程ID $workers[$pid] = $process// 存入進程數組 } //創建進程執行函數 function doProcess(swoole_process $process){ $process->write("PID:$process->pid");//子進程寫入信息 echo "寫入信息: $process->pid $process->callback"; } //添加進程事件 向每一個子進程添加需要執行的動作 foreach($workers as $process){ //添加 swoole_event_add($process->pipe,function($pipe) use($process){ $data = $process->read();//能否讀取數據 echo "接受到:$data \n"; }); } ?> <?php //進程隊列通信 $workers = [];//進程倉庫 $worker_num = 2;//最大進程數 //批量創建進程 for($i = 0;$i<$worker_num;$i++){ $process = new swoole_process('doProcess',false,false)//創建子進程完成 $process->useQuneue();//開啟隊列,類似於全局函數 $pid = $process->start(); $workers[$pid] = $process } //進程執行函數 function doProcess(swoole_process $process){ $recv = $process->pop();//8192 echo "從主進程獲取到的數據:$recv \n"; sleep(5); $process->exit(0); } //主進程 向子進程添加數據 foreach($workers as $pid =>$process){ $process->push("Hello 子進程 $pid \n") } //等待子進程結束回收資源 for($i=0;$i<$worker_num;$i++){ $ret = swoole_process::wait();//等待執行完成 $pid = $ret['pid']; unset($workers[$pid]); echo "子進程退出 $pid \n"; } ?> <?php //觸發函數 異步執行 達到10次停止 swoole_process::signal(SIGALRM,function(){ static $i = 0; echo "$i \n"; $i++; if($i>10){ swoole_process::alarm(-1); //清除定時器 } }); //定時器 swoole_process::alarm(100 *1000); ?> <?php //創建鎖對象 $lock = new swoole_lock(SWOOLE_MUTEX);//互斥鎖 echo "創建互斥鎖\n"; $lock->lock();//開始鎖定 主進程 if(pcntl_fork()>0){ sleep(1); $lock->unlock();//解鎖 }else{ echo "子進程 等待鎖\n"; $lock->lock();//上鎖 echo "子進程 獲取所"; $lock->unlock();//釋放鎖 exit("子進程退出"); } echo "主進程 釋放鎖"; unset($lock); sleep(1); echo "子進程退出"; ?> <?php //dns查詢 swoole_async_dns_lookup('www.baidu.com',function($host,$ip){ echo "$host,$ip"; }) ?> swoole 實現及時通信 服務器端 <?php //服務器代碼 //創建websocker 服務器 $ws =new swoole_websocket_server("0.0.0.0",9502); //on 函數 open message close //open情況 $ws->on('open',function($ws,$request){ echo "新用戶 $request->fd 加入。\n"; $GLOBALS['fd'][$request->fd]['id'] =$request->fd;//設置用戶ID $GLOBALS['fd'][$request->fd]['name'] ='匿名用戶';//設置用戶名 }); //message 收發消息 $ws->on('message',function($ws,$request){ $msg =$GLOBALS['fd'][$request->fd]['name'].":".$request->data."\n"; if(strstr($request->data,"#name#")){ //用戶設置昵稱 $GLOBALS['fd'][$request->fd]['name']=str_replace("#name#",'',$request->data); }else{ //進行用戶信息發送 //發送到每一個客戶端 foreach ($GLOBALS['fd'] as $i){ $ws->push($i['id'],$msg); } } }); //close $ws->on('close',function($ws,$request){ echo "客戶端-{$request} 斷開連接\n"; unset($GLOBALS['fd'][$request]);//清除連接倉庫 }); $ws->start() ?> 作者:a十二_4765 鏈接:https://www.jianshu.com/p/00babd74567e 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM