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的異步請求成功了
swoole 安裝和簡單實用
轉至:https://www.cnblogs.com/taikongliu/p/6801950.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.