使用PHP的exec函数是否能够高效地进行多处理?

时间:2017-07-10 14:20:40

标签: php asynchronous multiprocessing exec

我对异步PHP感兴趣,并研究过像pThreads,ReactPHP,Swoole和Amp这样的东西。但是我想开发类似的东西,而不是根据自己的兴趣使用其他人建造的东西。

所以我的目标是创建在PHP中编写异步代码的能力,同时将所有内容保存在同步流中。

我的想法是使用PHP提供的exec函数并编写一个包装类,它允许在exec()周围使用。

例如,如果我想执行PDO SQL查询,我可以通过exec()启动后台进程,这将引发另一个.php(CLI)文件,该文件将执行PDO查询但仍然允许主要的PHP执行exec()完成后继续...使用命令行参数发送SQL语句等...

然后,一旦PDO查询完成,它就会将结果放入SESSION变量中,允许主PHP请求检查结果是否存在或从PDO数据库查询中获取结果。

我还没有开始任何事情,但我只是想知道这样的事情是否值得做,并且在能够扩展的同时可以工作,就像我已经足够稳定一样,我会考虑在生产环境中使用它。 / p>

2 个答案:

答案 0 :(得分:1)

不,PHP的exec函数不适合多处理。它阻塞,因此一次只允许一个子进程。您可以使用proc_open来实现您想要的目标。

但如果你的目标是在制作上运行,我真的建议使用working solution而不是建立你自己的基础。或者你喜欢在用木头建造东西之前种植自己的树吗?

答案 1 :(得分:0)

@ Erdss4,我认为你并不真正了解Async PHP使用的位置,以及它何时有用。 (我不想攻击你)

让我们假设你的情况: 经典的PHP工作原理如下:

  1. apache || nginx ||其他http服务器 - >正在侦听80 | 443个传入连接(请求)。

  2. 连接(请求)它运行(spawn,fork)已路由的php文件,将所有传入的变量(cookies,post,get ...)发送到此php文件。

  3. php文件有一个干净的上下文,只包含上次请求的变量,它运行所有写入的逻辑,发送回响应和死(清理内存,上下文......)如果我们想保存一些东西,我们需要一些共享资源,如RDB,NO-SQL,......(经典地在另一个进程中运行,并通过TCP或php模块访问)

  4. 转到1。

  5. 异步PHP的工作原理如下:

    1. php http server - >正在侦听80 | 443传入连接(请求),写这样的东西有一些选项,分叉(慢,昂贵),event-loop(更好),而(true){} ......

    2. 现在没有nginx || apache解析所有传入的“变量”你必须手动完成,aerys可以做到这一点

    3. 您可以编写复杂的逻辑,其中上下文和变量可以在没有外部资源(如RDB)的情况下在其他请求之间共享...

    4. 但这里最强大的工具是promises&& coroutines

    5. 请记住,只有在异步访问所有外部资源时,您的php才是异步的

    6. amphp有很多异步组件允许使用async php

      的强大功能 P.S:我的观点:做你想做的事没有意义。遗憾。