Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的并发性_Php_Mysql_Api_Concurrency_Server Side - Fatal编程技术网

PHP中的并发性

PHP中的并发性,php,mysql,api,concurrency,server-side,Php,Mysql,Api,Concurrency,Server Side,在我的PHP服务器端API中,我正在进行大量的MySQL查询,我希望通过让多个线程处理不同的查询,然后返回结果来加快查询速度 但是如何在PHP中创建另一个线程呢?我正在传递POST参数,因此一个简单的shell_exec()可以工作,但似乎有点不安全。我正在考虑的选择: 1) 使用我拥有的参数发出一个cURL请求,处理请求中的JSON,然后返回 2) 使用PHPCLI调用一个shell\u exec(),并以某种方式(我该如何做??)在PHP中处理响应 这里最好的选项是什么?PHP中不支持线程。

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

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

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

2) 使用PHPCLI调用一个
shell\u exec()
,并以某种方式(我该如何做??)在PHP中处理响应


这里最好的选项是什么?

PHP中不支持线程。但是,您可以使用扩展来生成和管理fork,但是如果您得出结论认为应该使用线程来完成任务,那么最好再看看您的算法


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

请查看。PHP根本不支持真正的线程,因此您必须通过fork()调用来实现伪线程。请注意,生成一个进程比生成一个线程要“沉重”得多。

PHP没有实现线程(而且可能永远不会实现),因为许多PHP的库都不是线程安全的。另一种变体是
pcntl
,它封装了C
fork
函数

我已经为这些功能提供了支持,使我能够在更高的级别上管理它们

$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 () { ... } );

通常,它是通过队列和工作者来完成的,后者监视您设置的队列管理软件(即rabbitmq)。然后,您的脚本将任务添加到队列中,一些后台工作人员将执行该任务。除了执行这种复杂的路径之外,可能还需要研究优化和缓存等替代方法。如果您的瓶颈确实在等待一个无法进一步加速或缓存的查询,并且您认为并行执行更多查询实际上会有所帮助,可以从同一个脚本建立多个连接,使用非阻塞API启动查询并随后获得结果可能会容易得多。几个连接?用PHP编写的非阻塞API?不确定您具体在说什么-我的观点是我想异步调用并返回它们,我的问题是如何做到这一点如果是这样的话,大型网站是如何用PHP构建的?在我看来,性能关键的API/具有许多数据库交互的网站将需要concurrency@lollercoaster:和存储并发与php并发无关。仓库处理它themselves@lollercoaster,最密集的任务可以通过后台处理和缓存的组合来完成。“这意味着不能从不同的线程调用函数”——这对于TS代码来说是不正确的定义