Swoole 環(huán)境搭建

Docker搭建Swoole環(huán)境

$ docker-machine ls
$ docker-machine start default
$ docker-machine ssh default
$ docker-machine ip
$ docker ps -a

拉取鏡像

docker@default:~$ docker pull twosee/swoole
docker@default:~$ docker pull twosee/swoole-coroutine
docker@default:~$ docker pull twosee/swoole-coroutine:mysql
docker@default:~$ docker pull twosee/swoole-coroutine:redis

查看鏡像

docker@default:~$ docker images|grep swoole
twosee/swoole-coroutine   latest              d71166ef543b        2 months ago        833MB
twosee/swoole             latest              36b1fc8cfa4d        2 months ago        833MB
twosee/swoole-coroutine   redis               f07dcda98890        5 months ago        83.5MB
twosee/swoole-coroutine   mysql               43aac2677dd2        5 months ago        486MB

啟動(dòng)鏡像

docker@default:~$ docker run -d --name=swoole \
-v /workdir:/workdir \
-p 9501:9501 \
twosee/swoole-coroutine \
php /app/server.php start  

注意-v /workdir:/workdir是需要掛載映射的工作目錄,workdir為你自己掛載的文件路徑失暂。

$ docker run -it -d -p 9701:9701 --name=myswoole twosee/swoole-coroutine /bin/bash

掛載了還幾次都不成功顶捷,更換了端口再試試莹弊!

$ docker run -it -d -p 9701:9701 -v /share/swoole:/app --name=myswoole twosee/swoole-coroutine /bin/bash
$ docker ps -a | grep myswoole
539b086d15cc        twosee/swoole-coroutine   "docker-php-entrypoi…"   48 seconds ago      Up 48 seconds         0.0.0.0:9701->9701/tcp              myswoole

打開本地項(xiàng)目創(chuàng)建測試文件

$ vim /share/swoole/server.php

注意這里的端口使用的是9701與容器啟動(dòng)時(shí)保持一致

<?php
$ws = new swoole_websocket_server("0.0.0.0", 9701);
$ws->on("open", function($ws, $request){
    $ws->push($request->fd, "connect success");
});
$ws->on("close", function($ws, $fd){
    echo "fd: {$fd}  close";
});
$ws->on("message", function($ws, $frame){
    $ws->push($frame->fd, "server:".$frame->data);
});
$ws->start();

測試文件編寫完畢后會(huì)同步到myswoole容器中映射的app目錄下

進(jìn)入容器啟動(dòng)服務(wù)器腳本

$ docker exec -it myswoole bash
root@539b086d15cc:/# cd app
root@539b086d15cc:/# ls
root@539b086d15cc:/# php server.php start

服務(wù)器腳本運(yùn)行成功后,可編寫客戶端腳本對其進(jìn)行訪問悲伶,首先需要確定容器的IP地址陶夜,之前是可以通過docker-machine ip獲取的,這里使用的是192.168.99.100棒假。

$ vim client.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        var ws = new WebSocket("ws://192.168.99.100:9701");
        ws.onmessage = function(evt){
            console.log(evt.data);
        };
    </script>
</body>
</html>

客戶端腳本可在本地服務(wù)器上開發(fā),然后訪問客戶端腳本精盅,并查看控制臺(tái)輸出信息帽哑。

connect success

編譯安裝Swoole擴(kuò)展

  • 操作系統(tǒng):Ubuntu
  • PHP版本:PHP5

準(zhǔn)備工作

#  安裝PHP
$ sudo apt-get install php5 php5-dev
# 安裝編譯環(huán)境,常見三種編譯器gcc/g++/clang
$ sudo apt-get install gcc autoconf
# 修改編譯器
$ vi makefile
CC = clang
# 刪除已編譯好的文件重新編譯
$ make clean && make

編譯源碼

phpize是Shell腳本叹俏,主要用于調(diào)用autoconf提供的工具妻枕,生成configure文件。 cmakeautoconf功能類似粘驰,出現(xiàn)要比autocof晚一些屡谐。

# 使用cmake生成lib/libswoole.so的動(dòng)態(tài)鏈接庫
$ vim CMakeLists.txt
# 生成makefile
$ cmake

啟用多線程編譯,加快編譯速度蝌数。

# 啟用多線程編譯
$ make -j

