zoukankan      html  css  js  c++  java
  • windows下制作PHP扩展

    一、编译PHP

    转自:http://demon.tw/software/compile-php-on-windows.html

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

    在Windows下源码编译PHP

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

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

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

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

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

    5、假定你已经安装了Visual Studio 2008(我个人不推荐用Visual Studio 2008,推荐使用Platform SDK Febrary 2003,官方的编译版本就是用这个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扩展

    转自:http://blog.csdn.net/linvo/archive/2009/04/17/4086909.aspx

    第一步:准备

    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://www.guyzyl.com/post-37.html

  • 相关阅读:
    MSDN Magazine搞错了
    Visual Studio 2005中设置调试符号(Debug Symbols)
    BCB 6的问题
    吴裕雄天生自然Spring Boot使用Spring Data JPA实现人与身份证的一对一关系映射
    吴裕雄天生自然Spring BootSpring Data JPA
    吴裕雄天生自然Spring BootSpring Boot对JSP的支持
    吴裕雄天生自然Spring BootSpring Boot的异常统一处理
    吴裕雄天生自然Spring Boot使用Spring Data JPA实现Author与Article的一对多关系映射
    吴裕雄天生自然Spring Boot解决 Error creating bean with name 'entityManagerFactory' defined in class path resource
    吴裕雄天生自然Spring Boot@ExceptionHandler注解和@ControllerAdvice注解
  • 原文地址:https://www.cnblogs.com/hellowzd/p/5606791.html
Copyright © 2011-2022 走看看