博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows下制作PHP扩展
阅读量:5896 次
发布时间:2019-06-19

本文共 2973 字,大约阅读时间需要 9 分钟。

一、编译PHP

转自:

编译PHP扩展必需的一些头文件需要从php源码中获取,其中有一些配置性的头文件,需要做到下面第8步之后,也就是说php服务器程序可以使用别人已经编译好的安装包。

在Windows下源码编译PHP

最近在学习编写PHP拓展,懒得装Linux,就研究了一下在Windows下编译PHP的方法,总算搭建好了在Windows下开发PHP拓展的环境。

1、在C盘新建一个文件夹,C:/PHPDEV

2、从官网下载最新版(我这里用的是5.2.14)的,将下tar.gz或tar.bz2压缩包保存到C:/PHPDEV,解压到当前文件夹

3、下载并保存到C:/PHPDEV,解压到当前文件夹

4、获取编译好的和,保存到桌面或者其他C:/PHPDEV以外的地方。分别打开压缩包并进入bin文件夹,将bison.exe和flex.exe复制到C:/Windows文件夹

5、假定你已经安装了Visual Studio 2008(我个人不推荐用Visual Studio 2008,推荐使用,官方的编译版本就是用这个PSDK编译的,但是这里用Visual Studio 2008做说明),开始菜单->Microsoft Visual Studio 2008->Visual Studio Tools->Visual Studio 2008 Command Prompt,打开Visual Studio 2008命令提示行

6、用cd命令将目录切换到C:/PHPDEV/php-5.2.14

7、输入buildconf.bat,回车。这个批处理的作用是搜索所有的.w32文件并为你创建configure.js

8、输入下面的命令

cscript /nologo configure.js –without-xml –without-wddx –without-simplexml –without-dom –without-libxml –disable-zlib — without-sqlite –disable-odbc –disable-cgi –enable-cli –enable-debug –without-iconv –disable-ipv6

为什么要disable和without那么多功能呢?因为这些功能需要的库文件并没有包含在PHP的源码包中(不然会很大),这些额外的库文件需要你自己去下载(要找全不是那么容易的)。如果你不禁用这些功能,会出现编译错误。

9、输入nmake,回车

10、第9步中可能会出现文件的编码错误,找到出现错误的文件,用EditPlus选择Western European (Windows)编码打开后另存为utf-8编码,重写nmake即可

11、编译好以后切换到C:/PHPDEV/php-5.2.6/Debug_TS,测试一下

php -r "echo ‘hello,world’;"

 

二、windows下开发PHP扩展

转自:

第一步:准备

1、php源码包和windows下的二进制包,以及安装Visual C++,并把Microsoft Visual Studio/Common/MSDev98/Bin的绝对路径添加到windows环境变量

2、解压源码包到d:/php_src

3、进入d:/php_src/ext目录,复制skeleton文件夹,并重命名为要开发扩展的名字,本例为“linvo”

4、把二进制包中dev目录下的php5ts.lib文件,拷入新建的linvo目录

5、编辑linvo目录中的php_skeleton.h、skeleton.c、skeleton.dsp这三个文件,替换内容中所有extname为linvo,EXTNAME为LINVO。(严格区分大小写)

第二步:编码

6、编辑php_skeleton.h文件(头文件)

在PHP_FUNCTION(confirm_linvo_compiled);下面编写

PHP_FUNCTION(hello);

声明一个hello函数

7、编辑skeleton.c文件(主文件)

在PHP_FE(confirm_linvo_compiled, NULL) 下面编写

PHP_FE(hello, NULL)

这是函数入口,下面该写函数主体了

找到PHP_FUNCTION(confirm_test_compiled)函数,该函数是测试函数,在该函数后面新写一个函数

PHP_FUNCTION(hello)

{

    char *arg = NULL;

    int arg_len, len;

    char *strg;

 

    /* 接收参数 */

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {

        return;

    }

 

    len = spprintf(&strg, 0, "Hello,%s", arg);

    RETURN_STRINGL(strg, len, 0);

}

第三步:编译

8、运行cmd命令行,进入d:/php_src/ext/linvo目录

9、输入 msdev linvo.dsp /MAKE "linvo - Win32 Release_TS"

10、如果没有错误,则在php_src目录下会生成一个Release_TS文件夹,里面就是编译好的php_linvo.dll扩展

第四步:使用

11、将其拷入运行环境中的php扩展目录ext

12、编辑php.ini添加extension=php_linvo.dll,重启apache

13、在php文件中执行如下语句 

echo hello('Linvo');

将输出

Hello,Linvo

14、通过echo phpinfo();也可看到扩展已加载的信息

linvo

linvo support enabled

 

 

三、加载问题

 当生成的扩展放到文件夹中,并且修改了php.ini之后有可能出现生成的扩展dll并没有被php加载,可以从以下几个方面进行检查。

1、创建一个php,并且使用phpinfo()函数打出当前php信息,找到php中真实加载的php.ini。

2、是否已经重启过apache。

3、查看apache的错误日志,看出现的有没有关于加载扩展出错的一些信息。 如果出现“PHP Warning:  PHP Startup: extname: Unable to initialize module/nModule compiled with module API=20090626, debug=0, thread-safety=1/nPHP    compiled with module API=20060613, debug=0, thread-safety=1/nThese options need to match/n in Unknown on line 0”这样的提示,说明编译时使用源码版本与php的应用程序不符合(并未要求完全一致的版本) ,如果出现不符合。

4、写扩展时是否引用了其它dll,对于此种问题原因,详见:

转载地址:http://vkasx.baihongyu.com/

你可能感兴趣的文章
mac mamp mysql no start servel
查看>>
Docker简易版:使用更少击键运行Redis,MongoDB
查看>>
laravel框架快速入门(一)
查看>>
swing 鼠标监听addMouseMotionListener
查看>>
windows下设置网络pingIP地址
查看>>
js如何实现10秒倒计
查看>>
ubuntu下解决鼠标滚轮不能使用的问题
查看>>
隐马尔可夫(HMM)、前/后向算法、Viterbi算法 再次总结
查看>>
LAV Filters
查看>>
多媒体客服的选择与应用
查看>>
iOS11 automaticallyAdjustsScrollViewInsets和estimatedRowHeight适配
查看>>
订阅linux kernel的mail list
查看>>
mysql 批量更新多条记录(且不同值)的实现方法
查看>>
Hadoop上路_02-hadoop介绍和环境准备
查看>>
JFinal多参数搜索条件自动组装及参数传递
查看>>
Lua与ObjC的交互
查看>>
c++ ios_base register_callback方法使用
查看>>
Java中为什么需要Object类,Object类为什么是所有类的父类
查看>>
在Hadoop-1.2.1中跑著名的wordcount例程
查看>>
css3 -webkit-flex 布局
查看>>