低版本Linux內(nèi)核不支持-j參數(shù)康嘉。注意的是-j是危險(xiǎn)操作,若占用所有進(jìn)程會(huì)造成系統(tǒng)資源耗盡而死機(jī)籽前。

下載Swoole源代碼

# 下載代碼
$ git clone https://github.com/swoole/swoole-src/releases
$ cd swoole-src

編譯源碼

phpize是PHP官方自帶的用于生成configure編譯腳本的工具,它會(huì)根據(jù)php.m4配置生成configure腳本。

$ phpize

查看腳本參數(shù)

$ .configure --help

生成makefile枝哄,makefilemake的配置文件肄梨,用來執(zhí)行編譯配置。configure會(huì)檢測操作系統(tǒng)的差異挠锥,Linux2.6.27分界線众羡。

$ .configure

查看Linux系統(tǒng)內(nèi)核版本

$ uname -a

編譯,將.c文件生成.o文件蓖租,然后連接生成swoole.so粱侣。

$ make

安裝

$ make install

查詢 php.ini 文件地址

$ php -i | grep php.ini

修改php.ini配置文件并加入Swoole擴(kuò)展

$ vim php.ini
extension=swoole.so

查看PHP擴(kuò)展

$ php -m | grep swoole

測試

$ php examples/server.php

相關(guān)工具

  • ldconf工具用于重新生成配置
$ ls /etc/ld.so.conf.d/
$ ldconfig
  • nm工具可查看源碼中定義的函數(shù)
$ nm libswoole.so

Ubuntu安裝配置Swoole

操作系統(tǒng):Ubuntu

查看Linux操作系統(tǒng)內(nèi)核版本

$ uname --all
Linux junchow 4.15.0-46-generic #49-Ubuntu SMP Wed Feb 6 09:33:07 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

安裝GCC編譯器

$ apt install gcc
$ gcc --version
gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0

安裝Cmake工具

$ apt install cmake
$ cmake --version
cmake version 3.10.2

安裝PHP

$ apt install php
$ php -v
PHP 7.2.15-0ubuntu0.18.04.2 (cli) (built: Mar 22 2019 17:05:14) ( NTS )

安裝php-pear

$ apt install php-pear

使用pecl安裝swoole

$ pecl install swoole
No releases available for package "pecl.php.net/swoole"

$ pear clear-cache

$ pear update-channels

$ pear upgrade

如果使用pecl install swoole無法成功,可進(jìn)入pecl官網(wǎng)搜索 swoole 包蓖宦,下載后本地安裝 齐婴。

通過swoole install 進(jìn)行在線安裝

# 安裝包,包括下載編譯安裝
$ pecl install https://pecl.php.net/get/swoole-4.3.1.tgz

# 下載源碼包
$ pecl download swoole

查看php是否已經(jīng)安裝 swoole 擴(kuò)展

$ php --ri swoole

查看php配置文件位置

$ php -i | grep php.ini

在php配置文件中添加swoole擴(kuò)展

$ vim php.ini
extension=swoole

檢查swoole擴(kuò)展是否已經(jīng)安裝成功

$ php -i | grep extension_dir

查看擴(kuò)展是否安裝

$ php -m | grep swoole

CentOS安裝配置Swoole

安裝PHP7.2+

# 卸載原先安裝的PHP
$ yum remove php

# 列出所有的php相關(guān)的rpm包
$ rpm -qa|grep php

# 強(qiáng)制刪除包
$ rpm -e xxx --nodeps

#  安裝擴(kuò)展包
$ yum install -y epel-release -y
# 更新系統(tǒng)內(nèi)核
$ yum update

# 更改yum源
$ rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm   
$ rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

# 安裝PHP7.2
$ yum -y install php72w php72w-cli php72w-common php72w-devel php72w-pear php72w-embedded php72w-fpm php72w-gd php72w-imap php72w-ldap php72w-mbstring php72w-opcache php72w-pdo php72w-xml php72w-xmlrpc php72w-mysql  php72w-mysqlnd php72w-odbc
# 安裝php依賴組件
$ yum install -y gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers gd gd2 gd-devel gd2-devel perl-CPAN pcre-devel

