用C/C++函数调用php功能的问题

  用C/C++函数调用php 功能 的问题
楼主sdbtb(sdbtb) 2005-03-24 14:04:21 在 Web 开发 / PHP 提问

我想写一个c/c++函数RunPhpScript(script   command,   result);  
  该函数里执行php   script:   command,将执行结果放入result。  
  这个函数是独立的,并不需要web   server的支持。  
   
  我以前是把php   script(例如:<?php   echo   "hello";   ?>)输入到文件中,然后调用php.exe进程,把这个文件名做为参数传递给php进程。然后等待执行结果,把执行结果重定向到另一个文件中。但 这种方法速度太慢。  
   
  另外一种方法就是修改php源代码,将它制作成为lib,并支持直接传递script。这样子就省去了启动进程的时间和文件处理的时间。但我不知道该如何重新编译php源代码。  
  不知道各位高人是否有更好更简单的方法。  
   
  谢谢各位! 问题点数:100、回复次数:39Top

src="http://topic.csdn.net/Include/Board.htm?Tags=" frameborder="0" scrolling="no">

1 楼sdbtb(sdbtb)回复于 2005-03-24 14:19:05 得分 0

谢谢各位。Top

2 楼xuzuning(唠叨)回复于 2005-03-24 15:13:57 得分 0

认真读懂php.exe是如何启动php4st.dll并向其传递数据的代码就知道该如何做了  
  Top

3 楼sdbtb(sdbtb)回复于 2005-03-24 15:21:31 得分 0

您的意思是直接调用php4ts.dll吗?   php.exe并不提供功能性的代码,功能性代码是在php4ts.dll中实现的,   是这样吗?   谢谢!Top

4 楼xuzuning(唠叨)回复于 2005-03-24 17:37:37 得分 0

是的Top

5 楼sdbtb(sdbtb)回复于 2005-03-24 17:40:55 得分 0

谢谢您的回复,我试试看。Top

6 楼sdbtb(sdbtb)回复于 2005-03-25 10:02:54 得分 0

我粗略的看了看源代码,发现只能处理整个php文件,没有单独处理一条php   script的功能。   这样子对于我来说,效率依然很低啊。   各位高人有什么好的办法吗?Top

7 楼uuq(杜牧)回复于 2005-03-31 18:41:27 得分 0

楼主怎么跟我一样的想法呀。  
   
  Top

8 楼sdbtb(sdbtb)回复于 2005-04-01 09:52:15 得分 0

uuq:你有好的方法解决这个问题吗?Top

9 楼phpteam(phpsalon.com)回复于 2005-04-01 12:13:29 得分 0

在C里执行PHP很简单,只需连接php4embed.lib这个库就行了。Top

10 楼alee201(alee)回复于 2005-04-01 19:34:16 得分 0

我用vb   调用过php   ,   也是和你一样,用通道重定向的方法。  
  vb   功能弱,所以才   让php脚本来执行某些功能,     c/c++   为什么还要用   php   来实现Top

11 楼sdbtb(sdbtb)回复于 2005-04-03 11:40:49 得分 0

phpteam:   您能说说具体的调用过程吗?(比如需要调用lib里的哪些函数以及调用他们的顺序)。谢谢!Top

12 楼sdbtb(sdbtb)回复于 2005-04-03 11:42:25 得分 0

alee201:我也不知道为什么,我只是执行任务:)Top

13 楼copygirl(wa!)回复于 2005-04-03 11:58:11 得分 0

很有意思的问题,mark!Top

14 楼uuq(杜牧)回复于 2005-04-03 13:19:43 得分 0

c是静态语言。php是动态语言。  
  如果C能执行php程序。那么C的程序可以动态改变执行状态。  
  Top

15 楼uuq(杜牧)回复于 2005-04-03 14:27:45 得分 50

http://wildphp.free.fr/wiki/doku.php?id=howto:embeding_a_php_source_into_a_windows_executable_file  
  楼主,我发现了一个可以解释了。  
  把php_win32std.dll复制到c:/php/extensions  
  就ok了  
  Top

