PHP背压Backpressure机制 先说问题 生产者 →10000条/秒 消费者 →100条/秒 ↑ 队列爆炸内存溢出系统崩溃 背压消费者告诉生产者慢点我处理不过来了---三种策略1.丢弃最简单-限流直接拒绝classRateLimiter{publicfunctionallow(string$key,int$limit):bool{$count$this-redis-incr($key);if($count1)$this-redis-expire($key,1);// 1秒窗口return$count$limit;}}$limiternewRateLimiter($redis);if(!$limiter-allow(api:user:1001,100)){http_response_code(429);die(Too Many Requests);// 直接丢弃告诉上游慢点}---2.缓冲-队列积压预警classBufferedQueue{privateint$maxSize1000;publicfunctionpush(array$job):string{$size$this-redis-llen(queue:jobs);if($size$this-maxSize){thrownew\OverflowException(队列已满($size)触发背压);}if($size$this-maxSize*0.8){// 80% 水位线通知生产者降速$this-redis-publish(backpressure,json_encode([actionslow_down,current$size,max$this-maxSize,]));}return$this-redis-rpush(queue:jobs,json_encode($job));}}---3.生产者感知背压-动态调速classProducer{privatefloat$delay0;// 当前延迟秒publicfunction__construct(){// 订阅背压信号$this-redis-subscribe([backpressure],function($msg){$signaljson_decode($msg,true);$this-delaymatch($signal[action]){slow_down0.1,// 降速每条延迟100msspeed_up0,// 恢复全速default$this-delay,};});}publicfunctionsend(array$data):void{if($this-delay0)usleep($this-delay*1_000_000);$this-queue-push($data);}}---4.ReactPHP 流式背压异步场景// 读文件速度 写数据库速度用 pause/resume 控制$loopReact\EventLoop\Loop::get();$sourcenewReact\Stream\ReadableResourceStream(fopen(big.csv,r),$loop);$sinknewSlowDatabaseWriter($loop);$source-on(data,function($chunk)use($source,$sink){$sink-write($chunk);if($sink-isFull()){$source-pause();// 消费者满了 → 暂停生产者$sink-once(drain,fn()$source-resume());// 排空后恢复}});---四种策略对比 策略 实现难度 数据损失 适用场景 ────────────────────────────────────────── 直接拒绝 ★☆☆ 有API限流、非关键请求 固定缓冲 ★★☆ 队列满时 任务队列、消息系统 动态调速 ★★★ 无 长连接、流式处理 pause/resume ★★★ 无 文件流、异步IO---一句话总结 背压消费者的求求你别再发了信号机制 没有背压 → 队列无限增长 →OOM→ 崩 有了背压 → 系统自动限速 → 稳定运行