PHP系列 | PDO::prepare(): send of 68 bytes failed with errno=32 Broken pipe

cli 模式报错

[2019-11-20T14:33:25+08:00][ error ] [8]PDO::prepare(): send of 68 bytes failed with errno=32 Broken pipe
error

相关代码

class RedisSubscribe
{
    public function subscribe()
    {
        $redis = BaseRedis::plocal();
        $redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
        $redis->psubscribe(array(‘[email protected]__:expired‘), function ($redis, $pattern, $chan, $msg) {
            Log::info(‘[订阅事件] 过期KEY ‘ . $msg);
            $flag = strstr($msg,":");
            if(empty($flag)){
                Log::error(‘[订阅事件] 非法的消息类型 ‘.$msg);
                return false;
            }
            $originData = explode(‘:‘,$msg);
            $event_key = $originData[1]??‘0‘;
            $event_status = $originData[0]??‘0‘;
            if($event_status == RedisTaskQueue::ORDER_TIMEOUT_EVENT){
                Log::info(‘[订阅事件] 订单超时事件 ‘.$event_key);
                $order = PayOrderModel::get([‘order_no‘ => $event_key]);
                    Log::info(‘[订阅事件] 订单 ‘.$event_key);
                    if ($order[‘status‘] == 0) {
                        $updateData = [
                            ‘id‘ => $order[‘id‘],
                            ‘status‘ => 2,
                            ‘notify_status‘ => 0,
                            ‘pay_time‘ => time(),
                            ‘remark‘ => ‘超时队列事件‘
                        ];
                        $res = PayOrderModel::update($updateData);
                        Log::info(‘[订阅事件] 更新订单 ‘ . json_encode($res));
                    }
            }
        });
    }
}

问题就出现在以上代码中查询和更新数据库问题

$order = PayOrderModel::get([‘order_no‘ => $event_key]); 

本以为开启需要断线重连,就没问题了,结果隔一段时间有出现了同样的错误

// 是否需要断线重连
‘break_reconnect‘ => false,  

问题分析,这里采用的Redis的订阅模式,持久性的

解决办法,通过任务队列解决

$isPushed = redis_queue(RedisTaskQueue::QUEUE_EVENT, $data);

把redis订阅服务获取到的信息,发布think-queue队列中,在队列中在进行处理数据库相关操作  

  

原文地址:https://www.cnblogs.com/tinywan/p/11898671.html

时间: 2024-10-07 13:15:30

PHP系列 | PDO::prepare(): send of 68 bytes failed with errno=32 Broken pipe的相关文章

Thinkphp5错误:Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 68 bytes)

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 68 bytes) 1 $users = Db::name('users')->select(); 2 dump($users); 对于大数据量查询结果,其内容超出了memory size,修改代码如下: 1 $users = Db::name('users')->limit(10)->select(); 完美解决!!!

MySQL测试环境遇到 mmap(xxx bytes) failed; errno 12解决方法

查看Mysql日志 InnoDB: Initializing buffer pool, size = 128.0M InnoDB: mmap(137363456 bytes) failed; errno 12 InnoDB: Completed initialization of buffer pool InnoDB: Fatal error: cannot allocate memory for the buffer pool [ERROR] Plugin 'InnoDB' init func

org.apache.activemq.transport.InactivityIOException: Cannot send, channel has already failed

项目是使用activeMQ 发布订阅的模式,在本地测试正常,但是 放到服务器上出现这个错误: org.apache.activemq.transport.InactivityIOException: Cannot send, channel has already failed 解决办法: 是因为缺少jar包,加上 hawtbuf-1.9.jar ,问题解决.

Send [1] times, still failed

com.alibaba.rocketmq.client.exception.MQClientException: Send [1] times, still failed, cost [696094]ms, Topic: TopicTest, BrokersSent: [broker-b, null] See https://github.com/alibaba/RocketMQ/issues/50 for further details. at com.alibaba.rocketmq.cli

mysql报错mmap(137428992 bytes) failed; errno 12,Cannot allocate memory for the buffer pool

mysql以`systemctl start mysqld.service`的方式启动一段时间后发现突然无法启动,尝试重新启动也不能解决问题,排查问题时,先后通过`systemctl status mysqld.service`和`journalctl -xe` 命令查看问题,无所得.然后查看`/var/log/mysqld.log`发现日志内报错信息如下: 2019-02-07T00:33:21.731341Z 0 [Note] InnoDB: Initializing buffer pool

PDO prepare 简介

使用预处理语句——prepare()方法 1.使用命名参数 $pdo = new PDO($dsn,$user,$pwd); $sql = 'insert into table1 set name=:name,age=:age'; $result = $pdo->prepare($sql); //执行准备sql $result->excute(array(':name'=>'zhangsan',':age'=>'2')); 2.使用问号参数 $pdo = new PDO($dsn,

PHP:PDO prepare预处理

许多成熟的数据库都支持预处理语句(Prepared Statements)的概念.它们是什么东西?你可以把它们想成是一种编译过的要执行的SQL语句模板,可以使用不同的变量参数定制它.预处理语句具有两个主要的优点: 查询只需要被解析(或准备)一次,但可以使用相同或不同的参数执行多次.当查询准备好(Prepared)之后,数据库就会分析,编译并优化它要执行查询的计划.对于复杂查询来说,如果你要重复执行许多次有不同参数的但结构相同的查询,这个过程会占用大量的时间,使得你的应用变慢.通过使用一个预处理语

Ubuntu 12.04出现“Could not write bytes: broken pipe”原因与解决

新员工需要安装ubuntu12.04和android 5.0编译环境. 其自己操作运行过apt-get -y update和upgrade. 我之间安装了gdm,dpkg-reconfigure gdm,选定gdm.缺省是lightgdm. 重新启动后,出现题目那样的错误. 解决这个问题,从网上搜到的方案(放到最后),不起作用,中间改回lightgdm登录器.采用方法: apt-get -y remove xserver-xorg apt-get -y install xserver-xorg

PHP Rabbitmq 报错Broken pipe

fwrite(): send of 13 bytes failed with errno=32 Broken pipe fwrite(): send of 21 bytes failed with errno=104 Connection reset by peer 用 rabbitmq 做消息队列时报上面的错误,当消费队列一启动,Unacked 瞬间达到好几百.经查:RabbitMQ服务器在短时间内发送大量的消息给Consumer,如果你没有来得及Ack的话,那么服务端会积压大量的UnAcke