1. 应用场景

主要用于学习和使用swoole的安装及用法,以及如何在项目中实践,应用,重要的是弄清楚其本质。

2. 学习/操作

1. 文档

Swoole4 文档 - 安装 Swoole  -- 很详细



2. 整理输出

截图如下:

docker svn建立版本库 docker安装swoole_php

环境

Linux centOS 7.4 64位

or

Mac


or

基于Docker


还是要说一句,推荐在物理机上安装,避免因为Docker文件共享导致的性能延迟

请留意「安装准备」

检查顺序:

安装前必须保证系统已经安装了下列软件

4.8 版本需要 php-7.2 或更高版本 

5.0 版本需要 php-8.0 或更高版本

「
➜  swoole pwd
/Users/huangbaoyin/Documents/code/php/swoole
➜  swoole php -v
PHP 8.1.9 (cli) (built: Aug  4 2022 14:00:20) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.9, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.9, Copyright (c), by Zend Technologies
➜  swoole
」
gcc-4.8 或更高版本
「
➜  swoole gcc -v
Apple clang version 14.0.0 (clang-1400.0.29.102)
Target: arm64-apple-darwin21.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
➜  swoole
」
make


➜  swoole make -v
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i386-apple-darwin11.3.0
➜  swoole
」
autoconf
「
➜  swoole autoconf -v
autoconf: error: no input file
➜  swoole
可以看到已经安装


查看 autoconf 信息

➜  swoole brew info autoconf
==> autoconf: stable 2.71 (bottled)
Automatic configure script builder
https://www.gnu.org/software/autoconf
/opt/homebrew/Cellar/autoconf/2.71 (71 files, 3.2MB) *
  Poured from bottle on 2022-08-19 at 17:41:00
From: https:///Homebrew/homebrew-core/blob/HEAD/Formula/autoconf.rb
License: GPL-3.0-or-later and (GPL-3.0-or-later with Autoconf-exception-3.0)
==> Dependencies
Required: m4 ✔
==> Analytics
install: 146,925 (30 days), 442,091 (90 days), 1,861,574 (365 days)
install-on-request: 20,966 (30 days), 62,229 (90 days), 281,837 (365 days)
build-error: 0 (30 days)
➜  swoole
」



均以满足条件,如果存在没有满足条件的软件,

使用homebrew进行安装即可,当然也可以编译安装

2.1 Linux -- CentOS

通过PECL安装

1、替换YUM源
yum -y install epel-release 
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

2、php7.2安装
yum -y install php72w

3、安装扩展
yum -y install php72w-cli php72w-fpm php72w-common 
安装成功可通过 “php -v ”查看是否安装成功

4、安装pecl

yum -y install php72w-devel
 yum -y install php72w-pear

docker svn建立版本库 docker安装swoole_linux_02

5、安装swoole(确认gcc编译器已安装,如果没有运行 yum install gcc*)

docker svn建立版本库 docker安装swoole_swoole_03

pecl install swoole

docker svn建立版本库 docker安装swoole_php_04

docker svn建立版本库 docker安装swoole_docker svn建立版本库_05

6、加入PHP扩展
vim /etc/php.ini
最后面添加 extension=
通过 php -m 可查看是否安装成功

一直没出来, swool的扩展, 具体原因TBD

7、安装中出现的问题,解决方案

 https://wiki.swoole.com/wiki/page/1013.html

openssl安装:
 yum install openssl
 yum install openssl-devel

源码编译安装参见Mac下源码安装,几乎完全一样

2.2 Mac

源码安装

官方-安装swoole的第一句话:


Swoole 扩展是按照 PHP 标准扩展构建的。「也常是*nix下源码编译安装的通用步骤」

使用 phpize 来生成编译检测脚本,

./configure 来做编译配置检测,

make 进行编译,

make install 进行安装。

命令如下:

这里安装最新版本「安装稳定版本,换url即可」


首先进入,自己的某个目录「你来决定」

mkdir -p ./build && \
 cd ./build && \
 mkdir ./tmp && \
 rm -rf ./swoole-src && \
 curl -o ./tmp/v4.8.12.tar.gz https:///swoole/swoole-src/archive/refs/tags/v4.8.12.tar.gz -L && \
 tar zxvf ./tmp/v4.8.12.tar.gz && \
 mv swoole-src* swoole-src && \
 cd swoole-src && \
 phpize && \
 ./configure \
 --enable-openssl \
 --enable-http2 && \
 make && sudo make install

注意,下面是官方网站上的命令脚本,但是本地安装出现问题

1. 首先 ./tmp文件夹没有创建,导致没办法下载源码压缩文件

