php 生产者-消费者实现

php+swoole+RabbitMQ实现的异步生产者与消费者 设计总说明 技术关键词 swoole php rabbitmq GuzzleHttp ElasticSearch Supervisor HTTP Linux monolog 说明 需求背景 PHP RabbitMQ扩展不支持连接池 连接池的作用主要是节省连接的时间。连接池机制预先打开N个连接,把它们缓存起来,当需要使用连接的时候就直接使用这些已经打开的连接,从而节省了时间。但PHP的RabbitMQ扩展为了兼容PHP-FPM模式,因为在PHP-FPM模式下是不能做连接池的,脚本在解释执行完毕后会释放所有的内 阅读详情

一、项目背景

        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)生产者实现

        lPush()从队列左边推入消息,rPush从队列右边推入消息。

	// 连接 Redis 服务器
	$redis = new Redis();
	$redis->connect('127.0.0.1', 6379);

	// 消息队列名
	$queue = 'message';

	// 生成消息
	$message = json_encode($jsonData);
	
	// 将消息推送到 Redis 队列中
	$redis->lPush($queue, $message);

5)消费者实现

        rPop()从队列右边取出消息,与lPush()结合使用弹出最早的消息,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);
    }
}

PHP实现生产者消费者问题(附完整源码) 阅读详情

相关推荐

PHP基于rabbitmq操作类的生产者和消费者功能示例

主要介绍了PHP基于rabbitmq操作类的生产者和消费者功能,结合实例形式分析了基于rabbitmq操作类的生产者和消费者定义与使用方法,需要的朋友可以参考下

手把手教你实现 生产者消费者模式

生产者消费者模式是一种并发设计模式,用于解决多线程环境下生产者和消费者之间的协作和数据共享问题。

胤凯的博客 1473

Ollama-OCR实战:5分钟搞定PDF文档转Markdown(附qwen2.5vl模型配置)

本文详细介绍了如何利用Ollama本地部署多模态大模型qwen2.5vl,结合OCR技术,实现PDF文档到Markdown的端到端智能转换。通过解析传统OCR的局限与AI方案的优势,并提供从环境搭建、提示词工程到处理复杂表格的完整实战指南,帮助用户高效构建自动化文档处理流水线,彻底重塑文档处理工作流。

yog99的博客 607

一看就懂系列之 php中的生产者and消费者模式

前言在工作中常常听到某某大牛之间的交谈会涉及到,xx消费者啊啥的,到底什么大牛之间讲的是什么? 这篇文章主要解决三个问题: 1.到底什么是生产者和消费者,以及它们之间的故事 2.它们之间靠什么交流 3.应用场景正文一、什么是生产者和消费者,以及它们之间的故事在实际的程序开发中,会经常碰到这样的情况:小a模块负责生产数据,这些数据由另外一个模块负责处理。产生数据的模块,就形象地称为生产者;而处

咖啡色的羊驼 5974

基于FPGA的图像预处理系统(图)

 北京机械工业学院 韩娟娟 邓文怡 娄小平 由于获取图像的工具或手段的影响,使获取图像无法完全体现原始图像的全部信息。因此,对图像进行预处理就显得非常重要。预处理的目的是改善图像数据,抑制不需要的变形或者增强某些对于后续处理来说比较重要的图像特征。通常根据预处理目的的不同,把预处理技术归为图像增强技术和图像分割技术两类。图像对比度处理是空间域图像增强的一种方法。由于图像灰度范围狭窄会使

lyzhangxianglove的专栏 1780

SAP PP模块MRP控制参数实战指南:从NETCH到NEUPL的深度解析

本文深入解析SAP PP模块中MRP控制参数的配置与应用,涵盖NETCH、NETPL和NEUPL三种运行模式的优化策略。通过实战案例和参数对比,帮助用户提升物料需求计划的效率和准确性,优化库存周转率和生产交付能力。

weixin_28419039的博客 245

php生产者消费者,生产者消费者模式实现(docker+beanstalkd+redis)