# 安裝php依賴組件
$ yum install -y wget vim pcre pcre-devel openssl openssl-devel libicu-devel gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses ncurses-devel curl curl-devel krb5-devel libidn libidn-devel openldap openldap-devel nss_ldap jemalloc-devel cmake boost-devel bison automake libevent libevent-devel gd gd-devel libtool* libmcrypt libmcrypt-devel mcrypt mhash libxslt libxslt-devel readline readline-devel gmp gmp-devel libcurl libcurl-devel openjpeg-devel libicu-devel
# 創(chuàng)建用戶和組
$ groupadd www
$ useradd -g www www
# 下載php安裝包解壓
$ cd /tmp
$ wget http://am1.php.net/distributions/php-7.2.1.tar.gz
$ tar xvf php-7.2.1.tar.gz
$ cd php-7.2.1

PHP下載地址 https://www.php.net/downloads.php

$ cd tmp && mkdir download && cd download
$ yum install -y wget
$ wget https://www.php.net/distributions/php-7.3.3.tar.gz
$ tar -zxvf php-7.3.3.tar.gz
$ cp -frp /usr/lib64/libldap* /usr/lib/
$ ./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-mysqlnd-compression-support \
--with-iconv-dir \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl \
--enable-mbregex \
--enable-mbstring \
--enable-intl \
--with-mcrypt \
--with-libmbfl \
--enable-ftp \
--with-gd \
--enable-gd-jis-conv \
--enable-gd-native-ttf \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--with-gettext \
--disable-fileinfo \
--enable-opcache \
--with-pear \
--enable-maintainer-zts \
--with-ldap=shared \
--without-gdbm

./configure  \
--prefix=/usr/local/php  \
--with-fpm-user=www  \
--with-fpm-group=www  \
--with-curl  \
--with-freetype-dir  \
--with-gd  \
--with-gettext  \
--with-iconv-dir  \
--with-kerberos  \
--with-libdir=lib64  \
--with-libxml-dir  \
--with-mysqli  \
--with-openssl  \
--with-pcre-regex  \
--with-pdo-mysql  \
--with-pdo-sqlite  \
--with-pear  \
--with-png-dir  \
--with-jpeg-dir  \
--with-xmlrpc  \
--with-xsl  \
--with-zlib  \
--with-bz2  \
--with-mhash  \
--enable-fpm  \
--enable-bcmath  \
--enable-libxml  \
--enable-inline-optimization  \
--enable-mbregex  \
--enable-mbstring  \
--enable-opcache  \
--enable-pcntl  \
--enable-shmop  \
--enable-soap  \
--enable-sockets  \
--enable-sysvsem  \
--enable-sysvshm  \
--enable-xml  \
--enable-zip  \
--enable-fpm 

# 下載安裝icu 然后重新編譯時(shí)指定路徑 --with-icu-dir=/usr/local/icu
checking for location of ICU headers and libraries... checking for icu-config... no
not found
configure: error: Unable to detect ICU prefix or no failed. Please verify ICU install prefix and make sure icu-config works.
$ yum -y install libicu-devel

checking for libzip... not found
configure: error: Please reinstall the libzip distribution
$ yum install -y libzip-devel

checking for libzip... configure: error: system libzip must be upgraded to version >= 0.11
# https://nih.at/libzip/
$ 卸載libzip
$ yum remove -y libzip
$ wget https://libzip.org/download/libzip-1.5.2.tar.gz
$ 

下載安裝icu重新編譯時(shí)指定路徑 --with-icu-dir=/usr/local/icu

http://download.icu-project.org/files

$ mkdir /usr/local/icu
$ wget http://download.icu-project.org/files/icu4c/64rc2/icu4c-64rc2-src.tgz
$ tar xf icu4c-64rc2-src.tgz 
$ cd icu/source
$ ./configure --prefix=/usr/local/icu
$ make && make check

CentOS7安裝PHP7

安裝PHP7.3.4

$ cd /usr/local/src
$ wget https://www.php.net/distributions/php-7.3.4.tar.gz
$ yum install -y tar
$ tar -zxvf php-7.3.4.tar.gz 
$ cd php-7.3.4
$ ./configure --prefix=/usr/local/php
$ make && make check
$ make test
$ make && make install
$ cp /usr/local/src/php-7.3.4/php.ini-development /usr/local/php/lib/php.ini
$ vim ~/.bash_profile
alias php=/usr/local/php/bin/php
$ source ~/.bash_profile
$ php -v
PHP 7.3.4 (cli) (built: Apr  9 2019 22:09:00) ( NTS )
$ yum install php-pear pcre-devel
$ pecl channel-update pecl.php.net
$ pecl upgrade-all
$ cd `pear config-get php_dir`
$ pwd
/usr/share/pear

