- 浏览: 201392 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
guji528:
使用Python通过正则表达式替换很方便:
sprin ...
Python正则表达式指南 -
guji528:
很实用,先keep再看
Python正则表达式指南 -
yushine:
1,2,3,5 已经做了剩下的本来也正准备做。
2012, 每一个软件工程师必须做的11件事 -
mynetstudy:
用导出不就可以了吗
递归删除SVN工作目录下的.svn目录
想了很久怎么给这篇文章起标题,本文是针对入门型的,定位在 开发或者学习 PHP C/C++扩展的朋友的初级教程。
有两个理由需 要自己编写PHP扩展。第一个理由是:PHP需要支持一项她还未支持的技术。这通常包括包裹一些现成的C函数库,以便提供PHP接口。例如,如果一个叫 FooBase的数据库已推出市场,你需要建立一个PHP扩展帮助你从PHP里调用FooBase的C函数库。这个工作可能仅由一个人完成,然后被整个 PHP社区共享(如果你愿意的话)。第二个不是很普遍的理由是:你需要从性能或功能的原因考虑来编写一些商业逻辑。
本门技术我大概花了七 个小时来整理技术,并发布这边博文,暂时的功能是在windows平台上生成DLL文件。
技术关键字:windows Microsoft Visual C++ 6.0 源程序编译 PHP Extension DLL
What is PECL?
PECL (PHP Extension Community Library),PHP的扩展库,它提供了一系列已知的扩展库,由C++等其他语言编写而成,多数以Dll(动态链接库)的形式体现,为比PEAR更快,但是与PEAR
不同的是,PECL需要在服务器上配置并被注册到主机中。
PECL is a repository for PHP Extensions, providing a directory of all known extensions and hosting facilities for downloading and development of PHP extensions.
开发环境的搭建
PHP 的源码包,这个可以到 http://www.php.net/downloads.php 去下载,记得我们是要源码包(Complete Source Code)而不是PHP 的二进制代码包(Windows Binaries)。本文所采用是 PHP 5.2.12 的源码包。
随便贴出下载地址:http://cn.php.net/distributions/php-5.2.12.tar.gz
注: 千万别覆盖当前windows下的php,因为你下载的是linux上运行的源码程序,我们用的只是他需要编译的头文件,例如php.h。
解压开php-5.2.12.tar.gz
除此之外我们还需要一个 php5ts.lib (若用 PHP 4 的源码包则需要的是 php4ts.lib)的文件。这在PHP 二进制代码包的 dev 目录(php4ts.lib 则是直接放在二进制代码包的根目录)下可以找到。
该源码包解压到某个目录,我们可以看到main、Zend、win32、TSRM、regex、ext 等目录。
现在记住重要的地方: 拷贝main、Zend、win32、TSRM、regex、ext\standard到windows php 安装目录中。暂时先不解释为什么。因为后面我们出现编译错误时会提醒你的,这些都是项目中必须要用到的。
我们在这里使用的 IDE 是 VC++ 6.0 简体中文版本 。需要次软件的在下面评论中留下你的Email和QQ号或者在联系页面查看我的联系方式,我直接传文件给你。
项目开始
在菜单中选择 【文件】 -> 【新建】 -> 【工程】 来创建这个扩展的项目文件。
工程类型为“Win32 Dynamic-Link Library”。工程名称为:lixiphp,在本例中我们的扩展名字为 lixiphp,位于 PHP\ext目录下。
在抚琴居 《扩展 PHP》一文中使用的类型是 Win32 Project ,我第一次做的时候选择 Win32 Console Application,结果Link 时会出现了错误。
在 “您希望创建什么类型的DLL?”中,选择 “一个空的 DLL 工程”。
On the next menu choose “An empty DLL project” and click the finish button. A new window should open up and show you all the information relating to the project; click the OK button again。
现在我们将扩展的源代码文件lixiphp.c 新建/添加到 lixiphp扩展的项目文件当中。
注意:
此处新建文件为lixiphp.c不是lixiphp.cpp。
配置项目属性
1、删除 Win32 Debug,添加个性Release。
① 组件 -> 配置 -> 选中Win32 Debug -> 删除
此时就剩下 Win32 Release。 因为生成DLL 不需要Debug,所以删除掉。
② 组件 -> 配置 -> 添加配置 Release_lixiphp, 配置拷贝从Win32 Release。平台任然为Win32。
最后效果为下图:
2、设置工程属性
① C/C++ tab 设置
On the C/C++ tab,General Category, add the following preprocessor definitions:
A 选择分类:预处理器
讲预处理器定义设置为:
ZEND_DEBUG=0,COMPILE_DL_LIXIPHP_MOD,ZTS=1,ZEND_WIN32,PHP_WIN32,WIN32,_DEBUG,_CONSOLE,_MBCS
附加包含路径设置为:
../..,../../main,../../Zend,../../TSRM
自己根据相对路径算一算对不对,如果你按照我上面的做的话,是不会出问题的。 ../的意思上级目录。
效果如下图:
B 选择分类:Code Generation
In the Code Generation Category, change Use run-time Library to “Multithreaded DLL”.
效果如下图:
② 连接设置
分类:常规
输出文件名为:Release_lixiphp/php_lixiphp.dll
对象/库对象最末尾添加 php5ts.lib, 如果你是PHP4 就添加 php4ts.lib,最后为:
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php5ts.lib
On the Link tab in the General Category, change the Output file name to Release_lixiphp/php_lixiphp.dll . In future projects you will be able to change the name to anything (*.dll). However, most PHP extensions come with the prefix php_ to indicate they are in-fact PHP extensions. (php_*.dll)
On the same tab (Link), same category (General), add php4ts.lib to Object/library modules.
这样,整个扩展项目文件的Release 版本就配置好了。
现在万事俱备,只欠编码了,让我们这就开始吧!
Copy PHP\dev\php5ts.lib 到你刚才建立的项目中,PHP4同理。
编写lixiphp.c代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
/* include standard header */
/* you will need to include this in all of your php extension projects*/
#include "php.h"
#include "ext/standard/info.h" /* for phpinfo() functions */
/* All the functions that will be exported (available) must be declared */
ZEND_FUNCTION(hello_lixi);
PHP_MINFO_FUNCTION(lixiphpmod);
/* Just a basic int to be used as a counter*/
int
i;
/* function list so that the Zend engine will know what’s here */
zend_function_entry lixiphpmod_functions[] =
{
ZEND_FE(hello_lixi, NULL) {NULL, NULL, NULL}
};
/* module information */
zend_module_entry lixiphpmod_module_entry =
{
STANDARD_MODULE_HEADER,
"LixiPHP"
, lixiphpmod_functions, NULL, NULL, NULL, NULL, PHP_MINFO(lixiphpmod), NO_VERSION_YET, STANDARD_MODULE_PROPERTIES
};
#if COMPILE_DL_LIXIPHP_MOD
ZEND_GET_MODULE(lixiphpmod)
#endif
PHP_MINFO_FUNCTION(lixiphpmod)
{
php_info_print_table_start();
php_info_print_table_row(2,
"LixiPHP Extension"
,
"All Systems Go"
);
php_info_print_table_end();
}
ZEND_FUNCTION(hello_lixi)
{
}
|
最后在compile 、build , Release_lixiphp目录中就会生成 php_lixiphp.dll。
至此整个编译过程结束。
使用extension dll
① 拷贝php_lixiphp.dll到 php/ext 目录中。
② 配置php.ini文件,添加extension=php_lixiphp.dll
③ 重启服务器
测试安装是否成功
调试代码如下:
1
2
3
4
|
<?php
hello_lixi();
phpinfo();
?>
|
或者使用 命令测试,命令如下:
php -r hello_lixi();
注意: php.exe的目录必须加入环境变量path中,不好请在评论中提问。
效果图如下:
最后慢慢享受一下自己成果吧!
本文功能简单,只为那些想学习extension dll 的phper们提供点基础知识。
错误解决
现在详解的错误方法是我在学习研究过程中遇到的。如果你严格按照上面的步骤,这一栏信息你完全可以飘过。只是针对那些从半路杀出来的,你可能在看其他文章和技术文档时出现错误,通过搜索引擎来到这儿的。不过我们同样欢迎你!
① php.h 文件不在配置环境中
ERROR:
fatal error C1083: Cannot open include file: ‘php.h’: No such file or directory
解决方法:
请查看本文的 “开发环境的搭建” 一栏,你肯定是没有安装 tar.gz源码,在Windows Binaries 二进制代码包中是无法编译的。
② phpinfo() functions 错误
ERROR:
fatal error C1083: Cannot open include file: ‘php.h’: No such file or directory
lixiphp.c(31) : warning C4013: ‘php_info_print_table_start’ undefined; assuming extern returning int
lixiphp.c(32) : warning C4013: ‘php_info_print_table_row’ undefined; assuming extern returning int
lixiphp.c(33) : warning C4013: ‘php_info_print_table_end’ undefined; assuming extern returning int
解决方法:#include “ext/standard/info.h” /* for phpinfo() functions */
关于standard的安装方法请查看本文的 “开发环境的搭建” 一栏,你没有拷贝源码包中的ext\standard
③ 编译通过,但是连接出错
ERROR:
——————–Configuration: helloworld – Win32 Release_TS——————–
Linking…
Creating library Release_TS/php_lixiphp.lib and object Release_TS/php_lixiphp.exp
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Release_TS/php_lixiphp.dll : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.
解决方法:
你的工程建立错误,请建立:Win32 Dynamic-Link Library 工程,我们做的DLL项目。
④ 无法连接php 内部函数,没有添加php5ts.lib
ERROR:
Linking…
Creating library Release_TS/lixiphp.lib and object Release_TS/lixiphp.exp
lixiphp.obj : error LNK2001: unresolved external symbol __imp__php_info_print_table_end
lixiphp.obj : error LNK2001: unresolved external symbol __imp__php_info_print_table_row
lixiphp.obj : error LNK2001: unresolved external symbol __imp__php_info_print_table_start
lixiphp.obj : error LNK2001: unresolved external symbol __imp__zend_printf
Release_TS/php_lixiphp.dll : fatal error LNK1120: 4 unresolved externals
解决方法:
工程 -> 设置 -> 链接 -> 常规 -> 添加php5ts.lib, 请查看本文 连接设置。
注: 我遇到的错误就这样了,你有什么错误,请在评论中提交。
发表评论
-
Magento模板及布局文件中引用Static Block的方法
2013-03-21 10:25 1294Static Block是Magento提供的非常实用的一种 ... -
PHP ORM框架与简单代码实现
2013-02-18 12:37 1446对象关系映射(Object Relational Mappi ... -
php.ini安全配置详细解释
2013-01-24 11:28 1944PHP本身再老版本有一些问题,比如在 php4.3.10和p ... -
关于PHP学习
2012-11-02 21:54 8271.首先看了PHP的源码API ... -
Zend Framework的DB处理-表关联(转载)
2012-04-24 10:35 1202介绍: 在RDBMS中,表之间有着各种 ... -
浅谈Zend Framework, CodeIgniter与Kohana
2012-04-13 17:11 1264抛砖引玉,这三份框架 我都花了一定的时间精力去了解,根据 ... -
浅谈Zend Framework, CodeIgniter与Kohana
2012-04-13 17:10 14<div id="article_conten ... -
22个开源的PHP框架
2012-02-06 12:40 974http://coolshell.cn/articles/10 ... -
isolated 十个超级有用的PHP代码片段
2012-01-31 15:50 8951. 发送短信 调用 TextMagic API。 // ... -
Drupal 主页定制:定制个性的drupal 主页<front>
2011-11-24 23:48 1074默认主题就是列表格式,像blog一样,一般做企业展示性的网站, ... -
drupal6.x中创建新的主题模版和区域(Regions)
2011-11-24 23:27 15892011-01-02 18:29 ... -
9大最有潜力PHP开源项目:PHP FOR Android开发居首
2011-11-10 11:21 1544PHP的开源世界可谓相当 ... -
Comparing PHP Frameworks ( Symfony, CakePHP, YII and CodeIgniter)
2011-06-30 18:13 1558转自 http://karim-ouda.blogspot.c ... -
A Good PHPer
2011-01-18 16:35 7671.首先看了PHP的源码API函数,对于许多口水仗的争论一笑而 ... -
PHP实现html标签补全
2011-01-18 15:37 1189PHP实现html标签补全 作者:朦朧中的罪惡 | ... -
Comparison of web application frameworks
2011-01-18 15:29 1017From Wikipedia, the free encycl ... -
搭建Eclipse PDT开发CakePHP的环境
2011-01-14 14:20 2681搭建Eclipse PDT开发CakePHP ... -
国外主流PHP框架比较-CodeIgniter、CakePHP、ZendFramework、Symfony
2010-12-01 13:16 1297最近简单的使用了目前在国内用的比较多的几个主流国外PHP框架( ... -
面向 PHP 5.3 友好的 PHP 开发
2010-10-12 13:57 1216最近 Debian 的 testing 版 ... -
php5.3不支持eregi()函数了
2010-10-12 13:52 8666写正则的时候可能会碰到用ereg()时出现错误,如:Depre ...
相关推荐
The PHP-CPP library is a C++ library for developing PHP extensions. It offers a collection of well documented and easy-to-use classes that can be used and extended to build native extensions for ...
自定义自己的PHP模块,用C语言开发自己的PHP函数,当我们想在PHP使用C语言强大的函数库的时候,我们可以通过编写自己的PHP函数过调用想要使用的其它C语言函数,使你的PHP程序更强大高效,要下的赶块...
Parser Error Message: Could not load file or assembly 'System.Web.Extensions, Version=1.0.61025.0, ...出现该错误解决办法 将System.Web.Extensions.dll 与System.Web.Extensions.Design.dll 放到项目BIN目录
System.Web.Extensions.dll 和 System.Web.Extensions.Design.dll 是两个关键的组件,它们在ASP.NET框架中扮演着重要的角色,特别是在实现AJAX(Asynchronous JavaScript and XML)功能时。这两个DLL文件是ASP.NET ...
中完整Windows Extensions Dll文件",这指的是在Windows环境下运行PHP时,为了启用额外的扩展功能而需要的一些动态链接库(DLL)文件。这些DLL文件提供了PHP与不同外部库或服务交互的能力,使得PHP可以执行更复杂的...
除了手动安装,你还可以使用一些集成开发环境(IDE)或Web服务器软件的管理界面来添加和管理PHP扩展,如XAMPP控制面板中的“PHP Extensions”选项。这种方法通常更简单,但可能不适用于所有情况。 总之,为Windows...
System.Web.Extensions.dll和System.Web.Extensions.Design.dll是ASP.NET框架中两个至关重要的组件,主要用于支持AJAX(Asynchronous JavaScript and XML)技术。在ASP.NET应用程序中,这些DLL文件提供了丰富的功能...
在PHP开发中,扩展(Extensions)是增强PHP功能的重要组件,比如`php_memcache.dll`和`php_redis.dll`就是两个非常重要的PHP扩展。 `php_memcache.dll`是PHP与Memcached缓存系统交互的扩展。Memcached是一种高性能...
将php_yaf.dll放置于phpstudy的PHP路径下。 D:\phpstudy_pro\Extensions\php\5.6.9nts\ext 如果没有就看一下php.ini里有没有yaf 如果没有在最下方加上extension=php_yaf.dll
- 从官方源或者第三方可靠的资源站点下载与你的PHP版本相匹配的`php_amqp.dll`和其依赖的`librabbitmq.dll`文件。例如,可以从PECL(PHP Extension Community Library)或GitHub仓库获取。 3. **配置php.ini**: ...
System.Web.Extensions dll 动态链接库
System.Web.Extensions.dll V3.5。有时编译需要这个东西,又一时找不到,故提供一个下载。
安装说明: 把php_yaf.dll放置于phpstudy小皮面板PHP路径下。 例如D:\phpstudy_pro\Extensions\php\php7.3.4nts\ext 在小皮面板,网站—管理—php扩展—选择yaf 或者在php.ini手动加上extension=yaf
《深入理解System.Web.Extensions.dll与.NET Framework 1.0》 System.Web.Extensions.dll是ASP.NET框架中的一个重要组件,尤其在1.0版本中扮演着关键角色。这个动态链接库(DLL)文件包含了对ASP.NET AJAX...
然后,将解压后的 ZendLoader.dll 文件复制到 PHP 的 extensions 目录下。接着,打开 php.ini 文件,找到 "zend_extension" 或 "extension" 配置项,添加 ZendLoader.dll 的完整路径。最后,保存并重启 Web 服务器...
Z.EntityFramework.Extensions.dll 破解版,我们在用EF开发时 会有版权报错 要求license,这个dll是我用工具破解的
2.复制php_apc.dll到你的PHP的模块文件夹里,比如c:/php/extensions (PHP4.X)或者c:/php/ext(PHP5.X) 3.打开php.ini.搜索;extension=php_zip.dll 在这一行下面加上 extension=php_apc.dll apc.enabled = 1 apc.shm_...
替换C:\Users\xxxxx\.nuget\packages\z.entityframework.extensions.efcore\2.1.49\lib\netstandard2.0下的Z.EntityFramework.Extensions.EFCore.dll。适用于.net core的ef,解除了1个月使用的限制。