PHP 7(Symfony4)中的后端多线程

时间:2019-01-10 11:10:36

标签: php multithreading symfony php-7 symfony4

(我读过其他问题,但它们指的是旧版本的PHP或前端多线程)

我有一个PHP / PostgreSQL应用程序,它具有复杂的后端处理部分。本质上,有一个很大的循环(数千次迭代)一次又一次地(通过排列)遍历相同的数据。在每个循环中,读取相同的数据,应用操作,并将结果写回到数据库。循环完全相互独立,循环之间不保留任何结果。实际上,要清除对象高速缓存存储器(使用Doctrine),我每100个循环左右就清除一次高速缓存。

所以我基本上有:

for ($i=0; $i<5000; $i++) {
   // fetch data
   // manipulate data
   // write results to a different table
}

在这些循环中,绝不会触及原始数据,只会填充几个结果表。

这目前需要几分钟。在我看来,我喜欢并行处理的教科书示例。

将其置于多种威胁中的最佳方法是什么?我不太在乎执行顺序,也不在乎工作负载是均匀分布的(根据数据操作的性质,如果所有线程都运行相同数量的循环,那么它们最终将承担或多或少的相同工作负载)。我只想使用更多的CPU内核。

我已经在PHP 5中完成了多线程,这是...嗯...还不完美。可行,但困难。 PHP 7中有此改进吗?是否有一种相对简单的方法来基本说“ for(...)并在n个线程中运行它”?

如果有关系,该应用程序将用Symfony4编写,并通过控制台命令调用此后端过程。

1 个答案:

答案 0 :(得分:2)

pthreads扩展名被重写,以使其在v3中使用更加简单。它在PHP 7.2+上受支持,并提供了一种在PHP中创建多线程应用程序的方法。

或者,因为您使用的是Symfony,所以您可以编写简单的控制台命令,该命令可以使用Process组件将子进程作为独立的OS进程运行。这是来自实际项目的此类跑步者的示例:

select * from tablename where description =
'Transfer Group from ''GEUC Service Desk'' to ''GEUC Tier 2 Security'''