首先,进入命令行模式。
作为做事器的linux一样平常都默认进入命令行模式的,当然,我们管理做事器也一样平常通过putty等工具远程连接到做事器,为了方便,我们用root用户登录。
在命令行中键入:

crontab -e

之后就会打开一个文件,并且是非编辑状态,则是vi的编辑界面,通过敲键盘上的i,进入编辑模式,就可以编辑内容。
这个文件中的每一行便是一个定时任务,我们新建一行,便是新建一条定时任务(当然是指这一行内按照一定的格式进行书写)。
我们现在来举个例子,增加一行,内容如下:

php定时发送PHP准时义务的实现思绪你想给妹子发准时剖明新闻吗 Python

00 lynx -dump https://www.yourdomain.com/script.php

这是什么意思呢?实际上上面这一行由两部分组成,前面一部分是韶光,后面一部分是操作内容。
例如上面这个,

00

便是指当当前韶光的分钟数为00时,实行该定时任务。
韶光部分由5个韶光参数组成,分别是:

分 时 日 月 周

第1列表示分钟1~59 每分钟用或者 /1表示,/n表示每n分钟,例如/8便是每8分钟的意思,下面也是类推

第2列表示小时1~23(0表示0点)

第3列表示日期1~31

第4列表示月份1~12

第5列标识号星期0~6(0表示星期天)

全体句子的后面部分便是操作的详细内容。

lynx -dump https://www.yourdomain.com/script.php

意思便是说通过lynx访问这个url。
我们在利用中紧张用到lynx、curl、wget来实现对url的远程访问,而如果要提高效率,直接用php去实行本地php文件是最佳选择,例如:

00 /2 /usr/local/bin/php /home/www/script.php

这条语句就可以在每2小时的0分钟,通过linux内部php环境实行script.php,把稳,这里可不是通过url访问,通过做事器环境来实行哦,而是直接实行,由于绕过了做事器环境,以是效率当然要高很多。

好了,已经添加了几条须要的定时任务了吧。
点击键盘上的Esc键,输入“:wq”回车,这样就保存了设置的定时任务,屏幕上也能看到提示创建了新的定时任务。
接下来便是好好写你的script.php了。

关于CronTab的更多用法这里就不先容了,如果你想更灵巧的利用这个定时任务功能,该当自己再去深入学习一下crontab。

Windows做事器上利用bat定时实行php

windows上和linux上有一个类似的cmd和bat文件,bat文件类似于shell文件,实行这个bat文件,就相称于依次实行里面的命令(当然,还可以通过逻辑来实现编程),以是,我们可以利用bat命令文件在windows做事器上面实现PHP定时任务。
实际上在windows上定时任务,和linux上道理是一样的,只不过方法和路子不同。
好了下面开始。

首先,在一个你以为比较适当的位置创建一个cron.bat文件,然后用文本编辑器打开它(记事本都可以),在里面写上这样的内容:

D:\php\php.exe -q D:\website\test.php

这句话的意思便是,利用php.exe去实行test.php这个php文件,和上面的contab一样,绕过了做事器环境,实行效率也比较高。
写好之后,点击保存,关闭编辑器。

接下来便是设置定时任务来运行cron.bat。
依次打开:“开始–>掌握面板–>任务操持–>添加任务操持”,在打开的界面中设置定时任务的韶光、密码,通过选择,把cron.bat挂载进去。
确定,这样一个定时任务就建立好了,在这个定时任务上右键,运行,这个定时任务就开始实行了,到点时,就会运行cron.bat处理,cron.bat再去实行php。

非自有做事器(虚拟主机)上实现php定时任务

如果站长没有自己的做事器,而是租用虚拟主机,就无法进入做事器系统进行上述操作。
这个时候该当如何进行php定时任务呢?实在方法又有多个。

利用ignore_user_abort(true)和sleep去世循环

在一个php文档的开头直接来一句:

ignore_user_abort(true);

