2013-11-13 4 views
4

Phil Sturgeon написал об этом article о бенчмаркинге.

Что касается меня, эта технология называется ReactPHP.

Я был в их GitHub, но до сих пор не могу обдумать его без примера.

К счастью, я могу использовать репо Фила.

На линии 12 Фил создал петлю с 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, это простой веб-сервер. Означает ли это, что он заменяет nginx или Apache?
  • Когда самое подходящее время для использования ReactPHP или любой подобной технологии? Когда не подходящее время для его использования?

Я пытаюсь узнать об этой технологии, поэтому, если я сформулировал этот вопрос плохо, дайте мне знать, чтобы я мог переписать это.

EDIT:

Поскольку я получаю обратную связь о том, что вопрос является слишком широким, позвольте мне сузить свой вопрос и сделать ссылку на примере кода.

Взяв пример кода из 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(); 

ответ

3

1 - Какова цель этой петли $?

Ну, переменная $ loop используется для сохранения всех closures functions в массив, который будет выполняться позже асинхронно.

2 - Это говорит о ReactPHP, это простой веб-сервер. Означает ли это, что он заменяет nginx или Apache?

ReactPHP не заменит или не сразится с (Apache2 | Nginx), он в большинстве случаев объединит некоторые проблемы для процесса CLI.

3 - Когда самое подходящее время для использования ReactPHP или любой подобной технологии? Когда не подходящее время для его использования?

Я действительно не использую ReactPHP на производственном сервере, но было очень успешно выполнить некоторый автоматизированный пакетный процесс или протестировать некоторые проблемы на промежуточном сервере.

0

Петля делает именно то, что она говорит. Это петли. Точно так же, как узел.js он непрерывно повторяет цикл infinte и ждет, пока некоторые состояния связанных задач будут изменены. Эти изменения испускают события, которые можно обрабатывать точно так же, как это происходит. Это дает вам возможность реагировать на внешние события (другой процесс в вашем os, другой Web-сервис или аналогично). Это называется реактивным программированием.

Возможные варианты использования - это серверы сокетов (без использования ngjnx или Apache), которые ждут подключения клиентов (например, веб-чат) или сохранения текущих цен на акции с биржи, к которой вы подключены через соединение сокета.

Смежные вопросы