免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4653 | 回复: 14
打印 上一主题 下一主题

[冰天雪地裸体跪求]RH8下php如何调用c写的.so函数库? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-02-08 17:08 |只看该作者 |倒序浏览
在RH8下
我把用c编译的.so拷贝到php/extesion目录下,并在php.ini里加入了调用。
但是放进php页面执行的时候不能用dl("flow.so";调用,提示如下
Warning: dl(): Invalid library (maybe not a PHP library) 'flow.so'

这个库不是PHP自带的,也不是作为PHP的扩展,只是用来执行数据库操作的。

除了用dl()还有其他方法吗?
很急啊,到CSDN,PHP联盟,国际村等问了两个个星期都没人知道
9号前得不到答案我就得被炒鱿鱼了!!!!

论坛徽章:
0
2 [报告]
发表于 2004-02-08 17:36 |只看该作者

[冰天雪地裸体跪求]RH8下php如何调用c写的.so函数库?

看看是不是和你的一样?
http://tim.e104.org/?LangTo=GB2312&TIM=FORUM&FORUM=1&ShowDocument=9910

论坛徽章:
0
3 [报告]
发表于 2004-02-08 17:38 |只看该作者

[冰天雪地裸体跪求]RH8下php如何调用c写的.so函数库?

google一下,很多这方面的文章,呵呵

论坛徽章:
0
4 [报告]
发表于 2004-02-08 18:21 |只看该作者

[冰天雪地裸体跪求]RH8下php如何调用c写的.so函数库?

我翻了好多,都是说c里面调用.so的,没有说php里面调用的,要么就是说用dl()调用php的默认so。
现在有人都建议把函数都编译到php里面,但是好像也不现实啊,因为是操作oracle,说是要把很多的oracle库也包含进来

论坛徽章:
0
5 [报告]
发表于 2004-02-08 18:23 |只看该作者

[冰天雪地裸体跪求]RH8下php如何调用c写的.so函数库?

不是hileon 说的那个,那个是dll,是window里面的。
我要调用的是linux下的动态库xxxx.so

论坛徽章:
0
6 [报告]
发表于 2004-02-08 22:56 |只看该作者

[冰天雪地裸体跪求]RH8下php如何调用c写的.so函数库?

[quote]原帖由 "冰川火云"]CSDN,PHP联盟,国际村等问了两个个星期都没人知道 [/quote 发表:

那些地方怎么可以?有问题还是来这里吧。

言归正传:

扩展php首先要了解php的结构,php由3部分组成。
1、解释器 (分析和执行php源码)
2、功能部分(php中的各种函数)
3、界面部分(和Web服务器的接口)

其中第一部分和第二部分的一部分属于Zend引擎,也就是php的核心。这三部分共同构成了我们今天使用的php.
发一个漂亮的参考图




那么如果要扩展php应该从哪里下手呢?
一般也有三种可以动手的地方:
1、外部模块。
2、内建模块。
3、Zend引擎内核。

根据你的描述, 看来是想通过建立可以动态调用的外部来扩充php。那么一个php的扩充应该写成什么样子呢?这里发一个例子,这个函数非常简单,仅仅返回它的参数(声明:这已经超出我的所学所知了,如有差错还请大家指正)

  1. /* include standard header */
  2. #include “php.h”
  3. /* declaration of functions to be exported */

  4. ZEND_FUNCTION(first_module);
  5. /* compiled function list so Zend knows what’s in this module */

  6. zend_function_entry firstmod_functions[] =
  7. {
  8.         ZEND_FE(first_module, NULL)
  9.         {NULL, NULL, NULL}
  10. };
  11. /* compiled module information */
  12. zend_module_entry firstmod_module_entry =
  13. {
  14.         “First Module”,
  15.         firstmod_functions,
  16.         NULL, NULL, NULL, NULL, NULL,
  17.         STANDARD_MODULE_PROPERTIES
  18. };

  19. /* implement standard “stub” routine to introduce ourselves to Zend */
  20. #if COMPILE_DL
  21.         DLEXPORT zend_module_entry *get_module(void) { return(&firstmod_module_entry); }
  22. #endif

  23. /* implement function that is meant to be made available to PHP */
  24. ZEND_FUNCTION(first_module)
  25. {
  26.         zval **parameter;
  27.         if((ZEND_NUM_ARGS() != 1) || (zend_get_parameters_ex(1, &parameter)!= SUCCESS))
  28. {
  29.         WRONG_PARAM_COUNT;
  30. }
  31.         convert_to_long_ex(parameter);
  32.         RETURN_LONG((*parameter)->;value.lval);
  33. }
复制代码


所有的模块遵循以下的共同结构:
- 头文件内容。
- 输出函数C声明。
- Zend函数块声明。
- Zend模块块声明。
- get_module()工具。
- 所有输出函数工具。

看看你的模块有没有写成这样呢?另外编写的模块应该放到php的源码树中进行编译,还需要使用php的build系统来为它设定编译参数,我估计你的模块源代码离这样的要求还很远吧。

更多的详情你可以
http://www.php.net/manual/en/zend.php

那么外部模块有哪些缺点呢?
1、速度,由于外部模块需要php在执行时动态加载
2、需要使用dl()函数,或者更改php.ini
3、外部模块的文件有可能散乱的存放在磁盘上。

其实最最重要的问题是要问一问为什么要将功能编到php的动态模块中去?

[/img]
longnetpro 该用户已被删除
7 [报告]
发表于 2004-02-09 06:16 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2004-02-09 13:31 |只看该作者

[冰天雪地裸体跪求]RH8下php如何调用c写的.so函数库?

to shukebeita      

我们的设计思路是,通过动态库来操作数据库,目前是用oracle,但为了方便以后使用其他数据库,设计一个通用的接口。
以后更换数据库,只要重写动态库就可以了。尽量使php页面(用于web端)不涉及更多的操作。并且用动态库操作数据库,应该比用php脚本效率高一些。
同时也为改用其他的脚本语言,如jsp等,简化了工作。
(我原来希望用jsp的,也是一个小项目的经验而已,因为有jdbc可以使数据库的更换容易实现。但是公司的人认为java的运行速度太慢,而且与c的差别太大,而据说php语法的结构和c是很相象的)

开发人员只有3人,两个人负责写各种函数库,封装到动态库.so里面。我负责web显示部分。

我用php只有不到半年的时间,还是菜鸟。当初决定用php来开发这个项目时就是因为看到许多人都鼓吹php的强大功能。同时我也以为php既然是为unix/linux平台设计的,操作c的动态库应该是轻而易举的事情。

但是一切都和我预想的不一样。php根本就不像传说中的“asp有dll的动态库,php有so的动态库,完全可以与asp抗衡”。而且大多数人都只是把php用于基本的文本或者mysql数据库操作,更深入的应用很多少人懂。书籍也很难找到深入的,最多也就简单说了一下php的扩展。


不过现在看到这么多人都是这么说,看来只有重新编译php了,但是这样连php的版本恐怕都受到限制,无法升级了。
真希望能有asp那样简单的调用方式。

关于这个问题
因为这只是一个平台,以后需要二次开发,所以暂时不用zend编译。
不知道你的那种方法能不能用。



to  longnetpro
重新编译php的时候,./configure已经仿照--enable-bcmath=yes加了一句,不过编译的时候被跳过了,没有执行。

他们也是打算象你的方法那样做,但是有一个问题,动态库返回的是指针,php支持指针吗?

论坛徽章:
0
9 [报告]
发表于 2004-02-09 14:58 |只看该作者

[冰天雪地裸体跪求]RH8下php如何调用c写的.so函数库?

[quote]原帖由 "冰川火云"]我们的设计思路是,通过动态库来操作数据库,目前是用oracle,但为了方便以后使用其他数据库,设计一个通用的接口。 [/quote 发表:

首先不太理解你的这个思路,你们自行开发的模块到底里面包含了什么?

所以我假设:

A. 仅仅是一个简单的数据库抽象层为了更换数据库方便,而且要求更高效率。那么可能的办法有:
1、使用php自带的dbx功能。(详见手册,不过恐怕不够用)
2、使用ADODB数据库抽象层,它本身是php的,但是作者也用C开发了一个版本据说有75%性能提升。
http://php.weblogs.com/adodb

B. 模块里面包含了你们主要的Business Logic。
那么可以:

1、把business logic用php完成,开发完成以后用Zend工具做一下编码并且配合加速器使用。这样做不但能够提高运行效率而且使开发和调试更加容易(这个也是php的初衷)。
2、把business logic 挪到数据库中完成,据我所知oracle 支持内建java机制完成一般性的任务应该没有问题。用php 调用oracle的 服务器端的存储过程也能够得到较好的运行效率。

php当初就是为了更加方便的开发网页而设计的,而且经过这么多年大家的实践已经完善的相当不错了,很少会碰到需要应用开发人员用c进行扩展的情况,除非要建立新的系统接口,比如在php5中增加支持sqllite。

还是这个问题为什么要将功能编到php的动态模块中去?
longnetpro 该用户已被删除
10 [报告]
发表于 2004-02-09 15:28 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP