女主宣言

今天小编为大家分享编写PHP扩展的系列文章,文章从环境构建到扩展编写,会对使用到的相关PHP内核数据结构及API进行介绍,希望能对大家有所帮助。

PS:丰富的一线技术、多元化的表现形式,尽在“360云计算”,点关注哦!

众所周知PHP语言是由C语言编写,我们今天介绍的PHP扩展也是由C语言来进行开发的。所以在编写PHP扩展时,就需要考虑内存管理、数组边界以及其他底层语言的相关问题。因此,在编写PHP扩展时,很难说不会产生任何错误,所以就需要进行相应的调试。所以我们建议在Linux环境下,创建一个“DEBUG”的PHP构建环境,有助于更早的发现相关问题。

基于Linux从源码构建PHP也不会太复杂。但是,首先需要安装必要的开发组件,其中包括C编译器、链接器、库以及头文件。我们使用Linux的包管理器来进行操作。

Ubuntu/Debian环境:

$ sudo apt-get install build-essential autoconf automake bison flex re2c gdb \libtool make pkgconf valgrind git libxml2-dev libsqlite3-dev

RedHat/Fedora环境:

$ sudo dnf install gcc gcc-c++ binutils glibc-devel autoconf automake bison \flex re2c gdb libtool make pkgconf valgrind git \libxml2-devel libsqlite3x-devel

现在,我们可以从github克隆PHP GIT库,然后切换到所需的PHP版本(默认使用master分支或新版的PHP 8)。

$ git clone https://github.com/php/php-src.git
$ cd php-src
$ git checkout php-7.4.1 (switch to tag/branch of necessary PHP version)

接下来,配置PHP。我们将构建一个“DEBUG”版本的PHP,安装到home目录并且使用自定义的php.ini配置文件。“./configure”命令可以使用附近选项扩展,具体取决于你的PHP构建需求。可以指定:

  • 使用哪种SAPI(CLI、FastCGI、FPM、Apache)

  • 启用或禁用嵌入式PHP扩展及其选项

想要获取完整的配置选项,可以执行“./configure -help”查看。

$ ./buildconf --force
$ ./configure --enable-debug \--prefix=$HOME/php-bin/DEBUG \--with-config-file-path=$HOME/php-bin/DEBUG/etc

通常,需要与现有已安装版本进行相似的构建配置。为了节省时间,可以使用“php -i | grep ‘Configure Command’”获取现有构建的配置选项,并添加到“./configure”命令中。注意,构建一些PHP扩展可能需要安装其他库或者头文件,通常在此步骤中检查所有程序包依赖项。

最后,当configure成功时,编译并安装PHP构建:

$ make -j4
$ make install
$ cd ..

现在我们需要创建自定义的php.ini:

$ mkdir ~/php-bin/DEBUG/etc
$ vi ~/php-bin/DEBUG/etc/php.ini

应包含以下内容,启用错误报告并尽早发现可能的错误:

date.timezone="Asia/Shanghai"
max_execution_time=30
memory_limit=128Merror_reporting=E_ALL | E_STRICT ; catch all error and warnings
display_errors=1
log_errors=1zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.protect_memory=1      ; catch invalid updates of shared memory

将PHP添加到PATH环境变量中,覆盖系统中的PHP:

$ export PATH=~/php-bin/DEBUG/bin:$PATH

检查是否一切正常:

$ php -v

输出类似以下内容:

PHP 7.4.1 (cli) (built: Jan 15 2020 12:52:43) ( NTS DEBUG )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologieswith Zend OPcache v7.4.1, Copyright (c), by Zend Technologies

“DEBUG”PHP构建已准备好,下一步进行开发。

如果大家有什么建议或疑问,可以在下方留言交流。

360云计算

由360云平台团队打造的技术分享公众号,内容涉及数据库、大数据、微服务、容器、AIOps、IoT等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

