使用 PHPs exec 函数是否可扩展且高效地进行多处理?
Is using PHPs exec function scale able and efficient for multi-processing?
我对异步 PHP 产生了兴趣,并研究了 pThreads、ReactPHP、Swoole 和 Amp 等东西。但我想自己开发类似的东西,而不是使用别人建造的东西,只是出于我自己的兴趣。
所以我的目标是创建在 PHP 中编写异步代码的能力,同时保持一切都在同步流中。
我的想法是使用 exec 函数 PHP 提供并编写一个包装器 class 以启用围绕 exec() 的使用。
例如,如果我想执行 PDO SQL 查询,我可以通过 exec() 启动后台进程,这将启动另一个 .php (CLI) 文件,该文件将执行PDO 查询,但在 exec() 完成后仍然让主 PHP 执行继续...使用命令行参数发送 SQL 语句等...
然后一旦 PDO 查询完成,它将结果放入 SESSION 变量,允许主要 PHP 请求检查结果是否存在或从 PDO 数据库查询中获取结果。
我还没有开始任何事情,但我只是想知道这样的事情是否值得做,并且可以在扩展的同时工作,就像我已经足够稳定一样,我会考虑在生产环境中使用它.
@Erdss4,我觉得你不太明白AsyncPHP用在什么地方,什么时候有用。 (我不想冒犯你)
让我们想象一下您的情况:
经典 php 的工作方式如下:
阿帕奇 || nginx ||其他 http 服务器 -> 正在侦听 80|443 个传入连接(请求)。
在连接(请求)时它 运行(生成,分叉)php 路由的文件,发送所有传入变量(cookies,post,获取...) 到此 php 文件。
php 文件有一个干净的上下文,只有来自上次请求的变量,它 运行 是写的所有逻辑,发回响应并消亡(清理内存,上下文, ...) 如果我们想保存一些东西,我们需要一些共享资源,如 RDB,NO-SQL, ...(通常 运行ning 在另一个进程中,并通过 TCP 或 php 个模块)
转到 1.
异步 PHP 工作方式如下:
php http 服务器 -> 正在侦听 80|443 个传入连接(请求),要写这样的东西有一些选项,分叉(慢,昂贵),event-loop (更好), while(true) {} ...
现在没有解析所有传入的nginx||apache"variables"你必须手动做,aerys可以做到
您可以编写复杂的逻辑,其中可以在其他请求之间共享上下文和变量,而无需像 RDB 这样的外部资源...
但这里最强大的工具是 promises && coroutines
记住你的php只有当你所有的外部资源都被访问时才是异步的async
amphp 有很多允许使用异步功能的异步组件 php
P.S:我的看法:随心所欲是没有意义的。对不起。
不,PHP的exec
函数不适合多处理。它是阻塞的,因此一次只允许一个子进程。您可以使用 proc_open
来实现您想要的。
但如果您的目标是 运行 生产,我真的建议您使用 working solution 而不是构建您自己的基础。或者你喜欢在用木头建造东西之前自己种树吗?
我对异步 PHP 产生了兴趣,并研究了 pThreads、ReactPHP、Swoole 和 Amp 等东西。但我想自己开发类似的东西,而不是使用别人建造的东西,只是出于我自己的兴趣。
所以我的目标是创建在 PHP 中编写异步代码的能力,同时保持一切都在同步流中。
我的想法是使用 exec 函数 PHP 提供并编写一个包装器 class 以启用围绕 exec() 的使用。
例如,如果我想执行 PDO SQL 查询,我可以通过 exec() 启动后台进程,这将启动另一个 .php (CLI) 文件,该文件将执行PDO 查询,但在 exec() 完成后仍然让主 PHP 执行继续...使用命令行参数发送 SQL 语句等...
然后一旦 PDO 查询完成,它将结果放入 SESSION 变量,允许主要 PHP 请求检查结果是否存在或从 PDO 数据库查询中获取结果。
我还没有开始任何事情,但我只是想知道这样的事情是否值得做,并且可以在扩展的同时工作,就像我已经足够稳定一样,我会考虑在生产环境中使用它.
@Erdss4,我觉得你不太明白AsyncPHP用在什么地方,什么时候有用。 (我不想冒犯你)
让我们想象一下您的情况: 经典 php 的工作方式如下:
阿帕奇 || nginx ||其他 http 服务器 -> 正在侦听 80|443 个传入连接(请求)。
在连接(请求)时它 运行(生成,分叉)php 路由的文件,发送所有传入变量(cookies,post,获取...) 到此 php 文件。
php 文件有一个干净的上下文,只有来自上次请求的变量,它 运行 是写的所有逻辑,发回响应并消亡(清理内存,上下文, ...) 如果我们想保存一些东西,我们需要一些共享资源,如 RDB,NO-SQL, ...(通常 运行ning 在另一个进程中,并通过 TCP 或 php 个模块)
转到 1.
异步 PHP 工作方式如下:
php http 服务器 -> 正在侦听 80|443 个传入连接(请求),要写这样的东西有一些选项,分叉(慢,昂贵),event-loop (更好), while(true) {} ...
现在没有解析所有传入的nginx||apache"variables"你必须手动做,aerys可以做到
您可以编写复杂的逻辑,其中可以在其他请求之间共享上下文和变量,而无需像 RDB 这样的外部资源...
但这里最强大的工具是 promises && coroutines
记住你的php只有当你所有的外部资源都被访问时才是异步的async
amphp 有很多允许使用异步功能的异步组件 php
P.S:我的看法:随心所欲是没有意义的。对不起。
不,PHP的exec
函数不适合多处理。它是阻塞的,因此一次只允许一个子进程。您可以使用 proc_open
来实现您想要的。
但如果您的目标是 运行 生产,我真的建议您使用 working solution 而不是构建您自己的基础。或者你喜欢在用木头建造东西之前自己种树吗?