PHP中通过Web 执行C/C++应用程序   一、简介  
  如果你对Unix/Linux有所了解的话,你应该知道他们大都自带了C和C++的编译器,分别是GCC和G++。Unix在程序安装及Make等许 多地方使用到了这些编译器。利用一些控制台命令,C++和PHP, 我将向你介绍怎样生成一个完整的C++程序例子,他可以在用PHP程序来执行,并能获得相应的输出结果。我将先生成C++程序代码,并编译它,谈后讨论我 们将如果通过使用PHP的函数passthru来执行这个程序。从某种意义上来说,这边文章给我们提供一种通过Web页面来访问一般程序的方法。   
  为了能更好的理解这篇文章,你应该有一台运行着apache和最新版本php的unix/Linux服务器。同时也应该掌握C++, unix控制台命令,当然一些PHP的编程经验也是必需的。   
  二、编写一个C++程序  例如,我们可以写一个能够通过命令行还接收参数的C++ 简单程序,并命名为Sampleapp.然后我们能够按照下面的方式给他传递三个不同的参数 :Sampleapp ?参数一 ?参数二 ?参数三
   这个程序的功能是能输出传递给他的参数的个数和每个参数的值,然后我们可以用PHP脚本程序来执行编译好的C++程序。利用你习惯的文本编辑器,新建一个名为Sampleapp.cpp 的文件,再此文件中输入如下的代码: #include         int main(int argc, char* argv[]) {
cout << endl << "You passed " << argc-1 << " arguement" << (argc-1 == 1 ? "" : "s") << "." << endl;
cout << (argc-1 == 1 ? "This" : "These") << " arguement" << (argc-1 == 1 ? "" : "s") << " "
  << (argc-1 == 1 ? "is" : "are") << ": " << endl << endl;
for(int i = 1; i < argc; i++) cout << "[" << i << "] " << argv << endl; return 0; }
  这个C++程序包含的程序的入口点:main(),main()函数带了两个参数:argc(命令行传入参数的个数)和argv(一个包含了所传参数实际值的字符型指针数组)。这个两个参数能被C++编译器自动捕获。   
cout << endl << "You passed " << argc-1 << " arguement"  << (argc-1 == 1 ? "" : "s") << "." << endl;;   
  这句话的意思是获得从执行命令行传入的参数的个数。Argv这个字符型指针数组是从0开始检索的,它至少包含一个实际的值(即本程序的路径和名称), 这个值由C++编译器自动地附加上去。条件操作符”?”是用来判断命令行传入地参数是否多于一个。例如,如果命令行过传入两个参数,我们地程序将输出如下 信息: You passed 2 arguments.
cout << (argc-1 == 1 ? "This" : "These") << " arguement" << (argc-1 == 1 ? "" : "s") << " " << (argc-1 == 1 ? "is" : "are") << ": " << endl << endl;
  接下来,我们同样用条件操作符来输出另一句话。不过要记住,即使我们不从程序执行命令行传入任何参数,main函数地argv[]参数也包含一个值。同样地,如果我们从命令行传入两个参数给程序,程序将输出如下地信息: These arguments are:
for(int i = 1; i < argc; i++) cout << "[" << i << "] " << argv << endl; 
  最后,main函数逐一的输出命令行传入的每个参数,它用到了一个简单的for(;;)循环语句,这个函数能根据参数的个数将参数值一个一个的输出。假如我们传给程序两个参数”first”和second”, for循环输出的结果如下: [1] ?first  [2] ?second  
  以上是关于这个C++程序的简单说明,它的功能十分简单,就是将命令行传入的参数用cout函数显示在输出屏幕上。 接下来,我们将编译这个.cpp文件,如果你在Windows平台下,需要telnet到所使用的server上。在这里,我们使用大多Unix机器 上都提供的G++编译器来编译这个源文件。不过为了确信你的机器安装了G++,你可以输入如下命令:which g++。如果G++已经安装了,Unix shell将显示出G++所在的全路径。如果没有安装,它将提示你说”command couldn’t be found”. 你可以在这里下载到G++.
  在源文件所在的目录输入如下G++命令:  g++ -c sampleapp.cpp.
  通过这个命令,我们就将. cpp文件编译成了包含机器代码的目标文件。通过 ls ?a命令,你可以发现在本目录下出现了一个新文件sampleapp.o,这就是.cpp源文件被编译成机器码的结果。不过我们最终想要的是一个可执行文 件,因为我们还要输入如下的G++命令:  g++ sampleapp.cpp ?o sampleapp
   这样我们就获得了一个名为sampleapp的可执行文件。不过注意的是,Unix下的可执行文件跟Windows不一样,它没有任何后缀。
