我对异步PHP产生了兴趣,并研究了pThreads,ReactPHP,Swoole和Amp之类的东西。但我想自己开发类似的东西,而不是使用别人建造的东西,只是出于我自己的兴趣。
所以我的目标是创建在 PHP 中编写异步代码的能力,同时将所有内容保持在同步流中。
我的想法是使用 PHP 提供的 exec 函数并编写一个包装类,该类允许在 exec(( 周围使用。
例如,如果我想执行 PDO SQL 查询,我可以通过 exec(( 启动一个后台进程,这将触发另一个执行 PDO 查询的 .php (CLI( 文件,但在 exec(( 完成后仍然让主要的 PHP 执行继续......使用命令行参数发送 SQL 语句等...
然后,一旦PDO查询完成,它将结果放入SESSION变量中,允许主PHP请求检查结果是否存在或从PDO数据库查询中获取结果。
我还没有开始任何事情,但我只是想知道这样的事情是否值得做,并且在可扩展的同时工作,如果我得到它足够稳定,我会考虑在生产环境中使用它。
不,PHP 的exec
函数不适合多处理。它是阻塞的,因此一次只允许一个子进程。您可以使用proc_open
来实现您想要的。
但是,如果您的目标是在生产环境中运行,我真的建议您使用有效的解决方案,而不是构建自己的基础。或者你喜欢在用木头建造东西之前种植自己的树?
>@Erdss4,我想你并不真正了解异步PHP在哪里使用,以及它什么时候有用。(我不想冒犯你(
让我们想象一下您的情况: 经典 PHP 的工作方式如下:
-
Apache || nginx || other HTTP Server -> 正在侦听 80|443 个传入连接(请求(。
-
在连接(请求(上,它运行(生成,分叉(路由的PHP文件,将所有传入变量(cookie,post,get...(发送到此PHP文件。
-
PHP 文件有一个干净的上下文,只有来自上次请求的变量,它运行所有写入的逻辑,发送回响应和死亡(清理内存、上下文等(如果我们想保存一些东西,我们需要一些共享资源,如 RDB、NO-SQL、...(经典地在另一个进程中运行,并通过TCP或php模块访问(
-
转到 1.
异步 PHP 的工作方式如下:
-
PHP http server -> 正在侦听 80|443 个传入连接(请求(,要编写这样的东西,有一些选项,分叉(慢,昂贵(,事件循环(更好(,而(真({} ...
-
现在没有nginx||解析所有传入"变量"的 Apache 您必须手动完成,Aerys 可以做到这一点
-
您可以编写复杂的逻辑,其中上下文和变量可以在其他请求之间共享,而无需 RDB 等外部资源......
-
但这里最强大的是像promise&&coroutines这样的工具。
-
请记住,只有当所有外部资源都被异步访问时,您的 PHP 才是异步的
Amphp 有很多异步组件,允许使用异步 PHP 的强大功能
PS:我的观点:做你想做的事是没有意义的。不好意思。