在apache / mod_php中并发执行?

时间:2010-10-17 15:27:15

标签: php multithreading apache concurrency

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

每个内容块(这可能是例如在多个页面上重复使用的页脚)都有自己的某种控制器。我称之为Blockcontroller。

该控制器执行相关代码(包括通过资源模型的数据库请求,通过HTTPclient模型的外部API请求等)。

该框架旨在用于涉及多个数据源的非常复杂的环境中。这将特别是几个数据库服务器和REST apis。

现在的目标是同时执行此类内容块以加快页面传送速度。

示例:

Web界面需要从Google Mail,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 fiels并扫描标记为并发执行的块并组装带有队列的数组,并且每个队列点可以有多个条目。他们是依赖顺序的arragend。

因此,如果某些东西没有依赖关系,它肯定会在第一个位置进入队列组。依赖于这个群体的所有东西都会进入第二个positino等等......

数据存储在单件模型中。

我现在的问题是它适用于php的mod_cgi或mod_fastcgi,但它只是用apach mod_php搞砸了。

我用google搜索了一下,你应该永远不要将pcntl_fork与mod_php一起使用... 还有其他选择吗?

1 个答案:

答案 0 :(得分:2)

使用proc_open代替分叉,将每个块作为命令行上的不同脚本运行。这在所有网络主机上都不可能,但你可能还有自己的服务器吗?

你不能在mod_php中分叉,因为这将创建一个完全不同的Apache进程。在mod_php中进行并发工作真的很困难,但是使用proc_open是可行的(如我所说)。