PHP编程:PHP中经由过程Web履行C/C++使用法式
说说这一个月左右的学习情况和心得吧!我个人认为,既然决定了去做一件事,那就要以认真的态度去对待!既然决定来学习了,那不管当初是抱着怎样的心态来到这个培训班的,都要让自己认真的投入到学习中。c++|web|法式|履行 1、简介假如你对Unix/Linux有所懂得的话,你应当晓得他们大都自带了C和C++的编译器,分离是GCC和G++。Unix在法式装置及Make等很多中央利用到了这些编译器。使用一些掌握台号令,C++和PHP, 我将向你引见如何生成一个完全的C++法式例子,他可以在用PHP法式来履行,并能取得响应的输入了局。我将师长教师成C++法式代码,并编译它,谈后会商咱们将假如经由过程利用PHP的函数passthru来履行这个法式。从某种意义下去说,这边文章给咱们供应一种经由过程Web页面来会见普通法式的办法。
为了能更好的了解这篇文章,你应当有一台运转着apache和最新版本php的unix/Linux办事器。同时也应当把握C++, unix掌握台号令,固然一些PHP的编程经历也是必须的。
2、编写一个C++法式
例如,咱们可以写一个可以经由过程号令行还吸收参数的C++ 复杂法式,并定名为Sampleapp.然后咱们可以依照上面的体例给他传递三个分歧的参数 :
Sampleapp ?参数一 ?参数二 ?参数三
这个法式的功效是能输入传递给他的参数的个数和每一个参数的值,然后咱们可以用PHP剧本法式来履行编译好的C++法式。
使用你习气的文本编纂器,新建一个名为Sampleapp.cpp 的文件,再此文件中输出以下的代码:
#include <iostream.h>
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轮回输入的了局以下:
?first
?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:
one
?two
/three
如今,可履行的C++法式成生终了,上面咱们将生成一个可以经由过程 web阅读器来会见这个法式的PHP教本法式。
3、生成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 "<h1>You didn't enter any arguments.</h1>";
else
{
echo "<h1>SampleApp Result</h1>";
$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剧本来履行体系外部法式。关于若何封闭平安形式,请会见网页http://www.php.net/manual/en/features.safe-mode.php,下面有具体的引见。其次,在一些Unix体系上,PHP函数passthru不克不及将外部法式的输入传递给阅读页面,假如产生这类情形,可以用system函数来取代passthru函数。
4、结论
从本的例子可以看出,Unix操作体系十分壮大,而且PHP答应开辟者经由过程剧本以自力的线程来履行体系外部法式。本文的所给的例子十分的复杂,然而只需再多花一点工夫,你可以写一个能更新Mysql数据库的c++法式,运转其他体系号令的法式或是操作体系文件/目次布局的法式。然而,不论如何,你都应当确保你的体系平安,相对不克不及让任何其他的剧本法式随便会见体系外部法式。你发奋努力,熟悉了安全方面的问题,然后又设计了一些程序,感觉还不错。 装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。 为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。 本文当是我的笔记啦,遇到的问题随时填充 至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。 环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。 当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标, 真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎, 如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了, 多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。 这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。 小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。 没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。 首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。 首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。 为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。 本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。 首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。 本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。 多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
页:
[1]
2