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

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

相关文章

  • php的扩展写法总结

    PHP的扩展写法总结 在 PHP 中,扩展是一种 C 语言编写的动态链接库(.so文件或.dll文件),它能够提供一些 PHP 无法直接完成的功能,比如支持某些第三方库、提高 PHP 执行效率等。 下面将介绍如何编写 PHP 扩展,包括相关的代码示例和一些常用的扩展 API。 前置条件 在进行 PHP 扩展的编写之前,需要准备好以下工具: C 语言编译器:G…

    PHP 2023年5月23日
    00
  • PHP数组实例详解

    PHP数组实例详解 什么是PHP数组 在PHP中,数组是一种特殊类型的变量,用于存储多个值。数组元素可以是任何类型的数据,如整数、字符串、浮点数、布尔值,甚至可以是数组本身。PHP数组用于存储有序的数据集合,这些集合的元素可以通过数字索引或是字符串键来访问。 在PHP中,数组分为以下两种类型: 索引数组:使用数字作为数组的键,可以通过下标来访问数组元素。 关…

    PHP 2023年5月23日
    00
  • php基础教程 php内置函数实例教程

    标题 PHP基础教程和PHP内置函数实例教程 概述PHP是一种常用的服务器端编程语言,它可以用来开发 Web 应用程序。PHP语言不需要编译,它是一种解释型语言。PHP基础教程和PHP内置函数实例教程是指在学习这种编程语言时,学习PHP的基础知识和内置函数的应用。 PHP基础教程 PHP基础教程主要包括以下知识点: PHP基本语法 学习PHP的第一个步骤是了…

    PHP 2023年5月24日
    00
  • PHP和JS之间的数据交互并处理

    PHP和JS之间的数据交互可以通过以下步骤完成: 在PHP文件中获取需要交互的数据,可以使用POST或GET方法获取数据,然后将其存储为PHP变量或对象。 将需要与JS交互的数据转换为JSON格式,可以使用PHP内置函数json_encode()。例如: $data = array(‘name’ => ‘John’, ‘age’ => 30); …

    PHP 2023年5月26日
    00
  • 微信小程序 网络API Websocket详解

    微信小程序-网络API WebSocket详解 简介 现今的移动应用开发中,前后端分离已经成为一个显然的趋势。在这样的情况下,和后端交互,获取数据已经成为了一个移动应用开发的基本需求。所以,在大多数的应用中,都需要用到网络请求。其中,Websocket是网络请求的一种。 Websocket是什么? 说白了,Websocket就是一个协议,一种在web浏览器和…

    PHP 2023年5月23日
    00
  • 微信用户访问小程序的登录过程详解

    我们来详细讲解一下“微信用户访问小程序的登录过程详解”。 安装微信小程序 如果你还没有安装微信小程序,第一步需要安装一个微信小程序,在微信内部搜索需要使用的小程序,在小程序列表中找到需要的小程序即可进行安装。 进入微信小程序 安装好小程序后,在微信中点击进入该小程序,进入小程序的首页。 进入小程序需要授权登录 初次进入小程序时,用户需要授权登录,登录过程需要…

    PHP 2023年5月23日
    00
  • 日常整理PHP中简单的图形处理(经典)

    日常整理PHP中简单的图形处理(经典) 在PHP中,图形处理是很常见的需求,为了使图形更加美观或者更加符合需求,我们通常需要对图形进行处理和调整。本文将介绍一些PHP中常用的图形处理方法和技巧,帮助读者更好地实现自己需要的图形。 一、生成缩略图 有时候我们需要对一张图片进行缩放处理,通常是生成一个缩略图,使得图片在浏览时不会影响用户的网络和用户体验。PHP中…

    PHP 2023年5月23日
    00
  • PHP大文件分割上传 PHP分片上传

    PHP大文件分割上传(也称PHP分片上传)是一种将大文件通过分割成小文件并分批上传的方式,以减轻服务器负担,实现文件上传的方法之一。该方法适用于需要上传较大文件的网站或应用场景,比如云存储、大文件打包等。 以下是实现PHP大文件分割上传的完整攻略: 环境准备 PHP环境 >=5.5 Apache或Nginx服务器 上传文件大小限制需调整 实现步骤 1.…

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