代码之家  ›  专栏  ›  技术社区  ›  The Surrican

在apache/mod_php中并发执行?

  •  1
  • The Surrican  · 技术社区  · 15 年前

    我目前正在开发一个具有非常特殊功能的MVC WebFramework。 在XML文件中定义的布局被分为可单独排列/缓存/加载的内容块。

    每个内容块(例如在多个页面上重复使用的页脚)都有自己的控制器。我管它叫块控制器。

    此控制器执行相关代码(包括通过资源模型的DB请求、通过httpclient模型的外部API请求等)。

    该框架设计用于涉及多个数据源的非常复杂的环境中。这通常是几个数据库服务器和RESTAPI。

    现在的目标是同时执行这些内容块,以加速页面交付。

    例子:

    一个网络接口需要从谷歌邮件、Facebook、Twitter和其他10个来源获取你的地址簿,做一些匹配和计算。 每个请求大约需要1秒钟。 如果按顺序完成,这将累计15秒。

    目标是为所有内容定义一个块(是的,这应该是一个模型,但我希望将其保持在块级别,因为大多数逻辑都是在这个XML文件中定义的。然后它们就不生成输出。)并将“并发执行”标志设置为1。

    最后一个内容块,它按照所需的属性组装所有这些并发块,因此当它们全部完成并且数据可用时,它开始执行。像这样:

    <block template="blank.phtml" block="twitter.php" concurrent="1" name="twitter"/>
    <block template="blank.phtml" block="gmail.php" concurrent="1" name="gmail"/>
    <block template="blank.phtml" block="facebook.php" concurrent="1" name="facebook"/>
    <block template="stats.phtml" block="statistics.php">
        <depends>twitter</depends>
        <depends>gmail</depends>
        <depends>facebook</depends>
    </block>
    

    解析器首先查看布局XML字段,扫描标记为并发执行的块,并用队列组装数组,每个队列点都可以有多个条目。它们按依赖顺序排列。

    因此,如果某个对象没有依赖关系,那么它会在第一个位置直接进入队列组。所有依赖于这个组的东西都进入第二正电子,等等…

    数据存储在单例模型中。

    我现在的问题是,它可以与mod_cgi或mod_fastcgi for php一起工作,但它只是把Apaches mod_php搞得一团糟。

    我在谷歌上搜索了一下,发现你不应该在mod php中使用pcntl_fork… 还有其他选择吗?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Emil Vikström    15 年前

    不使用forking,而是使用proc_open在命令行上以不同的脚本运行每个块。这在所有的网络主机上都不可能,但也许你有自己的服务器?

    您不能使用mod_php,因为这将创建一个完全不同的apache进程。在mod-php中进行并发工作确实很困难,但在proc-open中它是可行的(如我所说)。