Phil Sturgeon 写了这篇关于基准测试的 article

我关心的是这项名为 ReactPHP 的技术。

我去过他们的 GitHub,但如果没有一个例子,我仍然无法理解它。

谢天谢地,我可以使用 Phil 的 repo。

在第 12 行,Phil 用 ReactPHP 创建了一个循环。

https://github.com/philsturgeon/nonblockingbro/blob/master/p2-async.php#L12

然后他开始使用第 24 行的循环

https://github.com/philsturgeon/nonblockingbro/blob/master/p2-async.php#L24

我的问题是:

  • 这个 $loop 的目的是什么?
  • 它在 ReactPHP 上说,它是一个简单的 Web 服务器。这是否意味着它取代了 nginx 或 Apache?
  • 什么时候是使用 ReactPHP 或任何类似技术的好时机?什么时候不适合使用它?

  • 我正在尝试了解这项技术,所以如果我对这个问题的措辞不好,请告诉我,以便我可以重写。

    编辑:

    由于我收到反馈说这个问题太宽泛,让我缩小我的问题并使其引用代码示例。

    https://github.com/philsturgeon/nonblockingbro/blob/master/p2-async.php#L12 中获取代码示例,

    我在下面复制了它。 $loop 有什么作用?
    $loop = React\EventLoop\Factory::create();
    
    $dnsResolverFactory = new React\Dns\Resolver\Factory();
    $dnsResolver = $dnsResolverFactory->createCached('8.8.8.8', $loop);
    
    $factory = new React\HttpClient\Factory();
    $client = $factory->create($loop, $dnsResolver);
    
    
    echo "Page number, Time taken";
    for ($page = 1; $page <= $total_page; $page++) {
    
        $loop->addTimer(0.001, function($timer) use ($client, $page) {
            $buffer = '';
            $request = $client->request('GET', 'http://fantasy.premierleague.com/my-leagues/303/standings/?ls-page='.$page);
            $request->on('response', function($response) use (&$buffer) {
                $response->on('data', function($data) use (&$buffer) {
                    $buffer .= $data;
                });
            });
            $request->on('end', function() use (&$buffer, $page) {
    
                \phpQuery::newDocument($buffer);
    
                foreach (pq('.ismStandingsTable tr') as $data) {
                    foreach (pq('td', $data) as $key => $val) {
                        if ($key == 2) {
                            // print pq($val)->text();
                        }
                    }
                }
    
                $time_end = microtime(true);
                $execution_time = $time_end - $GLOBALS['time_start'];
                echo ("\n".$page.", ".$execution_time);
    
            });
            $request->end();
        });
    }
    
    $loop->run();
    

    最佳答案

    1 - 这个 $loop 的目的是什么?

    好吧,$loop var 用于将所有 closures functions 保存到一个数组中,以便稍后异步执行。

    2 - 它在 ReactPHP 上说,它是一个简单的 Web 服务器。这是否意味着它取代了 nginx 或 Apache?

    ReactPHP 不会取代或对抗 (Apache2 | Nginx) ,它在大多数情况下会将一些问题聚合到 CLI 过程中。

    3 - 什么时候是使用 ReactPHP 或任何类似技术的好时机?什么时候不适合使用它?

    我真的不在生产服务器上使用 ReactPHP,但是在临时服务器中执行一些自动化批处理或测试一些问题已经非常成功。

    10-05 18:18