扩展安装

Swow 扩展安装提供了以下几种方法

通过 Composer 安装

可以使用 Composer 下载源码

composer require swow/swow

下载完成后在 vendor/bin 目录中会有一个 swow-builder 的文件,我们可以使用此脚本文件来安装扩展

# 编译扩展
php vendor/bin/swow-builder

# 编译扩展并指定php-config路径,注意这里需要配置的是php-config的路径,而非php命令的
# 自行手动安装的和大多数发行版的包提供的php对应的php-config都在相同目录下
# 例如almalinux的php,php-devel包中php在/usr/bin/php,php-config在/usr/bin/php-config
# alpine的php81,php81-dev包中php在/usr/bin/php81,php-config在/usr/bin/php-config81
# 如果你的PHP发行没有提供这一文件,你可能需要自行构建php
php vendor/bin/swow-builder --php-config=/path/to/php-config

# 查看帮助
php vendor/bin/swow-builder --help

# 模拟运行,用于查看编译命令
php vendor/bin/swow-builder --dry-run

# 编译扩展时显示完整编译日志信息
php vendor/bin/swow-builder --show-log

# 编译扩展过程中不进行询问 (如询问是否安装)
php vendor/bin/swow-builder --quiet

# 清理后编译扩展
php vendor/bin/swow-builder --clean

# 重新检测配置并清理后再编译扩展
php vendor/bin/swow-builder --rebuild

# 编译并安装扩展
php vendor/bin/swow-builder --install

# 编译并使用管理员权限安装扩展
php vendor/bin/swow-builder --install --sudo

# 清理后再编译并安装扩展
php vendor/bin/swow-builder --clean --install

# 重新检测配置并清理后再编译并安装扩展
php vendor/bin/swow-builder --rebuild --install

# 重新编译并安装扩展且手动指定启用一些功能
php vendor/bin/swow-builder --rebuild --install --ssl --curl

# 编译安装扩展并打开扩展的调试模式
php vendor/bin/swow-builder --install --debug

使用 swow-builder 安装时,程序在最后会询问并尝试使用管理员权限安装 Swow 扩展到系统路径,此时 sudo 可能会询问你管理员密码来安装 Swow 到系统目录。

安装程序在安装过程中会输出类似于下述的指令:

/usr/bin/env php -d extension=/path/to/your-project/vendor/swow/swow/ext/modules/swow.so --ri swow

你可以复制该指令并在命令行中运行,以检查 Swow 是否安装成功。

你也可以参考它来运行你的程序,而不是将 so 添加到全局的 ini 配置文件中,这样做的好处是你可以在不同的项目中使用不同的 Swow 版本。

编译安装成功后,在使用时推荐通过 -d 来按需加载 Swow 扩展,如:php -d extension=swow


编译参数

  1. PHP类型的编译参数需要在编译PHP时指定

  2. DEBUG类型的编译参数需要先启用--debug才能生效

  3. --enable--with参数大都支持在后面用等于号指定路径参数
  4. Builder Alias 是指在使用swow-builder时传参的别名
选项 在Builder中的别名 类型 支持平台 描述
--with-php-config=<path> --php-config=<path>     指定php-config路径
--enable-debug   PHP   打开PHP的调试模式,需要在编译PHP时指定,在编译Swow时指定无效
--enable-swow       启用Swow扩展的编译(默认启用)
--enable-debug-pack     Windows 打开扩展的的debug pack构建,用于Windows下Release版本PHP的Swow调试,编译Swow时指定,不能与--enable-debug一同使用
--enable-swow-debug --debug     启用DEBUG编译
--eanble-swow-memory-sanitizer --msan Debug Unix-like 启用memory-sanitizer帮助底层进行内存分析
--enable-swow-address-sanitizer --asan Debug Unix-like 启用address-sanitizer帮助底层进行内存分析
--enable-swow-undefined-sanitizer --ubsan Debug Unix-like 启用undefined-sanitizer帮助底层进行未定义行为分析
--enable-swow-gcov --gcov Debug Unix-like 启用GCOV支持,用于支持统计C代码覆盖率
--enable-swow-valgrind --valgrind Debug Linux 启用Valgrind支持(默认检测到有则自动启用)
--enable-swow-thread-context --thread-context     使用线程而不是boost-context作为协程上下文管理
--enable-swow-ssl --ssl     启用SSL支持,需要OpenSSL(默认检测到有则自动启用)
--enable-swow-curl --curl     启用cURL支持,需要libcurl(默认检测到有则自动启用)

