让我详细讲解一下“PHP扩展迁移为PHP7扩展兼容性问题记录”的完整攻略。
什么是PHP扩展
在开始探讨如何迁移为PHP7扩展兼容性问题记录之前,我们需要先了解一下什么是PHP扩展。
PHP扩展是一个能够通过动态链接库(DLL)的形式被加载进PHP解释器中的一些功能模块。这些模块提供了很多额外的功能,从而扩展了PHP语言的能力。常见的PHP扩展有MySQL扩展、GD图形扩展、cURL扩展等等。
PHP7扩展兼容性问题
在PHP7版本中,进行了很多的重大改变。这些改变大大提高了PHP语言的性能,但是也导致了一些不兼容的问题。
在PHP5中,Zend Engine2是PHP的内核。而在PHP7中,Zend Engine3取代了Zend Engine2成为了PHP的内核。由于这些变化,PHP5的扩展不能直接兼容PHP7,需要对PHP扩展进行迁移,才能兼容PHP7。
下面是一些PHP扩展迁移为PHP7扩展兼容性问题记录的具体步骤:
1.检查PHP扩展是否为PHP7扩展
在迁移PHP扩展之前,我们需要检查该扩展是否为PHP7扩展。可以通过以下命令检查:
php -dextension=[extension_name].so -m
如果该扩展能够被显示,那么它就是PHP7扩展。这些扩展是已经被迁移为PHP7的扩展,不需要再进行迁移。
2.安装PHP7
在进行PHP扩展迁移之前,需要先将PHP升级到PHP7。可以通过以下命令安装PHP7:
sudo apt-get install php7.0 php7.0-dev
3.检查是否有未定义的变量
在PHP7中,许多不再起作用的zval结构体中的变量在zend_value结构中定义。因此,如果PHP扩展存在未定义的变量,这些变量将无法编译。建议加上变量的定义以解决此问题。
4.将API函数名称添加到config.m4文件中
PHP7中API函数名称发生了变化,需要将新的API函数名称添加到config.m4文件中,以便对扩展进行重新编译。这里有一个例子:
PHP_FUNCTION(new_my_extension)
{
// 执行某些操作
}
zend_function_entry my_extension_functions[] = {
PHP_FE(new_my_extension, NULL)
{ NULL, NULL, NULL }
};
zend_module_entry my_extension_module_entry = {
STANDARD_MODULE_HEADER,
"my_extension",
my_extension_functions,
NULL,
NULL,
NULL,
NULL,
NULL,
NO_VERSION_YET,
STANDARD_MODULE_PROPERTIES
};
zend_module_entry *my_extension_module_ptr = &my_extension_module_entry;
5.修改MAKEFLE文件
MAKEFLE文件是编译PHP扩展的脚本。在进行PHP扩展迁移时,需要相应地修改MAKEFLE文件以支持PHP7。这里有一个例子:
PHP_EXT_NAME = my_extension.so
PHP_INI_FILE = php.ini
PHP_CONFIG = php-config
PHP_INCLUDES = `${PHP_CONFIG} --includes`
PHP_LD_FLAGS = `${PHP_CONFIG} --ldflags`
PHP_EXTENSION_DIR = `${PHP_CONFIG} --extension-dir`
all: $(PHP_EXT_NAME)
$(PHP_EXT_NAME): $(PHP_EXT_NAME:.so=.c)
$(CC) -W -Wall -shared -o $@ $< $(PHP_INCLUDES) $(PHP_LD_FLAGS)
clean:
rm -f $(PHP_EXT_NAME)
install:
cp $(PHP_EXT_NAME) $(PHP_EXTENSION_DIR)/$(PHP_EXT_NAME)
uninstall:
rm -f $(PHP_EXTENSION_DIR)/$(PHP_EXT_NAME)
示例说明
下面是两个PHP扩展迁移为PHP7扩展兼容性问题记录的示例:
示例1:如何迁移memcache扩展
git clone https://github.com/websupport-sk/pecl-memcache.git
cd pecl-memcache
# 将代码源中的 php.h 和 php_memcache.h 文件替换为 php7.h 和 php_memcache2.h 文件
cp php7.h php.h
cp php_memcache2.h php_memcache.h
# 修改 config.m4 文件
PHP_ARG_ENABLE(memcache,whether to enable memcache support,
[ --enable-memcache Enable memcache support])
PHP_CHECK_LIBRARY(memcache, z, [
PHP_ADD_LIBRARY_WITH_PATH(z, /usr/lib)
PHP_ADD_LIBRARY_WITH_PATH(memcache, /usr/lib)
],[
AC_MSG_ERROR([memcache library not found.])
])
PHP_NEW_EXTENSION(memcache, memcache.c memcache_queue.c memcache_standard_hash.c memcache_consistent_hash.c memcache_sasl_auth.c, $ext_shared)
# 修改 Makefile 文件
PHP_EXT_NAME = memcache.so
PHP_CONFIG = php-config
PHP_INCLUDES = `${PHP_CONFIG} --includes`
PHP_LD_FLAGS = `${PHP_CONFIG} --ldflags`
PHP_EXTENSION_DIR = `${PHP_CONFIG} --extension-dir`
all: $(PHP_EXT_NAME)
$(PHP_EXT_NAME): $(PHP_EXT_NAME:.so=.c)
$(CC) -W -Wall -shared -o $@ $< $(PHP_INCLUDES) $(PHP_LD_FLAGS)
clean:
rm -f $(PHP_EXT_NAME)
install:
cp $(PHP_EXT_NAME) $(PHP_EXTENSION_DIR)/$(PHP_EXT_NAME)
uninstall:
rm -f $(PHP_EXTENSION_DIR)/$(PHP_EXT_NAME)
示例2:如何迁移wddx扩展
# 下载 wddx 扩展源代码
git clone https://github.com/php/php-src.git
cd php-src/ext/wddx
# 修改 config.m4 文件
if test -r /usr/include/expat.h; then
PHP_ARG_WITH(wddx, for WDDX support,
[ --with-wddx[=DIR] Include WDDX support])
if test "$PHP_WDDX" != "no"; then
PHP_CHECK_LIBRARY(wddx, z, [
PHP_ADD_LIBRARY(z, 1, WDDX_SHARED_LIBADD)
PHP_ADD_INCLUDE($PHP_WDDX/include)
],[
AC_MSG_ERROR([libwddx not found.])
])
if test "$PHP_WDDX" != "yes"; then
PHP_ADD_LIBRARY_WITH_PATH(wddx, $PHP_WDDX/lib, WDDX_SHARED_LIBADD)
PHP_ADD_INCLUDE($PHP_WDDX/include)
else
PHP_ADD_LIBRARY_WITH_PATH(wddx, /usr/local/lib, WDDX_SHARED_LIBADD)
PHP_ADD_INCLUDE(/usr/local/include)
fi
PHP_NEW_EXTENSION(wddx, wddx.c wddx_lib.c, $ext_shared)
PHP_SUBST(WDDX_SHARED_LIBADD)
fi
fi
# 修改 Makefile 文件
PHP_EXT_NAME = wddx.so
PHP_CONFIG = php-config
PHP_INCLUDES = `${PHP_CONFIG} --includes`
PHP_LD_FLAGS = `${PHP_CONFIG} --ldflags`
PHP_EXTENSION_DIR = `${PHP_CONFIG} --extension-dir`
all: $(PHP_EXT_NAME)
$(PHP_EXT_NAME): $(PHP_EXT_NAME:.so=.c)
$(CC) -W -Wall -shared -o $@ $< $(PHP_INCLUDES) $(PHP_LD_FLAGS)
clean:
rm -f $(PHP_EXT_NAME)
install:
cp $(PHP_EXT_NAME) $(PHP_EXTENSION_DIR)/$(PHP_EXT_NAME)
uninstall:
rm -f $(PHP_EXTENSION_DIR)/$(PHP_EXT_NAME)
以上就是“PHP扩展迁移为PHP7扩展兼容性问题记录”的完整攻略。希望这些信息能够对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP扩展迁移为PHP7扩展兼容性问题记录 - Python技术站