PHP中的多线程/并行处理

PHP中的多线程/并行处理,php,mysql,multithreading,concurrency,phpexcel,Php,Mysql,Multithreading,Concurrency,Phpexcel,我有一个PHP脚本,它将使用PHPExcel从MySQL数据库查询的数据生成一个报告。目前,它的处理是线性的,它从MySQL获取数据,读入Excel模板,将数据写入模板,然后输出。我已经对代码进行了优化,使数据只迭代一次,而在PHP端很少进行处理。查询在.001秒内返回数百行,因此运行速度足够快。经过一段时间后,我发现我的瓶颈是(惊讶,惊讶)读取模板和编写输出。 我想这样做: Spawn a thread/process to read the template Spawn a thread/p

我有一个PHP脚本,它将使用PHPExcel从MySQL数据库查询的数据生成一个报告。目前,它的处理是线性的,它从MySQL获取数据,读入Excel模板,将数据写入模板,然后输出。我已经对代码进行了优化,使数据只迭代一次,而在PHP端很少进行处理。查询在.001秒内返回数百行,因此运行速度足够快。经过一段时间后,我发现我的瓶颈是(惊讶,惊讶)读取模板和编写输出。 我想这样做:

Spawn a thread/process to read the template
Spawn a thread/process to fetch the data
Return back to parent thread - Parent thread will wait until both are complete
Proceed on as normal
我的主要问题是这是否可能,值得吗?如果双方都同意,你将如何应对?
另外,它是CentOS上的PHP5

,我会尝试找出是否可以以更快的读取格式缓存或存储模板。我不知道这是否可行,但PHPExcel论坛相当不错,开发人员都在关注它。

您肯定可以在CentOS上使用PHP()生成进程。在做之前,我会考虑至少一件事…如果瓶颈出现在读取模板和写入输出上,则可能只是I/O绑定的问题,因此处理多个进程可能没有多大帮助。。。就我个人而言,我会尝试看看是否有可能改为进行一些缓存…

您不能使用多线程,但可以使用fork(,)。我肯定知道,您需要仔细测试流程生成时间,以确保这对于您的情况来说是值得的

$pid = pcntl_fork();

if ($pid == -1) {
  // fork failed

} elseif ($pid > 0) {
  // we're the parent! Wait for child to finish
  pcntl_waitpid($pid);

} else {
  // we're the child
}

通常,分叉Apache进程不是一个好主意。这可能会导致不确定的结果。相反,最好使用某种排队机制。Gearman是一种可以使用的开源排队机制。我还在Zend Server作业队列上发表了一篇博客文章,讨论异步运行任务

您还可以使用Zend Framework队列类之类的东西来实现一些异步工作


@Swisstack,我也不同意您关于PHP不是为高性能而创建的断言。很少有语言特性是性能缓慢的原因。也许通过对不同语言之间的$a++进行原始语言测试比较,您会发现这一点,但这种类型的测试是不相关的。我在PHP上做了几年的咨询工作,我从来没有看到过由该语言引起的性能问题。

如果读取模板和数据库查询都很慢,那么我会说,通过并行运行这些任务可以获得有价值的性能。但是,您自己也说过,读取模板很慢,而db查询很快。因此,即使忽略并行运行任务所需的添加所带来的任何额外开销,在最好的情况下,也可以节省0.001秒(db查询所需的时间)

并行运行多个任务始终需要最慢任务的时间。连续运行任务是所有任务的总和。在您的情况下,templateTime+queryTime(0.001)

我觉得不值得


通常数据库是方程式中的海龟。您可以不费吹灰之力异步完成这一部分。请参阅新添加的mysqli_poll()和friend函数。

阅读一次模板,然后对需要从数据创建的每个工作簿进行克隆。我假设他不是通过网络服务器运行的。好吧,我们不能假设太多。但即便如此,某种形式的工作队列通常是一条更好的道路。它更容易管理,等等。嘿,马克,你有没有碰巧链接到一个例子?非常感谢!谢谢