手动编译安装 (UNIX-like 或 cygwin、msys、wsl)

首先安装PHP和它的开发包(php头文件和phpize,php-config等),安装方法参考各发行版说明

准备构建依赖(UNIX)

如果你需要cURL hook支持或者ssl支持

linux

# debian和它的变种,如ubuntu, kali, armbian, raspbian, deepin, uos
apt-get install libcurl4-openssl-dev libssl-dev
# fedora, rhel 8, centos 8
dnf install libcurl-devel openssl-devel
# 旧版fedora, rhel 6/7, centos 6/7
yum install libcurl-devel openssl-devel
# archlinux和它的变种,如manjaro, archlinuxarm, blackarch
pacman -S curl openssl
# alpine
# 如果提示openssl1.1-compat-dev-1.1.1xxx: conflicts,只安装curl-dev就行
apk add curl-dev openssl-dev
# opensuse, suse
zypper install libcurl-devel libopenssl-devel

macOS

brew install curl openssl

然后根据提示执行export PKG_CONFIG_PATH来让configure能够找到它们。

每次构建Swow都需要这个export,建议加入你的bashrc。

构建安装

下载或者 clone 源代码后,在终端进入源码目录,执行下面的命令进行编译和安装,构建参数见下面的说明

# 获取源码
git clone https://github.com/swow/swow.git swow
cd swow/ext
# 生成configure
phpize
# 执行configure,构建参数见下面的说明
./configure
# 构建,可以使用 -j+数字 来并行构建
make -j4
# 安装,如果configure制定了prefix,可以不使用sudo
sudo make install

编译成功后,在使用时推荐通过 -d 来按需加载 Swow 扩展,如:php -d extension=swow


手动编译安装 (Windows)

准备MSVC

根据你所使用的PHP发布选择安装MSVC的版本,例如使用了PHP 8.0.1的”VS16 x64 Non Thread Safe”选项,则需要选择VS16,也就是VS2019

VC版本号 VS版本 说明
VS17 2022  
VS16 2019 安装VS2019或者在安装VS2022时选择VS2019工具链
VC15 2017 安装VS2017或者在安装VS2019时选择VS2017工具链
VC14 2015 安装VS2015或者在安装VS2017时选择VS2015工具链

准备devpack

PHP Windows 下载页 找到你所使用PHP版本的”Development package (SDK to develop PHP extensions)”链接,下载它

解压到任意目录(以下使用C:\php-8.0.1-devel-vs16-x64为例)

准备php-sdk-binary-tools

clone PHP官方提供的php-sdk-binary-tools到任意目录(以下使用C:\php-sdk-binary-tools为例)

git clone https://github.com/php/php-sdk-binary-tools

准备构建依赖(Windows)

https://downloads.php.net/~windows/php-sdk/deps/<vc版本例如vc15或者vs16>/<架构名例如x64>/ 找到依赖的包(例如curl)

注意版本对齐,未对齐的依赖版本可能导致奇怪的segfault,PHP无法正常退出等神奇问题,https://downloads.php.net/~windows/php-sdk/deps/series/中的文件提供了这些版本信息

解压到任意目录(以下使用C:\deps为例)

如果解压到Swow扩展源码目录的同级deps目录,则下面可以省去–with-php-build参数

例如Swow源码在C:\swow,Swow扩展源码目录在C:\swow\ext,deps在C:\swow\deps时

构建

打开PHP工具命令行:

例如在为之前提到的PHP8.0 VS16 x64 NTS构建swow扩展则执行C:\php-sdk-binary-tools\phpsdk-vs16-x64.bat

在打开的命令行中下载或者 clone 源代码后,进入源码目录,执行下面的命令进行构建

git clone https://github.com/swow/swow.git swow
CD swow\ext
REM 下面的C:\php-8.0.1-devel-vs16-x64是之前解压的devpack路径
C:\php-8.0.1-devel-vs16-x64\phpize.bat
configure.bat --enable-swow --with-php-build=C:\deps
nmake

构建完成后,将生成的php_swow.dll(位于当前目录的架构名目录中,如x64)放置于extension_dir中(默认的,这个目录是php文件同级的ext目录或者C:\php\ext,具体情况参照所使用的PHP发行说明)

编译成功后,在使用时推荐通过 -d 来按需加载 Swow 扩展,如:php -d extension=swow