SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.09.2011 23:12:10

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Параллелизация процессов в ПХП

Есть ли возможность одновременно выслать запросы на разные MySQL, да так, что бы второй, не ждал пока придёт ответ от первого?


<?
$server1 = mysql_connect("55.55.55.55","a","b");
$server2 = mysql_connect("66.66.66.66","c","d");

mysql_db_query("db1","SELECT ...",$server1);
mysql_db_query("db2","SELECT ...",$server2);

...somethink to do...
?>
 


Скажи миру - НЯ!

Неактивен

 

#2 03.09.2011 23:24:13

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Параллелизация процессов в ПХП

Такой возможности в php нет. Есть варианты обойти это, но они не идеальные
а) использовать fork http://php.net/manual/ru/function.pcntl-fork.php
b) использовать EVENTS для того, чтобы реальная работа выполнялась не запросом, а отложенно

Неактивен

 

#3 04.09.2011 00:15:10

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Параллелизация процессов в ПХП

А что думаете по поводу такого метода?
http://www.php.net/manual/en/mysqli.poll.php

Я немного запуталась во всех этих примерах, никак не могу разобраться (


Скажи миру - НЯ!

Неактивен

 

#4 04.09.2011 00:27:46

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Параллелизация процессов в ПХП

Проблема тут не в MySQL, проблема тут в идеологии. Представьте, что Вы —
бригадир на стройке. У Вас есть рабочий, которого можно послать таскать
кирпичи, а можно послать таскать цемент. Вы хотите послать этого рабочего
таскать кирпичи, а пока он бегает за кирпичами послать независимо таскать
цемент. Один рабочий с такой задачей справиться не может — Вам нужно
два рабочих.

Теперь применим эту аналогию к базе. Кирпичи и цемент — это Ваши под-
ключения. Они оба доступны. Но рабочий у Вас один — это поток исполнения
в PHP. Решение rgbeast как раз клонирует поток исполнения. Судя по резуль-
татам выдачи поисковиков, это чуть ли не единственное решение (можно
еще выполнить независимый сценарий через CLI, но это тот же fork, только
еще менее контролируемый).

Неактивен

 

#5 04.09.2011 11:43:08

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Параллелизация процессов в ПХП

Чаще такое используют когда нужно осуществлять параллельные записи в DB.
С чтением это сложнее. И в практике такое очень редко надо ... Вы уверены что это то что вам нужно ?

Какие способы вообще есть ?
Конкретное решение на вашу задачу даёт Sphinx http://habrahabr.ru/blogs/sphinx/64318/

Открывать асинхронные процессы в php можно с помощью CURL
Возможно для асинхронной работы вам понадобится дополнительно объявлять в запускаемых скриптах
http://www.php.net/manual/en/function.i … -abort.php

Отредактированно evgeny (04.09.2011 11:44:15)

Неактивен

 

#6 04.09.2011 15:21:20

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Параллелизация процессов в ПХП

Уверена, нужно.

Спасибо за ссылку, сейчас буду изучать


Скажи миру - НЯ!

Неактивен

 

#7 04.09.2011 23:55:55

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Параллелизация процессов в ПХП

Вот вам работающий пример с использованием CURL.

<?php

$query1="SELECT ....";
$query2="SELECT ....";

$urls = array(
"localhost/sync/execQuery.php?query=$query1",
"localhost/sync/execQuery.php?query=$query2"
);

 $tasks = array();

 $mh = curl_multi_init();

 foreach($urls as $url)  {
  $h = curl_init("http://".$url);
  curl_setopt($h,CURLOPT_FOLLOWLOCATION,1);
  curl_setopt($h,CURLOPT_RETURNTRANSFER,1);
  curl_setopt($h,CURLOPT_HEADER,0);
  curl_multi_add_handle($mh,$h);
  $tasks[$url] = $h;
 }

 $act = 0;
 do {
  curl_multi_exec($mh,$act);
  $info = curl_multi_info_read($mh);
  if($info["msg"] == CURLMSG_DONE)
  {
   $h = $info["handle"];
   $url = array_search($h,$tasks);
   $tasks[$url] = curl_multi_getcontent($h);
   curl_multi_remove_handle($mh,$h);
   curl_close($h);
  }
 }
 while($act > 0);

 curl_multi_close($mh);
 
 echo "<pre>";
 print_r($tasks);

 ?>


execQuery.php запускает запрос и возвращает массив.

Неактивен

 

#8 05.09.2011 17:06:59

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Параллелизация процессов в ПХП

А разве он не ждёт каждого из них по отдельности?


Скажи миру - НЯ!

Неактивен

 

#9 05.09.2011 17:18:25

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Параллелизация процессов в ПХП

Скажите честно, а что Вы такое пишете, что понадобились потоки PHP?

Неактивен

 

#10 05.09.2011 17:23:06

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Параллелизация процессов в ПХП

Ну вы же помните, вы мне помогали с базами, всё тоже самое пишу, горизонтальное масштабирование, разнести, разнесла, теперь нужен скрипт, что будет собирать нужные данные воедино )


