php 7.4 配置安装php-zbarcode扩展
前言
php-zbarcode 不是 PHP 官方扩展
官方源仓库:https://github.com/mkoppanen/php-zbarcode (这是一个较旧的仓库,最后更新于多年前,但支持 PHP 5.x 到 7.x,包括 7.4。克隆后需检查兼容性并编译。)
PHP 7 兼容 fork:https://github.com/lijinma/php-zbarcode (这个 fork 明确支持 PHP 7,并修复了部分崩溃 bug,适合 PHP 7.4 使用。)
我将使用 lijinma/php-zbarcode 进行编译安装扩展。
下载代码
sudo git clone https://github.com/mkoppanen/php-zbarcode.git
cd php-zbarcode
兼容修复
应用 PHP 7.4 兼容修复(基于 GitHub issue #22 和 #35 的社区补丁),先修复 zbar_version 参数(常见错误)
sudo sed -i 's/zbar_version(&major, &minor);/zbar_version(&major, &minor, &patch);/' zbarcode.c
sudo sed -i 's/spprintf(&zbar_ver, 24, "%d.%d", major, minor);/spprintf(&zbar_ver, 24, "%d.%d.%d", major, minor, patch);/' zbarcode.c
sudo sed -i 's/unsigned int major = 0, minor = 0;/unsigned int major = 0, minor = 0, patch = 0;/' zbarcode.c
核心 API 替换(PHP 7 必需,修复 zend_object_store_get_object 等)
sudo sed -i 's/zend_object_store_get_object(getThis() TSRMLS_CC)/Z_OBJ_P(getThis())/' zbarcode.c
sudo sed -i 's/zend_object_store_get_object(image TSRMLS_CC)/Z_OBJ_P(image)/' zbarcode.c
sudo sed -i 's/zend_object_store_get_object(getThis() TSRMLS_CC)/Z_OBJ_P(getThis())/' zbarcode.c # 重复替换
sudo sed -i 's/MAKE_STD_ZVAL(symbol_array);/ALLOC_ARRAY(symbol_array);/' zbarcode.c
sudo sed -i 's/add_assoc_string(symbol_array, "data", (char *)data, 1);/add_assoc_string_ex(symbol_array, "data", 4, (char *)data);/' zbarcode.c
sudo sed -i 's/add_assoc_string(symbol_array, "type", (char *)zbar_get_symbol_name(symbol_type), 1);/add_assoc_string_ex(symbol_array, "type", 4, (char *)zbar_get_symbol_name(symbol_type));/' zbarcode.c
sudo sed -i 's/php_imagick_object/zend_object/' zbarcode.c
sudo sed -i 's/ZEND_FETCH_RESOURCE(gd_image, gdImagePtr, &image, -1, "Image", phpi_get_le_gd());/ZEND_FETCH_RESOURCE(gd_image, gdImagePtr, &image, -1, "Image", le_gd);/' zbarcode.c # 假设 le_gd 已定义
sudo sed -i 's/zend_object_value/zend_object */g' zbarcode.c
sudo sed -i 's/zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t) php_zbarcode_object_free_storage, NULL TSRMLS_CC);/intern->std.obj = zend_objects_store_put(intern, (zend_objects_free_object_storage_t) php_zbarcode_object_free_storage, NULL, NULL);/' zbarcode.c
sudo sed -i 's/zend_objects_free_object_storage_t/zend_objects_free_object_storage_func_t/g' zbarcode.c
sudo sed -i 's/zend_register_internal_class_ex(&ce, zend_exception_get_default(TSRMLS_C), NULL TSRMLS_CC);/zend_register_internal_class_ex(&ce, zend_exception_get_default(), NULL);/' zbarcode.c
sudo sed -i 's/ce.create_object = php_zbarcode_object_new;/ce.create_object = (zend_object *(*)(zend_class_entry *))php_zbarcode_object_new;/g' zbarcode.c # 类型转换
sudo sed -i 's/php_info_print_table_start()/php_info_print_table_start();/' zbarcode.c
sudo sed -i 's/php_info_print_table_row(2, "zbarcode module", "enabled");/php_info_print_table_row(2, "zbarcode module", "enabled");/' zbarcode.c
sudo sed -i 's/php_info_print_table_end()/php_info_print_table_end();/' zbarcode.c
编译代码
我这里用了宝塔
sudo /www/server/php/74/bin/phpize ./configure --with-php-config=/www/server/php/74/bin/php-config make clean && make -j$(nproc) && sudo make install
安装成功输出:
root@xxx-debian:/usr/local/src/php-zbarcode#
make clean && make -j$(nproc)
find . -name \*.gcno -o -name \*.gcda | xargs rm -f
find . -name \*.lo -o -name \*.o | xargs rm -f
find . -name \*.la -o -name \*.a | xargs rm -f
find . -name \*.so | xargs rm -f
find . -name .libs -a -type d|xargs rm -rf
rm -f libphp.la modules/* libs/*
/bin/sh /usr/local/src/php-zbarcode/libtool --mode=compile cc -I/usr/include/x86_64-linux-gnu/ImageMagick-6 -I/usr/include/ImageMagick-6 -fopenmp -DMAGICKCORE_HDRI_ENABLE=1 -DMAGICKCORE_QUANTUM_DEPTH=16 -I. -I/usr/local/src/php-zbarcode -DPHP_ATOM_INC -I/usr/local/src/php-zbarcode/include -I/usr/local/src/php-zbarcode/main -I/usr/local/src/php-zbarcode -I/www/server/php/74/include/php -I/www/server/php/74/include/php/main -I/www/server/php/74/include/php/TSRM -I/www/server/php/74/include/php/Zend -I/www/server/php/74/include/php/ext -I/www/server/php/74/include/php/ext/date/lib -I/usr/include/x86_64-linux-gnu/ImageMagick-6 -I/usr/include/ImageMagick-6 -DHAVE_CONFIG_H -g -O2 -c /usr/local/src/php-zbarcode/zbarcode.c -o zbarcode.lo
mkdir .libs
cc -I/usr/include/x86_64-linux-gnu/ImageMagick-6 -I/usr/include/ImageMagick-6 -fopenmp -DMAGICKCORE_HDRI_ENABLE=1 -DMAGICKCORE_QUANTUM_DEPTH=16 -I. -I/usr/local/src/php-zbarcode -DPHP_ATOM_INC -I/usr/local/src/php-zbarcode/include -I/usr/local/src/php-zbarcode/main -I/usr/local/src/php-zbarcode -I/www/server/php/74/include/php -I/www/server/php/74/include/php/main -I/www/server/php/74/include/php/TSRM -I/www/server/php/74/include/php/Zend -I/www/server/php/74/include/php/ext -I/www/server/php/74/include/php/ext/date/lib -I/usr/include/x86_64-linux-gnu/ImageMagick-6 -I/usr/include/ImageMagick-6 -DHAVE_CONFIG_H -g -O2 -c /usr/local/src/php-zbarcode/zbarcode.c -fPIC -DPIC -o .libs/zbarcode.o
/bin/sh /usr/local/src/php-zbarcode/libtool --mode=link cc -DPHP_ATOM_INC -I/usr/local/src/php-zbarcode/include -I/usr/local/src/php-zbarcode/main -I/usr/local/src/php-zbarcode -I/www/server/php/74/include/php -I/www/server/php/74/include/php/main -I/www/server/php/74/include/php/TSRM -I/www/server/php/74/include/php/Zend -I/www/server/php/74/include/php/ext -I/www/server/php/74/include/php/ext/date/lib -I/usr/include/x86_64-linux-gnu/ImageMagick-6 -I/usr/include/ImageMagick-6 -DHAVE_CONFIG_H -g -O2 -o zbarcode.la -export-dynamic -avoid-version -prefer-pic -module -rpath /usr/local/src/php-zbarcode/modules zbarcode.lo -lzbar -lMagickWand-6.Q16HDRI -lMagickCore-6.Q16HDRI
cc -shared .libs/zbarcode.o -lzbar /usr/lib/x86_64-linux-gnu/libMagickWand-6.Q16HDRI.so /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16HDRI.so -Wl,-soname -Wl,zbarcode.so -o .libs/zbarcode.so
creating zbarcode.la
(cd .libs && rm -f zbarcode.la && ln -s ../zbarcode.la zbarcode.la)
/bin/sh /usr/local/src/php-zbarcode/libtool --mode=install cp ./zbarcode.la /usr/local/src/php-zbarcode/modules
cp ./.libs/zbarcode.so /usr/local/src/php-zbarcode/modules/zbarcode.so
cp ./.libs/zbarcode.lai /usr/local/src/php-zbarcode/modules/zbarcode.la
PATH="$PATH:/sbin" ldconfig -n /usr/local/src/php-zbarcode/modules
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/src/php-zbarcode/modules
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
Build complete.
Don't forget to run 'make test'.
root@xxx-debian:/usr/local/src/php-zbarcode# sudo make install
Installing shared extensions: /www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/
配置启用扩展
# 宝塔 php-fpm 会扫描的目录
sudo mkdir -p /www/server/php/74/etc/php.d
sudo bash -c 'echo "extension=zbarcode.so" > /www/server/php/74/etc/php.d/20-zbarcode.ini'
# 或者 vim 手动添加
vim /www/server/php/74/etc/php.ini
vim /www/server/php/74/etc/php-cli.ini
extension=/www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/zbarcode.so
# 方法1:绝对路径(最保险,推荐)
extension=/www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/zbarcode.so
# 方法2:相对路径(宝塔默认支持)
extension=zbarcode.so
# 方法3:写全目录也可以(宝塔也认)
extension=/www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/zbarcode.so
立刻验证
/www/server/php/74/bin/php -m | grep zbarcode
输出 zbarcode 为成功
创建一个页面,搜索zbarcode 是否存在
<?php phpinfo(); ?>

浙公网安备 33010602011771号