PHP 计时器每隔几秒运行一次。 让我们写一个简单的例子来解释这种技术。
需要说明的是:程序没有写结束判断语句,会无限循环。 当然,如果想停止,可以重新启动apache,重新启动后就失效了。 如果您想再次执行常规执行,请再次运行此代码。
上面这个简单的例子就可以说明这个原理。
所以对于里面的例子,我可以做一些改进。
执行脚本需要一个开关,可以通过导入外部文件来实现。 在 while 循环中,只需包含 switch 变量即可。 那么可以这样实现:
创建外部导入变量文件 switch.php ,内容如下:
改进后的脚本如下:
当然,我们也可以利用系统的定时来执行php脚本。 我们来看一个linux的反例。
在 Crontab 中使用 PHP 执行脚本
就像在Crontab中调用普通的shell脚本一样(具体Crontab用法),使用PHP程序调用PHP脚本。
每小时执行一次 myscript.php,如下所示:
# crontab -e
00 * * * * /usr/local/bin/php /home/john/myscript.php
/usr/local/bin/php 是PHP程序的路径。
1.crond简介
crond是linux下的一个守护进程,它周期性地执行某些任务或等待处理个别的风暴。 类似于windows下的计划任务。 操作系统安装时,会默认安装这个服务工具,并手动启动crond进程,crond进程每分钟会定期检测是否有任务需要执行,如果有任务需要执行,该任务将手动执行。
Linux下的任务调度分为两类,系统任务调度和用户任务调度。
系统任务调度:系统需要定期执行的工作,例如将缓存数据写入硬盘、清除日志等。/etc目录下有一个crontab文件,它是系统任务调度的配置文件。
/etc/crontab 文件包含以下行:
[root@localhost~]#cat /etc/crontab
外壳=/bin/bash
路径=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""主页=/
#run-parts
51****rootrun-parts/etc/cron.hourly
第247章 ***rootrun-parts/etc/cron.daily
224**0 rootrun-parts/etc/cron.weekly
第4241章
[root@localhost~]#
前四行用于配置运行 crond 任务的环境变量。 第一行SHELL变量指定系统要使用的shell,这里是bash,第二行PATH变量指定系统执行命令的路径,第三行MAILTO变量指定crond任务执行信息将通过电子邮件发送给root用户。 如果MAILTO变量的值为空,则表示不会向用户发送任务执行信息。 第四行中的 HOME 变量指定执行 Main 目录时使用的命令或脚本。 第六至第九行的含义将在下一小节中详细描述。 这里不多说。
用户任务调度:用户需要定期执行的任务,例如用户数据备份、定期短信提醒等。用户可以使用crontab工具自定义自己的定时任务。 所有用户定义的 crontab 文件都存储在 /var/spool/cron 目录中。 其文件名与用户名相同。
用户权限文件:
文档:
/etc/cron.deny
阐明:
该文件中列出的用户不允许使用 crontab 命令
文档:
/etc/cron.allow
阐明:
该文件中列出的用户可以使用 crontab 命令
文档:
/var/spool/cron/
阐明:
所有用户crontab文件存放的目录php 计划任务,以用户名命名
crontab文件的含义:
在用户创建的crontab文件中,每一行代表一个任务,每一行中的每个数组代表一个设置。 其格式分为六个数组。 前五段是时间设置段,第六段是要执行的命令段,格式如下:
分钟小时日月周命令
在:
分钟:分钟,可以是 0 到 59 之间的任意整数。
hour:小时,可以是0到23之间的任意整数。
day:日期,可以是1到31之间的任意整数。
Month:月份,可以是1到12之间的任意整数。
week:表示一周中的第几天,可以是0到7之间的任意整数,其中0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编译的脚本文件。
在上述每个数组中,还可以使用以下特殊字符:
星号 (*):代表所有可能的值。 例如,如果月份数组是星号,则表示在满足其他数组的阻塞条件后,每月都会执行该命令操作。
逗号 (,):可以指定以冒号分隔的值的列表范围,例如“1,2,5,7,8,9”
中线(-):可以使用整数之间的中线来表示整数范围,例如“2-6”表示“2,3,4,5,6”
正斜杠(/):可以使用正斜杠指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。 同时,正斜杠可以与星号一起使用,如*/10,如果用在分钟数组中,则表示每十分钟执行一次。
二、crond服务
安装定时任务:
yuminstall crontabs
服务操作说明:
/sbin/servicecrondstart//启动服务
/sbin/servicecrondstop//关闭服务
/sbin/servicecrondrestart //重启服务
/sbin/servicecrondreload//重新加载配置
查看crontab服务状态:
服务crond状态
手动启动crontab服务:
服务crondstart
要检查 crontab 服务是否已设置为开机启动,请执行命令:
系统
添加开机时手动启动:
chkconfig –level35 crondon
3.crontab命令解释
1、命令格式:
crontab[-uuser]文件
crontab[-uuser][-e|-l|-r]
2、命令功能:
通过crontab命令,我们可以以固定的时间间隔执行指定的系统命令或者shellscript脚本。 时间间隔的单位可以是分钟、小时、天、月、周及其任意组合。 该命令特别适合定期日志分析或数据备份。
3、命令参数:
-uuser:用于设置某个用户的crontab服务,例如“-uixdba”表示设置ixdba用户的crontab服务,该参数通常由root用户运行。
file:file是命令文件名,表示将file作为crontab的任务列表文件,加载到crontab中。 如果未在命令行上指定此文件,则 crontab 命令将接受在标准输入(键盘)上键入的命令并将其加载到 crontab 中。
-e:编辑用户的 crontab 文件的内容。 如果不指定用户,则表示编辑当前用户的crontab文件。
-l:显示用户的crontab文件的内容。 如果不指定用户,则表示显示当前用户的crontab文件的内容。
-r:从/var/spool/cron目录中删除用户的crontab文件。 如果不指定用户,则默认删除当前用户的crontab文件。
-i:删除用户的crontab文件时给出确认提示。
4、常用方法:
1)。 创建一个新的 crontab 文件
在考虑向 cron 进程提交 crontab 文件之前,首先要做的事情之一是设置环境变量 EDITOR。 cron 进程跟随它来确定使用哪个编辑器来编辑 crontab 文件。 99% 的 UNIX 和 LINUX 用户使用 vi。 如果您执行相同的操作,则可以编辑 $HOME 目录中的 .profile 文件并添加如下行:
编辑器= vi; 导出编辑器
然后保存退出。 让我们创建一个名为 cron 的文件,其中是用户名,例如 davecron。 将以下内容添加到该文件中。
#(在这里输入您自己的缩写)将日期回显到控制台
#下午 6 点到早上 6 点之间 15 分钟
0,15,30,4518-06***/bin/echo '日期'>/dev/console
保存并退出。 确保以上 5 个字段以空格分隔。
在前面的反例中,系统每隔15分钟就会向控制台输出当前时间。 如果系统崩溃或挂起,您可以一目了然地看到从上次显示的时间开始系统停止工作的时间。 有些系统中用tty1来代表控制台,可以根据实际情况对前面的反例做相应的修改。 要提交刚刚创建的 crontab 文件,您可以将此新创建的文件作为参数传递给 cron 命令:
$crontabdavecron
该文件现已提交给 cron 进程,该进程每 15 分钟运行一次。
同时,新创建的文件的副本已经放在/var/spool/cron目录中,文件名为用户名(即dave)。
2)。 列出 crontab 文件
要列出 crontab 文件,请使用:
$ crontab -l
0,15,30,45,18-06***/bin/echo `日期`>dev/tty1
您会看到与之前类似的内容。 您可以使用这些技术来备份 $HOME 目录中的 crontab 文件:
$crontab -l>$HOME/mycron
这样,一旦crontab文件被误删除,可以通过上一节介绍的方法快速恢复。
3)。 编辑 crontab 文件
如果你想在crontab文件中添加、删除或编辑条目,并且EDITOR环境变量设置为vi,那么你可以使用vi来编辑crontab文件,相应的命令是:
$ crontab -e
您可以更改 crontab 文件并退出,就像使用 vi 编辑任何其他文件一样。 如果单个条目发生更改或添加新条目,cron 将在保存文件时对文件执行必要的健全性检查。 如果其中一个字段的值超出允许的范围,它会提示您。
当我们编辑 crontab 文件时,我们可能会添加新条目。 例如,添加以下一项:
#DT:删除核心文件,at3.30amon1,7,14,21,26,26daysofeachmonth
3031,7,14,21,26**/bin/find-name "core'-execrm{};
立即保存并退出。 最好在 crontab 文件中的每个条目上方添加注释,这样您就可以知道它的功能、运行时间,更重要的是,它是哪个用户的工作。
现在让我们使用上面提到的 crontab -l 命令列出其所有信息:
$ crontab -l
#(crondave安装于星期二五月413:07:431999)
#DT:每 30 分钟向控制台发送一次日期
0,15,30,4518-06*** /bin/echo `日期`>/dev/tty1
#DT:删除核心文件,at3.30amon1,7,14,21,26,26daysofeachmonth
3031,7,14,21,26**/bin/find-name "core'-execrm{};
4). 删除crontab文件
要删除 crontab 文件php 计划任务,您可以使用:
$ crontab -r
5)。 恢复丢失的 crontab 文件
如果你不小心删除了crontab文件,假设你的$HOME目录中有备份,你可以将它复制到/var/spool/cron/,其中是用户名。 如果由于权限问题无法完成复制,可以使用:
$crontab
其中 是 $HOME 目录中副本的文件名。
我建议您在 $HOME 目录中保留此文件的副本。 我也有过类似的经历,多次删除了crontab文件(因为r键在e键的左侧旁边)。 这就是为什么一些系统文档建议不要直接编辑 crontab 文件,而是编辑该文件的副本,然后重新提交新文件。
某些 crontab 变体有些奇特,因此使用 crontab 命令时要小心。 如果省略任何选项,crontab 可能会打开一个空文件,或者看起来是一个空文件。 这时,按删除键退出,不要按,否则会丢失crontab文件。
5.用例
示例1:每1分钟执行一次命令
命令:
*****命令
示例2:每小时第3分钟和第15分钟执行
命令:
3,15****命令
示例3:上午8:00到11:00的第3分钟和第15分钟执行
命令:
3,158-11***命令
示例4:每两天上午8:00到11:00的第3分钟和第15分钟执行
命令:
3,158-11*/2**命令
例5:每周一上午8:00到11:00第3分钟和第15分钟执行
命令:
3,158-11**1 命令
示例6:每晚21:30重启smb
命令:
第3021章 *** /etc/init.d/smbrestart
示例7:每月1日、10日、22日4:45重启smb
命令:
4541,10,22**/etc/init.d/smbrestart
例8:每周六、日1:10重启smb
命令:
101**6,0/etc/init.d/smbrestart
示例9:每天18:00到23:00之间每30分钟重启一次smb
命令:
0,3018-23***/etc/init.d/smbrestart
示例 10:每周六晚上 11:00 重新启动 smb
命令:
023**6 /etc/init.d/smbrestart
示例 11:每小时重新启动 smb
命令:
**/1***/etc/init.d/smbrestart
示例 12:晚上 11:00 到上午 7:00 之间,每小时重新启动 smb
命令:
*23-7/1*** /etc/init.d/smbrestart
例13:每月4号、每周一至周六11:00重启smb
命令:
第0114章
示例 14:1 月 1 日 4:00 重启 smb
命令:
041jan* /etc/init.d/smbrestart
示例 15:每小时执行 /etc/cron.hourly 目录中的脚本
命令:
01****rootrun-parts/etc/cron.hourly
阐明:
run-parts 是参数。 如果删除此参数,则可以写入要运行的脚本的名称,而不是目录名称。
4、使用注意事项
1.注意环境变量问题
有时候我们会创建一个crontab,但是这个任务手动执行很难,但是自动执行这个任务就没有问题。 这通常是由于crontab文件中没有配置环境变量导致的。
在crontab文件中定义多个调度任务时,需要注意的问题之一就是环境变量的设置,因为当我们自动执行某个任务时,它是在当前shell环境中执行的,程序可以实际上找到环境变量,而系统手动进行任务调度时,不会加载任何环境变量。 因此,任务运行所需的所有环境变量都需要在crontab文件中指定,这样系统执行任务调度时才不会出现问题。
不要假设 cron 知道所需的特殊情况,它似乎并不知道。 因此,请确保在 shell 脚本中提供所有必要的路径和环境变量,除了一些手动设置的全局变量。 所以要注意以下3点:
1)脚本中涉及到文件路径时,写全局路径;
2)当脚本执行需要使用java或其他环境变量时,通过source命令导入环境变量,如:
catstart_cbp.sh
#!/bin/sh
源/etc/profile
exportRUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh-cmev&
3)当脚本自动执行没问题,但crontab不执行时。 这时候你就要大胆怀疑是环境变量惹的祸,可以尝试在crontab中直接引入环境变量来解决问题。 喜欢:
0****./etc/profile;/bin/sh/var/www/java/audit_no_count/bin/restart_audit.sh
2.注意清除系统用户的邮件日志
每个任务调度执行后,系统会将任务输出信息通过邮件发送给当前系统用户。 这样,随着时间的推移,日志信息会非常大,可能会影响系统的正常运行。 方向非常重要。
例如,您可以在crontab文件中设置以下模式来忽略日志输出:
0*/3***/usr/local/apache2/apachectlrestart>/dev/null2>&1
“/dev/null2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出。 由于标准输出已经被重定向到/dev/null,所以标准错误也会被重定向到/dev/null,这样日志输出问题就解决了。
3、系统级任务调度和用户级任务调度
系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成一些用户自定义的任务。 可以把用户级任务调度放在系统级任务调度中来完成(不推荐),但反过来不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,或者调度任务可以直接写入/etc/crontab文件中。 需要注意的是,如果要定义一个任务来定期重新启动系统,只需将该任务放在/etc/crontab 文件中即可。 即使在root用户下创建定时重启系统的任务也是无效的。
4.其他注意事项
新创建的cronjob不会立即执行,至少需要2分钟才能执行。 如果重新启动cron,它将立即执行。
当crontab突然失败时,可以尝试/etc/init.d/crondrestart来解决问题。 或者查看日志,看看有没有作业执行/报错 tail -f /var/log/cron.
不要随意运行 crontab -r。 它从 Crontab 目录 (/var/spool/cron) 中删除用户的 Crontab 文件。 该用户的所有 crontab 都消失了。
crontab 中的 % 有特殊含义,表示换行符。 如果要使用它,则必须使用通配符%。 例如常用的日期'+%Y%m%d'在crontab中不会被执行,应替换为日期'+%Y%m%d'。
发表评论