当前位置: 首页 > 软件库 > 程序开发 > >

Task-Schedule-PHP

php 任务调度框架
授权协议 GPL
开发语言 PHP
所属分类 程序开发
软件类型 开源软件
地区 国产
投 递 者 龙星渊
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

task-schedule-php

task-schedule-php是一个php任务调度框架,开发者可以使用这个框架来设置周期任务/一次性的延时任务后期异步执行。

动机:

  • 异步/不阻塞:用户操作的时候,服务器端除了和用户交互外,还会通知一些用户感知不到的外部系统,调用这些外部系统比较耗时,无法实时响应。因为这些任务不是主流程。可以将这些任务暂时存储起来,并将任务按照优先级(一般是任务预期执行的时间)进行排序,然后后期顺序执行这些任务,不阻塞主流程。

  • 重复/周期:有些任务任务不仅仅只执行一次,会多次重复性地执行。例如:外部系统的状态发生变化,但是外部系统不会主动地回调/推送通知我们(或者是外部系统主动推送的信道不良),我们会周期性地主动轮询外部系统的状态。

  • 延时处理。

典型的应用场景:

  • 乘客发起一次打车请求,服务器端可以先记录下乘客的打车请求,告知用户打车请求已经受理。服务器端后期想办法逐步将乘客的打车请求通知到周围的司机。

  • 支付系统在收到银行的支付成功回调通知后,先保证将支付状态写入数据库的主流程。然后想办法调用比较耗时的外部系统,将支付成功的消息推送到用户端App。

  • 用户在商户收银台生成一笔支付单后,如果没有在某个时间间隔之内收到银行的支付回调,收银台定期去银行轮询支付结果,直到知道用户在银行已经支付或者是超过最大轮询次数为止。

  • 用户在司机结束行程后,如果在30分钟内没有支付,服务端自动发起一次微信代扣请求。

运行环境

  •  PHP最低版本: 5.3.3.

  •  Redis环境:php需要安装PhpRedis扩展。

  •  Beanstalkd环境:需要beanstalkd的php客户端代码Pheanstalk,Pheanstalk代码已经内置包含在Libs-ThirdParty目录下。

例子

  • 例子程序可以在demo目录下找到。

  • 直接执行php ./demo/startRedis.php

  • 或者php ./demo/startBeanstalkd.php

  • 或者php ./demo/startPhp.php即可。

使用

在目录Core/Handlers目录下编写任务处理函数。

function helloWorld(){
    echo "\n\nhello world\n\n";
    return true;
}

实例化任务调度对象

$redisIp = '10.10.9.77';
$redisPort = '6379';
$redisTimeout = 2;
$redisClient = new \TaskSchedule\Libs\RedisWithReConnect($redisIp, $redisPort, $redisTimeout);

$scheduler = new \TaskSchedule\Core\TaskScheduler\RedisTaskSchedulerWithTransaction($redisClient);
$tasks = new \TaskSchedule\Core\Tasks\RedisTasks($redisClient);
$runner = new \TaskSchedule\Core\TaskRunner($taskResult);
$timeEvent = new \TaskSchedule\Core\TimeEvent\TimeEvent($scheduler, $tasks, $runner);

生产者将该任务添加到计划中。

$timeSpace = 2;
$type = \TaskSchedule\Core\Tasks\TasksInterface::RUN_REPEATED;
$func = 'helloWorld';

//注意,在add任务之前,先初始化下maxTaskId。
$timeEvent->add($timeSpace, $type, $func, $args = null);

消费者获取到任务并执行。