卸載PHP7.3.4

$ whereis php
$ rm -rf /usr/local/php /usr/bin/php /usr/lib64/php/ /etc/php.d/ /etc/php.ini /usr/share/php /usr/share/man/man1/php

安裝PHP7.2.17

$ cd /usr/local/src
$ wget https://www.php.net/distributions/php-7.2.17.tar.gz
$ tar zxvf php-7.2.17.tar.gz
$ cd php-7.2.17

$ ./configure --prefix=/usr/local/php
$ make && make install

$ cd /usr/local/src/php-7.2.14/php.ini-development /usr/local/php/lib/php.ini
$ php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/php/lib
Loaded Configuration File => /usr/local/php/lib/php.ini

$ vim ~/.bash_profile
alias php=/usr/local/php/bin/php
$ source ~/.bash_profile
$ php -v

沒安裝 php-devel 這個(gè)擴(kuò)展包稠茂,phpize是用來擴(kuò)展php擴(kuò)展模塊的柠偶,通過phpize可以建立php的外掛模塊,phpize 是屬于php-devel的內(nèi)容睬关。

$ phpize
Can't find PHP headers in /usr/include/php
The php-devel package is required for use of this command.
$ which phpize
$ yum search php-devel
$ yum info php72-php-devel
$ yum install -y php72-php-devel
$ yum install -y php-devel
$ yum info php72-php-pear
$ yum install -y php72-php-pear

安裝GIT

$ yum install -y git
$ git --version
git version 1.8.3.1

GIT下載Swoole

$ cd /usr/local/src
$ git clone https://github.com/swoole/swoole-src.git
$ cd swoole-src
$ make clean

$ phpize

$ which php-config
/usr/bin/php-config

$ ./configure --with-php-config=php-config

$ make && make install

$ whereis php.ini
$ vim /usr/local/php/lib/php.ini
extension=swoole.so
$ php -m | grep swoole
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诱担,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子电爹,更是在濱河造成了極大的恐慌蔫仙,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丐箩,死亡現(xiàn)場離奇詭異摇邦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)雏蛮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門涎嚼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挑秉,你說我怎么就攤上這事法梯。” “怎么了犀概?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵立哑,是天一觀的道長。 經(jīng)常有香客問我姻灶,道長铛绰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任产喉,我火速辦了婚禮捂掰,結(jié)果婚禮上敢会,老公的妹妹穿的比我還像新娘。我一直安慰自己这嚣,他們只是感情好鸥昏,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姐帚,像睡著了一般吏垮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罐旗,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天膳汪,我揣著相機(jī)與錄音,去河邊找鬼九秀。 笑死遗嗽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颤霎。 我是一名探鬼主播媳谁,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼友酱!你這毒婦竟也來了晴音?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤缔杉,失蹤者是張志新(化名)和其女友劉穎锤躁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體或详,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡系羞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了霸琴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椒振。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖梧乘,靈堂內(nèi)的尸體忽然破棺而出澎迎,到底是詐尸還是另有隱情,我是刑警寧澤选调,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布夹供,位于F島的核電站,受9級特大地震影響仁堪,放射性物質(zhì)發(fā)生泄漏哮洽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一弦聂、第九天 我趴在偏房一處隱蔽的房頂上張望鸟辅。 院中可真熱鬧氛什,春花似錦、人聲如沸匪凉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洒缀。三九已至,卻和暖如春欺冀,著一層夾襖步出監(jiān)牢的瞬間树绩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工隐轩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饺饭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓职车,卻偏偏與公主長得像瘫俊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子悴灵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理扛芽,服務(wù)發(fā)現(xiàn),斷路器积瞒,智...
    卡卡羅2017閱讀 134,715評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,323評論 25 707
  • 更改ip和dnsVi /etc/sysconfig/network-scripts/ifcfg-eth0vi /...
    Xwei_閱讀 1,828評論 0 3
  • 2015年9月3日川尖,乙未年七月廿一,中國抗日戰(zhàn)爭勝利70周年紀(jì)念日茫孔。今天上午的閱兵是中國首次在國慶節(jié)以外的日子舉行...
    滿井村人閱讀 149評論 0 1