Скажи миру - НЯ!

Неактивен

 

#11 05.09.2011 17:27:35

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Параллелизация процессов в ПХП

Сейчас конечно всё на одной машине, но потом по проекту, сервера могут находится в разных уголках планеты, допустим случится так, что надо будет для выдачи результата опросить 5 серверов с разных концов, каждый запрос это одна только транспортировка в полсекунды + обработка, уже почти секунда. Если идти стандартно, то уйдёт 5 секунд, только на запрос информации, а надо будет её ещё переработать и дальше послать. А так если можно было бы отсылать запросы параллельно не дожидаясь ответа предыдущего, то затрата времени относительного первого варианта выигрывались в геометрической прогрессии smile


Скажи миру - НЯ!

Неактивен

 

#12 05.09.2011 17:28:11

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Параллелизация процессов в ПХП

animegirl написал:

А разве он не ждёт каждого из них по отдельности?

Нет.
Они работают асинхроно (параллельно)

Неактивен

 

#13 05.09.2011 17:48:08

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Параллелизация процессов в ПХП

animegirl написал:

Сейчас конечно всё на одной машине, но потом по проекту, сервера могут находится в разных уголках планеты, допустим случится так, что надо будет для выдачи результата опросить 5 серверов с разных концов, каждый запрос это одна только транспортировка в полсекунды + обработка, уже почти секунда. Если идти стандартно, то уйдёт 5 секунд, только на запрос информации, а надо будет её ещё переработать и дальше послать. А так если можно было бы отсылать запросы параллельно не дожидаясь ответа предыдущего, то затрата времени относительного первого варианта выигрывались в геометрической прогрессии smile

Опишите ваш проект. Скорее всего вы не туда роете.
Возможно правельней будет поменять структуру базы, или создать денормализацию асинхроно сливая в центральную базу или вообще использовать FEDERATED TABLES

Неактивен

 

#14 05.09.2011 18:10:38

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Параллелизация процессов в ПХП

В деталях не имею права, структурой тоже занималась не я, архитектура продумана так, что бы при увеличение количества записей, базы можно было дробить горизонтально по меткам.
Схема выглядит примерно так:
Первый домен
3* Апп сервера
Апп сервера принимают данные, и ответственные за их обработку, они видят базу данных как одно большое целое, отправляя запрос на второй домен

Второй домен
3* сервера, имеют на своих машинах каталог, где указано на каком сервере ДБ находится та или иная информация. Принимают запросы от Апп серверов, собирают информацию по базам, отрезают излишки, отдают готовое на Апп сервер.

ДБ* сервера
Разделены по направлениям под различные сервисы, если информация одной таблицы превышает допустимого значения (время затрачиваемое на поиск), база делится по меткам, и разносится на разные сервера


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


Скажи миру - НЯ!

Неактивен

 

#15 05.09.2011 18:13:11

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Параллелизация процессов в ПХП

Забегу наперёд, пока не начали советовать
Идея репликации ДБ серверов отклонены, так как подключение новых серверов в группу не даёт 100% прирост мощностей, и чем больше будет в группе, тем меньше будет пользы от дальнейшего увеличения
Идея наращивания мощности отдельного сервера, отклонены по коммерческим соображениям.


Скажи миру - НЯ!

Неактивен

 

#16 05.09.2011 19:49:33

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Параллелизация процессов в ПХП

Самым необоснованным, кажется, является написание приложения на PHP.
Это язык для написания страничек, а не полноценных приложений. Но если
этот язык тоже навязан снаружи, то годится обсуждение из параллельного
треда smile

Неактивен

 

#17 05.09.2011 22:30:24

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Параллелизация процессов в ПХП

В общем ваша структура довольно стандартная, полная расширяемость = шардинг + репликация.


сервера могут находится в разных уголках планеты

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

Но в общем это нужно крайне избегать, так как это ломает всю идеологию вашей структуры.
Обычно в таких случаях создаётся центральная база в которую асинхронно сливаются специально сформированные данные с ваших шардов (денормализация)
И в дальнейшем ваши запросы идут напрямую в центральную базу. Расширятся центральная база обычной репликацией.

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

Неактивен

 

#18 05.09.2011 22:59:46

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Параллелизация процессов в ПХП

paulus написал:

