2012-04-26 24 views
9

我在我的PHP服务器端API的一个地方,我正在做大量的MySQL查询,我想通过多线程处理不同的查询来加速它,然后返回结果。并发在PHP中

但是我如何在PHP中创建另一个线程?我传递POST PARAMS,所以一个简单的shell_exec()可以工作,但似乎有点不安全。选项我考虑:

1)用我的参数做一个卷曲的请求,过程从请求的JSON,然后返回

2)呼叫shell_exec()用PHP CLI并以某种方式(我会怎么做这??)处理的反应在PHP

什么是最好的选择在这里?

+0

通常它是由队列和工作者完成的,它监视它 – zerkms 2012-04-26 02:22:49

+0

这是如何完成的? – lollercoaster 2012-04-26 02:23:42

+0

你设置了一些队列管理软件(即rabbitmq)。然后您的脚本将任务添加到队列中,并且一些后台工作人员执行它。 – zerkms 2012-04-26 02:25:02

回答

4

PHP中没有线程支持。但是,您可以使用pcntl扩展名来生成和管理分叉,但如果您得出应该使用线程完成的结论,最好再次查看算法。

异步处理长时间运行操作的选项是将它们存储在数据库中,并让后台工作进程从数据库中取出它们,计算结果,然后将结果存储在数据库中。然后前面的脚本会在数据库中查看它们,看它们是否完成,结果如何。

+1

如果是这种情况,大型网站如何在PHP中构建? – lollercoaster 2012-04-26 02:23:31

+1

@lollercoaster:如何“大规模”与线程相关? – zerkms 2012-04-26 02:23:59

+1

在我看来,具有许多数据库交互的性能关键的API /站点需要并发性 – lollercoaster 2012-04-26 02:25:33

3

查看pcntl extension。 PHP根本不支持真正的线程,所以你必须通过fork()来实现伪线程。请注意fork()过程比产生一个线程“重”得多。

2

PHP没有实现线程(并且可能永远不会),因为许多PHP的库不是线程安全的。该替代方案是pcntl,其包装了C fork函数。

我对created a handy wrapper这些功能,让我管理他们在更高的水平。

$thread1 = new Thread(function($thread) { 
    sleep(4); 
    $thread->write("Hello\n"); 
}); 

$thread2 = new Thread(function($thread) { 
    sleep(5); 
    $thread->write("World\n"); 
}); 

$thread3 = new Thread(function($thread) { 
    sleep(6); 
}); 

print $thread1->read(); // time: 0 -> 4 
print $thread2->read(); // time: 4 -> 5 
$thread3->join(); // time 5 -> 6 

// More advanced handling: 
// Thread::selectUntilJoin(array($thread1, $thread2, $thread3), function() { ... }, function() { ... }); 
+0

“意思是不能从不同线程调用函数”---这是不正确的TS代码定义 – zerkms 2012-04-26 03:24:25