异步PHP |将数据处理到多个系统中(建议)

异步PHP |将数据处理到多个系统中(建议),php,asynchronous,multitasking,Php,Asynchronous,Multitasking,我正在构建一个集成,通过API(REST)将数据通信到多个不同的系统。我需要尽快处理数据。这是一个基本布局: 解析和处理数据(可能放入如下数组) $data=array(Title=>“Title”,Subtitle=>“Test” 将数据提交到服务(1)$result1=$class1->functionservice1($data); 将数据提交到服务(2)$result2=$class2->functionservice2($data); 将数据提交到服务(3)$result3=$clas

我正在构建一个集成,通过API(REST)将数据通信到多个不同的系统。我需要尽快处理数据。这是一个基本布局:

  • 解析和处理数据(可能放入如下数组)
  • $data=array(Title=>“Title”,Subtitle=>“Test”

  • 将数据提交到服务(1)
    $result1=$class1->functionservice1($data);
  • 将数据提交到服务(2)
    $result2=$class2->functionservice2($data);
  • 将数据提交到服务(3)
    $result3=$class3->functionservice3($data);
  • 报告完成
    回显“完成”;
  • 在上面的脚本中运行,我需要等待每个函数完成,然后再开始下一个函数(需要3倍的时间)

    是否有一种简单的方法可以异步运行每个服务功能,但在(5)报告完成之前等待所有功能完成。我需要能够从每个
    $result
    提取数据,并将其作为一个帖子返回给第四个服务

    抱歉,如果这是一个简单的问题-我是一个PHP新手


    非常感谢,Ben

    您也可以将代码放入另一个php文件中,并使用以下方法调用它:

     exec("nohup /usr/bin/php -f your script > /dev/null 2>&1 &");
    

    如果您想像在其他语言中一样使用异步性,例如使用线程,则需要从PECL安装,因为PHP不支持开箱即用的线程

    您可以通过以下问题找到关于如何使用线程的解释:


    是的,有多种方法

    最有效的方法是使用事件循环,该循环利用非阻塞I/O实现并发性和协作多任务

    一个这样的事件循环实现是。有一个HTTP客户端与Amp一起工作,它被称为。它的自述文件中包含了一个示例。您应该看看承诺和协同路由是如何工作的。有
    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;
        }
    });
    

    您需要使用pthreads extension,PHP不支持开箱即用的线程……请看这里您可以看到问题的答案@Avihaym这些答案中没有异步性……您是从
    CLI
    运行代码还是通过web服务器调用脚本?@Mjh-我是通过web服务器运行的,可能是启动的作为一个cron作业。我将迭代一个挂起数据更新的数据库-每次提取一行并通过上述过程运行它。谢谢。我考虑过这种方法,但似乎无法将变量传递到脚本中。是否有任何方法可以将$data数组传递到名为with
    exec(…)的脚本中是的,您可以这样做:exec(“nohup/usr/bin/php-f/您的脚本“$var1.”“$var2.”>/dev/null 2>&1&”),然后通过$argv[1]获取它…有点像是@Avihay m。我可以创建另一个php文件,并使用上述选项将以前创建的变量传递给它。我仍然不明白的是,在子进程完成后如何在父进程中检索结果(我需要确保我也等待完成).有什么方法可以做到这一点吗?正如问题中所述-我正在尽最大努力,但PHP对我来说是一个全新的东西。我这里有3个答案,所有答案都可以完成这项工作。你的答案将是最简单的执行方法,基本上就是我上面要求的(其他答案可能更好,但我很难理解)@BenRees请确保转义您传递给脚本的变量,否则它可能会执行您不想要的操作。如果您对我自己的答案有任何疑问,或者想聊一下PHP的一般情况,您可以给我打电话。@BenRees我认为没有办法得到结果,脚本正在运行,并且与他的父母无关。我认为最好的结果是将结果保存在DB中,或者像我一样移动到Nodejs。祝你好运:)这不是真的。您需要使用操作系统的偶数接口(
    epoll
    ,Linux上)和为您的应用程序公开它的扩展。线程并不意味着异步。看一看,这恰恰暴露了我写的东西-1代表不正确的答案,并且在您的答案中没有说明OP如何使用线程来完成任务的示例。再次感谢您的回复和评论。我将通过该线程进行查看,看看这个或@Avihay m的答案是否最适合(并且最容易实现)我的情况。它到底是怎么不正确的?“线程化”并不意味着“异步”,我同意,-JS是单线程的,但有异步机制-但线程化是实现“做点什么,稍后通知”模式的一种方式@MjhIt是不正确的,因为有人问你如何建造房子,而你的回答是“使用锤子”。这是不正确的,因为使用线程并不意味着实现了异步性。OP还告诉你他是PHP新手,但你的建议是使用线程——他正确使用线程的几率有多大?如果您建议为PHP安装一个扩展,为什么不建议一个事件循环,它隐藏了实现,但公开了异步操作?这正是
    node.js
    所做的,人们可以通过扩展在PHP中实现同样的功能。看看我链接的库。谢谢你的建议@Mjh和n00dl3(@)-我会离开去研究什么是最合适的。我尽量避免在可能的地方安装库(因此我了解所有内容),但在这种情况下,它似乎是唯一的选择。我会尽快标记答案:)