php定时器,js定时器以及linux脚本定时器技术总结

来源:互联网 发布:2g神优化单机游戏 编辑:程序博客网 时间:2024/05/18 02:19

php定时器实现方案

以前对se特别感兴趣,但是自己又不会Java,lucene等搜索引擎开发工具,于是不断挖掘PHP的功效。

最后发现php也可以做抓取,并且原理很易:直接获取页面源文件,然后通过正则或字符串的参照截取来获取需要的信息。但是性能上不能和搜索引擎的多线程抓取相比。

实现了上一步之后,又思考着,如果抓取可以自动定时获取,那么人工运行可执行页面也就省下来了。

后来也在一些php开源程序中了解到关于"计划任务"的效果:可以定时运行某程序,比如数据库备份,更新缓存,生成静态页面,生成网站地图等。

最近由于项目需要定时更新远程数据库到本地,网上搜了搜,还真找到了。

ignore_user_abort();函数搭配set_time_limit(0);和sleep($interval);即可实现以上自动更新。

先给出一个基本的范式,其中有个人的测试程序:

<?php

ignore_user_abort(); // run script. in background

set_time_limit(0); // run script. forever

$interval=30; // do every 15 minutes...

do{

$fp = fopen('text3.txt','a');

fwrite($fp,'test');

fclose($fp);

sleep($interval); // wait 15 minutes

}while(true);

?>

首先运行该程序,然后关闭该页面,程序仍然运行中,test会每隔30秒的填补到text3.txt文件。

实现效果如图:(略)

最后根据php手册简单介绍一些相关的知识:

1.连接处理:

在 PHP 内部,系统维护着连接状态,其状态有三种可能的情况:

0 - NORMAL(正常)

1 - ABORTED(异常退出)

2 - TIMEOUT(超时)

当 PHP 脚本正常地运行 NORMAL 状态时,连接为有效。当远程客户端中断连接时,ABORTED 状态的标记将会被打开。远程客户端连接的中断通常是由用户点击 STOP 按钮导致的。当连接时间超过 PHP 的时限时,TIMEOUT 状态的标记将被打开。

可以决定脚本是否需要在客户端中断连接时退出。有时候让脚本完整地运行会带来很多方便,即使没有远程浏览器接受脚本的输出。默认的情况是当远程客户端连接中断时脚本将会退出。该处理过程可由 php.ini 的 ignore_user_abort 或由 Apache .conf 设置中对应的"php_value ignore_user_abort"以及 ignore_user_abort() 函数来控制。如果没有告诉 PHP 忽略用户的中断,脚本将会被中断,除非通过 register_shutdown_function() 设置了关闭触发函数。通过该关闭触发函数,当远程用户点击 STOP 按钮后,脚本再次尝试输出数据时,PHP 将会检测到连接已被中断,并调用关闭触发函数。

脚本也有可能被内置的脚本计时器中断。默认的超时限制为 30 秒。这个值可以通过设置 php.ini 的 max_execution_time 或 Apache .conf 设置中对应的"php_value max_execution_time"参数或者 set_time_limit() 函数来更改。当计数器超时的时候,脚本将会类似于以上连接中断的情况退出,先前被注册过的关闭触发函数也将在这时被执行。在该关闭触发函数中,可以通过调用 connection_status() 函数来检查超时是否导致关闭触发函数被调用。如果超时导致了关闭触发函数的调用,该函数将返回 2。

需要注意的一点是 ABORTED 和 TIMEOUT 状态可以同时有效。这在告诉 PHP 忽略用户的退出操作时是可能的。PHP 将仍然注意用户已经中断了连接但脚本仍然在运行的情况。如果到了运行的时间限制,脚本将被退出,设置过的关闭触发函数也将被执行。在这时会发现函数 connection_status() 返回 3。

2.相关函数:

PHP ignore_user_abort() 函数

PHP 杂项函数

定义和用法

ignore_user_abort() 函数设置与客户机断开是否会终止脚本的执行。

本函数返回 user-abort 设置的之前的值(一个布尔值)。

语法

ignore_user_abort(setting)
参数描述setting

可选。如果设置为 true,则忽略与用户的断开,如果设置为 false,会导致脚本停止运行。

如果未设置该参数,会返回当前的设置。

提示和注释

注释:PHP 不会检测到用户是否已断开连接,直到尝试向客户机发送信息为止。简单地使用 echo 语句无法确保信息发送,参阅 flush() 函数。


set_time_limit(0);

括号里边的数字是执行时间,如果为零说明永久执行直到程序结束,如果为大于零的数字,则不管程序是否执行完成,到了设定的秒数,程序结束

int connection_aborted ( void )

Returns TRUE if client disconnected.

int connection_status ( void )

Returns the connection status bitfield.


js定时器实现方案

   如何使用setInterval来制作网页停留时间。效果如下图

setInterval制作网页停留时间 三联

  我用了一个div加一个span标签来显示

  首先你要加入一个样式

  样式来控制div框的样子

  然后就是javascript代码

  如上图所示,代码为什么不给大家复制上,是为了让大家来自己打,这样有利于记忆。

  这里var a = setInterval(h,1000);

  参数说明:

  h是要运行的函数

  1000是运行的时间,就每隔多少毫秒运行一次那个函数。