这时,通过url访问这个php的时候,即利用户把浏览器关掉(断开连接),php也会在做事器上连续实行。
利用这个特性,我们可以实现非常牛的功能,也便是通过它来实现定时任务的激活,激活之后就随便它自己怎么办了,实际上就有点类似于后台任务。

而sleep(n)则是指当程序实行到这里时,暂时不往下实行,而是安歇n秒钟。
如果你访问这个php,就会创造页面最少要加载n秒钟。
实际上,这种永劫光等待的行为是比较花费资源的,不能大量利用。

那么定时任务到底怎么实现呢?利用下面的代码即可实现:

<?php

ignore_user_abort(true);

set_time_limit(0);

date_default_timezone_set('PRC'); // 切换到中国的韶光

$run_time = strtotime('+1 day'); // 定时任务第一次实行的韶光是来日诰日的这个时候

$interval = 360012; // 每12个小时实行一次

if(!file_exists(dirname(__FILE__).'/cron-run')) exit(); // 在目录下存放一个cron-run文件,如果这个文件不存在,解释已经在实行过程中了,该任务就不能再激活,实行第二次,否则这个文件被多次访问的话,做事器就要崩溃掉了

do {

if(!file_exists(dirname(__FILE__).'/cron-switch')) break; // 如果不存在cron-switch这个文件,就停滞实行,这是一个开关的浸染

$gmt_time = microtime(true); // 当前的运行韶光,精确到0.0001秒

$loop = isset($loop) && $loop ? $loop : $run_time - $gmt_time; // 这里处理是为了确定还要等多久才开始第一次实行任务,$loop便是要等多久才实行的韶光间隔

$loop = $loop > 0 ? $loop : 0;

if(!$loop) break; // 如果循环的间隔为零,则停滞

sleep($loop);

// ...

// 实行某些代码

// ...

@unlink(dirname(__FILE__).'/cron-run'); // 这里便是通过删除cron-run来见告程序,这个定时任务已经在实行过程中,不能再实行一个新的同样的任务

$loop = $interval;

} while(true);

通过实行上面这段php代码,即可实现定时任务,直到你删除cron-switch文件,这个任务才会停滞。

但是有一个问题,也便是如果用户直接访问这个php,实际上没有任何浸染,页面也会停在这个地方,一贯处于加载状态,有没有一种办法可以肃清这种影响呢?fsockopen帮我们办理了这个问题。

fsockopen可以实现在要求访问某个文件时,不必得到返回结果就连续往下实行程序,这是和curl常日用法不一样的地方,我们在利用curl访问网页时,一定要等curl加载完网页后,才会实行curl后面的代码,虽然实际上curl也可以实现“非壅塞式”的要求,但是比fsockopen繁芜的多,以是我们优先选择fsockopen,fsockopen可以在规定的韶光内,比如1秒钟以内,完成对访问路径发出要求,完成之后就不管这个路径是否返回内容了,它的任务就到这里结束,可以连续往下实行程序了。
利用这个特性,我们在正常的程序流中加入fsockopen,对上面我们创建的这个定时任务php的地址发出要求,即可让定时任务在后台实行。
如果上面这个php的url地址是www.yourdomain.com/script.php,那么我们在编程中,可以这样:

// ...

// 正常的php实行程序

// ..

// 远程要求(不获取内容)函数,下面可以反复利用

function _sock($url) {

$host = parse_url($url,PHP_URL_HOST);

$port = parse_url($url,PHP_URL_PORT);

$port = $port ? $port : 80;

$scheme = parse_url($url,PHP_URL_SCHEME);

$path = parse_url($url,PHP_URL_PATH);

$query = parse_url($url,PHP_URL_QUERY);

if($query) $path .= '?'.$query;

if($scheme == 'https') {

$host = 'ssl://'.$host;

}

$fp = fsockopen($host,$port,$error_code,$error_msg,1);

if(!$fp) {

return array('error_code' => $error_code,'error_msg' => $error_msg);

}

else {

stream_set_blocking($fp,true);//开启了手册上说的非壅塞模式

stream_set_timeout($fp,1);//设置超时

$header = \"大众GET $path HTTP/1.1\r\n\"大众;

$header.=\公众Host: $host\r\n\公众;

$header.=\公众Connection: close\r\n\r\n\"大众;//长连接关闭

fwrite($fp, $header);

usleep(1000); // 这一句也是关键,如果没有这延时,可能在nginx做事器上就无法实行成功

fclose($fp);

return array('error_code' => 0);

}

}