2. https:///swoole/swoole-src/archive/master.tar.gz 源码文件中似乎并没有提供 --enable-http2的配置选项

mkdir -p ~/build && \
 cd ~/build && \
 rm -rf ./swoole-src && \
 curl -o ./tmp/swoole.tar.gz https:///swoole/swoole-src/archive/master.tar.gz -L && \
 tar zxvf ./tmp/swoole.tar.gz && \
 mv swoole-src* swoole-src && \
 cd swoole-src && \
 phpize && \
 ./configure \
 --enable-openssl \
 --enable-http2 && \
 make && sudo make install

如果是新手,推荐一步一步来,可以查看每一步的作用和效果

这里会添加注释

mkdir -p ./build // 创建build目录,专门放置源码编译的软件/服务

cd ./build // 进入该目录

mkdir ./tmp  // 创建build目录下的临时目录,用于放置临时文件

rm -rf ./swoole-src // 先移除可能存在的目录,只是提前清理

curl -o ./tmp/v4.8.12.tar.gz https:///swoole/swoole-src/archive/refs/tags/v4.8.12.tar.gz -L // 下载源码文件压缩包到tmp目录下,并且重命名为/v4.8.12.tar.gz

tar zxvf ./tmp/v4.8.12.tar.gz // 解压源码压缩包

mv swoole-src* swoole-src // 重命名解压后的文件名为swoole-src

cd swoole-src // 进入解压后的源码目录

phpize // 生成编译检测脚本「即为了生成configure文件」

docker svn建立版本库 docker安装swoole_centos_06

docker svn建立版本库 docker安装swoole_centos_07

./configure -h // 查看编译配置检测支持的选项列表

docker svn建立版本库 docker安装swoole_linux_08

可以看到如下选项,否则会报错,例如:configure: WARNING: unrecognized options: --enable-http2

--enable-openssl        Use openssl

  --enable-http2          Use http2.0

docker svn建立版本库 docker安装swoole_php_09

 
./configure --enable-openssl --enable-http2// 启用 openssl和http2 配置选项 开始预编译

docker svn建立版本库 docker安装swoole_linux_10

 ...

docker svn建立版本库 docker安装swoole_linux_11

make // 开始编译

或者

make -j // 推荐 使用多核进行变异,速度会快一些 「没有参数时,即infinite,使用主机的所有核心数」

make -j 4 // 使用四个核心进行编译

docker svn建立版本库 docker安装swoole_docker svn建立版本库_12

开始编译,但是出现了报错,如下:

docker svn建立版本库 docker安装swoole_centos_13

docker svn建立版本库 docker安装swoole_docker svn建立版本库_14

报错信息:

/Users/huangbaoyin/Documents/env/build/swoole-src/include/swoole_ssl.h:27:10: fatal error: 'openssl/ssl.h' file not found
#include <openssl/ssl.h>
         ^~~~~~~~~~~~~~~
make: *** [thirdparty/php/sockets/sockaddr_conv.lo] Error 1
1 error generated.
make: *** [thirdparty/php/curl/interface.lo] Error 1
make: *** [src/network/dns.lo] Error 1


根据报错信息可知:在当前目录下的include下找不到openssl/ssl.h文件

解决办法:让其能找到需要的文件,手动执行该文件路径

需要重新执行预编译阶段,但是执行之前,先要确认信息

查看openssl的位置配置项名

docker svn建立版本库 docker安装swoole_linux_15

查看openssl的位置

docker svn建立版本库 docker安装swoole_docker svn建立版本库_16

重新执行 「直接复制命令,要留意是否还有其他不可见的符号,导致命令失败」

./configure --enable-openssl --enable-http2 --with-openssl-dir=/opt/homebrew/opt/openssl@3

但是接着又报错:

/opt/homebrew/Cellar/php/8.1.9/include/php/ext/pcre/php_pcre.h:23:10: fatal error: 'pcre2.h' file not found
#include "pcre2.h"
         ^~~~~~~~~


一样性质的错误:

docker svn建立版本库 docker安装swoole_swoole_17

/opt/homebrew/Cellar/pcre2/10.40/include

/opt/homebrew/Cellar/php/8.1.9/include/php/ext/pcre


docker svn建立版本库 docker安装swoole_linux_18


这里安装了pcre,

接下来创建一个软连接即可

ln -s /opt/homebrew/Cellar/pcre2/10.40/include/pcre2.h /opt/homebrew/Cellar/php/8.1.9/include/php/ext/pcre/pcre2.h 

docker svn建立版本库 docker安装swoole_docker svn建立版本库_19


但是依然报了警告「这里就先不处理了,因为编译还是成功了」

docker svn建立版本库 docker安装swoole_swoole_20


