1. 程式人生 > >swoole 安裝和簡單實用

swoole 安裝和簡單實用

Swoole是:PHP語言的高效能網路通訊框架,提供了PHP語言的非同步多執行緒伺服器,非同步TCP/UDP網路客戶端,非同步MySQL,資料庫連線池,AsyncTask,訊息佇列,毫秒定時器,非同步檔案讀寫,非同步DNS查詢。 Swoole雖然是標準的PHP擴充套件,實際上與普通的擴充套件不同。普通的擴充套件只是提供一個庫函式。而swoole擴充套件在執行後會接管PHP的控制權,進入事件迴圈。當IO事件發生後,swoole會自動回撥指定的PHP函式。
一:兩種安裝方式:
1》編譯安裝:
1>wget http://pecl.php.net/get/swoole-1.9.6.tgz 或者
    wget http://www.taikongliu.com/swoole/swoole-1.7.6-stable.tar.gz        //下載swoole    
2>tar -zxvf swoole-1.7.6-stable.tar.gz        //解壓swoole
3>cd swoole-src-swoole-1.7.6-stable/        //進入swoole
4>/phpstudy/server/php/bin/phpize        //生成configure
5>./configure --with-php-config=/phpstudy/server/php/bin/php-config        //編譯
6>make && make install            //安裝
7>cd /phpstudy/server/php/lib/php/extensions/no-debug-non-zts-20121212    //檢視是否安轉上了swoole.so    (注意:此檔案下邊都是你安裝的拓展)
8>vim /phpstudy/server/php/etc/php.ini     //在php.ini新增extension=swoole.so加入到檔案最後一行
9>/phpstudy/server/nginx/sbin/nginx  -s reload    //重啟nginx    
10>檢視phpinfo,這時候swoole拓展已經裝上了

2》PECL安裝:
1>pecl install swoole    //如果以上步驟一切正常的話,即表示swoole已經成功的安裝了。
2>extension=swoole.so            //成功之後,我們開啟php.ini(不知道配置檔案在哪的回去再把CLI看一遍),把swoole.so加入到檔案最後
3>$ php -m | grep swoole    //檢視swoole是否被正確的安裝

如如果想要升級swoole:pecl upgrade swoole




二:伺服器端執行程式
1>建立server.php
<?php
$serv = new swoole_server('127.0.0.1', 9501);    
//server的建立,只需要繫結要監聽的ip和埠,如果ip指定為127.0.0.1,則表示客戶端只能位於本機才能連線,其他計算機無法連線。
//埠這裡指定為9501,可以通過netstat檢視下該埠是否被佔用。如果該埠被佔用,可更改為其他埠,如9502,9503等。
$serv->set([    //我開2個worker程序處理我們的業務
    'worker_num' => 2,
]);
// 有新的客戶端連線時,worker程序內會觸發該回調
$serv->on('Connect', function ($serv, $fd) {
    echo "new client connected." . PHP_EOL;
});
//引數$serv是我們一開始建立的swoole_server物件,
//引數$fd是唯一標識,用於區分不同的客戶端,同時該引數是1-1600萬之間可以複用的整數。
// server接收到客戶端的資料後,worker程序內觸發該回調
$serv->on('Receive', function ($serv, $fd, $fromId, $data) {
    // 收到資料後傳送給客戶端
    $serv->send($fd, 'Server '. $data);
});
// 客戶端斷開連線或者server主動關閉連線時 worker程序內呼叫
$serv->on('Close', function ($serv, $fd) {
    echo "Client close." . PHP_EOL;
});
// 啟動server
$serv->start();
?>

2>由於swoole_server只能執行在CLI模式下,所以不要試圖通過瀏覽器進行訪問,這樣是無效的,我們在命令列下面執行,注意一定要找到php的絕對路徑
     /phpstudy/server/php/bin/php  server.php  (這行程式碼的意思是,把程式在伺服器跑起來)
    注意:我們平時執行完一個指令,執行完就結束了,但是現在的情況正好相反,當前程式一直處於執行中的狀態,並沒有退出終端。退出狀態一般為當前終端的執行權交給了終端,
    即可用在終端下進行其他操作,此時伺服器的程序已經開啟了。
3>在開另一個終端,執行  telnet 127.0.0.1 9501  (模擬客戶端請求)   如果沒有安裝telnet,可以 yum install -y telnet 安裝
4>建立客戶端檔案,也要在CLI下執行:client.php
<?php
// 建立一個同步阻塞的tcp socket
// 第一個引數是表示socket的型別,有下面四種類型選擇,這裡選則tcp socket就好
/**
 *     SWOOLE_SOCK_TCP 建立tcp socket
SWOOLE_SOCK_TCP6 建立tcp ipv6 socket
SWOOLE_SOCK_UDP 建立udp socket
SWOOLE_SOCK_UDP6 建立udp ipv6 socket
 */
// 第二個引數是同步還是非同步
/**
 *     SWOOLE_SOCK_SYNC 同步客戶端
SWOOLE_SOCK_ASYNC 非同步客戶端
 */
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);

// 隨後建立連線,連線失敗直接退出並列印錯誤碼
$client->connect('127.0.0.1', 9503) || exit("connect failed. Error: {$client->errCode}\n");
// 向服務端傳送資料
$client->send("hello server.");
// 從服務端接收資料
$response = $client->recv();
// 輸出接受到的資料
echo $response . PHP_EOL;
// 關閉連線
$client->close();
5>/phpstudy/server/php/bin/php client.php        //執行客戶端,輸出Server hello server.
6>使用task非同步處理資料
  在建伺服器程式 server_asy.php
 <?php
/**
 * swoorl非同步處理
 */
$serv = new swoole_server("127.0.0.1", 9503);
//配置task程序的數量,即配置task_worker_num這個配置項。比如我們開啟一個task程序
$serv->set([
    'task_worker_num' => 1,
]);
$serv->on('Connect', function ($serv, $fd) {
    echo "new client connected." . PHP_EOL;
});
$serv->on('Receive', function ($serv, $fd, $fromId, $data) {
    echo "worker received data: {$data}" . PHP_EOL;

    // 投遞一個任務到task程序中
    $serv->task($data);

    // 通知客戶端server收到資料了
    $serv->send($fd, 'This is a message from server.');

    // 為了校驗task是否是非同步的,這裡和task程序內都輸出內容,看看誰先輸出
    echo "worker continue run."  . PHP_EOL;
});
/**
 * $serv swoole_server
 * $taskId 投遞的任務id,因為task程序是由worker程序發起,所以多worker多task下,該值可能會相同
 * $fromId 來自那個worker程序的id
 * $data 要投遞的任務資料
 */
$serv->on('Task', function ($serv, $taskId, $fromId, $data) {
    echo "task start. --- from worker id: {$fromId}." . PHP_EOL;
    for ($i=0; $i < 5; $i++) {
        sleep(1);
        echo "task runing. --- {$i}" . PHP_EOL;
    }
    echo "task end." . PHP_EOL;
});

$serv->on('Finish', function ($serv, $taskId, $data) {
    echo "finish received data '{$data}'" . PHP_EOL;
});
$serv->start();

7>/phpstudy/server/php/bin/php server_asy.php        //執行伺服器
8>/phpstudy/server/php/bin/php client.php        //在執行客戶端
9>再把server_asy.php中的echo"task end." . PHP_EOL;  改成return "task end." . PHP_EOL;,執行
   /phpstudy/server/php/bin/php server_asy.php    和/phpstudy/server/php/bin/php client.php,
  這時就可以看到swoole的非同步請求成功了