php实际开发过程,4.工作实际开发应用

**本文以thinkphp5中扩展 think-queue的应用为实例**

1.安装think-queue 扩展

```

composer install topthink/think-queue

```

2.index模块下新建控制器,调用消息队列入队

~~~

```

namespace app\index\controller;

/**

* 文件路径: \application\index\controller\JobTest.php

* 该控制器的业务代码中借助了thinkphp-queue 库,将一个消息推送到消息队列

*/

use think\Exception;

use think\Queue;

use think\Log;

class JobTest

{

/**

* 一个使用了队列的 action

*/

public function actionWithHelloJob($msg){

// 1.当前任务将由哪个类来负责处理。

// 当轮到该任务时,系统将生成一个该类的实例,并调用其 fire 方法

$jobHandlerClassName = 'app\index\job\Hello'; // 对应job下处理的消息类

// 2.当前任务归属的队列名称,如果为新队列,会自动创建

$jobQueueName = "helloJobQueue";

// 3.当前任务所需的业务数据 . 不能为 resource 类型,其他类型最终将转化为json形式的字符串

// ( jobData 为对象时,存储其public属性的键值对 )

$jobData = [ 'ts' => time(), 'bizId' => uniqid() , 'a' => 1, 'msg'=>$msg , 'time'=>date('Y-m-d H:i:s') ] ;

// 4.将该任务推送到消息队列,等待对应的消费者去执行

$isPushed = Queue::push( $jobHandlerClassName , $jobData , $jobQueueName );

// database 驱动时,返回值为 1|false ; redis 驱动时,返回值为 随机字符串|false

if( $isPushed !== false ){

return date('Y-m-d H:i:s') . " a new Hello Job is Pushed to the MQ"."
";

}else{

return 'Oops, something went wrong.';

}

}

public function actionWithMultiTask($whichTask){

$taskType = $_GET['taskType'];

switch ($whichTask) {

case 'taskA':

$jobHandlerClassName = 'application\index\job\MultiTask@taskA';

$jobDataArr = ['a' => '1'];

$jobQueueName = "multiTaskJobQueue";

break;

case 'taskB':

$jobHandlerClassName = 'application\index\job\MultiTask@taskB';

$jobDataArr = ['b' => '2'];

$jobQueueName = "multiTaskJobQueue";

break;

default:

break;

}

$isPushed = Queue::push($jobHandlerClassName, $jobDataArr, $jobQueueName);

if ($isPushed !== false) {

echo("the $taskType of MultiTask Job has been Pushed to ".$jobQueueName ."
");

}else{

throw new Exception("push a new $taskType of MultiTask Job Failed!");

}

}

}

~~~

```

3.index模块下新建job目录,供调用处理进入消息队列的消息

namespace app\index\job;

use think\Log;

use think\queue\Job;

/**

* 文件路径: \application\index\job\Hello.php

* 这是一个消费者类,用于处理 helloJobQueue 队列中的任务

*/

class Hello

{

/**

* fire方法是消息队列默认调用的方法

* @param Job $job 当前的任务对象

* @param array|mixed $data 发布任务时自定义的数据

*/

public function fire(Job $job,$data)

{

// 有些消息在到达消费者时,可能已经不再需要执行了

$isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);

if(!$isJobStillNeedToBeDone){

$job->delete();

return;

}

$isJobDone = $this->doHelloJob($data);

if ($isJobDone) {

// 如果任务执行成功, 记得删除任务

$job->delete();

print("Hello Job has been done and deleted"."\n");

}else{

if ($job->attempts() > 3) {

//通过这个方法可以检查这个任务已经重试了几次了

print("Hello Job has been retried more than 3 times!"."\n");

$job->delete();

// 也可以重新发布这个任务

//print("Hello Job will be availabe again after 2s."."\n");

//$job->release(2); //$delay为延迟时间,表示该任务延迟2秒后再执行

}

}

}

/**

* 有些消息在到达消费者时,可能已经不再需要执行了

* @param array|mixed $data 发布任务时自定义的数据

* @return boolean 任务执行的结果

*/