1、配置PHP构建环境相关推荐

  1. 【Groovy】Gradle 构建工具 ( 自动下载并配置构建环境 | 提供 API 扩展与开发工具集成 | 内置 Maven 和 Ivy 依赖管理 | 使用 Groovy 编写构建脚本 )

    文章目录 一.Gradle 自动下载并配置构建环境 二.Gradle 提供 API 扩展与开发工具集成 三.Gradle 内置 Maven 和 Ivy 依赖管理 四.Gradle 使用 Groovy ...

  2. fis3 html 变量替换,fis3配置之分环境(media)构建

    本博客不欢迎:各种镜像采集行为,请尊重知识产权法律法规.大家都是程序员,不要闹得不开心. 继续fis3前端构建的学习旅程,苏南大叔在本文中继续实践的参数是media参数.这个参数不知道是哪位大神命名的 ...

  3. Gradle 构建环境变量配置

    一.前言 Gradle 提供多种机制用于配置 Gradle 和 指定项目的性能.开发者可以通过配置各种属性,用以提高Gradle的性能,以及实现某些特殊的构建需求(比如网络代理) 二.Gradle 属 ...

  4. jenkins设置执行时间_Jenkins环境搭建(4)-配置定时构建

    每次手动触发job构建,是很麻烦的一件事情,job中可以配置定时构建,今天就来分享下定时构建:构建分为两种:定时构建和轮询SCM. 一.定时构建 Jenkins采用了著名的UNIX任务调度工具CRON ...

  5. 第2章 构建环境——安装Oracle 9i

    第2章    构建环境--安装Oracle 9i   2.1.       安装完数据库服务器后,还需要在同一台计算机上独立安装管理客户机吗?为什么? 解答:不需要.数据库服务器安装完成后包括3部分: ...

  6. Dockerfile文件创建centos:7,配置JDK8的环境变量,与运行springboot的jar包,的镜像

    DockerFile文件创建centos:7 配置JDK8的环境变量 与运行springboot的jar包 准备文件 一:官网下载Linux的JDK包 https://www.oracle.com/j ...

  7. springboot 常用配置之多环境配置(开发环境、测试环境、生产环境等)

    在上一课中我们通过idea工具没有做任何配置就构建了一个springboot项目,并且已经成功启动了,但我们都很清楚这些都远远不能达到我们实际项目的需求,比如我们要引入我们自己的redis配置.mys ...

  8. WPF 框架全构建环境虚拟机硬盘分享

    现在 WPF 完全开源了,咱可以构建自己私有的版本.我分享一个虚拟机硬盘给你,只要你下载下来,通过 VMWare 导入,即可无需任何配置,拿到一个能构建 WPF 官方源代码的全构建环境.可以用来只做你 ...

  9. 在Visual Studio Code中配置GO开发环境

    一.GO语言安装 详情查看:GO语言下载.安装.配置 二.GoLang插件介绍 对于Visual Studio Code开发工具,有一款优秀的GoLang插件,它的主页为:https://github ...

最新文章

  1. 【pytorch】torch.nn.GroupNorm的使用
  2. zookeeper安装教程(zookeeper3.4.5为例)
  3. JavaWeb学习笔记——XML简介
  4. 算法设计与分析课程的时间空间复杂度
  5. Nature:科学家首次实现肉眼可见的量子纠缠
  6. LINUX静态网络配置
  7. Docker常用操作命令(二)
  8. tfidf处理代码_tfidf.txt
  9. 深入进货单-价格跟踪----宇然电脑公司管理软件
  10. superset0.34源码级别汉化
  11. 【PAT - 甲级1004】Counting Leaves (30分) (dfs,递归)
  12. mvc html.radiobutton 选中,asp.net-mvc - 如何使用RadioButtonFor选择单选按钮中的任何一个并包含if else语句 - 堆栈内存溢出...
  13. ConstraintLayout 完全解析 快来优化你的布局吧
  14. cnpack转换dfm文件
  15. apdu 移动sim_SIM卡APDU指令
  16. cogs2235 烤鸡翅 贪心
  17. python 流水作业调度_动态规划——流水作业调度问题
  18. 10 Kafka集群与运维
  19. 原生JS实现任意数据的动态表格
  20. 记录一下自己爬虎牙LOL主播的爬虫思路

热门文章

  1. jsp学习之路之安装Apache Tomcat7.0服务器
  2. Spring自学日志05(代理模式)
  3. Spring,SpringMvc初始化监听配置
  4. WebService之初体验
  5. 云南职称计算机准考证打印,会计考试准考证打印
  6. linux内核热修复,揭露内核黑科技 - 热补丁技术真容
  7. java连续创建目录_Java创建目录
  8. java reader 方法_Java Reader reset()方法
  9. 把zabbix图形整合至运维平台
  10. 不知道选择多云还是混合云?先把概念弄清楚吧