16 楼uuq(杜牧)回复于 2005-04-03 14:38:13 得分 0

dos窗口下运行  
  embed_php.exe   info   将输出phpinfo()所有信息  
  embed_php.exe   env   将出来环境变量Top

17 楼delphine(七龙)回复于 2005-04-03 14:58:53 得分 0

不是很明白,帮你顶起来吧。让更多人看到它。Top

18 楼alee201(alee)回复于 2005-04-03 21:05:36 得分 0

以前见过一个一个程序,可以编译   php   脚本   成   控制台exe   程序,  
  那么有没有办法,可以编译成   dll   供其它语言调用,     可以找找看。  
  有结果的话   ,即各告诉我一下,我的邮箱是   alee201@sina.com  
  确实,php   的一些系统函数,要自己来实现的话,很麻烦,而且别的语言里面都没有。  
  Top

19 楼ezdevelop(phpsalon.com)回复于 2005-04-04 09:15:20 得分 50

#include   <php_embed.h>  
   
  int   main(int   argc,   char   **argv)  
  {  
      char   *php_code   =   "echo   /"Hello,   phpteam!//n/";";  
   
      PHP_EMBED_START_BLOCK(argc,   argv);  
      zend_eval_string(php_code,   NULL,   "My   PHP   code"   TSRMLS_CC);  
      PHP_EMBED_END_BLOCK();  
   
      return   0;  
  }  
   
  其中变量php_code就是你的PHP代码,"My   PHP   Code"只是一个标识,可任意更改。  
  编译的时候连接php4embed.lib即可。Top

20 楼ezdevelop(phpsalon.com)回复于 2005-04-04 09:17:42 得分 0

其他的关于一些扩展开发的资料可在我的BLOG上找到!Top

21 楼sdbtb(sdbtb)回复于 2005-04-04 17:03:55 得分 0

ezdevelop:   我用的是版本为4.3.10的php源码,在zend_config.h中有这样一行代码:#include   "../main/php_config.h"   ;可是在main目录下并没有这个文件,只有php_config.h.in。所以编译的时候肯定无法通过。   请问这是怎么回事?   谢谢!  
  Top

22 楼ezdevelop(phpsalon.com)回复于 2005-04-04 17:33:41 得分 0

编译PHP源代码的时候会自动系统环境生成的,建议从官方下载PHP源代码,并从头到尾编译一遍,这一步是会开发环境做基础,以后就很方便了。Top

23 楼sdbtb(sdbtb)回复于 2005-04-04 20:37:12 得分 0

uup:   thanks   for   your   information!Top

24 楼sdbtb(sdbtb)回复于 2005-04-05 10:43:45 得分 0

谢谢ezdevelop,   uup提供的信息。   现在已经可以把php   script执行功能嵌入到c/c++的win32应用程序中了。但是执行的结果打印到屏幕上,   实际上我需要将执行的结果保存到我自己的缓冲区中,  
  所以现在的问题是,能否将php的dll的输出重定向到我的缓冲区(一块内存)中。不知  
  各位有好的方法吗,谢谢!  
  Top

25 楼xuzuning(唠叨)回复于 2005-04-05 11:50:37 得分 0

完全可以借助php的输出控制函数来过渡Top

26 楼sdbtb(sdbtb)回复于 2005-04-05 21:15:36 得分 0

xuzuning:   能详细说下吗?   比如我如何将自己的缓冲区传递给php执行模块并使得其将执行结果  
  放入到我的缓冲区中?谢谢。Top

27 楼ezdevelop(phpsalon.com)回复于 2005-04-06 08:59:55 得分 0

两种方法:  
  第一种:可以参考PHP中Output   Buffer模块的代码。  
  第二种:输出重定向到文件,然后在你的DLL里调用,当然效率不及第一种高!Top

28 楼sdbtb(sdbtb)回复于 2005-04-06 10:55:57 得分 0

