PHP编程:php守护历程 加linux号令nohup完成义务...
小试一下身手,大概是没问题了,那么交给你个任务,做个留言本吧,这和HELLO WORLD有一比啊!^_^,同是新手面临的第一道关。 Unix中 nohup 号令功效就是不挂断地运转号令,同时 nohup 把法式的一切输入到放到以后目次 nohup.out 文件中,假如文件不成写,则放到 <用户主目次>/nohup.out 文件中。那末有了这个号令今后咱们php就写成shell 剧本利用轮回来让咱们剧本一向运转下去,不论咱们终端窗口是不是封闭都可以让咱们php 剧本一向运转下去。即刻下手写个 PHP 小法式,功效为每30秒纪录工夫,写入到文件
复制代码 代码以下:
# vi for_ever.php
#! /usr/local/php/bin/php
define('ROOT', dirname(__FILE__).'/');
set_time_limit(0);
while (true) {
file_put_contents(ROOT.'for_ever.txt', date('Y-m-d H:i:s')."\n", FILE_APPEND);
echo date('Y-m-d H:i:s'), ' OK!';
sleep(30);
}
?>
保留加入,然后付与 for_ever.php 文件可履行权限:
# chmod +x for_ever.php
让它在再后台履行:
# nohup /home/andy/for_ever.php.php &
记得最初加上 & 符号,如许才干够跑到后台去运转
履行上述号令后呈现以下提醒:
5157
nohup: appending output to 'nohup.out'
一切号令履行输入信息城市放到 nohup.out 文件中
这时候你可以翻开 for_ever.php 同目次下的 for_ever.txt 和 nohup.out 看看后果!
好了,它会永久运转下去了,怎样停止它呢?
# ps
PID TTY TIME CMD
4247 pts/1 00:00:00 bash
5157 pts/1 00:00:00 for_ever.php
5265 pts/1 00:00:00 ps
# kill -9 5157
找到历程号 5157 杀之,你将看到
+ Killed nohup /home/andy/for_ever.php
OK!
====================
在良多项目中,也许有良多相似的后端剧本需求经由过程crontab准时履行。好比每10秒反省一下用户形态。剧本以下:
@file: /php_scripts/scan_userstatus.php
复制代码 代码以下:
#!/usr/bin/env php -q
$status = has_goaway();
if ($status) {
//done
}
?>
经由过程crontab准时履行剧本scan_userstatus.php
#echo “*:*/10 * * * * /php_scripts/scan_userstatus.php”
如许,每隔10秒钟,就会履行该剧本。
咱们发明,在短工夫内,该剧本的内存资本还没有释放完,又启用了新的剧本。也就是说:新剧本启动了,旧剧本占用的资本还没有如愿释放。如斯,穷年累月,华侈了良多内存资本。咱们对这个剧本停止了一下改善,改善后以下:
@file: /php_scripts/scan_userstatus.php
复制代码 代码以下:
#/usr/bin/env php -q
while (1) {
$status = has_goaway();
if ($status) {
//done
}
usleep(10000000);
}
?>
如许,不需求crontab了。可以经由过程以下号令履行剧本,到达不异的功效后果
#chmod +x /php_scripts/scan_userstatus.php
#nohup /php_scripts/scan_userstatus.php &
在这里,咱们经由过程&将剧本放到后台运转,为了避免跟着终端会话窗口封闭历程被杀,咱们利用了nohup号令。那末有无举措,不使nohup号令,也可以运转呢,就像Unin/Linux Daemon一样。接上去,就是咱们要讲的守护历程函数。
甚么是守护历程?一个守护历程凡是补以为是一个不合错误终端停止掌握的后台义务。它有三个很明显的特点:在后台运转,与启动他的历程离开,不必掌握终端。经常使用的完成体例是fork() -> setsid() -> fork() 具体以下:
@file: /php_scripts/scan_userstatus.php
复制代码 代码以下:
#/usr/bin/env php -q
daemonize();
while (1) {
$status = has_goaway();
if ($status) {
//done
}
usleep(10000000);
}
function daemonize() {
$pid = pcntl_fork();
if ($pid === -1 ) {
return FALSE;
} else if ($pid) {
usleep(500);
exit(); //exit parent
}
chdir("/");
umask(0);
$sid = posix_setsid();
if (!$sid) {
return FALSE;
}
$pid = pcntl_fork();
if ($pid === -1) {
return FALSE;
} else if ($pid) {
usleep(500);
exit(0);
}
if (defined('STDIN')) {
fclose(STDIN);
}
if (defined('STDOUT')){
fclose(STDOUT);
}
if (defined('STDERR')) {
fclose(STDERR);
}
}
?>
完成了守护历程函数今后,则可以创立一个常驻历程,所以只需求履行一次:
#/php_scripts/scan_userstatus.php
这里较为关头的二个php函数是pcntl_fork()和posix_setsid()。fork()一个历程,则暗示创立了一个运转历程的正本,正本被以为是子历程,而原始历程被以为是父历程。当fork()运转以后,则可以离开启动他的历程与终端掌握等,也意味着父历程可以自在加入。 pcntl_fork()前往值,-1暗示履行掉败,0暗示在子历程中,而返历程ID号,则暗示在父历程中。在这里,加入父历程。setsid(),它起首使新历程成为一个新会话的“向导者”,最初使该历程不再掌握终端,这也是成为守护历程最关头的一步,这意味着,不会跟着终端封闭而强迫加入历程。关于一个不会被中止的常驻历程来讲,这是很关头的一步。停止最初一次fork(),这一步不是必需的,但凡是都这么做,它最大的意义是避免取得掌握终端。(在直接翻开一个终端装备,并且没有利用O_NOCTTY标记的情形下, 会取得掌握终端).
其它事项申明:
1) chdir() 将守护历程放到老是存在的目次中,别的一个优点是,你的常驻历程不会限制你umount一个文件体系。
2)umask() 设置文件形式,创立掩码到最大的答应限制。假如一个守护历程需求创立具有可读,可写权限的文件,一个被承继的具有更严厉权限的掩码会有反感化。
3)fclose(STDIN), fclose(STDOUT), fclose(STDERR) 封闭尺度I/O流。注重,假如有输入(echo),则守护历程会掉败。所以凡是将STDIN, STDOUT, STDERR重定向某个指定文件.没有人会喜欢和见异思迁的人交朋友,因为这种人太不安分,太不可靠,因此,你必须要强迫自己完成自己的目标,哪怕可能会很难受,也得坚持,毅力就是这么锻炼出来的。 学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql 为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。 基础有没有对学习php没有太大区别,关键是兴趣。 因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax 对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。 在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。 先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。 其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。 小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。 多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。 我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能: 如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了, 最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。 没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。 找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。 你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。 装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。 我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能: 再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
页:
[1]