我想写一个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
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