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[i] << 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[i] << 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

  {

  }