当前位置:主页   - 电脑 - 程序设计 - C/C++
C++调用PHP
来源:网络   作者:王骏   更新时间:2011-04-08
收藏此页】    【字号    】    【打印】    【关闭

  PHP是比较流行的脚本语言,WEB开发使用广泛,如何在C++程序中不依赖任何WEB SERVER调用PHP,并取得执行结果完成交互,这是本文代码所要实现的功能。

  PHP安装好后,在目录下有一个php-cgi.exe,我们只要执行这个CGI程序,并将数据通过命名管道传递给它,然后把执行结果通过命名管道读取出来即可,过程并不复杂!请看如下代码:

  命名管道的创建:

SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES)}; 
sa.bInheritHandle = 1; 
sa.lpSecurityDescriptor = NULL; 
 
HANDLE hStdoutR, hStdoutW, hStdinR, hStdinW; 
CreatePipe(&hStdoutR, &hStdoutW, &sa, 0); 
SetHandleInformation(hStdoutR,HANDLE_FLAG_INHERIT, 0); 
CreatePipe(&hStdinR, &hStdinW, &sa, 0); 
SetHandleInformation(hStdinW, HANDLE_FLAG_INHERIT, 0); 

  启动php-cgi进程:

STARTUPINFO si = {sizeof(STARTUPINFO)}; 
PROCESS_INFORMATION pi; 
si.dwFlags = STARTF_USESTDHANDLES; 
si.hStdOutput = hStdoutW; 
si.hStdInput = hStdinR; 
 
char env[255] = "REQUEST_METHOD=POST\0CONTENT_LENGTH=18\0CONTENT_TYPE= 
 application/x-www-form-urlencoded\0SCRIPT_FILENAME=D:\\test.php"; 
if(!CreateProcess(NULL, "d:\\php5\\php-cgi.exe D:\\test.php", 
 NULL, NULL, 1, NORMAL_PRIORITY_CLASS, env, NULL, &si, π)) 
 return 0; 
 
CloseHandle(hStdoutW); 
CloseHandle(hStdinR);

  传递数据:

if(!WriteFile(hStdinW, "var=Hello VCKBASE!", 18, &dwWritten, NULL)) 
 return 0; 
 
CloseHandle(hStdinW);

  读取返回数据:

char buf[1000] = {0}; 
DWORD dwRead = 0; 
while(ReadFile(hStdoutR, buf, sizeof(buf), &dwRead, NULL) && dwRead != 0){ 
 printf(buf); 
} 
 
CloseHandle(hStdoutR);

  D盘的test.php

<? 
echo $_REQUEST["var"]; 
?> 

  执行结果:

X-Powered-By: PHP/5.3.1 
Content-type: text/html 
 
Hello VCKBASE!

  实际上,C++调用其他CGI程序,例如PERL,方法也大同小异,如果你打算做一个自己的WEB服务器,调用CGI程序是少不了的。

  BTW: PHP如何与其他应用程序(例如C++开发的程序)交互也是一个不错的话题,在腾讯通即时通讯软件的服务器端中,就采用PHP通过COM组件实现与应用程序的交互,有兴趣的朋友可以研究一下!

  本文示例源代码或素材下载

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明