php 生产者-消费者实现

一、项目背景

        mes报工需求,原项目接口接收产线上位抛来的数据,处理无误后存储在本地,最后抛给工厂接口。

        但是有时候工厂数据响应太慢,也导致mes响应给上位变慢,拖慢了mes系统。

        现要求,将原接口中抛给工厂的功能分离出来。即,上位抛来数据处理无误并存储在本地后,直接返回给上位,而将数据抛给工厂的部分实现异步处理。

二、思路

        首先想到的是多线程,但是php是不支持多线程的,想要实现多线程需要下载各种插件,十分麻烦。最终我们采用了生产者-消费者的模式来实现。

三、生产者-消费者的简单介绍

        通俗讲,A是发糖的,B是吃糖的,但是B只能一个一个吃,如果A发糖的速度高于B吃糖的速度,那么就会出现A发了糖,B还没有吃的情况。那怎么办呢,A找来一个盒子,把要发给B的糖放在里面,B吃完了嘴里的糖就自行从盒子里取,双方各不耽误。

        这样就相当于一个简单的生产者-消费者模型。A是生产者,B是消费者,盒子是内存空间。A不需要理会B的状态,他会把数据放在特定的内存中;而B同样不和A有牵扯,在当前数据处理完后,只管从内存中拿数据。

四、实现

1)安装redis服务(也可以选择其他的,我用的是redis,所以只介绍redis)

        Releases · microsoftarchive/redis

         注意 :安装过程是全英文的,一定要选择将redis添加到环境变量!另外,记住自己的端口!默认是6379。

2)在php安装路径的ext文件夹中添加拓展

        下载链接:https://downloads.php.net/~windows/pecl/releases/redis/5.3.3/php_redis-5.3.3-7.3-ts-vc15-x64.zip

3)编辑php.ini

        加入extension=redis,如果前面有;删掉即可。

4)生产者实现

	// 连接 Redis 服务器$redis = new Redis();$redis->connect('127.0.0.1', 6379);// 消息队列名$queue = 'message';// 生成消息$message = json_encode($jsonData);// 将消息推送到 Redis 队列中$redis->lPush($queue, $message);

5)消费者实现

        rPop()弹出最早的消息,lPop()弹出最新的消息。

