关于PHP扩展的一些思考

可一想到终将是你的路人, 便觉得,沦为整个世界的路人。

PHP 库包含了哪些扩展

1
php -m

查看动态链接库位置

1
php -i | grep extension_dir

执行PHP代码

1
php -r "print_r( gd_info() );"

写文件

1
echo extension=gd.so >> /usr/local/php/lib/php.ini

编译方式

默认情况下,大多数的扩展都是静态编译的,即它们将成为生成的二进制文件的一部分。默认只有 opcache 扩展共享,即它将在 modules/ 目录生成一个 opcache.so 共享对象 。你可以通过 --enable-NAME=shared 或者 --with-NAME=shared 将其他扩展编译成共享对象(但不是所有的扩展支持这个)。

修复编译问题

如果运行 make 时遇到奇怪的错误或生成的二进制文件损坏(例如,在运行第一次测试之前, make test 就崩溃了),你应该尝试运行 make clean。它会删除所有已编译的对象,强制下一次 make 调用运行完整构建。

有时候,你必须在更改 ./configure 选项之后运行 make clean。 如果只是启用额外的扩展,则增量构建应是安全的,但是改变其他的选项可能需要完全重建。

共享扩展

PHP 扩展既能构建成静态库也可以构建成动态库(.so)。大多数静态库是与 PHP 捆绑在一起编译的,动态库可以显式地传递参数 --enable-EXTNAME=shared--with-EXTNAME=shared./configure

静态扩展默认是可用的,动态库需要增加 extension 或者 zend_extensionini 配置。俩者可以是绝对路径,也可以是相对路径。

从 PECL 安装扩展

1
~/myphp> bin/pecl install apcu

该命令将下载、编译并安装 APCu 扩展。结果会是 apcu.so 文件在扩展目录下,可以通过传递 extension=apcu.so 配置选项来加载此文件。

使用 phpize 构建扩展

进入扩展源码目录执行phpize

1
2
3
4
5
6
7
8
/tmp/apcu-4.0.2> ~/myphp/bin/phpize
Configuring for:
PHP Api Version: 20121113
Zend Module Api No: 20121113
Zend Extension Api No: 220121113

/tmp/apcu-4.0.2> ./configure --with-php-config=$HOME/myphp/bin/php-config
/tmp/apcu-4.0.2> make -jN && make install

当你构建扩展时,你应该总是指定 --with-php-config 选项(除非你只有一个全局的 PHP 安装),否则 ./configure 无法确定要构建的 PHP 版本和标志。指定 php-config 脚本也确保了 make install 将移动生成的 .so 文件(可以在 modules/ 目录找到)到正确的扩展目录。

删除已编译对象的 make clean 也是可用的,并且允许你增量构建失败时强制重新构建扩展。 另外 phpize 提供了一个清理选项 phpize --clean。该命令将删除所有 phpize 导入的文件和通过 /configure 脚本生成的文件。

https://learnku.com/docs/php-internals/php7/building_extensions/6849
https://digitalist-tech.se/blogg/webp-enabling-php-gd-library