我想用php做个任务提醒功能,如我今天添加一个任务,任务时间是明天,到了明天我这个任务做个主动提醒

我想用php做个任务提醒功能,如我今天添加一个任务,任务时间是明天,到了明天我这个任务做个主动提醒,第1张

楼主我大概了解你的意思,要实现这种问题应该是可以通过两种方案,一个是后端推送提醒(但是web程序如果不通过浏览器访问的话不能像APP一样可以推送消息后提醒啊~),另外一种就是前端开定时器匹配时间,匹配后提醒,大概思路如下

1:后端长轮询提醒,查询到后,基本不现实,如果浏览器支持websocket还可以考虑,为了通用性还是别考虑了。

2:前端提醒

a后端将提醒时间打到页面,js开个setInterval进行匹配,时间匹配相同时提醒

b通过ajax,也是定时想后端请求,后端检测是否需要提醒,来返回前端,让前端处理

php通过扩展pthreads也可以支持线程上的 *** 作,在mac下可以通过brew安装pthreads扩展。线程类要继承Thread类,而后实现run方法。

class computer extends Thread {

 

    public $id;

    public $runing = false;

    public $params = null;

 

    public function __construct($id) {

        $this->id     = $id;

        $this->runing = true;

    }

 

    public function run() {

        while ($this->runing) {

            if (is_null($this->params)) {

                echo "线程({$this->id})等待任务\n";

            } else {

                echo "线程({$this->id}) 收到任务参数::{$this->params}\n";

                $this->params = null;

            }

            sleep(1);

        }

    }

 

}

不建议在PHP-FPM里使用多线程,写不好会导致工作进程频繁崩溃使用PHP就应该转变思路,不要照搬Java那一套异步处理耗时任务也不一定要使用多线程你完全可以在PHP中用 pclose(popen('/path/to/taskphp &', 'r')); 异步打开一个进程处理耗时的任务,PHP-FPM则返回信息给浏览器提示"正在处理",taskphp这个cli脚本处理完成任务后,把数据库当前任务的状态标记为"完成",前端AJAX定时轮询到这个任务为"完成",则提示用户即可

FPM master 进程启动后,会进入函数fpm_event_loop,无限循环

处理事件

master 进程所做的的事,总的来说就是两类:

简称timer事件,需按时运行,主要有3个:

简称fd事件,需从文件句柄(file descriptor)读取到指令后,依指令运行.

重复一下,unix 下一切IO, 皆文件,socket ,socketpair,pipe 都返回文件句柄(fd) 用于通信.

主要的fd有:

对于timer事件,多个事件在事件轴上是依次排列的,只需反复检查,到时运行.

对于fd事件,需监听多个fd,需用到我们第二篇讲的IO多路复用技术.

如果满足事件条件,则处理事件内容.

FPM设计上,两类事件使用同一个结构,并且事件触发条件和事件处理逻辑放到同一个事件对象里(C语言对象就是结构体).

举个例子, 打铃下课,打铃是触发条件,下课是事件内容,两个同时放到一个事件对象 ,这是一个很好的设计.

fd值: -1

flags值: FPM_EV_PERSIST

which值: FPM_EV_TIMEOUT

fd值: 获取触发指令的文件fd

flags值: FPM_EV_EDGE(fd事件底层的边缘触发标志,需系统支持)

which值: FPM_EV_READ

两类事件分别放在两个事件队列

static struct fpm_event_queue_s fpm_event_queue_timer = NULL; 

static struct fpm_event_queue_s fpm_event_queue_fd = NULL;

事件队列的结构很常见,双向队列:

typedef struct fpm_event_queue_s {

struct fpm_event_queue_s prev;

struct fpm_event_queue_s next;

struct fpm_event_s ev;

} fpm_event_queue;

4移除事件 (fpm_event_del -> fpm_event_queue_del)

简单的出列 *** 作:

static int fpm_event_queue_del(struct fpm_event_queue_s queue, struct fpm_event_s ev)

对于fd事件,需在底层事件轮询机制里移除(如:epoll)

5,运行事件回调函数:

6, 底层事件轮询模块结构

不同的 *** 作系统,支持不同的IO事件机制,linux 支持epoll,

windows支持select, freebsd 支持kqueue,这个结构统一 *** 作接口

在函数fpm_event_init_main里 调用module->init初始化

fpm 里对应的配置

master进程在fpm_event_loop函数里无限循环,处理定时任务和fd事件

期间会在module->wait阻塞片刻,对于epoll机制,就是epoll_wait.

普通>

但是可以通过记录访问时间,来确定用户的状态。

用户登录后,每次访问,更新一下最近访问时间在数据库里

在用户页面的公共部分,做一个定时轮询,n秒一次(防止用户打开页面后放着不动,看资料或者做别的)

服务器端做一个定时,将最近时间在n秒内的用户设为在线状态,将最近时间大于n秒的(说明已经关了页面),设为离线状态。 如果是普通 web空间无法配置定时器,可以在每次用户访问时处理一次(如果用户量大,需要做时间判断,防止同时访问量多时多次重复处理,影响服务器性能)

