PHP允许使用扩展的方式,直接使用C语言开发PHP的功能,由于编译的问题,很多底层和框架的基础工作如果用PHP必然会带来额外的开销,降低系统的吞吐量,必然yaf就是这样的思路,把框架封装在扩展里,让系统开销降低到最小,基本接近不用框架的性能水平。

首先是获取PHP的源代码,这里提供一个PHP源码的下载地址,目前最新的是PHP7.1,不够考虑到我一直在用的环境,这里选择PHP 5.4.31为例。

第二是在Windows平台下的PHP编译部署。在Windows下需要用到Visual Studio,PHP 5.4.31用到的是Visual Studio 2008,同时需要升级到vS2008 SP1编译才能正常编译使用。否则在部署之后就会出现无法加载的问题。

注意,在此之前,windows需要先安装php,并把php加入到环境变量中,推荐安装xampp,一步到位。

VS2008 SP1 :下载地址

PHP 5.4.31源码:下载地址

PHP5ts.lib:下载地址

安装完开发环境之后,就可以开始进行配置了。在Windows下开发扩展在创建项目时比在Ubuntu上要麻烦的多,一个是需要PHP的源代码,还有一个就是配置需要先构建一个项目,然后手动配置,不能像Ubuntu下那么直接执行一个脚本就完事了。将源代码部署在E:\Projects\php-5.4.45-src路径下,然后使用管理员身份运行终端(cmd.exe)然后

cd E:\Projects\php-5.4.45-src\ext
php ext_skel_win32.php --extname=hello

就可以构建一个PHP扩展的开发项目,(路径在 E:\Projects\php-5.4.45-src\ext\hello)可以看到如下图所示的项目文件

利用之前安装好的VS2008SP1 打开这个项目。可以看到如下内容

右键选中项目 打开右键菜单-->属性,如下

点击C/C++-->常规,找到并打开如下图红圈所示

把这是个地址都修改成PHP源码部署的绝对地址,这样就不会出现稍微移动一下项目位置就会出现不能编译的问题,修改后的地址如下

配置好之后,还需要在PHP源码上做一些设置,

(1)将E:\Projects\php-5.4.45-src\win32\build\config.w32.h.in 拷贝到E:\Projects\php-5.4.45-src\main下,并把最后的.in后缀去掉,否则编译的时候会出现

找不到..main\config.w32.h文件的错误

(2)需要单独下载php5ts.lib并进行配置,否则会出现

1>LINK : fatal error LNK1181: 无法打开输入文件“php5ts.lib”

错误,将php5ts.lib解压到E:\Projects\php-5.4.45-src\build,然后打开项目属性--->链接器--->输入,然后把值改成如下图标识的样子。

到此为止,就可以开始编译项目了。编译出来的动态库,通过在php.ini后增加扩展的方式,然后重启xampp,就可以通过phpinfo()函数看到了。

第三是在Ubuntu平台下的编译部署,在Ubuntu下开发php扩展要简单的多,首先一样先安装xampp for Ubuntu,安装方法可以参考我前一篇文章《Ubuntu16.04的PHP开发环境配置》。然后配置系统的php环境,执行如下命令

将系统php和xampp中的php链接在一起,这样可以方便测试php扩展。系统的php命令路径在 cd /usr/local/bin,所以先切换到该路径下

cd /usr/local/bin
sudo mv php php-5.4.45
sudo mv php-cgi php-cgi-5.4.45
sudo mv php-config php-config-5.4.45
sudo mv phpize phpize-5.4.45 sudo ln -s /opt/lampp/bin/php-5.4.31 php
sudo ln -s /opt/lampp/bin/php-cgi-5.4.31 php-cgi
sudo ln -s /opt/lampp/bin/php-config-5.4.31 php-config
sudo ln -s /opt/lampp/bin/phpize-5.4.31 phpize
sudo ln -s /opt/lampp/etc/php.ini /usr/local/lib/php.ini

执行之后,xampp apache使用的php和终端使用的php就是同一个了。

接下来就可以开始创建项目了,设置PHP源码放置在 home/Projects/php-5.4.45-src

注意  ext_skel 刚开始是没有执行权限的,需要执行如下命令 给予执行权限

chmod 777 ext_skel

那么接下去创建项目可以执行如下的命令

cd /home/Projects/php-5.4.45-src/ext
sudo ./ext_skel --extname=hello
cd hello
gedit config.m4 /*找到第16行和第18行去掉前面的dnl注释,如下图所示*/
sudo phpize
sudo ./configure
sudo make && make install
sudo make test

注意保存文件之后,还需要执行phpize,否则还是会碰到不生成.so文件的问题。