Самым необоснованным, кажется, является написание приложения на PHP.
Это язык для написания страничек, а не полноценных приложений. Но если
этот язык тоже навязан снаружи, то годится обсуждение из параллельного
треда smile

В этом я с вами абсолютно не согласен.
PHP это сильный, объектно ориентированный язык программирования, предназначенный для разработки полноценных web приложений.
Именно в web приложениях другие языки особо не обходят PHP, имея также свои сложности и косяки.

Неактивен

 

#19 05.09.2011 23:23:48

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Параллелизация процессов в ПХП

ПХП был выбран насколько я знаю теми же архитекторами, но по спецификации, программируем так, что бы можно было любой узел перенести на другую языковую платформу и пустить параллельно. Но на данный момент главное - скорость разработки, когда будет основное, то часть команды переключится на оптимизацию.

Географический разнос серверов запланирован на более позднию стадию, так как главный метки по разбивки данных будут географическое место расположение, и по моделе, выйдет так, что 80% запросов будет затрагивать ту область, где пользователь находится, тем самым разнос серверов, уменьшат время передачи данных.

Центральная база если и будет, то по некоторым определённым, не релевантным для общей работы, данным. Проект будет состоять из набора подключаемых модулей, запланировано так, что бы при вылете одного из модулей, остальные работали штатно, при вылете главного домена, модули можно было открывать с их личных доменов, и работать как не в чём не бывало smile

Запросы к нескольким серверам будут, причём чем больше будет информации, тем больше её будем делить, и тем больше будет шардов, так что это смоделировано заранее


Скажи миру - НЯ!

Неактивен

 

#20 05.09.2011 23:41:50

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Параллелизация процессов в ПХП

Географический разнос серверов запланирован на более позднию стадию, так как главный метки по разбивки данных будут географическое место расположение, и по моделе, выйдет так, что 80% запросов будет затрагивать ту область, где пользователь находится, тем самым разнос серверов, уменьшат время передачи данных.

Лет 10 назад это могло бы быть эффективно, но с сегодняшней скоростью сети, месторасположение сервера практически не играет значение.
Географически распределяются только прокси сервера с кешем тяжелого трафика как фото или видео.

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

Неактивен

 

#21 05.09.2011 23:45:58

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Re: Параллелизация процессов в ПХП

Да почти, сейчас надо разобраться с federated и понять нужны ли вообще сервера Б, ведь основные действия на них происходить не будут, потому их задачу можно будет спокойно перенести на сервера А


Ну попробуйте взять прокси Бразилии и пропинговать японские сервера, потом умножаем количество соединений, и их частоту, так как аякс при малейшем изменение, будет запрашивать новые данные.


Скажи миру - НЯ!

Неактивен

 

#22 06.09.2011 22:18:42

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Параллелизация процессов в ПХП

По поводу скорости разработки — возьмите какой-то высокоуровневый язык типа ruby,
(да, я имею в виду rails) — разработка станет быстрее, чем на php smile

Пинги обычно не так важны, как скорость передачи информации, которая у нас высокая
по всему миру. А скорость ответа Вам снизят обычные реплики на близкорасположенных
серверах.

Неактивен

 

#23 07.09.2011 00:38:00

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Параллелизация процессов в ПХП

Ну попробуйте взять прокси Бразилии и пропинговать японские сервера

А зачем ?
Международные проекты располагаются на американских или европейских дата центрах с хорошими выходами, с короткими трейсами, вот вам и быстрый доступ с любого конца света.
Попробуйте попингуйте google или facebook все сервера в Америке, и нигде проблем с гуглом нет, не в Японии не в Бразилии ...

Неактивен

 

#24 07.09.2011 00:44:48

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Параллелизация процессов в ПХП

paulus написал:

По поводу скорости разработки — возьмите какой-то высокоуровневый язык типа ruby,
(да, я имею в виду rails) — разработка станет быстрее, чем на php smile

Ну это бесконечная тема ...  smile Так можно везде плюсы и минусы найти ...
Если на PHP писать используя фреймворки и готовые решения, и при этом очень хорошо это уметь делать, то разница в скорости уже будет зависеть не от языка. smile

Неактивен

 

#25 07.09.2011 10:30:12

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Параллелизация процессов в ПХП

Язык неизбежно накладывает свою идеологию на стиль программирования.
Можно писать на python так же, как на php, но это будет неэффективно (как
по времени программирования, так и по времени исполнения полученного
кода). Какой бы ни был фреймворк — он останется на PHP, и Вы будете вынуж-
дены думать в терминах PHP.

Я не призываю менять язык прямо здесь и сейчас. Просто существуют куда
более высокоуровневые языки, которые позволяют делать всё быстрее.
Тот же VisualBasic, например wink

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson