環境安裝:javascript
檢測依賴環境是否安裝 rpm -qa | grep 「軟件或者包的名字」或者 yum list installedphp
eg:
rpm -qa | grep libevent-devel
必須擴展:pcntl(pcntl擴展能夠支持php的多線程操做(僅限linux系統))、posix html
可選擴展:event(php7)或者 libevent(php5) 選其中一個 且這兩個擴展依賴libevent-devel擴展java
一鍵環境全裝:mysql
#此步驟包含了安裝php-cli主程序以及pcntl、posix、libevent庫及git程序
yum install php-cli php-process git gcc php-devel php-pear libevent-devel -y
單獨安裝:linux
檢測:擴展是否安裝:curl -Ss http://www.workerman.net/check.php | phpnginx
#省略安裝 pcntl、posix 的步驟 #安裝event擴展的依賴庫 yum install libevent-devel -y #下載並安裝event擴展 wget http://pecl.php.net/get/event-2.5.3.tgz tar -zxvf event-2.5.3.tgz cd event-2.5.3 /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make make install
#全路徑 /usr/local/php/lib/php/extensions/no-debug-non-zts-20180731/event.so #php.ini中啓用event擴展(下面路徑不對的話換成上面的全路徑) echo extension=event.so > /usr/local/php/etc/php.ini
環境安裝完畢,接下來安裝workerman框架:git
git clone https://github.com/walkor/Workerman
或者直接將文件拷貝到你想要的位置
基於php多進程以及libevent事件輪詢庫。不依賴php-fpm、nginx或者apache等這些容器即可以獨立運行github
Windows 將workerman下載下來當作vendor第三方插件同樣直接使用web
<本機ip>能夠爲0.0.0.0
表示監聽本機全部網卡,包括內網ip和外網ip及本地迴環127.0.0.1
<本機ip>若是覺得127.0.0.1
表示監聽本地迴環,只能本機訪問,外部沒法訪問
<本機ip>若是爲內網ip,相似192.168.xx.xx
,表示只監聽內網ip,則外網用戶沒法訪問
<本機ip>設置的值不屬於本機ip則沒法執行監聽,而且提示Cannot assign requested address
錯誤
注意:www/test 對應的是 www.demo.com 它的hosts設置的ip爲127.0.0.1(監聽本地迴環)
例子1:http服務:www/test/httpServer.php
<?php use Workerman\Worker; require_once dirname(__FILE__).'/vendor/Workerman/Autoloader.php'; // 建立一個Worker監聽2345端口,使用http協議通信 $http_worker = new Worker("http://www.demo.com:2345"); // 啓動4個進程對外提供服務 $http_worker->count = 4; // 接收到瀏覽器發送的數據時回覆hello world給瀏覽器 $http_worker->onMessage = function($connection, $data) { // 向瀏覽器發送hello world $connection->send('hello world'); }; Worker::runAll();
打開終端 鍵入文件所在目錄 輸入 php httpServer.php start -d 回車就創建http服務器了(無需開啓apache或者nginx) 注意修改了這些服務器文件必須 php httpServer.php restart
瀏覽器訪問www.demo.com:2345 或者127.0.0.1:2345 (瀏覽器顯示hello world)
websocket:www/test/websocketServer.php
<?php use Workerman\Worker; require_once dirname(__FILE__).'/vendor/Workerman/Autoloader.php'; // 建立一個Worker監聽2345端口,使用http協議通信 $ws_worker = new Worker("websocket://0.0.0.0:2222"); // 啓動4個進程對外提供服務 $ws_worker->count = 4; // 接收到瀏覽器發送的數據時回覆hello加上瀏覽器發送的數據拼接一塊兒發送給瀏覽器 $ws_worker->onMessage = function($connection, $data) { // 向瀏覽器發送hello world $connection->send('hello'.$data); }; Worker::runAll();
打開終端 鍵入文件所在目錄 輸入 php websocketServer.php start -d 回車就創建http服務器了(無需開啓apache或者nginx) 注意修改了這些服務器文件必須 php httpServer.php restart
websoket頁 index.php :怎麼訪問他呢打開apache:訪問www.demo.com:80
<html> <head></head> <body> <script type="text/javascript"> var ws = new WebSocket("ws://www.demo.com:2222");//鏈接127.0.0.1:222 ws.onopen=function(){ ws.send('world'); } ws.onmessage=function(e){ console.log(e.data);//helloworld } </script> </body </html>
<本機ip>能夠爲0.0.0.0
表示監聽本機全部網卡,包括內網ip和外網ip及本地迴環127.0.0.1
<本機ip>若是覺得127.0.0.1
表示監聽本地迴環,只能本機訪問,外部沒法訪問
<本機ip>若是爲內網ip,相似192.168.xx.xx
,表示只監聽內網ip,則外網用戶沒法訪問
<本機ip>設置的值不屬於本機ip則沒法執行監聽,而且提示Cannot assign requested address
錯誤
使用Worker::$pidFile = '/var/run/workerman.pid';改變位置時,當他所在服務器啓後,而後註釋它以後在終端是殺不掉的,由於找不到pid路徑了
因此要先殺掉它啓動的服務而後在幹別的哦
Worker:onError()由如下幾種結果觸發
mysql代理: 實現 mysql -h127.0.0.1 -P4406 -uroot -p 鏈接到端口爲3306的mysql
凹
自定義協議
協議交互流程
1客戶端發送寫個數據包給服務端,服務端收到數據調用協議的input方法返回長度值$length給workerman框架
2獲得這個$length值後就會衝反衝區截取出$length長度的數據(即分包)並調用協議的decode方法解包,解包後的數據爲$data
3解包後的workerman將數據$data以回調onMesage($connection,$data)的形式傳遞給業務
4.服務端給客戶端發送數據時, workerman會自動利用協議的encode方法將$buffer打包後發送給客戶端
yum install php-cli php-process git gcc php-devel php-pear libevent-devel -y
下載:
composer require workerman/gateway-woker 或者 git clone https://github.com/walkor/GatewayWorker
工做原理
分佈式部署