easysoft / phpmicro

micro sfx SAPI for php
Apache License 2.0
255 stars 30 forks source link

event扩展怎么编译进去 #2

Closed mmmcatoo closed 2 years ago

mmmcatoo commented 2 years ago

想咨询下PHP8.x的情况下如何编译event扩展

dixyes commented 2 years ago

具体遇到了什么困难吗

mmmcatoo commented 2 years ago

下载了https://pecl.php.net/package/event这个扩展的3.0.6的版本。 解压到ext目录之后使用

./buildconf --force
./configuration --with-event-core

最后会报一个

checking PHP version... configure: error: unknown source
report
dixyes commented 2 years ago

event扩展完全不支持in-tree构建, 我提了个PR 你可以用我这分支的源码

除此之外 你需要静态构建它的依赖libevent并且连接到最终的二进制中:

make EXTRA_LIBS='/path/to/libevent.a /path/to/libevent_extra.a ... -lrt -ldl -lpthread -lm ...'
dixyes commented 2 years ago

如果没有关于构建micro(而不是event)的其他问题的话,请移步event的pr讨论并关闭这个issue

mmmcatoo commented 2 years ago

不加EXTRA_LIBS编译成功了

dixyes commented 2 years ago

是这样的 你需要先构建libevent的静态库们,再在EXTRA_LIBS里指定,如果不这么做,构建出的micro/cli将会有对libevent的依赖。

操作步骤(未验证,仅供参考):

准备cmake toolchain file

保存到任意路径,以/path/to/cmaketoolfile为例

SET(CMAKE_SYSTEM_NAME Linux)
# 设置目标架构
SET(CMAKE_SYSTEM_PROCESSOR aarch64)
# 设置交叉编译的c/cxx编译器
SET(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
SET(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)
# 设置cflags
SET(CMAKE_C_FLAGS "")
SET(CMAKE_CXX_FLAGS "")
# 设置cmake寻找库的根目录
SET(CMAKE_FIND_ROOT_PATH "/path/to/inst")

如果你需要libevent-openssl的话,你需要先准备个静态编译的openssl

构建静态的libevent

以/path/to/inst为安装路径为例,方括号部分可选(下同)

# 获取libevent源码
git clone https://github.com/libevent/libevent
pushd libevent
mkdir build
pushd build
# 使用cmake配置
cmake .. \
    -DBUILD_SHARED_LIBS=OFF \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_TOOLCHAIN_FILE=/path/to/cmaketoolfile
# 使用cmake构建
cmake --build [-j `nproc`]
# 安装到/path/to/inst
make install DESTDIR=/path/to/inst
popd
popd

构建php

准备下源码先,如果需要纯静态的micro,就使用下面例子里的=all-static参数

git clone https://github.com/php/php-src
pushd php-src
# 准备 micro,见readme
git clone <url for this repo> sapi/micro
# 准备event
git clone <url for event> ext/event
./buildconf --force
./configure \
    --disable-all \
    --disable-cgi \
    --disable-cli \
    --disable-phpdbg \
    --enable-micro[=all-static] \
    --with-event-core \
    --with-event-libevent-dir=/path/to/inst \
    --your-other-options...

这个时候打开Makefile看看它的EXTRA_LIBS里有啥,需要重新组装:

重复的库只保留最后一次出现

最后保持顺序不变,重新组装成EXTRA_LIB变量:

例如(为了方便加了换行)

-levent
-levent_openssl
-lz
-lcurl
-lz
-lssl
-lcrypto
-lz
-ldl
-lpthread

将会变成

/path/to/inst/lib/libevent.a
/path/to/inst/lib/libevent_openssl.a
/path/to/inst/lib/libcurl.a
/path/to/inst/lib/libssl.a
/path/to/inst/lib/libcrypto.a
/path/to/inst/lib/zlib.a
-ld
-lpthread

最后使用重新组装的EXTRA_LIBS构建micro(cli同理,把configure中的--disable-cli --enable-micro换成cli就行)

make EXTRA_LIBS='/path/to/inst/lib/libevent_xxx.a...' [-j`nproc`] micro

当然 这个操作过于麻烦了

我已经在撸自动的构建系统了,只不过还要一段时间, 目前新构建系统里构建脚本部分整好了,有带swow curl openssl parallel redis ffi的版本的二进制(测试过程中的产物,每天更新):https://github.com/dixyes/lwmbs/actions/runs/2388707128

swoole event等其他异步IO引擎的版本还在TODO中

mmmcatoo commented 2 years ago

希望大佬早日成功