We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
现在 Server/Client->send 在缓存区已满的情况下,会直接返回false,需要借助onBufferFull和onBufferEmpty这样复杂的事件通知机制才能实现任务的暂停和恢复。
Server/Client->send
false
onBufferFull
onBufferEmpty
在实现需要大量发送的场景下,现有机制虽然可以实现,但非常复杂。
现在基于协程可以实现一种机制,直接在当前协程内yield,等待数据发送完成,缓存区清空时,自动resume当前协程,继续send数据。
yield
resume
send
SW_ERROR_OUTPUT_BUFFER_OVERFLOW
php
Server/Client
for ($i = 0; $i < 100; $i++) { //在缓存区塞满时会直接返回`false` $server->send($fd, $data_2m); }
for ($i = 0; $i < 100; $i++) { //在缓存区塞满时会 yield 当前协程,发送完成后 resume 继续向下执行 $server->send($fd, $data_2m); }
此项特性会改变底层的默认行为,因此需要额外的一个参数来开启。
$serv->set([ 'send_yield' => true, ]);
The text was updated successfully, but these errors were encountered:
No branches or pull requests
现状
现在
Server/Client->send
在缓存区已满的情况下,会直接返回false
,需要借助onBufferFull
和onBufferEmpty
这样复杂的事件通知机制才能实现任务的暂停和恢复。在实现需要大量发送的场景下,现有机制虽然可以实现,但非常复杂。
思路
现在基于协程可以实现一种机制,直接在当前协程内
yield
,等待数据发送完成,缓存区清空时,自动resume
当前协程,继续send
数据。Server/Client->send
返回false
并且错误码为SW_ERROR_OUTPUT_BUFFER_OVERFLOW
时,不返回false
到php
层,而是yield
挂起当前协程Server/Client
监听onBufferEmpty
事件,在该事件触发后,缓存区内的数据已被发送完毕,这时resume
对应的协程Server/Client->send
向缓存区内写入数据,这时因为缓存区已空,发送必然是成功的实例
改进前
改进后
选项
此项特性会改变底层的默认行为,因此需要额外的一个参数来开启。
The text was updated successfully, but these errors were encountered: