1. 程式人生 > >php搭建swooleTCP伺服器

php搭建swooleTCP伺服器

這次的swoole學習,比較緩慢

也由於這些幾天事比較多,晚上沒去學習,swoole的筆記也一直在沒編寫,下面簡單介紹和應用下swoole

swoole是什麼?

  • 非同步、並行、高效能
  • 純C編寫
  • php擴充套件

swoole能做什麼?

  • 非同步多執行緒伺服器及客戶端
  • 非同步MySQL、Reids、資料庫連線池、任務佇列
  • http/websocket伺服器/客戶端
  • 非同步檔案讀寫
  • Swoole2.0支援協程

Swolle 實踐

swoole手冊:https://wiki.swoole.com/wiki/page/1.html

伺服器版本:centos7/ubuntu16

php版本:5.4+

一、swoole安裝(百度上有很多安裝文章,也可以用寶塔直接安裝)

二、簡單TCP伺服器建立

<?php
/**@建立TCP伺服器 * 作者:生生 */ $host = '127.0.0.1'; //監聽對應外網的IP 0.0.0.0監聽所有ip $port = 9501;   //埠號(1024以下埠需要root許可權) $mode = SWOOLE_PROCESS; //SWOOLE_PROCESS 程序模式-多程序方式 $socke_type = SWOOLE_SOCK_TCP; //SWOOLE_SOCK_TCP 伺服器型別-預設TCP $serv = new swoole_server($host,$port);
//後面2引數不寫是預設 /**@ * 函式:bool $swoole_server->on(string $event,miexd $callback); * $event * connect:當建立連結的時候 (2個預設引數:$serv-伺服器資訊,$fd-客戶資訊 /-名字隨意) * receive:當接收資料的時候 (4個預設引數:$serv-同上,$fd-同上,$from_id-客戶id,$data-傳遞資料) * close:關閉連結 */ //@作用:監聽連結進入事件 $serv->on('connect',function($serv,$fd){ echo '連結成功'; });
//@作用:監聽資料接收事件 $serv->on('receive',function($serv,$fd,$from_id,$data){
    var_dump($fd.'--'.$data);
/**@ * 函式:bool Server->send(mixed $fd, string $data, int $serverSocket = -1); * 作用:向客戶端傳送資料 * 引數: * $fd,客戶端的檔案描述符 * $data,傳送的資料,TCP協議最大不得超過2M,可修改 buffer_output_size 改變允許傳送的最大包長度 * $serverSocket,向Unix Socket DGRAM對端傳送資料時需要此項引數,TCP客戶端不需要填寫 */ $serv->send($fd,"資料:".$data); }); //@作用:監聽連結關閉事件 $serv->on('close',function($ser,$fd){ echo '關閉連結'; }); //啟動服務 $serv->start();

三、執行上面php檔案

  1、瀏覽器直接訪問會提示:Fatal error: Swoole\Server::__construct(): swoole_server only can be used in PHP CLI mode. in /www/jzj/public/aa.php on line 7

     這個檔案需要用php CLI模式(php命令列模式執行: php -f 執行檔名.php)

   

       2、如果命令列執行的時候出現這個錯誤說明,埠被佔用,

     

    檢視被佔用的埠PID:sudo lsof -i:9501

    kill掉程序:sudo kill -9 PID(在執行 php -f 執行檔名.php

      

 四、建立TCP同步客戶端(TP5舉例)

<?php
namespace app\admin\controller;
use think\Controller;
use think\Db;
use Redis;
use swoole_client;
class Index extends controller
{
//客戶端swoole public function swoole() { $client = new swoole_client(SWOOLE_SOCK_TCP); //連線到伺服器 if (!$client->connect('127.0.0.1', 9501, 0.5)) { die("connect failed."); } //向伺服器傳送資料 if (!$client->send("hello world")) { echo '傳送失敗'; } //從伺服器接收資料 $data = $client->recv(); if (!$data) { die("recv failed."); } echo $data; //關閉連線 $client->close(); } }

  注意客戶端伺服器在框架中要引入

  

  把這個檔案上傳到伺服器專案中,瀏覽器訪問這個後如果報錯如下:是因為服務端沒有send傳送資料出來問題

 

   服務端會出現send為空,要注意很可能是$serv->on中的第一個引數不對,

  

   如圖:這個引數一定要是對應的new的物件

  

  在重新執行檔案:命令列會出現這個,

  

  

  這樣就完成了簡單的tcp伺服器與同步tcp客戶端的搭建,當tcp伺服器檔案執行完成後刪除也不影響(建議保留)

  簡單流程是:編寫TCP伺服器檔案->執行伺服器檔案->TCP伺服器建立成功->建立TCP客戶端檔案->執行與服務端(向服務端傳送資料並接受服務端返回資訊)

  當然這篇只是簡單的搭建與瞭解swoole,後續還會更新簡單的swoole的php非同步操作與實時聊天功能

  本人也是新手,swoole是很強大的擴充套件,裡面包含很多知識我也在學習中

  想要探討swoole或者其他問題可以關注部落格園:傳說中的生生或+Q:876036823一起交流

                              -----生生的筆記