下面我们可以来检验一下程序执行的结果,如果如下命令: sampleapp one -two /three
我们可以看到如下的执行结果: You passed 3 arguments. These arguments are: [1] one [2] ?two [3] /three
 现在,可执行的C++程序成生完毕,下面我们将生成一个能够通过 web浏览器来访问这个程序的PHP教本程序。
三、生成PHP脚本程序   为了能通过Internet来调用我们的C++程序,我们需要生成一个PHP脚本程序。这个PHP脚本程序将有一个Form表单,以便用户能输入可以 传给程序Sampleapp的参数。PHP脚本的代码太长就不在这里全部列出了,需要的话可以通过下面的地址来下载它。(Php code)
if(@$submit) { } else {  } 
  首先,脚本程序检查看变量$submit是否有值,这个变量$submit的值是程序后面的Form表单提交后传递过来的,它缺省为空值。符号@的作用是当变量$submit的值不存在的时忽略相关的错误信息。  
  由于变量$submit缺省为空,所以一开始执行else{}中的代码,它在浏览器上简单的显示一个Form表单。Form的action属性设为变 量 $PHP_SELF,即表单提交后返回本页。同时Form表单包含了一个文本输入条,这是用来让用户输入要传递给C++程序的命令行参数。Form如下图 所示: 
  一旦我们输入执行命令并提交表单,变量$submit(即按钮Go的名字)就获得一个值,这样PHP教本将执行if{}之间的代码。 if($args == "") echo " You didn't enter any arguments."; else { echo " SampleApp Result";
  $command = "/htdocs/sampleapp " . escapeshellcmd($args); passthru($command); }   
  变量$args是自动产生的,它的值是Form表单中文本输入条传过来的值。如果没有输入任何信息,程序将简单的告诉用户没有输入任何值。   
  如果用户输入任何非空的信息,程序将把text域的值,即变量$args传给C++程序。下面这段代码就是执行C++的程序的执行命令: $command = "/htdocs/sampleapp " . escapeshellcmd($args);
  函数eacapeshellcmd是用来当做安全检查工具,以过滤调一些如”,”,””和”\”等的特殊字符。这可以防止一些用户企图输入某些字符来调用系统内部命令。 例如,如果你在Form表单的text域中输入”1 ?two /three”,那么变量$command的值就为: /htdocs/sampleapp 1 ?two /three
  你能发现我们定义了程序sampleapp的全路径,在这个例子中,程序文件位于/htdocs目录下。你可以根据的自己程序所在的目录做相应的修改。 passthru($command);
  最后,我们使用PHP的函数passthru来执行变量$command所包含的命令并且将原始的执行结果输出到浏览器上。在我的服务器上,返回结果的HTML页面如下:
  w在本文即将结束之前,几个可能碰到的问题我想说一下。首先,当你执行sampleapp.php教本程序的时候,如果你没有看到程序的任何输出信息,或许是开了安全模式。如果这样,系统将不会允许PHP脚本来执行系统内部程序。关于如何关闭安全模式,请访问网页[url]http://www.php.net/manual/en/features.safe-mode.php[/url],上面有详细的介绍。其次,在一些Unix系统上,PHP函数passthru不能将内部程序的输出传递给浏览页面,如果发生这种情况,可以用system函数来代替passthru函数。 
  四、结论  从本的例子可以看出,Unix操作系统非常强大,并且PHP允许开发者通过脚本以独立的线程来执行系统内部程序。本文的所给的例子非常的简单,但是只要再多花一点功夫,你可以写一个能更新MySQL数据库的c++程序,运行其他系统命令的程序或者是操作系统文件/目录结构的程序。但是,不管怎样,你都应该确保你的系统安全,绝对不能让任何其他的脚本程序随意访问系统内部程序。

转载于:https://blog.51cto.com/282460/55086