_sock('www.yourdomain.com/script.php');

// ...

// 连续实行其他动作

// ..

把这段代码加入到某个定时任务提交结果程序中,在设置好韶光后,提交,然后实行上面这个代码,就可以激活该定时任务,而且对付提交的这个用户而言,没有任何页面上的堵塞感。

借用用户的访问行为来实行某些延迟任务

但是上面利用sleep来实现定时任务,是效率很低的一种方案。
我们希望不要利用这种办法来实行,这样的话就可以办理效率问题。
我们借用用户访问行为来实行任务。
用户对网站的访问实在是一个非常丰富的行为资源,包括搜索引擎蜘蛛对网站的访问,都可以算作这个类型。
在用户访问网站时,内部加一个动作,去检讨任务列表中是否存在没有被实行的任务,如果存在,就将这个任务实行。
对付用户而言,利用上面所说的fsockopen,根本觉得不到自己的访问竟然还做出了这样的贡献。
但是这种访问的缺陷便是访问很不规律,比如你希望在凌晨2点实行某项任务,但是这个韶光段非常晦气,没有用户或任何行为到达你的网站,直到早上6点才有一个新访问。
这就导致你原来打算2点实行的任务,到6点才被实行。

这里涉及到一个定时任务列表,也便是说你须要有一个列表来记录所有任务的韶光、实行什么内容。
一样平常来说,很多系统会采取数据库来记录这些任务列表,比如wordpress便是这样做的。
我则利用文件读写特性,供应了托管在github上的开源项目php-cron,你可以去看看。
总之,如果你想要管理多个定时任务,靠上面的单个php是无法合理布局的,必须想办法构建一个schedules列表。
由于这里面的逻辑比较繁芜,就不再详细阐述,我们仅勾留在思路层面上。

借用第三方定时任务跳板

很好玩的是,一些做事商供应了各种类型的定时任务,例如阿里云的ACE供应了单独的定时任务,你可以填写自己运用下的某个uri。
百度云BCE供应了做事器监测功能,每天会按照一定的韶光规律访问运用下的固定uri。
类似的第三方平台上还有很多定时任务可以用。
你完备可以用这些第三方定时任务作为跳板,为你的网站定时任务做事。
比如说,你可以在阿里云ACE上建立一个每天凌晨2点的定时任务,实行的uri是/cron.php。
然后你创建一个cron.php,里面则采取fsockopen去访问你真正要实行某些任务的网站的url,例如上面的www.yourdomain.com/script.php,而且在cron.php中还可以访问多个url。
然后把cron.php上传到你的ACE上面去,让ACE的定时任务去访问/cron.php,然后让cron.php去远程要求目标网站的定时任务脚本。

循环利用include包含文件(待验证)

php面向过程的特性使得其程序是从上往下实行的,利用这个特性,在我们利用include某个文件时,就会实行被引入的文件,知道include的文件内程序实行完之后,再往下实行。
如果我们创建一个循环,再利用sleep,不断的include某个文件,使循环实行某段程序,则可以达到定时实行的目的。
我们再进一步,并不是利用while(true)来实现循环,而是利用被include文件本身再include自身来实现循环,比如我们创建一个do.php,它的内容如下:

if(...) exit(); // 通过某个开关来关闭实行

// ...

// 实行某些程序

// ...

sleep($loop); // 这个$loop在include('do.php');之前赋值

include(dirname(__FILE__).'/do.php');

实在通过这种方法实行和while的思路也像。
而且同样用到sleep,效率低。

如果想要学习视频,互换谈论,请按照下图所示输入私信“申请加入”获取加群链接~~~