广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php没有定时功能的原因是什么
  • 720
分享到

php没有定时功能的原因是什么

2023-07-05 06:07:28 720人浏览 安东尼
摘要

今天小编给大家分享一下PHP没有定时功能的原因是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。web开发中php不能使用

今天小编给大家分享一下PHP没有定时功能的原因是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

web开发php不能使用定时器的本质原因是可控常驻内存运行环境的缺失;两个要点,第一常驻内存,第二可控。CGI模式下,进程执行完脚本后直接退出,不能指望其到指定时间运行任务;PHP-FPM模式下,进程常驻内存,但不可控。

php为什么没有定时功能

常见的定时器有两种:一种周期性定时执行,例如每天的凌晨三点出报表;另一种在指定时间后执行(一次),例如会员登录系统五分钟后发放每日登录奖励。对应javascript中的setInterval和setTimeout函数(严格来说setInterval是周期性执行,指定时间点执行需要自行处理)。

WEB开发的PHP程序员对JavaScript中的两个定时器函数应该都还熟悉,回到PHP层面就有点傻眼:

PHP中有sleep,但是没有(内置)定时器函数可用。sleep函数勉强可以做到,但会导致进程阻塞,期间不能做其他事(或无响应)。为什么PHP没能提供定时器(Timer)这个功能呢?

原因

web开发中PHP不能使用定时器的本质原因是可控 常驻内存运行环境的缺失。两个要点:第一常驻内存,第二可控。CGI模式下,进程执行完脚本后直接退出,不能指望其到指定时间运行任务;PHP-FPM模式下,进程(绝大多数)常驻内存,但不可控。

不可控的意思是执行PHP的进程不受PHP代码影响,进程的入口点和退出时机由额外的程序控制。例如FPM模式下,PHP脚本中的exit、die函数只中断脚本的执行,不会对执行脚本的进程产生特别的影响(内存泄露除外)。PHP开发人员编写的脚本是进程的执行体,执行完毕后就从进程的执行上下文中卸载出去。这种情况下,执行PHP脚本的时机仍然由外部驱动,没有外部请求PHP代码就安详的躺在硬盘上,什么都不做,也就定时任务。

由于PHP主要面向web开发,PHP这种执行模式稳定可靠,开发效率快。比如省去资源释放这一步,就避免了开发中很多工作量和坑。想想某些第三方库代码中改时区、字符编码等还不还原,在常驻内存运行环境下几乎肯定会导致后续请求有问题。但在FPM模式下,这种坑无意中直接趟平,省去许多调试时间,为程序员保住发际线做出了不小的贡献。

问题已经了解,那么PHP中如何使用定时器执行定时任务?

危险的做法

在web环境下,PHP脚本默认有超时时间。去掉超时设置,就可以让程序一直在后台运行(如果进程不退出的话)。例如以下代码在响应请求后继续后台运行,并且每五秒钟输出一次时间到文件:

# test.phpset_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实现定时器的做法可简单归结为如下几种:

  • 使用cron、jenkins等调度工具做周期性定时任务(既可以是执行脚本,也可以是请求某个网址);

  • 一次性执行任务通过消息队列数据库等方式投递给第三方程序执行;

  • WordPress一样模拟定时任务,但要记住这种方式依赖于客户端请求,并需自行处理好进程并发问题;

  • 使用常驻内存型方式运行PHP程序,即CLI模式。

除了第三种做法,其他方式都是推荐的,具体方案请结合实际需求。作为PHP程序员,当然还是首选用PHP来做,也就是CLI模式。

CLI模式

摸着良心说,CLI模式让PHP发挥的空间拓展不少。在CLI模式下,程序的入口点就是脚本,且代码可以常驻内存,进程完全由PHP代码控制。在这种形式下,实现定时器就有多种玩法。本文列出几种做法,抛砖引玉:

  • 使用swooleworkerman框架,内置(高精度)定时器;

  • 使用多进程(池)/多线程(池)技术(pcntlpthreads拓展在CLI模式下才可用);

  • 处理tick或者alarm等信号;

  • 使用libeventlibev等事件驱动库;

  • sleep加循环或自己实现事件循环。

想折腾的话自己用2-5方案,不想折腾swooleworkerman等框架是首选,稳定可靠。

以上就是“php没有定时功能的原因是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网PHP编程频道。

--结束END--

本文标题: php没有定时功能的原因是什么