PHP中通过Web 执行C/C++应用程序相关推荐

  1. php运行c,PHP中通过Web 执行C/C++应用程序

    您可能感兴趣的话题: PHP 核心提示:如果你对Unix/Linux有所了解的话,你应该知道他们大都自带了C和C++的编译器,分别是GCC和G++. 一.简介 如果你对Unix/Linux有所了解的话 ...

  2. Global.asax中Application_Error无法执行

    Global.asax中Application_Error无法执行 问题解决后才发现这句是错误的,之前用VS2005开发后发布到服务器上也出现这种情况,后来莫名 的好了(是解决了没发现原因). 之前的 ...

  3. 第三十六讲 ASP.NET中的Web服务(三)

    *摘要 .ASP.NET安全性 .基本验证和简要验证 .集成Windows验证 .表单验证 .SSL .客户授权证书验证 .模拟 * 身份验证 .身份验证是指以下过程:获取标识凭据(如用户名和密码), ...

  4. ctf xor题_从一道CTF题目谈PHP中的命令执行

    原创 Xenny 合天智汇 快睡的时候,打开B站发现有位用户留言,大意就是让我帮忙看一道题,正好当时有空,于是就打开了他发的链接,代码如下 很明显是一道PHP代码审计的题目,而且只需要绕过第三行的if ...

  5. 使用Azure SDK 1.4.1中的Web Deploy

    公告    :本博客为微软云计算中文博客  的镜像博客.   部分文章因为博客兼容性问题  ,会影响阅读体验  .如遇此情况,请访问  原博客. 刚刚更新的Azure SDK v1.4.1通过使用We ...

  6. web项目中的web.xml元素解析

    2019独角兽企业重金招聘Python工程师标准>>> 1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字 ...

  7. PHP guzzle异步请求数据,怎么在PHP中使用Guzzle执行POST和GET请求

    怎么在PHP中使用Guzzle执行POST和GET请求 发布时间:2021-02-17 08:01:14 来源:亿速云 阅读:67 作者:Leah 怎么在PHP中使用Guzzle执行POST和GET请 ...

  8. 在ASP.NET AJAX 1.0框架中访问Web服务

    一. 简介     如今,微软最新推出的AJAX框架为ASP.NET AJAX 1.0(下载地址为[url]http://ajax.asp.net/downloads/default.aspx[/ur ...

  9. 使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目

    今天,Visual Studio中没有内置工具来测试WEB API.使用浏览器,只能测试http GET请求.您需要使用Postman,SoapUI,Fiddler或Swagger等第三方工具来执行W ...

最新文章

  1. (翻译) MongoDB(13) 在 Ubuntu 上安装MongoDB社区版
  2. 怎样做反向域名解析?
  3. solr 使用自定义的 QueryParser
  4. 5.分布式数据库HBase第1部分
  5. shell 变量定义使用
  6. 历史上第一位从事游戏开发与设计的女程序员
  7. memcache 源码分析之开场白
  8. Android图片完整性检验,Android安全测试之应用完整性校验检测
  9. 【收藏】一千行 MySQL 学习笔记
  10. Spark 堆外内存
  11. UE4基础知识总结(一)
  12. DeFi 可以从金融危机中学到三件事
  13. 红杉资本合伙人Maguire:Crypto将是未来30年最大趋势 |链捕手
  14. 50天入门人工智能!
  15. Cisco Packet Tracer(对cisco模拟器的初识+路由基本配置)
  16. PMI-ACP练习题(7)
  17. IP地址,子网,掩码的计算
  18. APP自动化测试-6.断言处理assert与hamcrest
  19. 一个bug管理软件:BugFree
  20. CPU卡程序设计实例(二十五)ESAM过程密钥内部认证

热门文章

  1. Android中Adapter适配器的介绍以及用法的总结
  2. pta c语言 凯撒密码
  3. c++ mysql ctime_CTime::Format
  4. 2019 6.30学习笔记
  5. Linux安装中文字体_宋体
  6. 《Java大学教程》—第17章 Java聚焦类框架
  7. 推荐一款自己的软件作品[豆约翰博客备份专家],新浪博客,QQ空间,CSDN,cnblogs博客备份,导出CHM,PDF(转载)...
  8. Invalid nested tag br found, expected closing tag li 错误解决
  9. JS手动实现一个new操作符
  10. mysql 存储微信昵称乱码_MYSQL 保存微信昵称特殊字符报错解决方法-设置编码集为utf8mb4的方法...