gpt4 book ai didi

php - PHP 中的协程?

转载 作者:可可西里 更新时间:2023-10-31 23:22:49 25 4
gpt4 key购买 nike

您好,我正在寻找一种在 php 文件中实现协程的方法。我的想法是我有很长的流程,需要能够在可能的数小时或数天内产生结果。因此,其他 php 文件将调用与协程相同的文件中的函数来更新某些内容,然后调用类似 $coroutine.process() 的函数,这会导致协程从其最后的 yield 继续。这是为了避免必须使用大型状态机。

我在想协程 php 文件在空闲时实际上不会运行,但是当给定处理时间时,将从顶部进入并使用类似 switch 或 goto 的东西从上一个 yield 重新启动。然后当它达到下一个 yield 时,该文件将在某处(如 session 或数据库)保存其当前状态,然后退出。

有没有人听说过这个,或者类似的比喻?以某种方式在一个集合下聚合和管理多个协程的奖励点,可能支持类似线程的连接,以便流程在完成时在一个地方继续(有点像 Go)。

更新:php 5.5.0 添加了对生成器和协程的支持:

https://github.com/php/php-src/blob/php-5.5.0/NEWS

https://wiki.php.net/rfc/generators

我还没有尝试过,所以也许有人可以建议一个简单的例子。我正在尝试将状态机转换为协程。因此,例如 for 循环内的 switch 命令(其流程难以遵循,并且随着添加更多状态而容易出错)转换为协作线程,其中每个决策点在有序的线性流程中很容易看到,暂停yield 关键字处的状态更改。

一个具体的例子是,假设您正在编写一个电梯 Controller 。不是根据电梯的状态(STATE_RISING、STATE_LOWERING、STATE_WAITING 等)确定是否读取按钮的状态,而是编写一个循环,其中包含在电梯处于每种状态时运行的子循环。因此,当它上升时,它不会下降,并且不会读取除紧急按钮以外的任何按钮。这可能看起来没什么大不了的,但在像聊天服务器这样的复杂状态机中,几乎不可能在不引入细微错误的情况下更新状态机。而协作线程(协程)版本具有清晰可见的流程,更易于调试。

最佳答案

Swoole 协程库为 PHP 提供了 go like 协程。每个协程每个进程只增加 8K 的内存。它提供了具有预期基本功能(如 yield 和 resume)的协程 API、协程迭代器等 coro 实用程序,以及文件系统功能和网络(套接字客户端和服务器、redis 客户端和服务器、MySQL客户等)。

您的问题的第二个要素是拥有长生命周期协同程序的能力 - 这可能不是一个好主意,除非您在 session 中保存 coro 的状态并允许 coro 结束/关闭。否则,请求将必须与协程一样长。如果服务由长期存在的 PHP 脚本托管,则场景会更简单,协程将一直存在,直到它被允许/强制关闭。

Swoole 的性能与基于 Node.js 和 Go 的服务相当,并用于定期托管 500K+ TCP 连接的多个生产服务。它是 PHP 鲜为人知的瑰宝,主要是因为它是在中国开发的,并且大多数支持和文档仅限于中文用户,尽管有一小部分人努力帮助说其他语言的人。

Swoole 的一个优点是它的 PHP 类包装了一个扩展的 C/C++ api,从一开始就设计为允许在没有 PHP 的情况下使用它的所有功能。相同的源代码可以很容易地编译为 PHP 扩展和/或标准库,适用于 *NIX 系统和 Windows。

关于php - PHP 中的协程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12939319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com