ezdevelop:谢谢你的多次解答。  
          起初我使用dup,dup2等函数和临时文件,将标准输出重定向到临时文件中。这种方法  
  在Win32   console应用程序下工作的很好。但是我转到GUI(MFC)应用程序下,就无法实现  
  重定向。  
          我也觉得重定向是一个比较笨的方法,php肯定提供有更好的办法。但是我还是不知道  
  该从哪儿入手。您能具体解释一下吗?谢谢。Top

29 楼mayi545()回复于 2005-04-06 18:02:57 得分 0

关注Top

30 楼uuq(杜牧)回复于 2005-04-06 19:17:57 得分 0

PHP_EMBED_START_BLOCK(argc,   argv);  
      zend_eval_string(php_code,   NULL,   "My   PHP   code"   TSRMLS_CC);  
      PHP_EMBED_END_BLOCK();  
  应该从这里直接取得脚本中的变量。  
  zend应该提供了一些api的  
  Top

31 楼xuzuning(唠叨)回复于 2005-04-07 08:29:55 得分 0

首先声明:我没有认真研究过这个问题,短期内也不大可能研究。  
   
  按照正常的思路,你应该先解决这样一个问题:  
  在你的c程序中如何取得php函数的返回值?或是说你如何读取一个php变量的值?  
  后者应该比前者困难一些  
   
  你首先应把重点放在ob_get_contents()函数上。只要你能得到这个函数的返回值,那么一切问题都解决了。  
  即便可能需要对该函数进行改造,但也就是一个函数而已。况且还可以根据他声明一个新函数,而不改变原代码。Top

32 楼sdbtb(sdbtb)回复于 2005-04-07 11:06:16 得分 0

唉,   还是找不到解决办法。Top

33 楼sdbtb(sdbtb)回复于 2005-04-07 17:51:01 得分 0

我在windows   GUI应用程序中调用php   script,经常会异常终止,异常窗口标题是:  
  Zend   Timeout   Window:......应用程序错误。   这是什么原因?   调用php的代码如下:  
      PHP_EMBED_START_BLOCK(argc,   argv);  
      zend_eval_string(php_code,   NULL,   "My   PHP   code"   TSRMLS_CC);  
      PHP_EMBED_END_BLOCK();  
   
  Top

34 楼ezdevelop(phpsalon.com)回复于 2005-04-08 09:30:33 得分 0

php.ini  
  max_execution_time   =   0;Top

35 楼sdbtb(sdbtb)回复于 2005-04-08 10:17:18 得分 0

我用的是php4.3.10的源代码和dll。   源代码目录和dll目录下都有php.ini-dist和  
  php.ini-recommended   两个文本文件,但是没有php.ini文件。   我看了一下这两个文件,确实设置都是:max_execution_time   =   30;   如果是30秒的话,我的应用程序调用它的过程我觉得  
  挺快的,不会超过1秒。   您看是否是这个问题呢?Top

36 楼ezdevelop(phpsalon.com)回复于 2005-04-08 13:24:37 得分 0

写embed程序应该把zend的timeout禁止掉,可在php.ini里也可在程序里写,如果你的电脑上没有php.ini,则PHP是取默 认的值,即30秒,所以请自行将php.ini-dist或php.ini-recommended改为php.ini,并与php4ts.dll放在一 起或放在系统目录下。Top

37 楼ezdevelop(phpsalon.com)回复于 2005-04-08 13:25:20 得分 0

查看一下PHP的main.c文件即可知道。Top

38 楼sdbtb(sdbtb)回复于 2005-04-08 16:14:26 得分 0

我改过了,还是没用。   我的应用程序是图形界面的,点击一个按钮来执行php   script,  
  但是经常出现异常终止的情况,异常终止的标题:Zend   timetout   window.   然后整个  
  应用程序异常退出。      
  问题在哪儿呢?   我快疯了   :)Top

39 楼sdbtb(sdbtb)回复于 2005-04-19 16:39:26 得分 0

hehe.Top

相关问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值