本地通过docker 安装redis和beanstalkd,还可以通过swoole 添加定时器,以及进行多进程进行消费#从仓库里将redis和beanstalkd下载docker pull redis:5.0.7docker pull schickling/beanstalkd#查看镜像列表docker images#将beanstalkd运行在docker容器并映射到本地主机11300端口doc...

weixin_36166752的博客 442

使用 Visual Studio Code 搭建 SAP UI5 本地开发环境

工欲善其事,必先利其器。时至今日,SAP 提供了非常多的 SAP UI5 开发工具,既包含本地搭建的,也包含浏览器里远端使用的工具,比如 WebIDE 和 Business Application Studio. 我们访问下面这个链接,就能找到所有这些工具的安装或者配置步骤: https://tools.hana.ondemand.com/#sapui5 如果想选择本地开发,SAP 推荐的工具是 Visual Studio Code,也就是本文要介绍的内容。 也可以下载 WebIDE 的本地安装包,将其安

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1万+

生产者/消费者模式(转载)

★简介     在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。     单单抽象出生产者和消费者,还够不上是生产者/消费者模式。该模式还需要有一个缓冲区处于生产者和消费者之间,作为一个中介。生产者把数据放入缓冲区,而

w57w57w57的专栏 3657

【通信】多径衰落信道的matlab仿真

1 简介 2 部分代码 clearf_c=1e3; %carrier frequency(no modulation)time_1 = (linspace (0, 10, 1000)); %timesignal_in = sin (2 * pi *f_c* time_1); %sine wave plot (time_1, signal_in, 'b');grid on;

qq_59747472的博客 1383

【光斑定位】空间激光通信、光斑定位、CCD、光斑定位——13000字

0.完整源码获得方式 订阅MATLAB/FPGA教程,免费获得教程案例以及任意2份完整源码 ----------------------------------------------------------------- 空间激光通信是指以光波作为载波进行数据传输的一种通信方式。目前,空间激光通信己成为人们关注的焦点。在空间激光通信系统中,光斑定位是是一项关键技术。 本论文首先对国内外空间激光通信系统的研究现状进行了阐述,论述了空间激光通信的理论只是,并对CCD成像原理,...

FPGA/MATLAB学习教程/源码/项目合作开发 1292

进程间同步互斥经典问题(一)生产者-消费者问题

问题描述:生产者-消费者问题,也叫做缓存绑定问题(bounded-buffer),是一个多进程同步问题。 即有两个进程:制造少和消费者,共享一个固定大小的缓存 制造商的工作是制造一段数据,放进缓存,如此重复。 消费者一次消费一段数据,从缓存中取出。 要保证不让制造商在缓存还是满的时候仍要向内写数据,不让消费者试图从空的缓存中取出数据。 问题分析: 要避免多个生产商竞争一个

llin-黎辰 1万+

educoder实训——计算几何形状的表面积与体积

educoder python实训

qq_41234663的博客 1230

php 生产者消费者_实现生产者和消费者

# 自动加载*boot.php*```// +----------------------------------------------------------------------// | boot.php// +----------------------------------------------------------------------// | Description: 自动...

weixin_28951585的博客 220

DRV8711驱动器的各寄存器的介绍

drv8711驱动器

PCLintelligence的博客 1636

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

php生产者可以有多个消费者,C#_基于C#实现的多生产者多消费者同步问题实例,本文实例讲述了基于C#实现的 - phpStudy...

基于C#实现的多生产者多消费者同步问题实例本文实例讲述了基于C#实现的多生产者多消费者同步问题,分享给大家供大家参考之用。具体代码如下:// 多个生产者和多个消费者,能生产n个产品的情况using System;using System.Threading;public class HoldIntegerSynchronized{private int[] buffer; //缓冲区private...

weixin_39916681的博客 225

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

php 生产者消费者_PHP基于rabbitmq操作类的生产者和消费者功能示例