linux定时器实现方案

crontab定时器(包括执行shell)

如果要让unix系统重复,定期做一件事,我们就会用到crontab.

实质上真正去执行每一个重复任务的是cron,cron是的unix家族的一个后台常驻程序,cron是由cron文件来驱动的,crontab只是用来管理cron文件的,比如给cron file里面添加任务,删除任务,文件里记录了要执行的任务,以及其"时间规则"

crontab的作用,正如crontab的man文档中写的: maintain crontab files for individual users 

crontab提供给我们的接口

我们是不需要去直接编辑cron file,修改查看cron file都应该使用crontab


限制用户使用crontab的文件有:/etc/cron.allow /etc/cron.deny 。 
当使用crontab建立工作排程后,将被记录到/var/spool/cron里。
#注意是写入到用户的那个文件中,例如,用户 Jeff 的定时任务会写入到/var/spool/cron/jeff。 
cron执行的每一项工作都被记录到/varlog/cron里去。
crontab参数:crontab [-u username] [-l|-e|-r]   
-u:只有root才可能,帮其他用户建立或移除工作排程。 
-l:查阅crontab的工作内容 
-r:移除所有的crontab的工作内容,移除一项,用
-e : 编辑。万不能使用 vi 直接编辑这个文件,因为直接编辑不能检查语法错误

例1:每天12:00给root发信。
[root@lyy etc]# crontab -e     #用vi编辑 
0 12 * * * mail root -s "at 12:00" < /root/.bashrc
每项工作有六个字段分别是:
分钟    小时    日期    月份    周    指令 
0-59    0-23    1-31    1-12    0-7    指令         #0和7都代表星期天
辅助特殊字符:
* (星号)代表任何时刻 
,(逗号)代表分隔时候。如3点与6点 就是3,6 
-(减号)代表一段时间范围内。如:3点到6点 就是3-6 
/n(斜线)n代表数字,即每隔n单位。如每隔五分钟,/5
示例:
* * * * * cmd
* * * * * sleep 20; cmd
* * * * * sleep 40; cmd
#上面就是每 20 秒运行一次 cmd 的 Crontab 的做法。

例2:每隔3分钟,在屏幕输出字符
# crontab -e 
# crontab -l 
*/3 * * * * echo "hello world !!!!!" > /dev/pts/0    #pts/0是用telnet的终端接口

查看一下记录  
# cat /var/log/cron
Dec 12 20:27:01 lyy crond[9865]: (root) CMD (echo "hello world !!!!!" &gt; /dev/pts/0) 
Dec 12 20:30:01 lyy crond[9908]: (root) CMD (echo "hello world !!!!!" &gt; /dev/pts/0)

例3:每个星期三下午14:30分发送一个邮件给pc
 crontab -e 
30 14 * * 3 mail pc -s "test" &lt; /home/text.txt
crontab -e 是针对用户的cron设计的,如果是系统例行性任务,只要编辑/etc/crontab文件就可以了。
 
查看/etc/crontab内容
# cat /etc/crontab 
SHELL=/bin/bash        #接口 
PATH=/sbin:/bin:/usr/sbin:/usr/bin    #执行路径搜寻 
MAILTO=root            #以mail发送者 
HOME=/            #家目录

# run-parts 
01 * * * * root run-parts /etc/cron.hourly        #每小时 
02 4 * * * root run-parts /etc/cron.daily        #每天 
22 4 * * 0 root run-parts /etc/cron.weekly        #每周日 
42 4 1 * * root run-parts /etc/cron.monthly    #每个月1号
取消不要的输出项目:把输出的结果以命令重导向到/dev/null
安全检验:由于一些木马以例行命令方式值入,所以可以通过 
检查/var/log/cron来发现。
周与日月不可同时并存
如:  www.2cto.com  
30 12 11 9 5 root echo "just test " #这是错误的写法。
本来以为九月十一号是星期五执行这个任务,但是系统可能会判定每个星期 
五执行一次或每年九月十一号分别执行。

唤醒停机期间的工作任务 anacron
anacron不能取代crontab,它存在目的是处理非24小时在线的linux系统的 crontab的执行。它是以天为单位或在开机后执行,它会检查停机期间的crontab并执行,然后就自动停止了。
 
linux命令:
建立任务crontab -e 
*/1 * * * * echo 'ddd'/var/test.txt 一分钟写一次ddd到test.txt文件中
* * * */1 * sh /var/jboss-4.0.5.GA/server/default/log/temp/delete_log1.sh 一个月运行一次delete_log1.sh脚本
 
sh脚本(delete_log1.sh)
dd=`date -d"1 month ago" +%y-%m`
rm -vf /var/temp/log.20$dd-*     删除当前时间的起一个月的匹配文件


本文为整理汇总,相关技术参考以下文章:
shell定时器-crontab : http://blog.csdn.net/magoyang/article/details/52186395
详谈 php定时器 : http://blog.csdn.net/qq1355541448/article/details/13505479

0 0
原创粉丝点击