PHP教程之用PHP完成经由过程Web履行C/C++法式
exit来实现结束后面的PHP语句的执行,缩小调试范围,特别是数据库交互的程序,先输出个SQL语句看看,对了,再分析怎么会插入/删除不成功呢?这样对查错很有帮助。c++|web|法式|履行 一,简介假如你对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 <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教本法式。
三,生成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函数。
四,结论
从本的例子可以看出,Unix操作体系十分壮大,而且PHP答应开辟者经由过程剧本以自力的线程来履行体系外部法式。本文的所给的例子十分的复杂,然而只需再多花一点工夫,你可以写一个能更新Mysql数据库的c++法式,运转其他体系号令的法式或是操作体系文件/目次布局的法式。然而,不论如何,你都应当确保你的体系平安,相对不克不及让任何其他的剧本法式随便会见体系外部法式。
假如你想取得更多关于本文提到的相干信息,可以检查上面列出的一些相干链接和图书。
HTML中的任何元素都要亲自实践,只有明白了什么元素会起到什么效果之后,你才会记忆深刻,而一味的啃书,绝对是不行的,我想大部分新手之所以觉得概念难学,大部分是一个字“懒”,懒是阻止进步的最大敌人,所以克服掉懒的习惯,才能更快的学好一样东西。 对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。 装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。 为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。 真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎, 建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。 Ps:以上纯属原创,如有雷同,纯属巧合 微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。 写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。 当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标, 再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。 没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。 对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。 在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。 装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。 当然这种网站的会员费就几十块钱。 建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。 曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线\\\\\\\'_\\\\\\\' ; 本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。 php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
页:
[1]