本文链接: https://www.lsjlt.com/news/349892.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • php没有定时功能的原因是什么
    今天小编给大家分享一下php没有定时功能的原因是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。web开发中PHP不能使用...
    99+
    2023-07-05
  • php为什么没有定时功能
    web开发中PHP不能使用定时器的本质原因是可控常驻内存运行环境的缺失;两个要点,第一常驻内存,第二可控。CGI模式下,进程执行完脚本后直接退出,不能指望其到指定时间运行任务;PHP-FPM模式下,进程常驻内存,但不可控。本教程操作环境:w...
    99+
    2023-05-14
    php
  • php6没有的原因是什么
    本篇内容主要讲解“php6没有的原因是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php6没有的原因是什么”吧!没有php6的原因:1、开发小组认为,如果不能完全解决Unicode就不能称...
    99+
    2023-07-04
  • springboot启动时没有日志的原因是什么
    这篇文章主要介绍“springboot启动时没有日志的原因是什么”,在日常操作中,相信很多人在springboot启动时没有日志的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”springboot启...
    99+
    2023-06-20
  • javascript没有权限的原因是什么
    这篇文章主要讲解了“javascript没有权限的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript没有权限的原因是什么”吧!ja...
    99+
    2022-10-19
  • php_eol没有换行的原因是什么
    小编给大家分享一下php_eol没有换行的原因是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php_eol是文本换行,只对文本文件有效,在浏览器并不能如常显...
    99+
    2023-06-15
  • linux没有病毒的原因是什么
    本篇内容介绍了“linux没有病毒的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!linux不是没有病毒,而是病毒少。病毒少的原因...
    99+
    2023-07-04
  • spring定时任务没有执行的原因有哪些
    1. 配置错误:可能是由于配置文件中的定时任务配置错误,导致定时任务无法正确识别和执行。2. 依赖错误:如果定时任务依赖的某个组件或...
    99+
    2023-08-24
    spring
  • Python没有main函数的原因是什么
    为什么必须强制main函数作为入口?这些语言都是编译语言,需要将代码编译成可执行的二进制文件。为了让操作系统/引导程序找到程序的开头,需要定义这样一个函数。简而言之,需要在大量可执行的代码中定义一个至关重要的的开头。不难看出,对于这些语言来...
    99+
    2023-05-14
    Python main
  • Python中没有main函数的原因是什么
    Python中没有main函数的原因是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。为什么必须强制执行主函数这些语言是已编译的语言,需要将代码编译到可执行的二进制文件中,以...
    99+
    2023-06-16
  • CSS百分比定义高度没有效果的原因是什么
    本篇内容主要讲解“CSS百分比定义高度没有效果的原因是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS百分比定义高度没有效果的原因是什么”吧! ...
    99+
    2022-10-19
  • php设置时区的原因是什么
    这篇文章主要讲解了“php设置时区的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php设置时区的原因是什么”吧!由于PHP5.0对data()函数进行了重写,所以目前的日期时间函...
    99+
    2023-06-20
  • php没有mbstring扩展的设置是什么原因?怎么解决?
    近年来,PHP语言一直以来都是互联网行业最为广泛使用的一种语言,被广泛运用于Web开发、数据处理、接口开发等领域。但是在使用PHP开发项目时,难免会遇到各种问题,其中之一就是在进行字符串处理时会出现乱码的情况。而解决这个问题的方法之一就是使...
    99+
    2023-05-14
    php
  • 解决定时任务@Scheduled没有准时执行的原因及分析
    目录定时任务@Scheduled没有准时执行的原因原因解决法案定时任务@Scheduled入门一个最简单的例子编写单线程demo多线程总结定时任务@Scheduled没有准时执行的原...
    99+
    2023-05-17
    定时任务 定时任务@Scheduled @Scheduled没准时执行
  • 不建议使用Time.Sleep实现定时功能的原因有哪些
    这篇文章主要介绍“不建议使用Time.Sleep实现定时功能的原因有哪些”,在日常操作中,相信很多人在不建议使用Time.Sleep实现定时功能的原因有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用...
    99+
    2022-10-19
  • linux具有稳定性的原因是什么
    这篇文章主要介绍了linux具有稳定性的原因是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux具有稳定性的原因是什么文章都会有所收获,下面我们一起来看看吧。linux具有稳定性是因为它没有像其它操作...
    99+
    2023-07-05
  • php中要定义字符串的原因是什么
    小编给大家分享一下php中要定义字符串的原因是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在PHP语言中声明字符串有三种方式:1:用单引号声明2:用双引号声明3:用字界符声明1:对于单引号声明用英文半角的单引号,将字...
    99+
    2023-06-15
  • left join没有走索引的原因是什么及怎么解决
    本篇内容主要讲解“left join没有走索引的原因是什么及怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“left join没有走索引的原因是什么及怎么解决”吧!查一...
    99+
    2023-07-05
  • XP系统没有声音是什么原因?如何解决?
      虽然微软已经宣布停止对XP系统支持,不过XP系统的用户还是很多,据数据分析XP还拥有27%的用户数量,在XP用户数还如此庞大的情况下,针对XP故障进行解决还是很多XP用户及技主员需要学习的。那么XP系统没有声音是什么...
    99+
    2023-06-06
    XP系统没有声音是什么原因 声音 原因 系统 XP
  • 香港云服务器时常不稳定的原因是什么
    香港云服务器时常不稳定的原因有:1.网络线路影响服务器访问不稳定;2.租用的服务器配置不匹配;3.服务器内部存放程序太多;具体分析如下:网络线路影响服务器访问不稳定网络质量是导致香港服务器稳定性中最常见也是最易发生的事件。几乎占据了6成以上...
    99+
    2022-10-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作