PHP扩展开发编译环境的搭建的更多相关文章

  1. 利用 Docker 构建一个简单的 java 开发编译环境

    目前 Java 语言的版本很多,除了常用的 Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本.如果想切换自己本地的 Java 开发环境 ...

  2. C++ 函数模板与类模板(使用 Qt 开发编译环境)

    注意:本文中代码均使用 Qt 开发编译环境,如有疑问和建议欢迎随时留言. 模板是 C++ 支持参数化程序设计的工具,通过它可以实现参数多态性.所谓参数多态性,就是将程序所处理的对象的类型参数化,使得一 ...

  3. Java编译环境的搭建(eclipse)

    每用一种语言开发,要搭建其编译和开发环境,我们废话不说,立刻来看看Java开发环境的搭建. 1.安装JDK和JRE Windows环境下: a.去Oracle官网下载对应版本的JDK安装包,http: ...

  4. WebAssembly学习(二):Windows10下WebAssembly C/C++编译环境的搭建与Hello World尝试

    首先,不论是在Windows.Linux还是Mac上,Webassembly的编译都是主要依赖于Emscripten SDK这个工具的.但是,在这里必须要吐槽一下,不论是WebAssembly官网.W ...

  5. Visual Studio Code (VSCode) 配置 C/C++ 开发编译环境

    前言 工作多年,突然发现很多C++的基础都忘记了,加之C++不断更新换代后的各种新特性,于是想重拾C++的基础学习.虽然现在工作都是Linux平台,但考虑到个人方便,自己也仅仅想重温语法,家里家外都可 ...

  6. Windows下QT4.8.4编译环境的搭建(转载http://blog.csdn.net/bestgonghuibin/article/details/38933141)

    开始使用QT了,所以第一步就是把环境搭起来,这里小记一下,以免以后忘记. 1. 下载安装文件 要使用QT功能,那么必须要下载QT的源码,还必须要一个是用QT的编译环境,可以是VS2010,也可以是专用 ...

  7. 第一篇:《UNIX 网络编程 第二版》编译环境的搭建

    第一步:搭建基本的编译环境 安装gcc, g++, bulid-essential等编译软件 第二步:下载本书示例源码包 第三步:解压下载到的包并放在用户主目录中 第四步:进入包内并执行以下命令 su ...

  8. 第一篇:《UNIX 环境高级编程》编译环境的搭建

    第一步:搭建基本的编译环境 安装gcc, g++, bulid-essential等编译软件 第二步:下载本书示例源码包 可在这里下载 www.apuenook.com 第三步:解压下载到的包并放在用 ...

  9. 《UNIX 环境高级编程》编译环境的搭建( 运行本专栏代码必读 )

    第一步:搭建基本的编译环境 安装gcc, g++, bulid-essential等编译软件 第二步:下载本书示例源码包 可在这里下载 www.apuenook.com 第三步:解压下载到的包并放在用 ...

随机推荐

  1. MySQL8.0.20安装详解

    https://blog.csdn.net/yeb112233/article/details/106042867/ alter user root@localhost identified by ' ...

  2. PDF的信息提取的问题

    PDF对企业应用来说是刚需.   然而PDF显然不是一种对机器友好的格式,它只是对人类友好,就是说方便阅读打印,但让程序去提取其中的内容却很难.下面简单说说为什么是这样.   以前还读书的时候(20+ ...

  3. CSS基础 结构伪类选择器 last-child、first-child和nth-of-type的使用方法

    一.通过伪类选择器查找单个标签元素html结构 <div> <a herf='#'>导航1</a> <a herf='#'>导航2</a> ...

  4. RabbitMQ开启SSL与SpringBoot连接测试

    楔子 近期公司程序被安全扫描出 远程主机允许明文身份验证 中风险漏洞,查了下修复方案,RabbitMQ官方提供了SSL连接方式,而且 SpringBoot AMQP 也支持 SSL 连接.以下将配置R ...

  5. Pytest_简介与安装(1)

    一.Pytest简介 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但更灵活.官方网站优点简介: 非常容易上手,入门简单,文档丰富,文档中有很多实例可 ...

  6. MySQL 截取小数位数

    项目中遇到一些有关小数位数截取的问题,留下痕迹,以便后续使用时注意:个人推荐使用方法2),直接四舍五入 1)select FORMAT(1478568.2457,2): 查询出来的结果为: ,每隔3位 ...

  7. 【基因组学】maker的安装和注释

    本文默认读者有一定的生信基础,没有基础的可以阅读以前的笔记内容. maker作为比较受人认可的基因组注释软件,其流程较为清晰简单. 不知何故,我的conda无法安装maker,故而采用手动安装方式. ...

  8. WAFW00F waf识别工具 源码学习

    我实习工作的第一个任务根据已有的java waf识别工具 实现了一个python的waf识别工具 代码结构非常乱 仅仅达到了能用的水平. 顶头svp推荐这个项目当时我已经写好了开始用了自己的 稍微看了 ...

  9. Keil MDK STM32系列(七) STM32F4基于HAL的PWM和定时器

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  10. 【刷题-LeetCode】229. Majority Element II

    Majority Element II Given an integer array of size n, find all elements that appear more than ⌊ n/3 ...