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的異步請求成功了

轉至:https://www.cnblogs.com/taikongliu/p/6801950.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章