$runTimeLen = 5; 
$timeEvent->loop($runTimeLen);
  • task-schedule-php task-schedule-php是一个php任务调度框架,开发者可以使用这个框架来设置周期任务/一次性的延时任务后期异步执行。 ##动机: 异步/不阻塞:用户操作的时候,服务器端除了和用户交互外,还会通知一些用户感知不到的外部系统,调用这些外部系统比较耗时,无法实时响应。因为这些任务不是主流程。可以将这些任务暂时存储起来,并将任务按照优先级(一般是任务预期执行

  • /** * This file is part of php-task-schedule. * * Licensed under The MIT License * For full copyright and license information, please see the MIT-LICENSE.txt * Redistributions of files must retain the

  • /** * This file is part of php-task-schedule. * * Licensed under The MIT License * For full copyright and license information, please see the MIT-LICENSE.txt * Redistributions of files must retain the

  • 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3572 题目大意: 给N个任务,M台机器。每个任务有最早才能开始做的时间S,deadline E,和持续工作的时间P。每个任务可以分段进行,但是在同一时刻,一台机器最多只能执行一个任务. 问存不存在可行的工作时间。 解题思路: 由于时间<=500且每个任务都能断断续续的执行,那么我们把每一天时间作为一

  • 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3572 题意:有N个任务,有M个机器。每个任务必须在Si天或者以后开始做,在Ei 天或者之前完成,完成任务必须处理Pi 天。其中,每个任务可以在任意(空闲)机器上做,每个机器同一时刻只能做一个任务,每个任务同一时刻只能被一个机器做,而且任务做到一半可以打断,拿去其他机器做。问:能否在规定时间内把任务做完

  • 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3572 题意:有M个机器(代表一天可以同时干M天的工作),有N个任务。每个任务必须在Si或者以后开始做,在Ei或者之前完成,完成每个任务必须处理Pi个时间单位,问最后是否可以完成这N个任务 这个题的建图算是经典,因为限定每个时刻每台机器只能处理一个任务,所以可以把时间点分配给各个合法的机器...具体是先

  • 本文实例讲述了PHP实现简单的协程任务调度。分享给大家供大家参考,具体如下: class Task { protected $taskId; protected $coroutine; protected $sendValue = null; protected $beforeFirstYield = true; public function __construct($taskId, Gener

  • HDU 3572 Task Schedule(最大流) http://acm.hdu.edu.cn/showproblem.php?pid=3572 题意:        给N个任务,M台机器。每个任务有最早才能开始做的时间S,deadline E,和持续工作的时间P。每个任务可以分段进行,但是在同一时刻,一台机器最多只能执行一个任务. 问存不存在可行的工作时间。 分析:        由于时间<

  • 原问题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4907 #include<stdio.h> #include<string.h> #define maxn 200010 int a[maxn+10],b[maxn+10]; int main() {     int T,q,m,n,i,j;     scanf("%d",&T);     while

  • Work Queues (工作/任务队列) (using php-amqplib) In the first tutorial we wrote programs to send and receive messages from a named queue. In this one we'll create a Work Queue that will be used to distribute

  • 题目大意:中文的,就不解释了! 解题思路:直接预处理,两次哈希,一次标记是否存在,一次存储最优解。据说二分可以做的。 题目来源:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?pid=1001&cid=527 http://acm.hdu.edu.cn/showproblem.php?pid=4907 code: #incl

  • 任务调度 简介 过去,你可能需要在服务器上为每一个调度任务去创建 Cron 入口。但是这种方式很快就会变得不友好,因为这些任务调度不在源代码中,并且你每次都需要通过 SSH 链接登录到服务器中才能增加 Cron 入口。 Laravel 命令行调度器允许你在 Laravel 中对命令调度进行清晰流畅的定义。且使用这个任务调度器时,你只需要在你的服务器上创建单个 Cron 入口接口。你的任务调度在 a

  • http://acm.hdu.edu.cn/showproblem.php?pid=4907 给出一串数,表示在某个时间有一个任务,之后再给出m次询问,每次询问给出一个时间,问在这个时间如果多出来一个额外的任务,且只能在机器空闲的时间做,最早会在什么时间做,思路就是,如果某个时间点有任务,就往后找到第一个没任务的时间点,如果没有任务,则答案就是这个时间。 #include<iostream> #i

  • http://acm.hdu.edu.cn/showproblem.php?pid=3572 题意:给N个任务,M台机器。每个任务有最早才能开始做的时间S,deadline E,和持续工作的时间P。问存不存在可行的工作时间。 题解:最大流。主要问题在于建模……    建模:源点与每一个任务建边,容量为P;每一天与汇点建边,容量为M;每一个任务和天数建边,容量为1。    判断:判断最后求得最大流是

 相关资料
  • 简介 在过去,开发者必须在服务器上为每个任务生成单独的 Cron 项目。而令人头疼的是任务调度不受源代码控制,而且必须通过 SSH 连接到服务器上来增加 Cron 项目。 Laravel 的命令调度程序允许你在 Laravel 中对命令调度进行清晰流畅的定义。并且在使用调度程序时,只需要在服务器上增加一条 Cron 项目即可。调度是在 app/Console/Kernel.php 文件的 sche

  • 基本任务调度 方案1: 通过 @Cron 注解,这个需要依赖 cron4j 框架: //1分钟执行一次 @Cron("*/1 * * * *") public class MyTask implements Runnable { @Override public void run() { System.out.println("task running...");

  • 主要内容:1. 串行调度,2. 非串行调度从一个事务到另一个事务的一系列操作称为调度。 它用于保存每个单独事务中的操作顺序。 1. 串行调度 串行调度是一种调度,其中一个事务在开始另一个事务之前完全执行。 在串行调度中,当第一个事务完成其循环时,则执行下一个事务。 例如: 假设有两个事务和有一些操作。 如果它没有交错操作,那么有以下两种可能的结果: 执行的所有操作,然后执行的所有操作。 在给定的(b)图中,调度A显示了序列调度,其中之后跟

  • 我刚刚更新了 Play!框架到版本 2.1 和 scala 到版本 2.10... 现在我的游戏!应用程序已损坏。似乎Akka API已经发生了变化。我找不到现在使用的阿卡版本,但我认为这是最后一个版本...... 我刚刚阅读了迁移指南:http://doc.akka.io/docs/akka/2.1.0/project/migration-guide-2.0.x-2.1.x.html。 我相应地

  • 每个 gulp 任务(task)都是一个异步的 JavaScript 函数,此函数是一个可以接收 callback 作为参数的函数,或者是一个返回 stream、promise、event emitter、child process 或 observable (后面会详细讲解) 类型值的函数。由于某些平台的限制而不支持异步任务,因此 gulp 还提供了一个漂亮 替代品。 导出任务 任务(tasks

  • Ant构建文件是用XML编写的,它不允许像你喜欢的编程语言那样声明变量。 但是,正如您可能想象的那样,如果Ant允许声明项目名称,项目源目录等变量,那将非常有用。 Ant使用property元素,允许您指定属性。 这允许将属性从一个构建更改为另一个或从一个环境更改为另一个。 默认情况下,Ant提供以下可在构建文件中使用的预定义属性 - Sr.No. 属性和描述 1 ant.file 构建文件的完整