導航:首頁 > 源碼編譯 > swoole編譯安裝教程

swoole編譯安裝教程

發布時間:2022-07-08 00:35:15

1. mac 怎麼開啟swoole 服務

Swoole是php的非同步並行擴展,有點像Node.js,但swoole既支持同步又支持非同步,比node更強大。Swoole擴展是基於epoll高性能事件輪詢,並且是多線程的,性能非常好。
Swoole除了提供網路Server/Client的功能之外,還提供了Task非同步任務管理器,可以使你的程序中某些處理慢的函數非同步去執行。

2. 如何使用 PHP 構建一個高性能的彈幕後端服務

隨著WEB2.0的流行,現在很多網站都流行使用「彈幕」這種形式來實現互動。
彈幕(barrage),中文流行詞語,原意指用大量或少量火炮提供密集炮擊。大量以字幕彈(dàn)出形式顯示的評論同時在屏幕上飄過的現象也被稱為彈幕。
作為PHPer的我們,看到現在各種網站都有酷炫的彈幕飛過,我們是不是也想給自己的網站加入彈幕功能呢?
首先彈幕的後端其實說白了和公共聊天室的後端原理十分相似,都是一個客戶端發送消息給服務端,服務端再將收到的消息廣播給其他的客戶端。對於後端來說他們幾乎沒區別,區別就在於前端。
好在我們有一個前端彈幕插件,這個插件是一個jquery插件,github地址:https://github.com/chiruom/jquery.danmu.js,基本上會使用jquery語法,看看示例代碼就可以傻瓜化使用。
前端已經有了解決方案,但是後端呢?前端如何與後端通訊?用傳統的ajax輪詢嗎?不行,這樣效率太低,想想各大火爆的直播平台都是同一時間幾萬人在線,幾千人同時發彈幕,如果靠ajax輪詢一個php介面的話伺服器會吃不消的。且彈幕消息存儲方案略顯復雜,有人問為什麼要存儲呢?因為ajax使用的HTTP協議是無狀態協議,A客戶端和B客戶端之間對於伺服器來說沒有任何標志,如果伺服器要確保A客戶端和B客戶端分別在兩次請求的時候伺服器只返回這兩個客戶端沒有獲取過的彈幕消息,那麼伺服器端就必須使用一個緩存來標識某某客戶端看過哪條彈幕消息。綜上所述ajax可以實現小規模的彈幕通信方案,但是很麻煩。
好在最新的HTML5中加入了WebSocket協議,我們可以通過WebSocket這種基於HTTP協議之上的即時通信協議來替代ajax這種傳統的我問你答的老舊通信模式。而我們是PHPer,對於我們這種只懂PHP的人該如何編寫WebSocket服務端呢?好在我們又得知PHP有一個Swoole擴展,我們在PHP語言中使用它可以很方便的構建一個WebSocket服務端。
關於Swoole的介紹可以參照他的官網http://www.swoole.com/,下面引用官網對它的一段簡短的介紹。
PHP的非同步、並行、高性能網路通信引擎,使用純C語言編寫,提供了PHP語言的非同步多線程伺服器,非同步TCP/UDP網路客戶端,非同步MySQL,非同步Redis,資料庫連接池,AsyncTask,消息隊列,毫秒定時器,非同步文件讀寫,非同步DNS查詢。 Swoole內置了Http/WebSocket伺服器端/客戶端、Http2.0伺服器端。
Swoole可以廣泛應用於互聯網、移動通信、企業軟體、雲計算、網路游戲、物聯網(IOT)、車聯網、智能家居等領域。 使用PHP+Swoole作為網路通信框架,可以使企業IT研發團隊的效率大大提升,更加專注於開發創新產品。
先別被Swoole這么多的功能嚇到了。我們先關注這裡面的重點Swoole內置了Http/WebSocket伺服器端/客戶端意味著我們可以通過它構建WebSocket的服務端。看到這里我們是不是就急急忙忙去拿官網的WebSocket服務端代碼做測試呢?不,Swoole是一個PHP擴展,意味著我們還得去安裝它。是不是直接去下載so文件然後在php.ini中加入extension=swoole.so就可以了呢?還不是,我們先去看看Swoole擴展的依賴,這也是我們使用任何語言的任何外部包,外部模塊,外部擴展最先要了解的問題。
參考官網:http://wiki.swoole.com/wiki/page/7.html環境依賴
僅支持linux,FreeBSD,MacOS,3類操作系統
Linux內核版本2.3.32以上
PHP5.3.10以上版本,包括PHP7
gcc4.4以上版本或者clang
cmake2.4+,編譯為libswoole.so作為C/C++庫時需要使用cmakePHP版本依賴
swoole僅支持PHP5.3.10或更高版本,建議使用PHP5.4+swoole不依賴php的stream、sockets、pcntl、posix、sysvmsg等擴展。PHP只需安裝最基本的擴展即可意味著我們Windows下是無法使用這個擴展了(其實可以藉助cygwin在win下使用swoole,但是考慮到我們使用swoole擴展就是為了性能,也為了熟悉以後的生產環節部署做准備,強烈推薦在linux下開發),那麼我們把開發環境轉移到Linux下進行吧。
接著還要求Linux內核版本為2.3.32以上,PHP為5.3.10以上,那麼我們就用最新的CentOS吧,這個版本的yum安裝的php直接就是PHP7最新版,根本無需考慮其他問題,當然你喜歡圖形界面,用Ubuntu也可以。其他的基本上最新的Linux發行版都是符合版本要求的。
接著我們便來安裝這個擴展,推薦使用PECL來安裝,只需要一條pecl install swoole
即可,非常方便。當然你要編譯安裝,具體步驟請參考http://wiki.swoole.com/wiki/page/6.html安裝完擴展之後在命令行下輸入
php -m
檢查,如果有swoole那麼說明安裝成功了。
接下來就正式開始我們的編碼旅程了。
開始編碼旅程之前我們先看看最基礎的效果原型是什麼樣子沒錯就是這個樣子,兩個瀏覽器之前完全獨立使用Websocket連接服務端,因此對於服務端來說這兩個瀏覽器就相當於兩個完全處在不同機器上的客戶端。
效果看完了就開始來講代碼吧。
我們先看看官網的WebSocket服務端示例代碼。
$serv = new Swoole\Websocket\Server("127.0.0.1", 9502);$serv->on('Open', function($server, $req) {echo "connection open: ".$req->fd;
});
$serv->on('Message', function($server, $frame) {echo "message: ".$frame->data;
$server->push($frame->fd, json_encode(["hello", "world"]));});
$serv->on('Close', function($server, $fd) {echo "connection close: ".$fd;
});
$serv->start();
我們看到這個代碼的第一行先是new了一個WebSocket服務端對象,並且在構造方法中的第一個參數指定了服務端監聽的IP,第二個參數指定了服務端監聽的埠。然後使用on方法為每一個事件設置了回調函數,最後一行start方法正式開始運行服務端。
這種寫法非常像Javascript裡面的非同步調用,這也是Swoole中的事件驅動非同步非阻塞特性,正因為是這種特性,每一個獨立的事件(請求)會在服務端接收到之後分別非同步處理,他們之間無需互相等待,這也是Swoole性能高的原因所在。
我們來分別剖析一下每一個事件的含義。
$serv->on('Open', function($server, $req) {echo "connection open: ".$req->fd;
});
顧名思義,Open表示打開一個新的鏈接,並且在事件觸發之後echo出連接上服務端的客戶端id,該客戶端唯一id為回調函數第二個參數中的fd欄位。這也是服務端區分客戶端的唯一id。
$serv->on('Message', function($server, $frame) {echo "message: ".$frame->data;
$server->push($frame->fd, json_encode(["hello", "world"]));});
同樣顧名思義,Message表示消息到達服務端的事件,並且在事件觸發之後echo出發送給服務端的數據,該數據為回調函數第二個參數的data欄位。另外我們還看到它調用了$server->push,這是回調函數的第一個參數中的push方法,它是一個服務端給客戶的發送數據的方法,第一個參數為要發送的客戶端id,第二個為要發送的數據,這里的含義是向發給服務端消息的那個客戶端發送["hello", "world"]這個數組(方括弧寫數組為PHP5.4的新特性,如果你是PHP5.3請使用傳統的array工廠函數生成數組)經過json序列化之後的數據。
$serv->on('Close', function($server, $fd) {echo "connection close: ".$fd;
});
最後一個事件Close更加容易理解,就是關閉事件,當然關閉的不是服務端,而是客戶端,可以理解為客戶端與服務端斷開連接的事件。回調函數中的代碼含義為echo出與服務端斷開連接的那個客戶端id。
基本的API都清楚了,下面就直接看代碼吧,短短二十行而已。
https://github.com/cw1997/danmu-demo/blob/master/server.php$server = new swoole_websocket_server("0.0.0.0", 1997);$server->on('open', function (swoole_websocket_server $server, $request) {echo "server: handshake success with fd{$request->fd}\n";//$request->fd 是客戶端id});
$server->on('message', function (swoole_websocket_server $server, $frame) {echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";//$frame->fd 是客戶端id,$frame->data是客戶端發送的數據//服務端向客戶端發送數據是用 $server->push( '客戶端id' , '內容')$data = $frame->data;
foreach($server->connections as $fd){
$server->push($fd , $data);//循環廣播
}
});
$server->on('close', function ($ser, $fd) {echo "client {$fd} closed\n";
});
$server->start();
這里最核心的廣播代碼其實還用到了一個之前沒有提到過的成員,也就是swoole_websocket_server對象的connections成員,這個成員中保存了所有已連接上該WebSocket服務端的fd,也就是客戶端id。因此我們只要在message事件中使用foreach遍歷該成員,循環將所有服務端收到的彈幕消息都發送給其他已連接上該服務端的客戶端即可。
後端講完了再講講前端吧。
前端代碼也不是很多https://github.com/cw1997/danmu-demo/blob/master/index.htmlvar ws = new WebSocket("ws://192.168.1.107:1997");ws.onopen = function(){
console.log("握手成功");
ws.send('hello world!!!');
};
ws.onmessage = function(e){
console.log("message:" + e.data);
var time = jQuery('#danmu').data("nowtime") + 1;var text_obj = '{ "text":"' + e.data + '" , "color":"green" ,"size":"1","position":"0","time":"' + time + '" ,"isnew":" "}'; //構造加上了innew屬性的字元串danmu對象console.log(text_obj);
var new_obj = eval('(' + text_obj + ')'); //轉化為js對象jQuery('#danmu').danmu("add_danmu", new_obj); //向插件中添加該danmu對象};
ws.onerror = function(){
console.log("error");
};
核心代碼都在這里,使用new WebSocket("ws://192.168.1.107:1997")創建一個WebSocket客戶端連接對象,通過該對象的各種事件進行對應的操作,和服務端是不是很像?更多代碼解釋可以參考源代碼中的注釋,這里不做更多介紹。
看到這里相信作為一名PHPer的你也可以開發出屬於自己的彈幕系統了。這里展示的只是一個最基礎最原始的彈幕平台。我們也了解到了使用PHP開發一個彈幕平台需要涉及到的技術有WebSocket,Swoole擴展,甚至碰到了很多初級開發者平時不怎麼接觸的工具,比如說PECL,比如說Linux。
其實PHP結合Swoole擴展還可以做很多事情,比如說對接各種家電,對接各種硬體介面實現在Web端實時控制家電,又比如說結合樹莓派做智能小車,通過web端進行遙控等等,各種新奇的玩法等你發現。誰說PHP只能做Web開發?PHP擁有了Swoole擴展其實能做的事情還有很多,Swoole就像他的宣傳標題一樣:重新定義PHP。

3. 菜鳥問個很基礎的問題Centos怎麼安裝swoole

php擴展swoole實現實時非同步任務隊列的方案。安裝swoole
pecl 安裝:
pecl install swoole
看命令行提示,如果它提示說沒有寫php.ini,則自己手動在PHP.ini後面加上:
extension = "swoole.so"
服務端
在打算放置腳本的目錄(你也可以自行新建)新建Server.php,代碼如下:
「`
<?php
class Server
{
private $serv;
public function __construct() {
$this->serv = new swoole_server("0.0.0.0", 9501);
$this->serv->set(array(
'worker_num' => 1, //一般設置為伺服器CPU數的1-4倍
'daemonize' => 1, //以守護進程執行
'max_request' => 10000,
'dispatch_mode' => 2,
'task_worker_num' => 8, //task進程的數量
"task_ipc_mode " => 3 , //使用消息隊列通信,並設置為爭搶模式
//"log_file" => "log/taskqueueu.log" ,//日誌
));
$this->serv->on('Receive', array($this, 'onReceive'));
// bind callback
$this->serv->on('Task', array($this, 'onTask'));
$this->serv->on('Finish', array($this, 'onFinish'));
$this->serv->start();
}
public function onReceive( swoole_server $serv, $fd, $from_id, $data ) {
//echo "Get Message From Client {$fd}:{$data}n";
// send a task to task worker.
$serv->task( $data );
}
public function onTask($serv,$task_id,$from_id, $data) {
$array = json_decode( $data , true );
if ($array['url']) {
return $this->httpGet( $array['url'] , $array['param'] );
}

4. 框架中集成swoole擴展怎麼使用

swoole擴展是PHP擴展。php swoole擴展,PHP語言的高性能網路通信框架,提供了PHP語言的非同步多線程伺服器,非同步TCP/UDP網路客戶端,非同步MySQL,資料庫連接池,AsyncTask,消息隊列,毫秒定時器,非同步文件讀寫,非同步DNS查詢。

1、下載swoole源碼
[root@nginx ~]# wget


2、解壓進入swoole文件夾
[root@nginx ~]# tar -zxvf swoole-1.7.17-stable
[root@nginx ~]# cd swoole-src-swoole-1.7.17-stable/


3、編譯安裝swoole
[root@nginx swoole-src-swoole-1.7.17-stable]# phpize
[root@nginx swoole-src-swoole-1.7.17-stable]# ./configure
[root@nginx swoole-src-swoole-1.7.17-stable]# make && make install


4、php.ini配置文件載入swoole.so模塊
[root@nginx swoole-src-swoole-1.7.17-stable]# vi /usr/local/php/lib/php.ini

注意 php命令行運行和瀏覽器運行的配置文件不一樣。
php 命令行的配置:
[root@nginx swoole-src-swoole-1.7.17-stable]# php --ini
Configuration File(php.ini)Path:/usr/local/lib
Loaded Configuration File:/usr/local/lib/php.ini//配置文件
Scanforadditional .ini files in:(none)
Additional .ini files parsed:(none)

5、查看swoole模塊是否已經安裝成功
[root@nginx swoole-src-swoole-1.7.17-stable]# php -m



6、編寫服務端httpServer.php文件並運行
$serv=newswoole_server("127.0.0.1",9501);
$serv->on('connect',function($serv,$fd){
echo"Client:Connect. ";
});
$serv->on('receive',function($serv,$fd,$from_id,$data){
$serv->send($fd,'Swoole: '.$data);
});
$serv->on('close',function($serv,$fd){
echo"Client: Close. ";
});
$serv->start();


運行httpServer.php
[root@nginx swoole-src-swoole-1.7.17-stable]# php httpServer.php


7、用telnet測試
[root@nginx ~]# telnet 127.0.0.1 9501
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is'^]'.
hello 客戶端
Swoole: hello 服務端
來源:PHP swoole擴展安裝和使用-
20170819 13:57

5. php swoole 只能運行在php-cli 環境嗎

一直想寫點Swoole的東西,畢竟它重新定義了php,卻一直不知道怎麼下手寫Swoole涉及的知識點非常多,互為表裡,每次想寫都發現根本理不出一個頭緒Swoole是一個php的擴展,它的核心目的就是解決php在實現server服務中可能遇到的一系列問題,這些問題用源生的php往往並不能很高效(執行效率)的解決,一般也不會使用php來解決,所以會有說swolle重新定義的php的說法。
其實swoole也提供了一個框架,swoole framework是基於swoole extension設計的一個框架,要用好這個框架,還是要先了解swoole extension。
擴展的英文名稱是Extension,php擴展是用C語言作為開發語言,基於Zend引擎提供的API,編譯成的一個動態庫。
如果曾經做過類似動態庫調用開發的童鞋可能會更好理解一些,例如Android中的NDK開發在php的配置文件中配置好extension的屬性後,就可以引用這個動態庫了。
也就是說,swoole本身是用C語言編寫的,它可以讓php獲得一些額外的function。
然後是運行方式,swoole的許多功能都只能運行在cli模式下,而cli模式往往是很多剛接觸swoole的phper遇到的第一個問題。
有時候其實只是需要轉變一下思路
我們現在整理一下最常見的php代碼執行方式:
安裝apache、php
配置apache對那個目錄進行php解析
用瀏覽器訪問那個目錄的php文件
更多的細節這里就不提了,畢竟我相信每個phper對這個都是很熟悉的。
但這里就開始出現了第一個問題,我們知道,php是一個腳本語言,腳本語言的核心特點在於不用編譯,隨時執行,而執行腳本的工具就是解析器,而php的解析器就是zend引擎。
嚴格來說,zend並不是唯一的選擇,不過,zend是最官方的。另外,Zend Studio和Zend Engine不是同一個東西,本文中的Zend全部指Zend Engine。
換個角度講,只要有解析器,寫好的php腳本就是可以執行的,而zend引擎與apache之間並沒有絕對的關系實際上,apahce是調用了zend對php腳本進行執行,然後將執行結果輸出給了瀏覽器所以所謂cli模式(CommandLine,命令行模式),其實就是在命令行下直接調用zend引擎對php腳本進行解析並執行,並獲得程序輸出結果的php腳本執行方式。
其實php也可以作為shell腳本來使用哦,就像bash shell一樣既然問題講清楚了,在一個系統中具體怎麼操作呢?
本文以CentOS 7.5作為系統環境,swoole是針對linux系統開發的,windows下並不適用。學習swoole的一個前題是懂得基本的linux系統使用。
當安裝好php的時候,找到php的安裝目錄,如果是默認安裝的話,可以試試whereis命令# 某種簡單的方法
whereis php
> /usr/local/bin/php;
locate whereis find這些命令都可以試試,目的是找到php然後我們來寫一個最經典的php腳本:
<?php
//vi hello_cli.php
echo 'Hello PHP Cli';
編寫純php腳本時,php標簽不要封口
然後我們在shell里執行它:
/usr/local/bin/php hello_cli.php
> Hello PHP Cli
這段代碼中的第一個php,是一個可執行文件,它接受一個php腳本文件作為輸入參數,並解析執行這個php腳本文件(通過zend)。
沒有錯,第一個cli模式下的php程序就被你執行成功了!
默認情況下,php都會被安裝在了$PATH的目錄下,那就可以直接省略路徑前綴了,下文中調用php的時候,全都省略了路徑前綴。
因為swoole是pecl的項目,所以使用pecl安裝是最簡單的方法,強烈推薦第一次接觸的童鞋先使用pecl安裝,在熟悉了swoole之後,再考慮使用編譯安裝的方式以獲取更多進階功能。
pecl這個工具基本都會被安裝在與php相同的目錄下(往往也都是$PATH目錄)pecl install swoole
執行以下命令查看是否安裝成功:
php -m | grep swoole
> swoole
如果正確的輸出了swoole,那麼恭喜你,這次安裝很成功另一個常見的比較麻煩的問題是,有些童鞋的電腦里安裝了多個php,而安裝的時候沒有正確的安裝到預期的php的擴展目錄中,就會導致無法正常工作,解決方案就是弄清楚各個php安裝目錄及配置關系,選擇正確的目錄進行安裝。
其實本文還沒正式開始介紹swoole,都是在學習swoole之前的准備工作,swoole的上手門檻比一般的php應用要高的多,如果沒有網路開發和操作系統方面的一些知識,學習它並不是一件容易的事情,學習曲線很陡峭。
這句話我在群里說了無數次
很多新手會詬病swoole的手冊寫的太模糊,其實是前置知識不足,而手冊也給出了需要的前置知識列表,以下引用至官網的手冊-學習swoole需要哪些知識?
多進程/多線程
了解Linux操作系統進程和線程的概念
了解Linux進程/線程切換調度的基本知識
了解進程間通信的基本知識,如管道、UnixSocket、消息隊列、共享內存socket
了解SOCKET的基本操作如accept/connect、send/recv、close、listen、bind了解SOCKET的接收緩存區、發送緩存區、阻塞/非阻塞、超時等概念IO復用
了解select/poll/epoll
了解基於select/epoll實現的事件循環,Reactor模型了解可讀事件、可寫事件
TCP/IP網路協議
了解TCP/IP協議
了解TCP、UDP傳輸協議
調試工具
使用gdb調試Linux程序
使用strace跟蹤進程的系統調用
使用tcpmp跟蹤網路通信過程
其他Linux系統工具,如ps、lsof、top、vmstat、netstat、sar、ss等學習並理解一個新事務並不是一個容易的事情,特別對於swoole這種具備一定顛覆性的工具,要有耐心和實踐。
淡定的把手冊看完,遇到不理解的名詞學會使用搜索引擎學習,swoole的手冊其實是個大寶庫,網路開發常見的問題其實里邊都涉及到了。

6. swoole不能在windows下直接安裝嗎

簡介
Swoole是一種PHP高級Web開發框架,框架不是為了提升網站的性能,是為了提升網站的開發效率。最少的性能損耗,換取最大的開發效率。利用Swoole框架,開發一個復雜的Web功能,可以在很短的時間內完成!

Swoole不是一個像Zend Framework、CakePHP、Yii、symfony、ThinkPHP等一樣的框架,也不是一個向WordPress、Drupal、Discuz、UChome等開源產品看齊的項目。 Swoole的目標是向Java框架、Rails On Ruby、Python DjangoPylons等一流框架發起挑戰。

運行環境:Linux Windows Mac FreeBSD Unix

PHP版本支持:PHP5.2 PHP5.3 PHP6.0

支持的資料庫:MS SQL Server、MySQL、IBM DB2、Oracle、Interbase 、SQLite、PostgreSQL、ODBC

支持的運行方式:Web、Cli命令行腳本、PHP-GTK GUI。

功能

包含以下幾個特色功能:

1、 類似ORM的數據查詢,提供SQL封裝器,讓MySQL的SQL與PHP的Array,會話,Cache無縫結合

2、App MVC分層結構,有效的程序結構分層,提高程序的可維護性和擴展性,實現低耦合,基於介面開發。

7. windows 可以編譯swoole嗎或者有人編譯出了swoole.dll嗎

下載 releases版本的swoole編譯安裝2.11編譯安裝swoole擴展,然後: # cd swoole # phpize # ./configure # make && make install

閱讀全文

與swoole編譯安裝教程相關的資料

熱點內容
噴油螺桿製冷壓縮機 瀏覽:579
python員工信息登記表 瀏覽:377
高中美術pdf 瀏覽:161
java實現排列 瀏覽:513
javavector的用法 瀏覽:982
osi實現加密的三層 瀏覽:233
大眾寶來原廠中控如何安裝app 瀏覽:916
linux內核根文件系統 瀏覽:243
3d的命令面板不見了 瀏覽:526
武漢理工大學伺服器ip地址 瀏覽:149
亞馬遜雲伺服器登錄 瀏覽:525
安卓手機如何進行文件處理 瀏覽:71
mysql執行系統命令 瀏覽:930
php支持curlhttps 瀏覽:143
新預演算法責任 瀏覽:444
伺服器如何處理5萬人同時在線 瀏覽:251
哈夫曼編碼數據壓縮 瀏覽:426
鎖定伺服器是什麼意思 瀏覽:385
場景檢測演算法 瀏覽:617
解壓手機軟體觸屏 瀏覽:350