如果能确定一个用户的访问,只有一个浏览器窗口,可以在窗口里加一个关闭事件(onbeforeunload),在此事件中发送一个退出请求,主动设为离线状态。这样状态管理会更完美一些

这样基本就可以完成一个在线状态的管理。具体n 设为多少可根据情况而定,一般5-30秒都是合理的,太短了服务器压力比较大,太长了误差会比较大

搭建 PHP 即时通讯系统通常需要以下步骤:

服务器环境准备:首先需要在服务器上安装 Web 服务器软件,例如 Apache 或 Nginx,以及 PHP 解释器。建议使用 Linux *** 作系统。

数据库准备:即时通讯系统需要存储用户和聊天记录等信息,因此需要选择适合的数据库,例如 MySQL 或 MongoDB。

选择通信协议:即时通讯系统需要使用一个通信协议来传递消息,例如 WebSocket 或长轮询(long polling)。

编写 PHP 后端代码:根据所选的通信协议,编写 PHP 后端代码来处理客户端发来的请求和推送消息到客户端。

编写客户端代码:编写客户端代码来与后端进行通信,获取聊天记录和推送消息等。

部署和测试:将代码部署到服务器上,并进行测试和调试。

后台提醒一般也就是轮询

也可以理解为你说的AJAX

或者你可以接入短信提醒,不过这个需要投入成本

还有可以发送邮件,这样你登陆邮箱客户端,就会提示了

每次订单成功就发送短信或者邮件

希望能帮助到你

使用>

高并发架构的难点是什么?

高并发架构最大问题主要是由于网站PV访问量大,单台服务器承载大量访问所带来的压力,所以会采用多台服务器进行分流,采用服务器集群技术,对于每个请求访问会被 发送到不同的服务器。

这样架构的难点就在管理、维护、监控、负载等等都面临很大的技术问题,同时还需要应对某些业务的突发流量,像秒杀、促销等场景化使用什么技术解决高并发?

互联网分布式架构设计,提高系统并发能力的方式,方法论上主要有两种:垂直扩展(Scale Up)与水平扩展(Scale Out)。

垂直扩展:提升单机处理能力。垂直扩展的方式又有两种:

(1)增强单机硬件性能,例如:增加CPU核数如32核,升级更好的网卡如万兆,升级更好的硬盘如SSD,扩充硬盘容量如2T,扩充系统内存如128G;

(2)提升单机架构性能,例如:使用Cache来减少IO次数,使用异步来增加单服务吞吐量,使用无锁数据结构来减少响应时间;

在互联网业务发展非常迅猛的早期,如果预算不是问题,强烈建议使用“增强单机硬件性能”的方式提升系统并发能力,因为这个阶段,公司的战略往往是发展业务抢时间,而“增强单机硬件性能”往往是最快的方法。

不管是提升单机硬件性能,还是提升单机架构性能,都有一个致命的不足:单机性能总是有极限的。所以互联网分布式架构设计高并发终极解决方案还是水平扩展。

水平扩展:只要增加服务器数量,就能线性扩充系统性能。水平扩展对系统架构设计是有要求的,如何在架构各层进行可水平扩展的设计,以及互联网公司架构各层常见的水平扩展实践。

水平扩展要怎么来做?首先是软件服务拆分到不同的服务器进行部署,全部堆积在一台上性能将会受限。例如:Redis 就只是部署在独立的服务器上,其它软件都在这服务器上出现增加各个软件服务部署的服务后,采用技相关技术手段分担到各个服务器上。nginx反向代理层可以通过“DNS轮询”的方式来进行水平扩展。dns-server对于一个域名配置了多个解析ip,每次DNS解析请求来访问dns-server,会轮询返回这些ip。PHP站点层可以通过修改nginxconf实现负载均衡机制来进行水平扩展。从而设置多个web后端。服务层可以通过服务连接池来进行水平扩展;这里一部需要实现服务化,PHP像swoole tarsphp等数据库可以按照数据范围,或者数据哈希的方式来进行水平扩展;那高并发架构是什么样的?

常见互联网分布式架构如上,分为:

(1)客户端层:典型调用方是浏览器browser或者手机应用APP

(2)反向代理层:系统入口,反向代理

(3)站点应用层:实现核心应用逻辑,返回html或者json数据

(4)服务层:服务化,例如像Swoole

(5)数据-缓存层:缓存加速访问存储

(6)数据-数据库层:数据库固化数据存储

以上就是关于我想用php做个任务提醒功能,如我今天添加一个任务,任务时间是明天,到了明天我这个任务做个主动提醒全部的内容,包括:我想用php做个任务提醒功能,如我今天添加一个任务,任务时间是明天,到了明天我这个任务做个主动提醒、php的thread是个什么情况、PHP FPM源代码反刍品味之四:事件处理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9360015.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存