4

Phil Sturgeon 写了这篇关于基准测试的文章。

我关心的是这种称为 ReactPHP 的技术。

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

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

在第 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();
4

2 回答 2

3

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

好吧,$loop var 用于将所有闭包函数保存在一个数组中,以便稍后异步执行。

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

ReactPHP 不会替代或对抗 (Apache2 | Nginx) ,它在大多数情况下会将一些问题汇总到 CLI 进程中。

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

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

于 2013-12-21T18:16:28.210 回答
0

循环完全按照它所说的去做。它循环。就像 node.js 一样,它不断重复无限循环并等待附加任务的某些状态发生变化。这些更改会发出可以在发生时完全处理的事件。这使您有机会对外部事件(您的操作系统中的另一个进程、另一个 Web 服务等)做出反应。这称为反应式编程。

可能的用例是等待客户端连接(例如网络聊天)的套接字服务器(没有 ngjnx 或 Apache),或者从您通过套接字连接连接到的证券交易所保存当前股票价格。

于 2018-02-26T17:58:58.743 回答