Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Параллельная обработка 2-х php запросов с одного браузера
 
 автор: Evgen29   (20.11.2009 в 13:27)   письмо автору
 
 

Привет всем!Проблема в следующем. Есть клиент, который через аякс(использую mootools) посылает запрос на серверный php-скрипт:

  var MyRequest = new Request({
  url : 'framework/kernelServer.php',
  data : 'task=getEvent&event=' + ev + '&element=' + el + '&idview=' + cw + strResult,
  method : 'post',
  noCache : true,
  //headers : 'Content-type: text/html; charset=windows-1251',
  onRequest : function(item){
      if($(el+'_img')){
        $(el+'_img').innerHTML = '<img src="../images/ajax-loader.gif" />';
      }
  },
  onSuccess : function(responseText, responseXML){
      if($(el+'_img')){
        $(el+'_img').innerHTML = '';
      }
      EventProvider(responseText, responseXML);
  }
  }).send();


На сервере php получает запрос, обрабатывает его и отдает функции:

   public function GetGBReport($comp,$id_r,$pr_in,$pr_out){
       global $answer;
       ini_set('max_execution_time','6000');
       set_time_limit (6000);
       ini_set('max_input_time','6000');
       ini_set('default_socket_timeout','6000');
       ob_start();
       include 'http://int.rostanet.ru/cgi-bin/GBReport.cgi?rep='.$id_r.'&in='.$pr_in.'&out='.$pr_out.'&comp='.$comp.'&answer='.$answer;
       $data=ob_get_contents();
       ob_clean();
       $this->currentResult = $data;
   }

которая внутри себя подключает cgi-скрипт. Этот скрипт создает удаленный com-объект на удаленном компьютере(его параметры передаются в переменной $comp), работает с ним(может даже около 20-30 минут),потом получает от него результаты, обрабатывает их и в нужной форме отдает в выходной поток. Моя вышеописанная функция,вернее метод класса, получает этот результат и возвращает его в браузер. все работает в принципе нормально, когда идет обращение к серверу от браузера один раз. Но у меня к той же страничке сервера клиент обращается через аякс с помощью других элементов формы через 2-3 секунды после первого обращения. Так вот, когда клиент посылает 1-й запрос, вижу, что на удаленном терминале идет процесс запуска com-объекта. Нажимаю другую кнопку на клиенте, он отсылает запрос к php, но на другом удаленном терминале не создается объект до тех пор, пока первый не отработает. Есть подозрение, что php не дает запуститься еще одному процессу. Вопрос: как сделать параллельную обработку нескольких запросов от одного клиента?

  Ответить  
 
 автор: Evgen29   (20.11.2009 в 14:21)   письмо автору
 
   для: Evgen29   (20.11.2009 в 13:27)
 

...делаю сводный отчет по нескольким базам...

  Ответить  
 
 автор: Evgen29   (20.11.2009 в 16:09)   письмо автору
 
   для: Evgen29   (20.11.2009 в 14:21)
 

кстати попробовал залогиниться под двумя разными пользователями в разных браузерах-в одном нажал запрос для одного терминала, а в другом для другого и на обоих терминалах запустился com-объект одновременно. понял, что 2 следующих друг за другом запроса от одного пользователя(поочередное нажатие 2-х кнопок,отправляющих запрос на сервер) php не обрабатывает сразу. А надо, чтобы сразу :)

  Ответить  
 
 автор: Evgen29   (23.11.2009 в 09:45)   письмо автору
 
   для: Evgen29   (20.11.2009 в 16:09)
 

Как я понял, под одной сессией можно запустить только один серверный процесс обработки запроса пользователя(???)
Вопрос - можно как либо запускать несколько процессов обработки параллельно. Допустим клиент обращается к серверу, тот запускает скрипт на сервере в той же сессии, который создает новую сессию и передает ей запрос клиента и SID текущей сессии и сам ничего не возвращает.Новая сессия обрабатывает запрос клиента, стартует скрипт с SID от старой сессии и возвращает клиенту из нее результат. Получается такая небольшая многопоточность. Можно это как то реализовать?Или есть более простые варианты, которые позволяют одной лишь настройкой сервера разрешать из одной сессии запускать несколько процессов обработки?

  Ответить  
 
 автор: Valick   (23.11.2009 в 11:54)   письмо автору
 
   для: Evgen29   (23.11.2009 в 09:45)
 

Спросите чё-нить полегче :)
интересует содержимое переменной $comp чем они отличаются для разных пользователей и чем они похожи для одного пользователя.
а ещё лучше расскажите подробнее о переменных $id_r,$pr_in,$pr_out
Честно скажу многопоточность для меня белое пятно, но то что вы описали не совсем похоже на многопоточность.

  Ответить  
 
 автор: Evgen29   (23.11.2009 в 12:33)   письмо автору
 
   для: Valick   (23.11.2009 в 11:54)
 

Все отражено в первом вопросе
а $id_r,$pr_in,$pr_out это параметры для cgi - в данном контексте они неважны

  Ответить  
 
 автор: Valick   (23.11.2009 в 12:45)   письмо автору
 
   для: Evgen29   (23.11.2009 в 12:33)
 

Вам помощь нужна или Вы проверяете уровень моих знаний?
Неужели так трудно сделать echo $comp для запроса от одного пользователя, для этого же пользователя через 2..3 сек и для другого пользователя?

  Ответить  
 
 автор: Evgen29   (23.11.2009 в 13:24)   письмо автору
 
   для: Valick   (23.11.2009 в 12:45)
 

"...Этот скрипт создает удаленный com-объект на удаленном компьютере(его параметры передаются в переменной $comp), работает с ним(может даже около 20-30 минут),потом получает от него результаты, ..."
$comp - просто имя компьютера, на котором должен запустится com-объект через cgi, а cgi-скрипт запускается из php. Проблема в том, что когда внутри php запускается cgi, сам cgi долго отрабатывает и php при этом ждет. Если в этот момент попробовать передать еще один запрос от клиента в php, то php этот запрос не выполняет мгновенно путем запуска еще одного процесса, а ставит этот 2 запрос в очередь. 2 Запрос ждет до тех пор пока не отработает первый, а потом начинает работать сам.

  Ответить  
 
 автор: Valick   (23.11.2009 в 14:14)   письмо автору
 
   для: Evgen29   (23.11.2009 в 13:24)
 

кстати попробовал залогиниться под двумя разными пользователями в разных браузерах-в одном нажал запрос для одного терминала, а в другом для другого и на обоих терминалах запустился com-объект одновременно.
это не я писал

  Ответить  
 
 автор: Evgen29   (24.11.2009 в 11:00)   письмо автору
 
   для: Evgen29   (20.11.2009 в 16:09)
 

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

  Ответить  
 
 автор: Evgen29   (24.11.2009 в 14:53)   письмо автору
 
   для: Evgen29   (20.11.2009 в 13:27)
 

избавится от такого рода "однопоточности" сессий помогло - ПРОСТОЕ ОТКЛЮЧЕНИЕ СЕССИЙ для данного серверного скрипта :)
все гениальное просто :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования