去评论
dz插件网

DISCUZX3/X25论坛云上报/计划任务异步机制方案1.0.2beta[7.22日...

admin
2022/04/20 15:32:47
DISCUZX3/X25论坛云上报/计划任务异步机制方案1.0.2beta[7.22日更新]


7.22日更新
1,优化超时问题
2,修正一个Exception错误


很多站长开启了防水墙等功能,在每次发帖的时候都会同步请求云端,这样当网络不畅的时候很容易导致“卡顿”的情况出现影响用户体验。

同理,论坛的计划任务也是把论坛后台的各种任务附加到用户的访问动作上,给用户造成论坛突然很卡了的假象。
于是,我们开发了这个论坛的异步机制来处理这个问题。


什么是异步?:

在执行过程中,我们把那些会造成卡的部分分离出来,放到后台来执行。

方案原理:
我们借助redis的队列机制的BLPOP方法,在一个死循环中等待队列中的可弹出的元素,否则就阻塞连接。
在后台处理前台提交过来的上报任务。

方案前提:
1,独立服务器,能执行命令行,并且安装了redis服务以及php-redis扩展。
2,服务器能执行计划任务。

实施步骤:
1,到 https://www.dismall.com/thread-12045-1-1.html 按提示安装框架。如果已经安装好可跳过此步。
2,关闭论坛,此过程大约需要5~15分钟。
3,确保论坛已经安装好redis以及php-redis扩展,如果没有安装可以参考帖子下方的方法。
4,下载帖子中的附件,并上传到服务器(不会覆盖任何文件)
5,切换到extend/bin目录,执行如下命令:
  1. ~$nohup php bin_async_cron.php&
6,在配置文件的最下方加入如下配置:
  1. $_config['extend']['asynctask']['on'] = 1;
在配置文件中找到如下两项按如下配置:
  1. $_config['remote']['on'] = '1';$_config['remote']['cron'] = '1';
7,执行命令:
  1. ~$crontab -e
添加如下代码到最后一行
  1. * * * * * curl "http://你的站/api/remote/index.php?mod=cron"
8,可以到bin目录下查看out文件,里面记录了云上报日志,如果发现里面的剩余成员数一直在增加可以再次执行步骤5,新增一个进程来执行。

注意事项:
1,为了避免重启后任务丢失,建议把步骤5添加到开机启动里。
2,由于linux计划任务最多每分钟执行一次,所以论坛的任务执行可能有所延后而不是准点执行,比如今日发帖的任务可能就不是准点更新而是延后了几分钟。
3,请限制extend/bin目录只能本机访问,尤其是该脚本存在死循环,一定不要在浏览器下执行。

linux系统安装redis服务简单步骤:
1,一般在/usr/local/src下,执行wget http://redis.googlecode.com/files/redis-2.6.14.tar.gz
2,解压 tar -zxf redis-2.6.14.tar.gz 然后切换到这个目录。
3,make
4,一般到/etc/sysctl.conf里添加vm.overcommit_memory=1,然后reboot,这样会允许分配所有内存避免不能启动redis。
5,在redis.conf中修改一下配置,最重要的是修改如下:
daemonize yes
把它转换成驻守进程,其余配置请参考手册。
6,redis-server redis.conf启动redis,如果没有redis-server命令,可以把src下面的redis-*都复制到/usr/bin目录下
7,redis-cli启动客户端测试启动是否正常。

PHP-REDIS客户端安装,参考:https://github.com/nicolasff/phpredis