关于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_extension
的 ini
配置。俩者可以是绝对路径,也可以是相对路径。
从 PECL 安装扩展
1 | ~/myphp> bin/pecl install apcu |
该命令将下载、编译并安装 APCu 扩展。结果会是 apcu.so
文件在扩展目录下,可以通过传递 extension=apcu.so
配置选项来加载此文件。
使用 phpize 构建扩展
进入扩展源码目录执行phpize
1 | /tmp/apcu-4.0.2> ~/myphp/bin/phpize |
当你构建扩展时,你应该总是指定 --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