9

我在我的 PHP 服务器端 API 中进行大量 MySQL 查询,我想通过让多个线程处理不同的查询然后返回结果来加速它。

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

1)使用我拥有的参数发出一个cURL请求,处理来自请求的JSON然后返回

2)用PHP CLI调用ashell_exec()并以某种方式(我该怎么做??)处理PHP中的响应

这里最好的选择是什么?

4

3 回答 3

4

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

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

于 2012-04-26T02:22:37.663 回答
3

查看pcntl 扩展名。PHP 根本不支持真正的线程,所以你必须通过 fork()ing 来实现伪线程。请注意,fork() 进程比生成线程要“重”得多。

于 2012-04-26T02:25:21.023 回答
2

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

我为这些函数创建了一个方便的包装器,让我可以在更高级别管理它们。

$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 () { ... } );
于 2012-04-26T02:37:46.087 回答