您的位置:首页 > 编程语言 > PHP开发

PHP调用C编程总结(windows)

2010-01-20 16:14 369 查看
一.环境的安装

   

    下载安装包,Google上搜索php+apache+sql的安装包并安装。

二.扩展编程

    针对在PHP环境下掉用C编程(c程序编译的dll),主要有以下两种方式。

   

    1.利用ATL构建DLL组件,然后再PHP里面直接调用,调用方法为

   

    <?php

    $com = new COM("atltest.Fun") or die("无法建立COM组件");

    echo $com->show(2);

    ?>

   

     2.按照linux下的方式来调用c程序写的dll。

    这种方式主要步骤为:

    (1).在linux下用php生成工程文件,然后拷贝到windows,(为什么这样做,因为windows下php没有扩展编程)

    (2).在windows下对php工程文件的php_xxx.h和xxx.c编辑,添加扩展的函数(方法),然后编译,生成扩展DLL.

    (3).把生成的DLL拷贝到php的扩展调用路径里面,再在php.ini里面添加生成的DLL支持。

    (4).最后在php程序中直接调用扩展DLL里面的函数即可.

三.总结

    第一种方法实现比较容易,但须用到第三方库,测试通过。

    第二种方法实现起来比较困难,测试未通过。

    最后决定使用第一种方法。

/*******************************************

附:第二种方法的一些步骤。

********************************************/

装好如下软件:

引用

1. VC++ 6

2. php二进制环境

3. Cygwin.

I. 下载php的源码包

下载后php源码包解压后有个ext目录,这个目录就是负责开发扩展的目录,目录中有默认你扩展的所有源码。还有两个重要的文件:ext_skel , ext_skel_win32.php.

ext_skel是创建扩展的shell,在windows上无法运行,所以就必须要有Cygwin。

II. 建立php扩展骨架目录文件

如果你的cygwin没有安装在c:/cygwin,进入php源码包/ext目录下,修改ext_skel_win32.php :

  $cygwin_path = 'c:/cygwin/bin';

修改为你的cygwin目录

  $cygwin_path = 'd:/cygwin/bin';

命令行方式进入ext目录然后运行:

php ext_skel_win32.php –extname=myhello

(当然,为了保证上面的命令行能正常运行,首先你得确保你的php目录在系统的环境变量里)

运行该命令后,有人发现下面的错误

引用

Warning: fopen(myhello/myhello.dsp): failed to open stream: No such file or directory in D:/cygwin/php-5.2.6/ext/ext_skel_win32.php on line 45

Warning: fopen(myhello/myhello.php): failed to open stream: No such file or directory in D:/cygwin/php-5.2.6/ext/ext_skel_win32.php on line 52

说明你的 cygwin 安装不完整。要是没报错你的myhello扩展就创建成功了。这就是一个简单的扩展框架,用纯c语言编写。

III. 添加依赖的php5ts.lib

  在php的二进制包中的 dev目录下将 php5ts.lib 拷到我们的myhello目录中, 否则编译将通不过。

IV. 添加hello c代码

生成的myhello目录中有关键文件包括

  myhello.dsp,

  myhello.c,

  php_myhello.h,

其他文件暂时不必关心.

提示:切忌myhello目录不可以挪移出ext目录,否则会编译报缺少php.h.

1. 修改php_myhello.h

扩展的新函数: 在PHP_FUNCTION(confirm_myhello_compiled); 行后添加一行

C代码

   1. PHP_FUNCTION(confirm_myhello_compiled); 

   2. PHP_FUNCTION(myhello);  // 新增的行 

PHP_FUNCTION(confirm_myhello_compiled);

PHP_FUNCTION(myhello);  // 新增的行

2. 修改myhello.c

在PHP_FUNCTION(confirm_myhello_compiled) 后添加我们的新函数

C代码

   1. PHP_FUNCTION(myhello){ 

   2.     php_printf(”Hello C extension”); 

   3. } 

PHP_FUNCTION(myhello){

    php_printf(”Hello C extension”);

}

在数组zend_function_entry myhello_functions[]增加一行

C代码

   1. zend_function_entry myhello_functions[] = { 

   2.     PHP_FE(confirm_myhello_compiled,    NULL)        /* For testing, remove later. */ 

   3.     PHP_FE(myhello, NULL) // 新增的行 

   4.     {NULL, NULL, NULL}    /* Must be the last line in myhello_functions[] */ 

   5. }; 

zend_function_entry myhello_functions[] = {

    PHP_FE(confirm_myhello_compiled,    NULL)        /* For testing, remove later. */

    PHP_FE(myhello, NULL) // 新增的行

    {NULL, NULL, NULL}    /* Must be the last line in myhello_functions[] */

};

V. 构建DLL文件

用vc6打开我们的工程,就是myhello.dsp

1. 修改编译方式为release: 选择Build->Set Active Configuration设置默认编译方式为Release, 否则会提示缺少php5ts_debug.lib ,其实就是php5ts.lib。

2. 按F5编译。会在ext上级的Release_TS目录下生成php_myhello.dll

提示:如果愿意使用命令行编译也是可以的,命令如下:

引用

msdev myhello/myhello.dsp /MAKE "myhello - Win32 Release_TS"

VI. 集成dll到php中。

1. 把我们生成的 php_myhello.dll放到二进制php环境的ext目录下.

2. 然后修改php.ini, 添加 extension=php_myhello.dll 重启apahce。

3. 新建c_test.php 内容为

Java代码

   1. <?php myhello(); ?>  

<?php myhello(); ?>

在浏览器里打开会看到页面:

引用

hello C extension.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息