仓酷云
标题:
PHP网页编程之PHP剧本来写Daemon法式
[打印本页]
作者:
活着的死人
时间:
2015-2-3 23:32
标题:
PHP网页编程之PHP剧本来写Daemon法式
多个成员之间重复做相同的工作,很容易因为交流沟通的时候没有进行一致性的文档要求而出现不明错误,严重影响开发进度,导致在预定时间内无法完成该项目或者完成的项目跟原先计划所要实现的项目功能不符合。 这又是一个风趣的概念,daemon在英语中是"精灵"的意思,就像咱们常常在迪斯尼动画里见到的那些,有些会飞,有些不会,常常围着动画片的主人公转来转去,舻靥嵋恍┲腋妫辈皇钡姑沟刈苍谥由希惺焙蚧够嵯氤鲆恍┬⌒〉幕ㄕ校阎魅斯拥腥耸种芯瘸隼矗蛉绱耍daemon有时也被译作"守护神"。所以,daemon历程在国际也有两种译法,有些人译作"精灵历程",有些人译作"守护历程",这两种称号的呈现频率都很高。
与真实的daemon类似,daemon历程也习气于把本人埋没在人们的视野以外,默默为体系做出奉献,有时人们也把它们称作"后台办事历程"。 daemon历程的寿命很长,普通来讲,从它们一被履行入手下手,直到全部体系封闭,它们才会加入。几近一切的办事器法式,包含咱们熟知的Apache和 wu-FTP,都用daemon历程的模式完成。良多Linux下罕见的号令如inetd和ftpd,末尾的字母d就是指daemon。
为何必定要利用daemon历程呢?Linux中每个体系与用户停止交换的界面称为终端(terminal),每个从此终端入手下手运转的历程城市依靠于这个终端,这个终端就称为这些历程的掌握终端(Controlling terminal),当掌握终端被封闭时,响应的历程城市被主动封闭。关于这点,读者可以用X-Window中的XTerm实验一下, (每个XTerm就是一个翻开的终端,)咱们可以经由过程键入号令启动使用法式,好比:$netscape 然后咱们封闭XTerm窗口,方才启动的netscape窗口也会随之一同俄然蒸发。然而daemon历程却可以冲破这类限制,即便对应的终端封闭,它也能在体系中久长地存鄙人去,假如咱们想让某个历程天保九如,不由于用户或终端或其他的变更而遭到影响,就必需把这个历程酿成一个daemon历程。
1. Daemon历程的编程划定规矩
假如想把本人的历程酿成daemon历程,咱们必需严厉依照以下步调停止:
1、挪用fork发生一个子历程,同时父历程加入。咱们一切后续任务都在子历程中完成。如许做咱们可以:
1.1 假如咱们是从号令行履行的该法式,这可以形成法式履行终了的假象,shell会归去守候下一条号令;
1.2 方才经由过程fork发生的新历程必定不会是一个历程组的组长,这为第2步的履行供应了条件保证。
如许做还会呈现一种很风趣的景象:因为父历程已先于子历程加入,会形成子历程没有父历程,酿成一个孤儿历程(orphan)。每当体系发明一个孤儿历程,就会主动由1号历程收养它,如许,本来的子历程就会酿成1号历程的子历程。
2、挪用setsid体系挪用。
这是全部过程当中最主要的一步。setsid的引见见附录2,它的感化是创立一个新的会话(session),并自任该会话的组长(session leader)。假如挪用历程是一个历程组的组长,挪用就会掉败,但这已在第1步失掉了包管。挪用setsid有3个感化:
2.1 让历程脱节原会话的掌握;
2.2 让历程脱节原历程组的掌握;
2.3 让历程脱节原掌握终真个掌握;
总之,就是让挪用历程完整自力出来,离开一切其他历程的掌握。
3、把以后任务目次切换到根目次。
假如咱们是在一个一时加载的文件体系上履行这个历程的,好比:/mnt/floppy/,该历程确当前任务目次就会是/mnt/floppy/。在全部历程运转时代该文件体系都没法被卸下(umount),而不管咱们是不是在利用这个文件体系,这会给咱们带来良多方便。处理的办法是利用chdir体系挪用把以后任务目次变成根目次,应当不会有人想把根目次卸下吧。
关于chdir的用法,拜见附录1。
固然,在这一步里,假如有特别的需求,咱们也能够把以后任务目次换成其他的途径,好比/tmp。
4、将文件权限掩码设为0。
这需求挪用体系挪用umask,拜见附录3。每一个历程城市从父历程那边承继一个文件权限掩码,当创立新文件时,这个掩码被用于设定文件的默许会见权限,屏障失落某些权限,如普通用户的写权限。当另外一个历程用exec挪用咱们编写的daemon法式时,因为咱们不晓得谁人历程的文件权限掩码是甚么,如许在咱们创立新文件时,就会带来一些费事。所以,咱们应当从头设置文件权限掩码,咱们可以设成任何咱们想要的值,但普通情形下,人人都把它设为0,如许,它就不会屏障用户的任何操作。
假如你的使用法式基本就不触及创立新文件或是文件会见权限的设定,你也完整可以把文件权限掩码一脚踢开,跳过这一步。
5、封闭一切不需求的文件。
同文件权限掩码一样,咱们的新历程会从父历程那边承继一些已翻开了的文件。这些被翻开的文件能够永久不被咱们的daemon历程读或写,但它们一样损耗体系资本,并且能够招致地点的文件体系没法卸下。需求指出的是,文件描写符为0、1和2的三个文件(文件描写符的概念将鄙人一章引见),也就是咱们常说的输出、输入和报错这三个文件也需求被封闭。极可能很多读者会对此感应奇异,岂非咱们不需求输出输入吗?但现实是,在下面的第2步后,咱们的 daemon历程已与所属的掌握终端得到了接洽,咱们从终端输出的字符不成能到达daemon历程,daemon历程用惯例的办法(如printf)输入的字符也不成能在咱们的终端上显示出来。所以这三个文件已得到了存在的价值,也应当被封闭。
利用PHP编写Gearman的Worker守护历程
在我之前的文章中,引见过Gearman的利用。在我的项目中,我利用了PHP来编写一向运转的Worker。假如依照Gearman官方保举的例子,只是复杂的一个轮回来守候义务,会有一些成绩,包含:1、今世码停止过修正以后,若何让代码的修正失效;2、重启Worker的时分,若何包管以后的义务处置完成才重启。
针对这个成绩,我思索了以下的处理办法:
1、每次修正完代码后,Worker需求手工重启(先杀逝世然后启动)。这个只能处理从头加载设置装备摆设文件的成绩。
2、在Worker中设置,单次义务轮回完成后,就对Worker停止重启。这个计划的成绩在于损耗对照大。
3、在Worker中添加一个加入函数,假如需求Worker加入的时分,在Client端发送一个优先级对照高的加入挪用。这个需求客户端共同,在利用后台类义务时,不太合适。
4、在Worker中反省文件是不是产生变更,假如产生了变更,加入偏重启本身。
5、为Worker编写旌旗灯号掌握,承受重启指令,相似于 http restart graceful 指令。
最初,联合4和5两种办法,可以完成如许一个Daemon,假如设置装备摆设文件产生了变更,他就会主动重启;假如承受到了用户的 kill -1 pid 旌旗灯号,也会从头启动。
代码以下:
<?php
declare( ticks = 1 );
// This case will check the config file regularly, if the config file changed, it will restart it self
// If you want to restart the daemon gracefully, give it a HUP signal
// by shiqiang<cocowool@gmail.com> at 2011-12-04
$init_md5 = md5_file( 'config.php');
// register signal handler
pcntl_signal( SIGALRM, "signal_handler", true );
pcntl_signal( SIGHUP, 'signal_handler', TRUE );
$job_flag = FALSE;
//Job status flag, to justify if the job has been finished
$signal_flag = FALSE;
//Signal status flag, to justify whether we received the kill -1 signal
while( 1 ){
$job_flag = FALSE;
//Job status flag
print "Worker start running ... \n";
sleep(5);
print "Worker's task done ... \n";
$flag = TRUE;
//Job status flag
AutoStart( $signal_flag );
}
function signal_handler( $signal ) {
global $job_flag;
global $signal_flag;
switch( $signal ){
case SIGQUIT:
print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGQUIT - No : $signal \n";
exit(0);
break;
case SIGSTOP:
print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGSTOP - No : $signal \n";
break;
case SIGHUP:
print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGHUP - No : $signal \n";
if( $flag === TRUE ){
AutoStart( TRUE );
}else{
$signal_flag = TRUE;
}
break;
case SIGALRM:
print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGALRM - No : $signal \n";
//pcntl_exec( '/bin/ls' );
pcntl_alarm( 5 );
break;
default:
break;
}
}
function AutoStart( $signal = FALSE, $filename = 'config.php' ){
global $init_md5;
if( $signal md5_file( $filename ) != $init_md5 ){
print "The config file has been changed, we are going to restart. \n";
$pid = pcntl_fork();
if( $pid == -1 ){
print "Fork error \n";
}else if( $pid > 0 ){
print "Parent exit \n";
exit(0);
}else{
$init_md5 = md5_file( $filename );
print "Child continue to run \n";
}
}
}
既然选择了PHP,就要坚持学下去!大家有没有问自己为什么会选择学习PHP呢?就我个人而言,完全是因为兴趣,因为我的专业和计算机完全无关,但是就是对编程很赶兴趣,尤其对网络编程、web开发特别赶兴趣。
作者:
第二个灵魂
时间:
2015-2-4 01:42
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
作者:
变相怪杰
时间:
2015-2-5 11:16
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
作者:
活着的死人
时间:
2015-2-5 16:58
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
作者:
愤怒的大鸟
时间:
2015-2-12 23:10
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
作者:
透明
时间:
2015-3-3 11:03
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
作者:
分手快乐
时间:
2015-3-11 04:39
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
作者:
深爱那片海
时间:
2015-3-12 00:44
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
作者:
乐观
时间:
2015-3-15 21:04
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
作者:
若天明
时间:
2015-3-22 04:10
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
作者:
只想知道
时间:
2015-4-7 20:14
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
作者:
爱飞
时间:
2015-4-11 16:06
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
作者:
山那边是海
时间:
2015-4-26 16:37
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
作者:
小妖女
时间:
2015-4-30 05:14
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
作者:
老尸
时间:
2015-5-6 18:00
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
作者:
精灵巫婆
时间:
2015-6-6 07:08
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
作者:
冷月葬花魂
时间:
2015-7-2 23:47
本文当是我的笔记啦,遇到的问题随时填充
作者:
兰色精灵
时间:
2015-7-10 08:36
兴趣是最好的老师,百度是最好的词典。
作者:
小女巫
时间:
2015-7-14 12:22
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
作者:
仓酷云
时间:
2015-7-18 11:46
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2