当前位置:首页 » 编程语言 » php队列的实现

php队列的实现

发布时间: 2022-03-12 14:19:54

㈠ 求问php可以对MQ队列实现监听吗

简介 前面篇文章讨论几种应用系统集式发现实际面向消息队列集案算总体比较合理选择我先针具体消息队列Activemq基本通信式进行探讨activemqJMS消息通信规范实现总说消息规范面定义见几种消息通信模式主要发布-订阅、点点两种另外通结合些模式具体应用我处理某些应用场景候衍种请求应答模式面我针几种式讨论 基础流程 讨论具体式候我先看看使用activemq需要启服务主要程 按照JMS规范我首先需要获JMS connection factory.通connection factory创建connection.基础我再创建session, destination, procerconsumer主要几步骤: 一. 获JMS connection factory. 通我提供特定环境连接信息构造factory 二. 利用factory构造JMS connection 三. 启connection 四. 通connection创建JMS session. 5. 指定JMS destination. 陆. 创建JMS procer或者创建JMS message并提供destination. 漆. 创建JMS consumer或注册JMS message listener. 吧. 发送接收JMS message. 9. 关闭所JMS资源包括connection, session, procer, consumer等 publish-subscribe 发布订阅模式点类似于我订阅报纸每尾候邮局发本报纸集合让我选择订阅哪表列所版发行报纸于我每订阅者说我选择份或者份报纸比北京报、潇湘晨报等些我订阅报纸相于发布订阅模式topic订阅报纸能我订阅相同报纸相于我同topic注册于份报纸发行说所订阅者构一关

㈡ PHP-php 怎么实现消息队列

消息队列
消息队列是线程间通讯的手段:

import java.util.*

public class MsgQueue{

private Vector queue = null;
public MsgQueue(){
queue = new Vector();
}
public synchronized void send(Object o)
{
queue.addElement(o);
}
public synchronized Object recv()
{
if(queue.size()==0)
return null;
Object o = queue.firstElement();
queue.removeElementAt(0);//or queue[0] = null can also work
return o;
}
}

因为java中是locked by object的所以添加synchronized 就可以用于线程同步锁定对象
可以作为多线程处理多任务的存放task的队列。他的client包括封装好的task类以及thread类

㈢ 请教PHP+Redis实现任务队列的思路

// 创建请求ID标志, uniqid 无法保证唯一, 自己去搜索生成唯一的方法
$uuid = uniqid();
$tsk_name = "mytask";
$time_out = 30000; // 超时策略: 30秒
$time_start = time();
$redis->rPush($tsk_name, $uuid); // 右(后)插入队列

// 堵塞等待队列中第一个和$uuid匹配的(到我了)
while($uuid != $redis->lGet($tsk_name, 0)){
if((time()-$time_start)> $time_out) {
break; // 超时跳出(某些原因队列异常了, 可能永远取不到)
}
usleep(10); // sleep 10ms, 再次尝试
}

// 这里执行任务的处理代码....