private function checkDatabaseToSeeIfJobNeedToBeDone($data){

return true;

}

private function doHelloJob($data) {

// 根据消息中的数据进行实际的业务处理...

$this->testWriteLog($data['msg'],$data['time']);

print("Hello Job Started. job Data is: ".var_export($data,true)." \n");

print("Hello Job is Fired at " . date('Y-m-d H:i:s') ." \n");

print("Hello Job is Done!"." \n");

return true;

}

/**

* 耗时方法,测试是否异步执行

*

*/

public function testWriteLog($msg,$time)

{

sleep(30);

Log::info('测试异步执行:'.$msg.'-'.$time.'-当前时间:'.date('Y-m-d H:i:s'));

}

}

```

4.windows下执行进入项目根目录 php think queue:listen 监听消息队列发布进入

5.启动 本地redis

6.访问控制器,发布消息队列任务

7.启动消息队列执行出 php think queue:work --queue helloJobQueue

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

引导性GCP:带有Google Cloud Pub / Sub的Spring Cloud Stream

我最近在Sprint Central的工程博客上阅读了Josh Long的Bootiful GCP系列 ,特别喜欢关于使用Google Cloud的Pub / Sub的第四部分 。 我受到该系列的启发,同时我还在为我的一个新项目评估Spring Cloud Stream。 我以为,我会继续讨论乔希&#x…

【渝粤题库】陕西师范大学202241 金融市场学 作业(专升本)

《金融市场学》作业 一 名词解释 1.货币头寸   2.金边债券   3.二板市场 4.金融市场 5.投资基金 6.系统风险 7.外汇市场 8.货币市场共同基金 9.衍生证券 10&#x…

【渝粤题库】陕西师范大学210002儿童文学 作业(高起专、高起本、专升本)

《儿童文学》作业 单选题 1、构成作品音响效果的因素是象声词、韵律和( )。 2、幼儿文学作品用词的总要求是:具体、浅显、充分发挥( )作用 3、在儿童文学创作艺术手法的运用中应注意心理描写和( &#xff…

db2 迁移mysql,mysql 迁移 db2

我该怎样迁移数据呢?如果用于非 IBM 平台的数据库模式与用于 DB2 的模式相同(或非常类似),那么可 以通过使用 IBM Migration Toolkit (MTK) 来完成数据迁移。因此......4. . 迁移应用程序 1.不同数据库的对象区别 Mysql/Sql Server->oracle 自增长 vs 序列 Oracle->DB2 …

jdbc和jdbc驱动_JDBC布尔兼容性列表

jdbc和jdbc驱动有趣的是,布尔类型只是在SQL标准后期才引入,即SQL:1999 。 即使在今天,并非所有数据库本身都支持BOOLEAN或BIT类型。 最重要的是,我们仍然可以在Oracle中等待一段时间。 这是2002年以来关于该主题的“问…

【渝粤题库】陕西师范大学300008 历史教学论

《历史教学论》作业 一、名词解释 1.历史课程标准 2.综合课型 3.讲述法 4.历史基础知识 5.历史教材 6.历史概念 7.复习课 8.讲解法 9.叙述法 10.绪论课 11&am…

【渝粤题库】陕西师范大学500013 物理教学论 作业(专升本)

《物理教学论》作业 一、简答题 1、中学物理教学应坚持哪些主要的教学原则? 2、适应新课程教学物理教师应具备怎样的智能结构? 3、中学生学习物理的主要思维特征是什么? 4、发展性课程评价体系的基本理念和原则是什么? 5、物理教学…

IDE日志分析方法pt。 1个

介绍 我认为大多数软件工程师都了解日志的重要性。 它们已成为软件开发的一部分。 如果无法解决问题,我们尝试在日志中查找原因。 对于一些简单的情况,当错误阻止应用程序打开窗口时,这可能就足够了。 您可以在日志中找到问题,然后…

ycms+php,CMS下载_建站大师 - 建站模板,CMS模板,网站开发

增加后台和用户中心可查看升级值的记录[12-14]增加后台为用户充值升级值的功能[12-14]增加后台列表的字段回调格式函数:联动菜单名称、单选字段名称、下拉字段名称、复选框名称[12-16]增加钩子接口:模块内容审核处理之后(module_verify_after)[12-17]增加…

【渝粤题库】陕西师范大学700011 新课程改革与生物教材研究

《新课程改革与生物教材研究》作业 一、选择题 1、1921年弗雷德里克班廷从狗的体内分离得到天然胰岛素。40多年后,首次人工合成结晶牛胰岛素的科学家是 A.中国人 B.加拿大人 C.美国人 D.德国人 2、轴突是神经细胞的 A&…

国家开放大学2021春1050金融理论前沿课题题目

教育 教育 试卷代号: 1050 2021年春季学期期末统一考试 金融理论前沿课题 试题(开卷) 2021年7月 一、名词解释(每小题5分,共15分) 1.骆驼评级体系: 2.经济数据偏差: 3.核心通货膨胀…

java运行构建期间出错_构建和运行Java 8支持

java运行构建期间出错尚未提供对Java 8的Eclipse支持。 如果要使用它,则必须构建它。 Eclipsepedia的JDT Core / Java8页面包含有关使用Eclipse Java开发工具 (JDT)中不断发展的Java 8支持源来设置开发环境的说明。 说明中缺少一些内容&#…

php ord函数 中文,php ord 函数与中文乱码解决方法_PHP教程

//a字符$str(pack(“a*”, “中国”));echo $str,””,strlen($str),”字节n”;getascill($str);//h字符$str(pack(“h*”, “fffe”));echo $str,””,strlen($str),”字节n”;getascill($str);//c字符$str(pack(“c*”, “55”,”56″,”57″));echo $str,””,strlen($str),…

从Commons CLI迁移到picocli

最初于2002年发布的Apache Commons CLI可能是使用最广泛的Java命令行解析器,但是它的API显示了它的年龄。 寻找具有最少样板代码的现代方法的应用可能对picocli感兴趣。 为什么要花麻烦的钱进行迁移,以及如何将基于Commons CLI的应用程序迁移到picocli&a…

怎么设置php的css颜色代码,CSS的文本字体颜色如何设置

这里要介绍的是网页设置颜色包含有哪些;网页颜色规定规范。1、常用颜色地方包含:字体颜色、超链接颜色、网页背景颜色、边框颜色2、颜色规范与颜色规定:网页使用RGB模式颜色网页中颜色的运用是网页必不可少的一个元素。使用颜色目的在于有区别…

QuickBooks和Sage数据导出器

许多中小企业都使用QuickBooks作为其会计模块。 同样,许多公司也使用Sage进行会计处理。 他们中的大多数人在需要从这些系统中导出数据时会遇到问题。 在线提供的许多连接器价格昂贵,无法满足确切的要求。 随附的是一些简短的代码段,这些代码…

php+easyui+上传文件,easyui 上传文件代码

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.IO;using BLL;using m Model;using System.Data;using System.Data.SqlClient;using System.Text;namespace Web.Handler{/// /// AddOppportunityHandler 的摘要说明/// pub…

java 8 集合分组_Java 8:按集合分组

java 8 集合分组在继续阅读Venkat Subramaniam的“ Java函数式编程 ”时,我到达了介绍Stream#collect函数的那部分。 我们想收集一个人,按年龄分组并返回一张方便的地图(年龄->人的名字)。 要刷新,这是…

请编写一个php程序,(笔试题)php练习笔试题(一) 编写程序(请任选两题)

简答题1.写出5个以上你所知道的常用的Linux命令和它的功能cat,显示文件内容。cd,改变目录路径。cp,复制文件。find,查找文件。grep,搜索、过滤信息。ls,列出目录信息。more,分页显示。rm&#x…

python str translate,str.translate() --文本过滤和处理

问题: 想清除整个范围的字符,或者去掉音符1、使用str.translate()s python\fis\tawesome\r\n# 第一步是清理空格,可以先建立一个小型的转换表,然后使用reanslate()方法remap {ord(\t): ,ord(\f): ,ord(\r): None}a s.translate(remap)aO…