成功编译 🧬

docker svn建立版本库 docker安装swoole_centos_21


sudo make install // 安装,如果有root权限,可以删除sudo

docker svn建立版本库 docker安装swoole_swoole_22


最后,

添加 Swoole 到 php.ini

最后,编译安装成功后,修改 php.ini 加入

extension=

或者


extension=swoole


通过 php -m 来查看是否成功加载了 ,如果没有可能是 php.ini 的路径不对。
可以使用 php --ini 来定位到 php.ini 的绝对路径,Loaded Configuration File 一项显示的是加载的 php.ini 文件,如果值为 none 证明根本没加载任何 php.ini 文件,需要自己创建。


docker svn建立版本库 docker安装swoole_docker svn建立版本库_23

 

docker svn建立版本库 docker安装swoole_php_24

Okay,安装成功~

PECL方式

docker svn建立版本库 docker安装swoole_php_25

命令有:

pecl install swoole

pecl install -D 'enable-sockets="no" enable-openssl="yes" enable-http2="yes" enable-mysqlnd="yes" enable-swoole-json="no" enable-swoole-curl="yes" enable-cares="yes"' swoole

#或者
 pecl install --configureoptions 'enable-sockets="no" enable-openssl="yes" enable-http2="yes" enable-mysqlnd="yes" enable-swoole-json="no" enable-swoole-curl="yes" enable-cares="yes"' swoole



按照上面的指南即可


但是出现了报错,原因和解决办法:TBD「主要见上面的编译安装,原因应就是上面的,已经解决,

后续来使用php7.2来安装再实践」



pecl install https://pecl.php.net/get/swoole-4.8.12.tgz

截图如下:

https://pecl.php.net/package/swoole

docker svn建立版本库 docker安装swoole_php_26

 

docker svn建立版本库 docker安装swoole_php_27

 

docker svn建立版本库 docker安装swoole_swoole_28

 


2.3 Docker

方式一:

pecl install swoole

docker svn建立版本库 docker安装swoole_docker svn建立版本库_29

关于是否开启相关支持,可以参考官方推荐

docker svn建立版本库 docker安装swoole_php_30


但是上面都是输入yes,结果安装失败,原因即有些扩展环境中并没有

【需要搞清楚这些支持是做什么用的~】


「先选择no」

第三次安装,统一回车默认no,

docker svn建立版本库 docker安装swoole_docker svn建立版本库_31


docker svn建立版本库 docker安装swoole_linux_32

可以看到,install ok,

以及 configuration option "php_ini" is not set to php.ini location
You should add "extensinotallow=" to php.ini


这里新建 docker-php-ext-swoole.ini,并且输入如下内容:

extension=

docker svn建立版本库 docker安装swoole_php_33


重启php-fpm容器,检测扩展是否安装成功「其实不需要重启,因为swoole是工作cli模式下, 而且swoole不会依赖PHP-FPM,但是依赖PHP,作为其扩展,不过这里PHP-FPM容器则比较特殊,里面包含了PHP,在Nginx+PHP-FPM模式下,就不要安装Swoole了,而是建议使用单独的容器安装PHP+Swoole」


没有重启容器之前,如下:

发现并没有加载swoole扩展,web请求以前端请求脚本phpinfo输出内容为准

以及加载的配置文件的路径,注意有些版本/平台下的PHP会有两个配置文件,


php.ini 和 php.cli 前者用于web,后者用于cli

docker svn建立版本库 docker安装swoole_php_34


尽管cli下,执行php -m可以发现swoole「那就说明已经安装成功」,但是http模式下,并没有生效

docker svn建立版本库 docker安装swoole_centos_35

docker svn建立版本库 docker安装swoole_docker svn建立版本库_36


查看配置信息

docker svn建立版本库 docker安装swoole_php_37


重启容器,然后刷新,查看phpinfo的信息「这个不是PHP-FPM,而是PHP本身/解释器的输出内容」

docker svn建立版本库 docker安装swoole_centos_38

可以看到安装成功~


扩展冲突

docker svn建立版本库 docker安装swoole_docker svn建立版本库_39


检查:无安装/开启有冲突的扩展

docker svn建立版本库 docker安装swoole_docker svn建立版本库_40

下一章节:




...

3. 问题/补充

1. 将Swoole扩展加入到php.ini文件中, 一直没显示出swool的扩展

按照上面的步骤再检查下

PHP-FPM容器重启下

2.swolle卸载[php扩展卸载]?

pecl  unstall  扩展名


如:

pecl unstall swoole

3. 要保证版本一致,不然通常是会报错的。

4. 参考

参见文档阅读列表

后续补充

...