$redis = new Redis();// 连接到 Redis 服务器
$redis->connect('127.0.0.1', 6379);while (true) {// 从队列 'message' 弹出消息$message = $redis->rPop('message');// 如果有消息,处理消息if ($message) {print_r("上传中...");// 初始化 cURL 会话$ch = curl_init($url);// 设置 cURL 选项curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_POSTFIELDS, $message);// 执行 cURL 会话$response = curl_exec($ch);// 检查是否有错误发生if (curl_errno($ch)) {log_write('Error:' . curl_error($ch));}$message = json_decode($message);// 关闭 cURL 会话curl_close($ch);$LogIppsot = $_SERVER['REMOTE_ADDR'];$PostStrpost = json_encode($message, JSON_UNESCAPED_UNICODE);$LogContentpost = $response;$LogTimepost = date("Y-m-d H:i:s", time());$glmesconn_errpost = sql_mes_conn();$logsqlstrpost = "insert into Log_Plc_Api(LogFrom,LogIp,PostStr,LogContent,LogTime) values ('AddEquipInfo','$LogIppsot','$PostStrpost','$LogContentpost','$LogTimepost')";sqlsrv_query($glmesconn_errpost, $logsqlstrpost);sqlsrv_close($glmesconn_errpost);} else {// 如果队列为空,稍等再试print_r("waiting...\n");sleep(1);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot 解决跨域问题

SpringBoot 解决跨域问题 遇到前端跨域访问问题,类似于这样的: 在Springboot项目里加上这个配置文件CorsConfig.java,重启之后即可实现跨域访问,前端无需再配置跨域。 1、添加跨域工具包CorsConfig 2、写跨域代码 import org.sp…

IO基础(缓冲流)

FileInputStream、FileOutputStream、FileReader、FileWriter属于基础流。 缓冲流是高级流。能够高效的处理数据。原理:底层自带了长度为8192的缓冲区提高性能 字节缓冲流:BufferedInputStream、BufferedOutputStream 字符缓冲流:Buffered…

云数据库 Memcache

Memcached 是一个高性能的分布式内存缓存系统,主要用于加速动态网页应用的访问速度,通过减少数据库查询次数来提高系统性能。Memcached 将常用的数据存储在内存中,因此提供了非常快速的读取和写入操作,通常用于缓存热点数据&#…

高转化的Facebook广告文案的秘诀

Facebook 广告文案是制作有效 Facebook 广告的关键方面。它侧重于伴随广告视觉元素的文本内容。今天我们的博客将深入探讨成功的 Facebook 广告文案的秘密! 一、广告文案怎么写? 正文:这是帖子的正文,出现在您姓名的正下方。它可…

算法基础学习Day2(双指针)

文章目录 1.题目2.题目解答1.快乐数题目及题目解析算法学习代码提交 2.题目2题目及题目解析算法学习代码提交 1.题目 202. 快乐数 - 力扣(LeetCode)11. 盛最多水的容器 - 力扣(LeetCode) 2.题目解答 1.快乐数 题目及题目解析 …

Web3与人工智能的跨界融合:数据隐私与去中心化的新机遇

随着Web3和人工智能(AI)技术的不断发展,两者的结合正在成为未来互联网的重要趋势。Web3代表着去中心化的未来,AI则提供了强大的智能化能力。当这两者结合时,不仅为数据隐私保护提供了新的解决方案,还推动了…

DevOps系统设计和技术选型

命名是一件痛苦的事情,除非你不想要一个好名字。 我正在做的这个管理系统叫什么合适,或者是什么类型的系统,想去想来不知所措,后来想想这么小的东西纠结什么,先从小的细节一点点来,能用就行,就用…

2024年华中杯数学建模A题太阳能路灯光伏板的朝向设计问题解题全过程文档及程序

2024年华中杯数学建模 A题 太阳能路灯光伏板的朝向设计问题 原题再现 太阳能路灯由太阳能电池板组件部分(包括支架)、LED灯头、控制箱(包含控制器、蓄电池)、市电辅助器和灯杆几部分构成。太阳能电池板通过支架固定在灯杆上端。…

sheng的学习笔记-AI-序列模型(Sequence Models),RNN,GRU,LSTM

Ai目录:sheng的学习笔记-AI目录-CSDN博客 基础知识 定义: 序列模型是输入输出均为序列数据的模型,它能够将输入序列数据转换为目标序列数据。常见的序列模型类型包括一对一、一对多、多对一、部分多对多和完全多对多。 重要的是需要有顺序…

《网络安全》相关知识点总结

第一章 安全现状及趋势 第二章 网络安全概述 2.1 信息保障阶段 信息保障技术框架IATF: 由美国国家安全局制定,提出“纵深防御策略” DiD(Defense-in-Depth Strategy) 在信息保障的概念下,信息安全保障的PDRR模型的内涵…

DApp浏览器能否集成在自己开发的DApp里?

答案是肯定的。在技术层面,DApp浏览器可以完全集成到你自己开发的DApp中,从而提供一个一体化的用户体验。本文将详细分析如何实现这一目标,以及其中的技术实现、优势和需要注意的问题。 一、什么是DApp浏览器? DApp浏览器是一种支…

MySQL--用户权限

1.使用root用户登录MySQL客户端,创建一个名为userl的用户,初始密码为123456;创建一个名为user2的用户,无初始密码。然后,分别使用uesr1、user2登录MySQL 客户端。 创建两个用户 使用user1登录 使用user2登录 2.使用root用户登录&a…

星海智算:skl-videolingo-2.0(AI视频翻译)使用教程

(一)项目介绍 VideoLingo是一款专为视频创作者设计的开源自动化工具,旨在提供从视频字幕生成到声音克隆配音的一站式服务。以下是对VideoLingo的详细介绍: 1、核心功能​ 1.1、一键全自动视频搬运​ 支持从YouTube等平台下载视…

SQL靶场第八关攻略

一.判断类型 输入?id1 and 11-- 输入?id1 and 12--页面都正常,说明不是数值型 输入?id1页面没有回显 加上--页面正常,说明是字符型注入 二.判断列数 输入?id1 order by 3--页面正常 输入?id1 order by 4--页面没有回显,说明一共有三列…

华为HCIP-Datacom H12-821H12-831 (12月最新题库)

备考HCIP-datacom的小伙伴注意啦 !!! 2024年下半年12月份最新(H12-821和H12-831)题库带解析,有需要的小伙伴移动至文章末 H12-821: H12-831: 1.BGP 邻居建立过程的状态存在以下几种:那么建立一个成功的连接所经历的状态机顺序是 A、3-1-2-5-4 B、1-3-5-2-4 C、…

Flask使用长连接

Flask使用flask_socketio实现websocket Python中的单例模式 在HTTP通信中,连接复用(Connection Reuse)是一个重要的概念,它允许客户端和服务器在同一个TCP连接上发送和接收多个HTTP请求/响应,而不是为每个新的请求/响…

MR30分布式 I/O 模块助力 CNC 设备产能飞跃

背景分析 在现代制造业中,CNC 设备扮演着极为关键的角色。然而,CNC 设备在运行过程中也存在着诸多痛点。传统的 CNC 设备往往在控制与通信方面存在局限,其内部的 I/O 系统大多采用集中式架构。这种架构下,一旦需要处理大量的输入输…

远程修改ESXi 6.7管理IP地址

1.启用安全Shell(也就是EXSi可以被SSH访问的功能) 2.使用SecureCRT SSH2连接ESXi主机,现在使用dcui并没有任何反应,在Session标签栏右键点击Disconnect。 The time and date of this login have been sent to the system logs.WA…

Vulnhub靶场 Kioptrix: Level 1 (#1) 练习

目录 0x00 环境准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 方法一:mod_ssl 2.8.42. 方法二:CVE-2003-02013. 方法三:Samba 0x04 总结 0x00 环境准备 下载链接:http://www.kioptrix.com/dlvm/Kioptrix_Level_1.…

消息中间件-Kafka3-kafkaJavaClient小例

消息中间件-Kafka3-kafkaJavaClient小例 Kafak Java Client private static final String KAFKA_TOPIC "kafak-test";private static String bootstrapServers "localhost:9092";private static AdminClient client null;static {Properties config n…