PHP扩展迁移为PHP7扩展兼容性问题记录

yizhihongxing

让我详细讲解一下“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技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • ie与session丢失(新窗口cookie丢失)实测及解决方案

    IE与Session丢失(新窗口cookie丢失)实测及解决方案 背景 在使用IE浏览器时,会经常遇到在新窗口打开网页时,原本存在的session信息和cookie信息丢失的情况,这不仅会给用户带来不便,也会影响网站的正常运转。 实测过程 为了验证这个问题,我们采用了以下步骤进行实测: 在IE浏览器中打开网站,并登录成功。此时,我们可以看到浏览器中已经设置了…

    PHP 2023年5月27日
    00
  • 周末总结正则表达式(完整篇)

    那么下面我将为您详细讲解 “周末总结正则表达式(完整篇)” 的完整攻略,主要分为以下几个部分: 前言 正则表达式概述 正则表达式语法和规则 常用的正则表达式元字符 正则表达式示例 总结 1.前言 欢迎大家阅读 “周末总结正则表达式(完整篇)”,这篇文章主要是帮助大家快速学习正则表达式,并且掌握一些常用的正则表达式元字符和技巧。接下来,我将为大家详细讲解正则表…

    PHP 2023年5月27日
    00
  • PHP中使用DOMDocument来处理HTML、XML文档的示例

    使用DOMDocument是PHP中处理HTML和XML文档的一种常用方法,可以通过DOMDocument类来解析、创建和修改具有节点、元素、属性和文本等内容的文档。下面将详细讲解如何使用DOMDocument来处理HTML、XML文档的示例攻略。 1. 创建DOMDocument对象 首先要创建一个DOMDocument对象,可以通过调用该类的构造函数来创…

    PHP 2023年5月26日
    00
  • PHP中使用Imagick操作PSD文件实例

    下面是 “PHP中使用Imagick操作PSD文件实例” 的完整攻略: 一、安装Imagick扩展 PHP中的Imagick扩展是用于处理图像的功能强大的扩展,需要先在服务器上安装。可以使用以下命令来安装: sudo apt-get install php-imagick 安装完成后,运行phpinfo()确认是否已经安装成功。 二、安装ImageMagic…

    PHP 2023年5月26日
    00
  • 微信小程序实现图片放大预览功能

    下面是“微信小程序实现图片放大预览功能”的完整攻略: 1. 使用自带组件<image>展示图片 我们可以使用小程序自带的<image>组件来展示图片,示例代码如下: <image src="{{imageUrl}}"></image> 其中imageUrl为图片的网络链接或本地临时文件路径。…

    PHP 2023年5月23日
    00
  • PHP实现通用alert函数的方法

    这里我为你提供一个通用的alert()函数的实现方法,使用PHP语言编写: 创建通用alert函数的方法 第一步:编写PHP函数 我们可以编写一个名为alert()的PHP函数来实现通用alert功能。该函数接受一个字符串参数,作为需要提示给用户的信息。函数代码如下所示: function alert($msg) { echo "<scrip…

    PHP 2023年5月23日
    00
  • PHP大小写问题:函数名和类名不区分,变量名区分

    PHP语言中大小写问题有一个很重要的原则:函数名和类名不区分大小写,但变量名是区分大小写的。 具体而言,如下所示: 函数名和类名不区分大小写 在PHP中,无论是函数名还是类名都是不区分大小写的,比如下面这个函数定义: function greet(){ echo "Hello World!"; } 可以像下面这样使用: greet(); …

    PHP 2023年5月26日
    00
  • 小结下MySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方法第1/3页

    下面我将详细讲解“小结下MySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方法第1/3页”的完整攻略。 产生原因 在MySQL、phpmyadmin和php中出现中文乱码的原因主要有两个:1. 字符集不一致:MySQL、phpmyadmin和php的字符集设置不一致,导致中文字符显示为乱码。2. 数据库、表或字段的字符集设置不正确:如…

    PHP 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部