PHP 异步调用多个函数

野孩子

我正在使用 Symfony 3 和ReactPHP库来控制我的所有功能,我需要异步执行对同一函数(subFunction()在代码中)的多次调用我有 2 个项目(project1 和 project2):

项目1代码:

/**
* Loop an array of urls and call sub function.
**/
public function startFunction() {
  $finalResponse = [];
  $urls = ['www.google.es', 'www.github.com', 'www.bitbucket.org'];

  foreach ($urls as $url) {
    $res = $this->subFunction($url);    // subfunction call ( **IT MAY TAKE A LONG TIME !!** )
    $finalResponse[] = $res;
 }

 return $finalResponse;
}

/**
* Uses Factory loop to get the Promise returned by finalRequest function.
**/
private function subFunction($url) {
  $loop = \React\EventLoop\Factory::create();
  $classA = new Project2\ClassA();
  $finalResponse = null;

  // project 2 function call
  $classA->finalRequest($url)->then(function($response) use(   
     &$finalResponse
  ) {
     $finalResponse = $response;
  })

  return $finalResponse;
}

项目2代码:

classA {

/**
* Makes an React\HttpClient request (GET) to sent url and return his value inside a Promise.
**/
public function finalRequest($url) {
   $generalDeferred = new Deferred();
   $generalPromise = $generalDeferred->promise();

   // make React\HttpClient request
   $request = $client->request('GET', $url);
   $request->on('response', function ($response) use($generalDeferred) {
   $response->on('data', function ($response) {
        $generalDeferred->resolve($response);
      });
   });
  $request->end();

  return $generalPromise;
}

}

问题是在每次subFunction($url)调用时,程序都会停止,直到 sub Function 得到响应,但我需要异步执行此操作,因为此 subFunction 可能需要几秒钟。所以我想同时启动所有subFunction($url)调用,并异步获取所有响应。

有可能解决这个问题吗?谢谢。

艾伯特

首先,一个应用程序中只能运行一个循环。其次,您必须使循环运行:https : //reactphp.org/event-loop/

您应该创建应用程序,然后注册所有服务和事件,启动循环并将其作为服务器运行。

$loop = React\EventLoop\Factory::create();

$server = stream_socket_server('tcp://127.0.0.1:8080');
stream_set_blocking($server, 0);

$loop->addReadStream($server, function ($server) use ($loop) {
[...]
});

$loop->addPeriodicTimer(5, function () {
[...]
});

$loop->run(); <---- you will not execute anything behind this point.

为什么?https://github.com/reactphp/event-loop/blob/master/src/ExtLibeventLoop.php#L196

public function run()
{
    $this->running = true;
    while ($this->running) { <------------------------------
        $this->futureTickQueue->tick();
        $flags = EVLOOP_ONCE;
        if (!$this->running || !$this->futureTickQueue->isEmpty()) {
            $flags |= EVLOOP_NONBLOCK;
        } elseif (!$this->streamEvents && !$this->timerEvents->count()) {
            break;
        }
        event_base_loop($this->eventBase, $flags);
    }
}

对于循环的使用,我建议使用 Guzzle Async:http ://docs.guzzlephp.org/en/stable/faq.html

$finalResponse = [];
$promises = [];
$urls = ['www.google.es', 'www.github.com', 'www.bitbucket.org'];
foreach ($urls as $index => $url) {
    $promise = $client->requestAsync('GET', $url);
    $promise->then(function ($response) use ($index, &$finalResponse) {
        $finalResponse[$index]=$response;
    });
    $promises[$index]=$promise;
}
foreach ($promises as $promise) {
    $promise->wait();
}
return $finalResponse;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

对php脚本进行异步调用

来自分类Dev

AWS开发工具包(PHP):异步调用lambda函数,获取状态

来自分类Dev

Android多个异步调用

来自分类Dev

异步调用模板函数

来自分类Dev

等待多个异步调用完成?

来自分类Dev

如何返回多个异步调用的响应?

来自分类Dev

对mongolab运行多个异步调用失败

来自分类Dev

PHP / HTML / JavaScript:使用echo异步调用时,<script>不起作用

来自分类Dev

PHP / HTML / JavaScript:使用echo异步调用时,<script>不起作用

来自分类Dev

如何异步调用AWS Lambda函数

来自分类Dev

Knockout计算函数内部的异步调用

来自分类Dev

lua同步调用C异步函数

来自分类Dev

在OCaml中异步调用函数

来自分类Dev

异步调用的函数语法

来自分类Dev

lua同步调用C异步函数

来自分类Dev

如何异步调用AWS Lambda函数

来自分类Dev

异步调用函数的 NodeJs 错误

来自分类Dev

nodejs- 在函数内执行多个异步调用的最佳方法?

来自分类Dev

完成多个异步调用后,AJAX会启动最终的异步调用

来自分类Dev

从同一PHP资源调用多个函数

来自分类Dev

从函数[PHP]调用数组中的多个参数

来自分类Dev

异步调用方法

来自分类Dev

角度异步调用

来自分类Dev

与委托的异步调用

来自分类Dev

OnContextItemSelected异步调用

来自分类Dev

承诺异步调用

来自分类Dev

显示多个Ajax异步调用的等待Gif

来自分类Dev

节点FTP:循环内有多个异步调用

来自分类Dev

在JavaScript中异步调用多个Promise的正确方法