Мы планируем создавать ставки в режиме реального времени, и мы оцениваем производительность PHP
сравнению с Java
с точки зрения пропускной способности и времени отклика и т. Д. (Часть Java берет на себя другой член команды)
Начальный старт:
У меня есть тестовый скрипт, который делает 50 http-соединений для разных серверов.
1-й подход. Я использую функцию curl_multi_init
и получаю ответ менее 7 секунд.
Второй подход. Я использую PHP
pthreads api
и пытаюсь сделать параллельные вызовы и ожидая того же времени отклика или меньше. Но общее время в среднем составляет около 25 секунд
Вот код
<?php $g_request_arr = array( '0' => array( 'request_url' => 'https://www.google.co.uk/?#q=56%2B12' ), .. .. .. '49'=>array( 'request_url' => 'https://www.google.co.uk/?#q=256%2B132' ) ); class ChildThread extends Thread { public function __construct($urls) { $this->data = $urls; } public function run(){ foreach($this->data as $url_info ){ $url = $url_info['request_url']; file_get_contents($url); } $this->synchronized(function($thread){ $thread->notify(); }, $this); } } $thread = new ChildThread($g_request_arr); $thread->start(); $thread->synchronized(function($thread){ }, $thread); ?>
Я хочу знать, чего не хватает в приведенном выше коде, или можно довести ответ до 7 секунд.
Вы запрашиваете все данные в одном потоке, вот лучший подход:
<?php class WebRequest extends Stackable { public $request_url; public $response_body; public function __construct($request_url) { $this->request_url = $request_url; } public function run(){ $this->response_body = file_get_contents( $this->request_url); } } class WebWorker extends Worker { public function run(){} } $list = array( new WebRequest("http://google.com"), new WebRequest("http://www.php.net") ); $max = 8; $threads = array(); $start = microtime(true); /* start some workers */ while (@$thread++<$max) { $threads[$thread] = new WebWorker(); $threads[$thread]->start(); } /* stack the jobs onto workers */ foreach ($list as $job) { $threads[array_rand($threads)]->stack( $job); } /* wait for completion */ foreach ($threads as $thread) { $thread->shutdown(); } $time = microtime(true) - $start; /* tell you all about it */ printf("Fetched %d responses in %.3f seconds\n", count($list), $time); $length = 0; foreach ($list as $listed) { $length += strlen($listed["response_body"]); } printf("Total of %d bytes\n", $length); ?>
Это использует несколько сотрудников, которые вы можете настроить, изменив $ max. Нет смысла создавать 1000 потоков, если у вас 1000 запросов на обработку.