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