PHP学习_聊聊关于PHP定时器的那些事

2021-09-18 0 212 百度已收录

罕见的按时器有两种:一种周期性按时履行,比方天天的清晨三点出报表;另外一种正在指按时间后履行(一次),比方会员登录零碎五分钟后发放逐日登录嘉奖。两种状况对于应shell中的cron以及at饬令,与JavaScript中的setInterval以及setTimeout函数相似(严厉来讲setInterval是周期性履行,指按时间点履行需求自行处置)。

做web开辟的PHP顺序员对于JavaScript中的两个按时器函数该当都还熟习,回到PHP层面就有点傻眼:PHP中有sleep,可是不(内置)按时器函数可用。sleep函数牵强能够做到,但会招致过程堵塞,时期不克不及做其余事(或者无呼应)。为何PHP没能供给按时器(Timer)这个功用呢?

缘由

团体以为,web开辟中PHP不克不及运用按时器的实质缘由是可控 常驻内存运转情况的缺失。两个要点:第一常驻内存,第二可控。CGI形式下,过程履行完剧本后间接加入,不克不及盼望其到指按时间运转义务;PHP-FPM形式下,过程(绝年夜少数)常驻内存,但不成控。

不成控的意义是履行PHP的过程没有受PHP代码影响,过程的出口点以及加入机遇由额定的顺序把持。比方FPM形式下,PHP剧本中的exitdie函数只中缀剧本的履行,没有会对于履行剧本的过程发生出格的影响(内存保守除了外)。PHP开辟职员编写的剧本是过程的履行体,履行终了后就从过程的履行高低文中卸载进来。这类状况下,履行PHP剧本的机遇依然由内部驱动,不内部恳求PHP代码就安宁的躺正在硬盘上,甚么都没有做,也就按时义务。

因为PHP次要面向web开辟,PHP这类履行形式波动牢靠,开辟服从快。比方省去资本开释这一步,就防止了开辟中良多任务量以及坑。想一想某些第三方库代码中改时区、字符编码等还没有复原,正在常驻内存运转情况下简直一定会招致后续恳求有成绩。但正在FPM形式下,这类坑有意中间接趟平,省去很多调试工夫,为顺序员保住发际线做出了没有小的奉献。

成绩曾经理解,那末PHP中若何运用按时器履行按时义务?

风险的做法

正在web情况下,PHP剧本默许有超不时间。去失落超时配置,就能够让顺序不断正在背景运转(假如过程没有加入的话)。比方如下代码正在呼应恳求后持续背景运转,而且每一五秒钟输入一次工夫到文件:

# test.php
set_time_limit(0); # 撤消超时配置,让剧本可不断运转

echo 'This is a background run forever script. Now you can leave me alone.';

fastcgi_finish_request();   # 完毕以后恳求

do{
   file_put_contents("/tmp/out.dat", "test script, now:" . date("Y-m-d H:i:s") . "\\n", FILE_APPEND);
   sleep(5);
}while(true);

恳求http://localhost:8080/test.php文件后,监测/tmp/out.dat文件,会发明不时有内容输入,不管客户端能否断开毗连、封闭阅读器或许重启电脑(不克不及重启效劳器)。这说明顺序不断正在履行,而且也完成了咱们想要的按时器功用。假如把sleep改为usleeptime_nanosleep,还能完成微秒、纳秒级按时器,岂没有美哉?

理论中该当只管即便防止用这类体式格局完成按时器,不只由于低效,还略有风险。缘由之一是每一次恳求会占用一个过程,恳求十万次需求十万个过程,根本上会招致零碎解体或者后续恳求无呼应;别的假如翻开了session,可是遗忘挪用session_write_close,会招致统一个用户的后续恳求被hang住(session活泼时处于加锁形态,没有封闭session会招致后续过程没法翻开session)。

web开辟该当越快呼应用户的恳求越好,正在web开辟顶用这类体式格局强行完成按时器,会让全部web使用处于没有波动、不成靠或者不成猜测形态。孟子曰:知而慎行,小人没有立于危墙之下。没有靠谱的做法要只管即便防止,顺带也防止背锅以及甩锅。

接上去看看PHP中运用按时器的精确姿态。

精确的姿态

PHP完成按时器的做法可复杂归纳为以下多少种:

  1. 运用cron、Jenkins等调剂东西做周期性按时义务(既能够是履行剧本,也能够是恳求某个网址);
  2. 一次性履行义务经过音讯行列步队、数据库等体式格局送达给第三方顺序履行;
  3. 像WordPress同样模仿按时义务,但要记着这类体式格局依附于客户端恳求,并需自行处置好过程并提问题;
  4. 运用常驻内存型体式格局运转PHP顺序,即CLI形式。

除第三种做法,其余体式格局都是推选的,详细计划请分离实践需要。作为PHP顺序员,固然仍是首选用PHP来做,也便是CLI形式。

CLI形式

摸着良知说,CLI形式让PHP发扬的空间拓展很多。正在CLI形式下,顺序的出口点便是剧本,且代码能够常驻内存,过程完整由PHP代码把持。正在这类方式下,完成按时器就有多种弄法。本文列出多少种做法,举一反三:

  1. 运用swooleworkerman等框架,内置(高精度)按时器;
  2. 运用多过程(池)/多线程(池)技能(pcntlpthreads拓展正在CLI形式下才可用);
  3. 处置tick或许alarm等旌旗灯号;
  4. 运用libeventlibev等事情驱动库;
  5. sleep加轮回或者本人完成事情轮回。

想折腾的话本人用2-5计划,没有想折腾swooleworkerman等框架是首选,波动牢靠。

总结

辨别HTTP恳求以及义务的干系,完成按时义务就复杂了。至于用不必PHP来完成,那是另一回事。固然作为web开辟的首选言语,PHP完成按时义务也是垂手可得的。

推选进修:《PHP视频教程》

以上便是聊聊对于PHP按时器的那些事的具体内容,更多请存眷酷吧易资源网别的相关文章!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

酷吧易资源网 PHP教程 PHP学习_聊聊关于PHP定时器的那些事 https://www.kubayi.com/7694.html

常见问题

相关文章

评论
暂无评论