× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

Coroutine\Channel->push

向通道中写入数据。

function Coroutine\Channel->push(mixed $data, float $timeout = -1) : bool;

参数

  • $data可以是任意类型的PHP变量,包括匿名函数和资源
  • 为避免产生歧义,请勿向通道中写入空数据,如0false、空字符串、null
  • $timeout设置超时时间,在通道已满的情况下,push会挂起当前协程,在约定的时间内,如果没有任何消费者消费数据,将发生超时,底层会恢复当前协程,push调用立即返回false,写入失败

$timeout参数在4.2.12或更高版本可用

返回值

  • 执行成功返回true
  • 通道并关闭时,执行失败返回false,可使用$chan->errCode得到错误码

channel基于引用计数实现,是零拷贝的

通道已满

  • 自动yield当前协程,其他消费者协程pop消费数据后,通道可写,将重新resume当前协程
  • 多个生产者协程同时push时,底层自动进行排队,底层会按照顺序逐个resume这些生产者协程

通道为空

  • 自动唤醒其中一个消费者协程
  • 多个消费者协程同时pop时,底层自动进行排队,按照顺序逐个resume这些消费者协程