Coroutine\Channel->push
最后更新于:2022-04-02 06:26:34
# Coroutine\\Channel->push
[TOC]
向通道中写入数据。
~~~
function Coroutine\Channel->push(mixed $data, float $timeout = -1) : bool;
~~~
## 参数
* `$data`可以是任意类型的`PHP`变量,包括匿名函数和资源
* 为避免产生歧义,请勿向通道中写入空数据,如`0`、`false`、空字符串、`null`
* `$timeout`设置超时时间,在通道已满的情况下,`push`会挂起当前协程,在约定的时间内,如果没有任何消费者消费数据,将发生超时,底层会恢复当前协程,`push`调用立即返回`false`,写入失败
> `$timeout`参数在`4.2.12`或更高版本可用
## 返回值
* 执行成功返回`true`
* 通道并关闭时,执行失败返回`false`,可使用`$chan->errCode`得到错误码
> `channel`基于引用计数实现,是零拷贝的
## 通道已满
* 自动`yield`当前协程,其他消费者协程`pop`消费数据后,通道可写,将重新`resume`当前协程
* 多个生产者协程同时`push`时,底层自动进行排队,底层会按照顺序逐个`resume`这些生产者协程
## 通道为空
* 自动唤醒其中一个消费者协程
* 多个消费者协程同时`pop`时,底层自动进行排队,按照顺序逐个`resume`这些消费者协程
';