我正在构建一个集成,通过API(REST)将数据传递给多个不同的系统。我需要尽快处理数据。这是一个基本布局:
$data = array( Title => "Title", Subtitle => "Test", .....
$result1 = $class1->functionservice1($data);
$result2 = $class2->functionservice2($data);
$result3 = $class3->functionservice3($data);
echo "done";
在上面的脚本中运行我需要等待每个函数在开始下一个函数之前完成(延长3倍)。
是否有一种简单的方法可以异步运行每个服务功能,但在报告完成之前等待所有服务功能完成。我需要能够从每个$result
中提取数据并将其作为一个帖子返回到第4个服务。
很抱歉,如果这是一个简单的问题 - 我是PHP新手
非常感谢,Ben
答案 0 :(得分:2)
是的,有多种方式。
最有效的方法是使用一个利用非阻塞I / O实现并发和协作式多任务处理的事件循环。
一个这样的事件循环实现是Amp。有一个与Amp一起使用的HTTP客户端,它叫做Artax。其自述文件中包含一个示例。你应该看看promises和coroutines是如何工作的。有Amp\wait
将同步代码与异步代码混合在一起。
<?php
Amp\run(function() {
$client = new Amp\Artax\Client;
// Dispatch two requests at the same time
$promises = $client->requestMulti([
'http://www.google.com',
'http://www.bing.com',
]);
try {
// Yield control until all requests finish
list($google, $bing) = (yield Amp\all($promises));
var_dump($google->getStatus(), $bing->getStatus());
} catch (Exception $e) {
echo $e;
}
});
其他方式包括使用线程和/或进程来实现并发。如果要使用当前代码,使用多个进程是最简单的方法。但是,产生进程并不便宜,在PHP中使用线程并不是一件好事。
答案 1 :(得分:1)
你也可以将你的代码放在另一个php文件中并使用它来调用它:
exec("nohup /usr/bin/php -f your script > /dev/null 2>&1 &");
答案 2 :(得分:0)
如果你想像其他语言一样使用异步性,即。使用线程,您需要从PECL安装pthreads extension,因为PHP不支持开箱即用的线程。
你可以在这个问题上找到关于如何使用线程的解释: