参数都是对的为什么激光推送python定时任务框架不能实现

[通用]定时任务推送消息至APP
移动端版本APP9.0
APP9.0的定时调度推送消息至客户端进行了优化:
1)消息推送设置推送用户设置和定时调度的默认用户组统一,除用户外可以通过角色或者部门来选择;
2)支持推送自定义链接;
3)支持推送报表。
定时任务的设置详细点击&
移动端消息推送教学视频地址请查看:&(出处: 帆软论坛)
2. 场景描述
在一般的销售行业中,一个厂家下面会有很多分销商,分销商需要从厂家那里进行采购,汇款等等一系列操作,而厂家也会定期的给这些分销商发送信息,告知他们货物的剩余情况,汇款情况等,而且在公司发工资的时候,也会给员工发送一份关于该员工的工资消息,那么如何实现推送定时任务至app呢?
每个月月底发送一条消息给所有用户,内容为各个用户的个人信息以及工资信息,并在系统的虚拟目录树定时任务结果下面显示。3.1&模板准备使用模板:%FR_HOME%\WebReport\ReportServer\reportlets\doc\SpecialSubject\定时任务权限控制.cpt3.2 设置定时任务打开数据决策系统,点击管理系统&定时调度,设置定时任务,任务名称为工资表,用户选择平台中的用户,如下图: [app]定时任务推送消息至app > _15-57-56.jpg" src="uploads/_9612.jpg?version=1&modificationDate=0&api=v2" data-image-src="/download/attachments/7-10-16_15-57-56.jpg?version=1&modificationDate=0&api=v2" data-unresolved-comment-count="0" data-linked-resource-id="" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="_15-57-56.jpg" data-base-url="http://www.finedevelop.com" data-linked-resource-content-type="image/jpeg" data-linked-resource-container-id="" data-linked-resource-container-version="9" data-location="扩展开发 > [app]定时任务推送消息至app > _15-57-56.jpg" data-image-height="594" data-image-width="798" data-mce-src="uploads/_9612.jpg?version=1&modificationDate=0&api=v2">设置开始时间:配置结束立即执行,执行频率选择表达式设定,设定为每月最后一个工作日19点50分,如下图:注:可用表达式自行设定频率时间。 [app]定时任务推送消息至app > _16-09-08.jpg" src="uploads/_5882.jpg?version=1&modificationDate=0&api=v2" data-image-src="/download/attachments/7-10-16_16-09-08.jpg?version=1&modificationDate=0&api=v2" data-unresolved-comment-count="0" data-linked-resource-id="" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="_16-09-08.jpg" data-base-url="http://www.finedevelop.com" data-linked-resource-content-type="image/jpeg" data-linked-resource-container-id="" data-linked-resource-container-version="9" data-location="扩展开发 > [app]定时任务推送消息至app > _16-09-08.jpg" data-image-height="595" data-image-width="802" data-mce-src="uploads/_5882.jpg?version=1&modificationDate=0&api=v2">选择本地文件中,模板选择定时任务内容权限控制.cpt,勾选“除通用结果外,根据默认用户组内的用户单独生成结果”,如下图: [app]定时任务推送消息至app > _16-11-21.jpg" src="uploads/_7791.jpg?version=2&modificationDate=0&api=v2" data-image-src="/download/attachments/7-10-16_16-11-21.jpg?version=2&modificationDate=0&api=v2" data-unresolved-comment-count="0" data-linked-resource-id="" data-linked-resource-version="2" data-linked-resource-type="attachment" data-linked-resource-default-alias="_16-11-21.jpg" data-base-url="http://www.finedevelop.com" data-linked-resource-content-type="image/jpeg" data-linked-resource-container-id="" data-linked-resource-container-version="9" data-location="扩展开发 > [app]定时任务推送消息至app > _16-11-21.jpg" data-image-height="363" data-image-width="800" data-mce-src="uploads/_7791.jpg?version=2&modificationDate=0&api=v2">注:推送对象需要有模板查看权限勾选客户端通知,推送终端选择APP通知,收件人为默认用户组,填写主题和内容,主题和内容都支持公式,如下图: [app]定时任务推送消息至app > _16-13-41.jpg" src="uploads/_5811.jpg?version=1&modificationDate=0&api=v2" data-image-src="/download/attachments/7-10-16_16-13-41.jpg?version=1&modificationDate=0&api=v2" data-unresolved-comment-count="0" data-linked-resource-id="" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="_16-13-41.jpg" data-base-url="http://www.finedevelop.com" data-linked-resource-content-type="image/jpeg" data-linked-resource-container-id="" data-linked-resource-container-version="9" data-location="扩展开发 > [app]定时任务推送消息至app > _16-13-41.jpg" data-image-height="498" data-image-width="800" data-mce-src="uploads/_5811.jpg?version=1&modificationDate=0&api=v2">自的jar开始,定时推送消息参数已可与日期绑定,并且增加了新的功能,用户可以自主选择推送消息的类型,有链接消息、图文消息、文件消息三个选项。如下所示:3.3&效果查看用Anna的账号登录app,每月月底即可看到对应的工资表,如下图: [app]定时任务推送消息至app > 微信图片_31.jpg" src="uploads/_2740.jpg?version=1&modificationDate=0&api=v2" data-image-src="/download/attachments//%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_31.jpg?version=1&modificationDate=0&api=v2" data-unresolved-comment-count="0" data-linked-resource-id="" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="微信图片_31.jpg" data-base-url="http://www.finedevelop.com" data-linked-resource-content-type="image/jpeg" data-linked-resource-container-id="" data-linked-resource-container-version="9" data-location="扩展开发 > [app]定时任务推送消息至app > 微信图片_31.jpg" data-image-height="533" data-image-width="300" data-mce-src="uploads/_2740.jpg?version=1&modificationDate=0&api=v2"> [app]定时任务推送消息至app > 微信图片_35.jpg" src="uploads/_7346.jpg?version=1&modificationDate=0&api=v2" data-image-src="/download/attachments//%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_35.jpg?version=1&modificationDate=0&api=v2" data-unresolved-comment-count="0" data-linked-resource-id="" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="微信图片_35.jpg" data-base-url="http://www.finedevelop.com" data-linked-resource-content-type="image/jpeg" data-linked-resource-container-id="" data-linked-resource-container-version="9" data-location="扩展开发 > [app]定时任务推送消息至app > 微信图片_35.jpg" data-image-height="533" data-image-width="300" data-mce-src="uploads/_7346.jpg?version=1&modificationDate=0&api=v2">
下载次数:0
如果您认为本文档还有待完善,请
文档内容仅供参考,如果你需要获取更多帮助,请咨询
关于技术问题,您还可以前往,点击顶部搜索框旁边的提问按钮
若您还有其他非技术类问题,可以联系帆软传说哥(qq:)
此页面有帮助吗?是否QuickBI助你成为分析师-邮件定时推送
创建报表过程中经常需要将报表情况定时推送给其他用户,及时了解数据情况。高级版本邮件推送功能支持仪表板周期性推送到订阅人,默认以当前登录者视角查看,同时支持结合 行级权限进行权限控制 和 结合全局参数功能确定邮件推送内容参数,具体操作步骤如下:
步骤一 设置行级权限
如下图为当前登录者设置行级权限,则邮件推送仪表板截图基于此权限展示:
行级权限设置详情请参考:行级权限设置
步骤二 创建仪表板并保存
创建仪表板,添加查询控件选择 相对时间,保存仪表板为 邮件推送测试:
步骤三 设置全局参数并保存
点击右上角 设置-全局参数 确定邮件任务参数:
如下图,选择‘订单等级’字段,参数命名为order_level:
点击确定,保存设置。
步骤四 新建邮件任务
按照 主导航栏-订阅-新建 路径新建邮件任务:
步骤五 点击设置邮件推送信息
1.邮件标题为必填项,允许填写 中英文、数字以及下划线,最长51个字符。
2.邮件开头,可以设置标题、文本、区块以及对齐方式等格式,还可以设置字体颜色、字号以及背景色、超链接等。
3.选择需要推送的仪表板: 邮件推送测试。
4.邮件内容则默认为本仪表板名称。
5.选择仪表板后,出现 参数 设置项,即为 步骤一中设置全局参数内容,参数不可再修改,设置参数值后,邮件推送截图展示基于此参数条件设置。
6.填写邮件结尾,非必填项。
7.负责人则默认为报表作者。
8.设置发送周期,可以按照需求选择设置,如下示例选择从20点20分到22点,每小时整点发送。
9.选择邮件发送的起始日期,未到该日期,邮件订阅不生效,如果设置了,则邮件会从开始发送。
10.选择收件人。
如上图,第二个收件人名称显示灰色,说明该账户没有设置邮箱等,若收件人未设置邮箱,则该收件人收不到邮件。请参考下面截图:在 我的- yunbi_default_space-空间设置-个人设置-个人信息 中填写必要信息。
最后右上角点击保存,设置完成。
另外可以在导航栏订阅,‘点点点’编辑区设置手动执行:
如下图,选择基准时间为,则仪表板中设置的查询条件的相对时间则是以此时间为基准,同时可以再次设置收件人:
以上邮件任务设置完成。
1.如果邮件发送失败,可以订阅 中查看日志:
2.只有有编辑报表权限的用户才可以编辑邮件订阅任务,以阅览者身份登录打开则不显示订阅任务无法编辑。
3.如果想要对邮件设置进行再次编辑,点击下图编辑按钮,若直接从仪表板中进入都是新建邮件:
本文作者:yuan0924
本文为云栖社区原创内容,未经允许不得转载。
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点技术的魅力就是永远在给你带来惊喜
多种方式实现Android定时任务
普通线程sleep的方式实现定时任务
Timer实现定时任务
ScheduledExecutorService实现定时任务
Handler实现定时任务
AlarmManager实现精确定时操作
1.普通线程sleep的方式实现定时任务
创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果,这是最常见的,可以快速简单地实现。但是这是Java中的实现方式,不建议使用
public class ThreadTask {
public static void main(String[] args) {
final long timeInterval = 1000;
Runnable runnable = new Runnable() {
public void run() {
while (true) {
System.out.println("execute task");
Thread.sleep(timeInterval);
} catch (InterruptedException e) {
e.printStackTrace();
Thread thread = new Thread(runnable);
thread.start();
和普通线程+sleep(long)+Handler的方式比,优势在于
可以控制TimerTask的启动和取消
第一次执行任务时可以指定delay的时间。
在实现时,Timer类调度任务,TimerTask则是通过在run()方法里实现具体任务(然后通过Handler与线程协同工作,接收线程的消息来更新主UI线程的内容)。
Timer实例可以调度多任务,它是线程安全的。当Timer的构造器被调用时,它创建了一个线程,这个线程可以用来调度任务。
* start Timer
protected synchronized void startPlayerTimer() {
stopPlayerTimer();
if (playTimer == null) {
playTimer = new PlayerTimer();
Timer m_musictask = new Timer();
m_musictask.schedule(playTimer, 5000, 5000);
* stop Timer
protected synchronized void stopPlayerTimer() {
if (playTimer != null) {
playTimer.cancel();
playTimer = null;
} catch (Exception e) {
e.printStackTrace();
public class PlayerTimer extends TimerTask {
public PlayerTimer() {
public void run() {
然而Timer是存在一些缺陷的
Timer在执行定时任务时只会创建一个线程,所以如果存在多个任务,且任务时间过长,超过了两个任务的间隔时间,会发生一些缺陷
如果Timer调度的某个TimerTask抛出异常,Timer会停止所有任务的运行
Timer执行周期任务时依赖系统时间,修改系统时间容易导致任务被挂起(如果当前时间小于执行时间)
Android中的Timer和java中的Timer还是有区别的,但是大体调用方式差不多
Android中需要根据页面的生命周期和显隐来控制Timer的启动和取消
ScheduledExecutorService实现定时任务
ScheduledExecutorService是从JDK1.5做为并发工具类被引进的,存在于java.util.concurrent,这是最理想的定时任务实现方式。
相比于上面两个方法,它有以下好处:
相比于Timer的单线程,它是通过线程池的方式来执行任务的,所以可以支持多个任务并发执行 ,而且弥补了上面所说的Timer的缺陷
可以很灵活的去设定第一次执行任务delay时间
提供了良好的约定,以便设定执行的时间间隔
public class ScheduledExecutorServiceTask
public static void main(String[] args)
final TimerTask task = new TimerTask()
public void run()
ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);
pool.scheduleAtFixedRate(task, 0 , 1000, TimeUnit.MILLISECONDS);
实际案例背景:
应用中多个页面涉及比赛信息展示(包括比赛状态,比赛结果),因此需要实时更新这些数据
思路分析:
多页面多接口刷新
就是每个需要刷新的页面基于自身需求基于特定接口定时刷新
每个页面要维护一个定时器,然后基于页面的生命周期和显隐进行定时器的开启和关闭(保证资源合理释放)
而且这里的刷新涉及到是刷新局部数据还是整体数据,刷新整体数据效率会比较低,显得非常笨重
多页面单接口刷新
接口给出一组需要实时进行刷新的比赛数据信息,客户端基于id进行统一过滤匹配
通过单例封装统一定时刷新回调接口(注意内存泄露的问题,页面销毁时关闭ScheduledExecutorService )
需要刷新的item统一调用,入口唯一,方便维护管理,扩展性好
局部刷新,效率高
public class PollingStateMachine implements INetCallback {
private static volatile PollingStateMachine instance = null;
private ScheduledExecutorS
public static final int TYPE_MATCH = 1;
private Map matchMap = new HashMap&&();
private List&WeakReference&View&& list = new ArrayList&&();
private PollingStateMachine() {
defineHandler();
pool = Executors.newSingleThreadScheduledExecutor();
pool.scheduleAtFixedRate(new Runnable() {
public void run() {
doTasks();
}, 0, 10, TimeUnit.SECONDS);
private void doTasks() {
ThreadPoolUtils.execute(new PollRunnable(this));
public static PollingStateMachine getInstance() {
if (instance == null) {
synchronized (PollingStateMachine.class) {
if (instance == null) {
instance = new PollingStateMachine();
public &VIEW extends View& void subscibeMatch(VIEW view, OnViewRefreshStatus onViewRefreshStatus) {
subscibe(TYPE_MATCH,view,onViewRefreshStatus);
private &VIEW extends View& void subscibe(int type, VIEW view, OnViewRefreshStatus onViewRefreshStatus) {
view.setTag(onViewRefreshStatus);
if (type == TYPE_MATCH) {
onViewRefreshStatus.update(view, matchMap);
for (WeakReference&View& viewSoftReference : list) {
View textView = viewSoftReference.get();
if (textView == view) {
WeakReference&View& viewSoftReference = new WeakReference&View&(view);
list.add(viewSoftReference);
public void updateView(final int type) {
Iterator&WeakReference&View&& iterator = list.iterator();
while (iterator.hasNext()) {
WeakReference&View& next = iterator.next();
final View view = next.get();
if (view == null) {
iterator.remove();
Object tag = view.getTag();
if (tag == null || !(tag instanceof OnViewRefreshStatus)) {
final OnViewRefreshStatus onViewRefreshStatus = (OnViewRefreshStatus)
handler.post(new Runnable() {
public void run() {
if (type == TYPE_MATCH) {
onViewRefreshStatus.update(view, matchMap);
public void clear() {
pool.shutdown();
instance = null;
private Handler defineHandler() {
if (handler == null && Looper.myLooper() == Looper.getMainLooper()) {
handler = new Handler();
public void onNetCallback(int type, Map msg) {
if (type == TYPE_MATCH) {
updateView(type);
需要刷新的item调用
PollingStateMachine.getInstance().subscibeMatch(tvScore, new OnViewRefreshStatus&ScoreItem, TextView&(matchViewItem.getMatchID()) {
public void OnViewRefreshStatus(TextView view, ScoreItem scoreItem) {
网络数据回调接口
public interface INetCallback {
void onNetCallback(int type,Map msg);
刷新回调接口:
public abstract class OnViewRefreshStatus&VALUE, VIEW extends View& {
private static final String TAG = OnViewRefreshStatus.class.getSimpleName();
private long
public OnViewRefreshStatus(long key) {
this.key =
public long getKey() {
public void update(final VIEW view, Map&Long, VALUE& map) {
final VALUE value = map.get(key);
if (value == null) {
OnViewRefreshStatus(view, value);
public abstract void OnViewRefreshStatus(VIEW view, VALUE value);
Handler实现定时任务
通过Handler延迟发送消息的形式实现定时任务。
这里通过一个定时发送socket心跳包的案例来介绍如何通过Handler完成定时任务
由于移动设备的网络的复杂性,经常会出现网络断开,如果没有心跳包的检测, 客户端只会在需要发送数据的时候才知道自己已经断线,会延误,甚至丢失服务器发送过来的数据。 所以需要提供心跳检测
下面的代码只是用来说明大体实现流程
WebSocket初始化成功后,就准备发送心跳包
每隔30s发送一次心跳
创建的时候初始化Handler,销毁的时候移除Handler消息队列
private static final long HEART_BEAT_RATE = 30 * 1000;
private Handler mH
private Runnable heartBeatRunnable = new Runnable() {
public void run() {
mHandler.postDelayed(this, HEART_BEAT_RATE);
public void onCreate() {
public void onConnected() {
mHandler.removeCallbacks(heartBeatRunnable);
mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);
public void onDestroy() {
mHandler.removeCallbacks(heartBeatRunnable)
注意:这里开启的runnable会在这个handler所依附线程中运行,如果handler是在UI线程中创建的,那么postDelayed的runnable自然也依附在主线程中。
AlarmManager实现精确定时操作
我们使用Timer或者handler的时候会发现,delay时间并没有那么准。如果我们需要一个严格准时的定时操作,那么就要用到AlarmManager,AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service.
在比赛开始前半个小时本地定时推送关注比赛的提醒信息
AndroidManifest.xml中声明一个全局广播接收器
android:name=".receiver.AlarmReceiver"
android:exported="false"&
android:name="${applicationId}.BROADCAST_ALARM" /&
接收到action为IntentConst.Action.matchRemind的广播就展示比赛
提醒的Notification
public class AlarmReceiver extends BroadcastReceiver {
private static final String TAG = "AlarmReceiver";
public void onReceive(Context context, Intent intent) {
if (intent == null) {
String action = intent.getAction();
if (TextUtils.equals(action, IntentConst.Action.matchRemind)) {
long matchID = intent.getLongExtra(Net.Param.ID, 0);
showNotificationRemindMe(context, matchID);
AlarmUtil提供设定闹铃和取消闹铃的两个方法
public class AlarmUtil {
private static final String TAG = "AlarmUtil";
public static void controlAlarm(Context context, long startTime,long matchId, Intent nextIntent) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, (int) matchId, nextIntent,
PendingIntent.FLAG_ONE_SHOT);
alarmManager.set(AlarmManager.RTC_WAKEUP, startTime, pendingIntent);
public static void cancelAlarm(Context context, String action,long matchId) {
Intent intent = new Intent(action);
PendingIntent sender = PendingIntent.getBroadcast(
context, (int) matchId, intent, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(sender);
关注比赛的时候,会设置intent的action为IntentConst.Action.matchRemind,会根据比赛的开始时间提前半小时设定闹铃时间,取消关注比赛同时取消闹铃
if (isSetAlarm) {
long start_tm = matchInfo.getStart_tm()
long warmTime = start_tm - 30 * 60
Intent intent = new Intent(IntentConst.Action.matchRemind)
intent.putExtra(Net.Param.ID, matchInfo.getId())
AlarmUtil.controlAlarm(context, warmTime * 1000,matchInfo.getId(), intent)
Gson gson = new Gson()
String json = gson.toJson(matchInfo)
SportDao.getInstance(context).insertMatchFollow(eventID, matchInfo.getId(), json, matchInfo.getType())
AlarmUtil.cancelAlarm(context, IntentConst.Action.matchRemind,matchInfo.getId())
SportDao.getInstance(context).deleteMatchFollowByID(matchInfo.getId())
android service 后台执行定时任务
Android 定时任务的多种实现方式
Android定时任务及闹钟的实现
Android定时任务及循环任务基础大集合
AlarmManager-系统推荐的定时任务
Android定时执行任务
android中的定时任务
Android 定时器方法详解
Android每天定时任务启动方法
Android后台定时任务分析
没有更多推荐了,利用php-cli和任务计划实现刷新token功能的方法-编程语言|编程教学|编程知识|编程|hysql编程教学
您好!欢迎来到我的博客!
hysql.org技术站
当前位置: >
利用php-cli和任务计划实现刷新token功能的方法
1、业务需求
需要实现这样一个功能:在第三方授权的认证当中,在用户首次登录授权我们会得到一个access_token,有效期为25小时,还会得到一个refresh_token,有效期为30天。
我们只要保存好这个refresh_token,在30天内我们都可以用这个refresh_token去请求一个api,他会返回一个新的access_token。这样我们只需要让用户授权一次,我们就可以获得长达30天的一个授权期限。
这里可以分为几个点:
&1&这个应该是要定期执行的一个任务。
25小时才会过期,那么我们12小时刷一次就足够了,并不需要很频繁的刷新。假设这样一种情况:让一个页面持续的运行,用一个while的死循环去执行一个任务,执行完之后sleep很长一段时间,然后再继续执行。这样做也是可以的,但是比较占资源。他执行的时间很少,等待的时间却很长,没必要这样一直等待。
&2&这个应该不需要是一个可以访问到的页面。
是我们内部执行的一个任务,不需要是人人可以访问到的一个页面。
&3&这个页面应该也要和框架融合在一起,可以访问到各种资源。
一个普通的php页面恐怕是不行的,我们需要跟框架融合的一个页面,需要可以访问到各种资源,比如说redis,比如说config,等等。
2、用cli模式运行codeigniter的页面
&1&cli的页面特性
什么是cli模式?就是命令行模式。我们可以不用url来访问php页面,而使用命令行来访问,这是可以的。
对页面来说,什么都不需要改变,比如:
&同样要是一个普通的controller,要继承自CI_Controller;
&要定义路由器,这个页面必须也是经由路由访问得到;
&甚至仍然可以添加这样的声明
defined('BASEPATH') OR exit('No direct script access allowed');
&可以通过添加一个判断让页面只能让cli访问:
public function __construct()
parent::__construct();
if (!is_cli())
exit("不正确的访问方式");
&通过echo打印在命令行上面,就如打印在页面上一样
&2&怎么通过命令行访问
cd E:\xxx\xxx\phpSite& //网站的根目录,即index.php所在目录
php index.php aaa bbb ccc& //即访问网址为yourdomain.com/index.php/aaa/bbb/ccc这样的地址注意:
&第一行是转到网站根目录这个路径;
&第二行php是调用了php.exe这个是因为我们有设置php的环境变量;
&index.php不可以缺少,因为这里我们没有走服务器了,没有经过服务器的url-rewrite,所以这个index.php是必不可少的。
我们可以将这两行代码放在一个文本文件里面,将名字改为refresh.bat,双击这个bat文件,他就会执行一次,相当于打开命令行来执行
如果我们需要调试的话,不要让弹出的命令行自动关掉,我们可以在加上第三行代码,加一个单词就可以了:pause
他就会停住并且显示相关的信息方便我们调试。
&3&页面调试
如下例子,此页面通过把一个值每刷新页面一次累加一次,存在redis里,来验证页面是否有被访问过:
defined('BASEPATH') OR exit('No direct script access allowed');
* Created by PhpStorm.
* Time: 23:18
class Refresh_token extends CI_Controller
public function __construct()
parent::__construct();
if (!is_cli())
exit("不正确的访问方式");
public function index()
$oldData = $this-&redis_model-&get_access_token('1234');
if ($oldData == null)
$oldData = 0;
$newData = $oldData + 1;
$this-&redis_model-&set_access_token('1234',$newData);
echo 'its refresh_token page!';
3、创建计划任务让他运行bat文件
4、刷新token
&1&命名的规则
刷新token首先想到的是遍历redis。redis那么多应该怎么遍历?我想到的是给不同类型redis设定不同的前缀。
比如说,所有用户的refresh_token的key都这样写:"refresh_token_用户id"。然后用redis的模式匹配就可以把以"refresh_token_"开头的key找出来,然后一条条处理。
&2&redis遍历
首先,redis是有模式识别的功能,参见手册:https://redis.io/commands/keys
其次,php原生的redis组件是有这个模式识别的功能。原生的用法大概是这样:
// 原生redis类库,不需要config/redis.php
$redis = new Redis();
$redis-&connect('127.0.0.1',6379);
//$redis-&set('key10','xx10',20);//第三个参数是存续时间,单位是秒,如果不填则为永久
echo $redis-&get('key10');
大致说一下,ci框架的redis操作api呢是在php原生的api上面进行了一层封装,而他这个封装呢不包括这个模式识别。
本人的自定义操作api是从框架api直接拷贝过来的,也是为了方便添加更多方法。在原生的框架上面添加总归不太好,比如说将来要升级、移植等问题。写成自己的类库想怎么改怎么改。
下面是添加这个模式识别api:
public function keys($pattern)
return $this-&_redis-&keys($pattern);
然后在model里面这样调用:
public function get_keys($pattern)
return $this-&rediscli-&default-&keys($pattern);
然后在controller里面使用:
$this-&redis_model-&set_redis('hello'.'1','my_hello_1',12345);
$this-&redis_model-&set_redis('hello'.'2','my_hello_2',12345);
$this-&redis_model-&set_redis('hello'.'3','my_hello_3',12345);
$vals = $this-&redis_model-&get_keys('hello'.'*');
if ($vals != null)//注意这里,他是一个array,如果返回的是匹配到0个,那么不会是一个空的有效的0长度的array,而确实是一个null。
foreach ($vals as $val)
echo '&/br&';
这样就可以完成对特定前缀的遍历了!
注意:这里要特别说明一下,我们在写入这个token的时候,会将有效期写进去,那么只要这个有效期的值是正确的,我们取到这个token必定是有效的,那么我们拿这个有效的token去刷新,必然是成功的。一般不存在刷新失败的情况。因为这个token一旦失效我们也就取不到了。
以上这篇利用php-cli和任务计划实现刷新token功能的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:php版微信开发Token验证失败或请求URL超时问题的解决方法验证token、回复图文\文本、推送消息的实用微信类php代码关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题PHP Token(令牌)设计PHP令牌 Token改进版PHP定时任务获取微信access_token的方法php表单加入Token防止重复提交的方法分析PHP使用token防止表单重复提交的方法基于thinkPHP3.2实现微信接入及查询token值的方法php token使用与验证示例【测试可用】
相关拓展:艾美妮服饰批发网发展历史2005年9月,经过多年的调研、规划。公司总部决定将中国市场作为主要服务对象,并由欧洲和香港设计师全程策划,组成一支完善的设计团队,并力争在五年内打造出一个真正属于中国消费的名牌。2007年7月 艾美妮服饰批发网官方网站与淘宝网合作,开通商品信息导出功能、产品同步以及订单同步功能,可以实现代理产品信息订单信息同步功能。2008年9月 艾美妮服饰批将生产线迁移至中国服装加工重市广州,同期在中国内地进行品牌的开发与生产;并对内地的市场进行全面的预测与调研。2010年7月 艾美妮服饰批发网官方网站与拍拍网合作,开通商品信息导出、产品同步以及订单同步功能,可以实现代理产品信息订单信息同步功能。
下一篇:没有了
6490819访问次数

我要回帖

更多关于 定时任务推送 的文章

 

随机推荐