[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Многопоточность, исполнение параллельных задач в с
vetalspb

Есть проект, в котором по web сервису идут запросы к нескольким сайтам которые отдают результат.
Необходимо организовать многопоточность что бы Н количесство скриптов запускалось одновременно.
Сейчас они запускаются последовательно
include("./webser/1.php");
include("./webser/2.php");
............
include("./webser/.....php");
А надо что бы они исполнялись параллельно, и в случаи зависания они убивались, передавая об этом информацию. Что бы не подвешивать сайт. Каждому скрипту передается несколько параметров, номер запроса, строка поиска.
Сервер freebsd php apache
Игорь_Vasinsky
Цитата
include("./webser/1.php");
include("./webser/2.php");

последовательно

Цитата
include("./webser/1.php"); include("./webser/2.php");

параллельно.

ты главно не унывай.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
vagrand
Реализуйте эти скрипты в виде cli скриптов и запускайте их в фоновом режиме посредством exec()

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
vetalspb
Цитата
Реализуйте эти скрипты в виде cli скриптов и запускайте их в фоновом режиме посредством exec()

но если через exec запускать, то я не смогу получить информацию об окончании выполнения скрипта. А это значит что вывод данных в скрипте
include("./webser/1.php");
include("./webser/2.php");
............
include("./webser/.....php");

print_r('$result');
T1grOK
Такие вещи делаются через сервер очередей.

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
kaww
Можно посмотреть в сторону http://php.net/manual/ru/class.thread.php
Должно быть как-то так:

class Webser extends Thread
{
protected $_num;

public function __construct($num)
{
$this-_num = $num
}

public function run()
{
include("./webser/{$this->_num}.php");
}
}


for($i=1;$i <= $n;++$i) {
$thread = new Webser($i);
$thread->start();
$thread->join();
}

З.Ы. Ничего не могу сказать по поводу производительности такого решения, т.к. не приходилось иметь дела с многопоточностью в php.
vetalspb
Вот так сделал.

$urls = array(
'http://www.ya.ru/',
'http://test.ru/webser/1.php',
'http://test.ru/webser/2.php'
);
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
$conn[$i]=curl_init($url);
curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1); //ничего в браузер не давать
curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,10); //таймаут соединения
curl_multi_add_handle ($mh,$conn[$i]);
}
//Пока все соединения не отработают
do { curl_multi_exec($mh,$active); } while ($active);
//разбор полетов
for ($i = 0; $i < count($urls); $i++) {
//ответ сервера в переменную
$res[$i] = curl_multi_getcontent($conn[$i]);
curl_multi_remove_handle($mh, $conn[$i]);
curl_close($conn[$i]);
}
curl_multi_close($mh);
print_r($res);

пока что не понял как работает. Прибавки в скорости не увидел. Но может пока не так много потоков поэтому не чувствуется
arbuzmaster
Много поточный curl жрет много ресурсов и процесс остановиться, только тогда когда закончатся все вызовы. Я делал цикл, в котором вызывал скрипты wget - ом с выводом в null через exec, работает шустро и жрет намного меньше ресурсов. А логировать процессы можно из самих php скриптов в файл или в БД( у меня результаты отправляются на websocket server). Опыты показали, что многопоточный curl жрет 18%, а wget в цикле - в момент запуска 2% (нагрузка на процессор Raspberry PI 3)


public static function startScenes($scenes)
{

foreach ($scenes as $scene)
{

exec('wget -O /dev/null -q http://localhost/scenes/ajax/'.urlencode($scene).' >/dev/null &');

}


}


_____________
Мой первый сайтик

Посмотри на свой XBMC под другим углом
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.