本文实例讲述了PHP基于rabbitmq操作类的生产者和消费者功能。分享给大家供大家参考,具体如下:注意事项:1、accept.php消费者代码需要在命令行执行2、'username'=>'asdf','password'=>'123456' 改成自己的帐号和密码RabbitMQCommand.php操作类代码/** amqp协议操作类,可以访问rabbitMQ* 需先安装php_am...

weixin_31653645的博客 275

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

php使用kafka

安装librdkafka 库 git clone https://github.com/edenhill/librdkafka.git ./configure make sudo make install 安装php-rdkafka 扩展 $ git clone https://github.com/arnaud-lb/php-rdkafka.git #生成con...

fashion138的博客 1022

PHP代码简单实现RabbitMQ

window amqp扩展安装,php实现rabbitmq的消息推送和消息接收

做一个乐于分享的程序员 1556

php beanstalkd使用,PHP使用Beanstalkd实例详解

有关Beanstalkd的基本概念,编译和yum的安装方法已经在上篇文章《Beanstalkd消息/任务队列的详解》中介绍了,今天练习下PHP使用Beanstalkd的过程,我选择的是使用Pheanstalk类来连接Beanstalkd1.使用Composer安装Pheanstalkcomposer require pda/pheanstalk2.实现代码php查看beanstalkd状态脚本St...

weixin_35954566的博客 658

php-amqplib thinkphp,thinkphp使用AMQP库(支持RabbitMq)

1,安装依赖库composer require php-amqplib/php-amqplib地址:https://github.com/php-amqplib/php-amqplib2,mq生产者.phpinclude(__DIR__ . '../../public/config.php');use PhpAmqpLib\Connection\AMQPStreamConnection;use P...

weixin_33962315的博客 620

php rabbitmq操作类及生产者和消费者实例代码

注意事项: 1、accept.php消费者代码需要在命令行执行 2、'username'=>'asdf','password'=>'123456' 改成自己的帐号和密码 RabbitMQCommand.php操作类代码 <?php /* * amqp协议操作类,可以访问rabbitMQ * 需先安装php_amqp扩展 */ class RabbitMQCommand

爱代码也爱生活 7790

php运用redis订阅发布功能实现异步消息任务处理

话不多说直接上代码: 消费者代码:subscribe.php <?php set_time_limit(0); ini_set("default_socket_timeout",-1); $channel1="pubsub1";//频道1 $channel2="pubsub2";//频道2 try{ $redis=new Redis(); $redis->pconnect("127.0.0.1",6379); /** * [$callback 回调函数] * @$redis [当

不知道起什么名字 1179

php rdkafka实例,php使用rdkafka进行消费

如仅作为消费者或生产者,直接使用下面消费者或生产者的代码,并安装扩展即可。PHP要安装rdkafka扩展,而rdkafka又依赖librdkafka,因此你需要安装rdkafka和librdkafka,之后就可以与kafka服务器交互了。消费者/*** 代码中的输出注释都可以打开供调试使用* 对 中台生产的 用户信息 进行消费* Date: 2019/7/31*/// 设置将要消费消息的主题$t...

weixin_42400669的博客 1599

kafka笔记-生产者和消费者代码(php)

生产者代码: <?php $rk = new Rdkafka\Producer(); $rk->setLogLevel(LOG_DEBUG); // 指定生产者链接kafka集群所有的broker地址列表, 参数如: 为hostl:portl,host2:port2, //这里不需要指定所有broker地址,生产者可以从给定的broker里找到其他broker的信息,但是建议配...

无 1063

php iframe 获取父级域名_用PHP+RabbitMQ实现消息的发送和接收

消费者:接收消息逻辑:创建连接-->创建channel-->创建交换机-->创建队列-->绑定交换机/队列/路由键-->接收消息<?php /************************************* * PHP amqp(RabbitMQ) Demo - consumer * Author: Linvo * Date: 2018/7/30 **...

weixin_39726379的博客 151
上一篇: Linux虚拟机安装教程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值