扩展安装

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