// $response 已拼装好要返回的内容
// 处理完成后(数据库等已入库更新), 需要:
if($redis->lGet($tsk_name, 0) == $uuid){ // 再次确认第一个是本请求
$redis->lPop($tsk_name); // 完成任务了, 从队列中移除
}else{
// 出现这种情况, 是因为超时了, 或前面的$uuid没有被消费
// 若不清除, 后续的请求, 都将无法正常进入队列执行
// 取队列中的所有$uuid
$queues = $redis->lRange($tsk_name, 0, -1);
foreach($queues as $i=>$uid){
if($uid==$uuid){

㈣ php数组如何实现循环队列

1.PHP基本上就是一种数组语言。时常要进行大量的数组循环操作,主要有两种方式,
一种是foreach,另一种是while,
代码如下:
foreach ($array as $value) {
echo $value;
}
while (list($key) = each($array)) {
echo $array[$key];
}
foreach ($array as $value) {
echo $value;
}
while (list($key) = each($array)) {
echo $array[$key];
}
2.在循环里进行的是数组“写”操作,则while比foreach快:
foreach ($array as $key => $value) {
echo $array[$key] = $value . '...';
}
while (list($key) = each($array)) {
$array[$key] = $array[$key] . '...';
}
foreach ($array as $key => $value) {
echo $array[$key] = $value . '...';
}
while (list($key) = each($array)) {
$array[$key] = $array[$key] . '...';
}

㈤ php怎么实现redis阻塞队列

具体的业务还是得需要你自己定制。你的需求实际上是一个变形的生产者-消费者实现。对于此类需求,主要是将请求和实际的处理过程解耦,一般都是采取异步的方式来通知请求方,这跟用不用redis其实没有多大的关系。一般的实现方法是你需要将用户的请求封装成一个Task,然后将这个Task再push到redis队列,然后后端的worker.php完全可以多进程、多线程的并发处理Task并将处理结果回调给请求方。这里唯一麻烦点的就是这个Task的设计,需要能够包含请求信息(请求内容,请求方标识等等).

㈥ 如何使用php、html及消息队列实现订单超时自动关闭订单

  1. 从php脚本方面解决的话,那就是每分钟用ajax请求一次php脚本,检查订单状态和当前时间,30分钟后检查到订单无异,测php更新订单到关闭状态,这个地方需要用到setTimeout了,循环执行请求,但是缺点是页面必能关闭,关闭了js就不执行,所以这个方法不太可取,30分钟时间太长,不可能不进行其他页面行为。

  2. 使用Mysql 定时计划任务(推荐你使用),语法体

createeventmyevent
onscheleatcurrent_timestamp+interval1hour(周期或者时间点)
do
updatemyschema.mytablesetmycol=mycol+1;(执行的sql

详细使用可以参考:https://segmentfault.com/a/1190000005142597,很清楚

㈦ 利用php +swoole如何实现异步任务队列

  • class msgServer

  • {

  • private $serv;

  • function __construct()

  • {

  • $this->serv = new SwooleServer("127.0.0.1", 9501);//创建一个服务

  • $this->serv->set(array('task_worker_num' => 4)); //配置task进程的数量

  • $this->serv->on('receive', array($this, 'onReceive'));//有数据进来的时候执行

  • $this->serv->on('task', array($this, 'onTask'));//有任务的时候执行

  • $this->serv->on('finish', array($this, 'onFinish'));//任务结束时执行

  • $this->serv->start();

  • }

  • public function onReceive($serv, $fd, $from_id, $data)

  • {

  • $data = json_decode($data, true);

  • $task_id = $serv->task($data);//这里发起了任务,于是上面的on('task', array($this, 'onTask'))就会执行

  • }

  • public function onTask($serv, $task_id, $from_id, $data)

  • {

  • $data['send_res'] = $this->sendMsg($data); //发送短信

  • //1.7.3之前,是$serv->finish("result");

  • return "result.";//这里告诉任务结束,于是上面的on('finish', array($this, 'onFinish'))就会执行

  • }

  • public function onFinish($serv, $task_id, $data)

  • {

  • $this->addSendLog($data); //添加短信发送记录

  • }

  • }

㈧ PHP+MYSQL 实现队列 进行发送短信怎么做

最近遇到一个批量发送短信的需求,短信接口是第三方提供的。刚开始想到,获取到手机号之后,循环调用接口发送不就可以了吗?

但很快发现问题:当短信数量很大时,不仅耗时,而且成功率很低。

于是想到,用PHP和MySQL实现一个消息队列,一条一条的发送短信。下面介绍具体的实现方法:

首先,建立一个数据表sms,包含以下字段:

id,
phone, //手机号
content //短信内容
将需要发送的短信和手机号存入sms表中。

接下来,需要用PHP实现一个定时器,定时读取一条记录,并发送短信:

<?php
$db = new Db();
$sms = new Sms();
while(true){
$item = $db->getFirstRecord(); //获取数据表第一条记录
if(!$item){
//如果队列中没有数据,则结束定时器
break;
}
$res = $sms->send($item['phone'],$item['content']); //发送短信
if($res){
$db->deleteFristRecord(); //删除发送成功的记录
echo $item['phone'].'发送成功';
}else{
echo $item['phone'].'发送失败,稍后继续尝试';
}
sleep(10); //每隔十秒循环一次
}

echo '发送完毕!';
?>
将代码保存为timer_sms.php,打开命令行,执行定时器:

php timer_sms.php
好了,php定时器将会根据设定的时间间隔(这里设的是10秒),自动完成发送短信的任务。任务完成后将自动退出定时器,不再占用服务器资源。

根据我的测试,PHP定时器占用资源并不多,不会对服务器造成压力。而且是异步访问数据库,也不会影响数据库的运行。

这种方式的优点是:

1、后台运行,前台无需等待

2、成功率高,失败的记录会自动重发,直到成功

热点内容
安卓手机存储卡格式化 发布:2025-07-20 21:18:57 浏览:248
小厂编程 发布:2025-07-20 21:17:24 浏览:797
我的世界无人管理的服务器服务器ip 发布:2025-07-20 20:49:58 浏览:90
我的世界正版服务器有哪些ip 发布:2025-07-20 20:49:45 浏览:643
ios转java 发布:2025-07-20 20:44:51 浏览:552
网管密码多少合适 发布:2025-07-20 20:44:48 浏览:648
用来存储和 发布:2025-07-20 20:43:22 浏览:4
抖音小游戏解压神器格子音乐怎么弹 发布:2025-07-20 20:43:22 浏览:71
如何在抖音里设置不需要密码 发布:2025-07-20 20:37:23 浏览:521
电脑版我的世界神奇宝贝服务器推荐 发布:2025-07-20 20:35:10 浏览:498