4k视频素材网站,wordpress5.1.1,温江建设局网站,网站首页制作怎么做的PHP本身是没有定时功能的#xff0c;PHP也不能多线程。PHP的定时任务功能必须通过和其他工具结合才能实现#xff0c;例如WordPress内置了wp-cron的功能#xff0c;很厉害。本文#xff0c;我们就来深入的解析几种常见的php定时任务的思路。1、Linux服务器上使用CronTab定时…PHP本身是没有定时功能的PHP也不能多线程。PHP的定时任务功能必须通过和其他工具结合才能实现例如WordPress内置了wp-cron的功能很厉害。本文我们就来深入的解析几种常见的php定时任务的思路。1、Linux服务器上使用CronTab定时执行php我们先从相对比较复杂的服务器执行php谈起。服务器上安装了php就可以执行php文件无论是否安装了nginx或Apache这样的服务器环境软件。而Linux中使用命令行用CronTab来定时任务又是绝佳的选择而且也是效率最高的选择。首先进入命令行模式。作为服务器的linux一般都默认进入命令行模式的当然我们管理服务器也一般通过putty等工具远程连接到服务器为了方便我们用root用户登录。在命令行中键入crontab -e之后就会打开一个文件并且是非编辑状态则是vi的编辑界面通过敲键盘上的i进入编辑模式就可以编辑内容。这个文件中的每一行就是一个定时任务我们新建一行就是新建一条定时任务(当然是指这一行内按照一定的格式进行书写)。我们现在来举个例子增加一行内容如下00 * * * * lynx -dump https://www.yourdomain.com/script.php这是什么意思呢实际上上面这一行由两部分组成前面一部分是时间后面一部分是操作内容。例如上面这个00 * * * *就是指当当前时间的分钟数为00时执行该定时任务。时间部分由5个时间参数组成分别是分 时 日 月 周第1列表示分钟159 每分钟用或者 */1表示/n表示每n分钟例如*/8就是每8分钟的意思下面也是类推第2列表示小时123(0表示0点)第3列表示日期131第4列表示月份112第5列标识号星期06(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。2、Windows服务器上使用bat定时执行phpwindows上和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。3、非自有服务器(虚拟主机)上实现php定时任务如果站长没有自己的服务器而是租用虚拟主机就无法进入服务器系统进行上述操作。这个时候应该如何进行php定时任务呢其实方法又有多个。4、使用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 3600*12; // 每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复杂的多所以我们优先选择fsockopenfsockopen可以在规定的时间内比如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);// ...// 继续执行其他动作// ..把这段代码加入到某个定时任务提交结果程序中在设置好时间后提交然后执行上面这个代码就可以激活该定时任务而且对于提交的这个用户而言没有任何页面上的堵塞感。5、借用用户的访问行为来执行某些延迟任务但是上面使用sleep来实现定时任务是效率很低的一种方案。我们希望不要使用这种方式来执行这样的话就可以解决效率问题。我们借用用户访问行为来执行任务。用户对网站的访问其实是一个非常丰富的行为资源包括搜索引擎蜘蛛对网站的访问都可以算作这个类型。在用户访问网站时内部加一个动作去检查任务列表中是否存在没有被执行的任务如果存在就将这个任务执行。对于用户而言利用上面所说的fsockopen根本感觉不到自己的访问竟然还做出了这样的贡献。但是这种访问的缺点就是访问很不规律比如你希望在凌晨2点执行某项任务但是这个时间段非常倒霉没有用户或任何行为到达你的网站直到早上6点才有一个新访问。这就导致你原本打算2点执行的任务到6点才被执行。这里涉及到一个定时任务列表也就是说你需要有一个列表来记录所有任务的时间、执行什么内容。一般来说很多系统会采用数据库来记录这些任务列表比如wordpress就是这样做的。我则利用文件读写特性提供了托管在github上的开源项目php-cron你可以去看看。总之如果你想要管理多个定时任务靠上面的单个php是无法合理布局的必须想办法构建一个schedules列表。由于这里面的逻辑比较复杂就不再详细阐述我们仅停留在思路层面上。6、借用第三方定时任务跳板很好玩的是一些服务商提供了各种类型的定时任务例如阿里云的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去远程请求目标网站的定时任务脚本。7、循环利用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效率低。PHP定时任务是一个非常有意思的东西虽然说实话用系统的php.exe去直接执行php文件的效率更高但是对于很多普通站长而言虚拟主机是无法做到直接php执行原生程序的。本文仅提供一些解决的思路我也仅仅是在学习中有很多问题或表述都不正确希望你指出来你可以通过本文的思路开发出自己的一种解决方案希望你能将方案发布并与我一起探讨。相关推荐