Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.02.2012, 06:48
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

PHP: несколько AJAX запросов с долговременной обработкой на сервере
Мне нужно получить данные с серверного скрипта, который обрабатывает и возвращает ответ, к примеру, через минуту. Если я посылаю, например, сразу два AJAX запроса, то ответ обоих я получу через две минуты (первый — через минуту, второй — через две). Как сделать так, чтоб один клиент мог своими действиями создавать два независимых процесса (а не один процесс со стеком запросов) на сервере, чтоб данные начали обрабатываться сразу, а ответ пришел через минуту, а не через две?
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #2 (permalink)  
Старый 15.02.2012, 07:13
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

почитай про pcntl_fork() в PHP
Ответить с цитированием
  #3 (permalink)  
Старый 17.02.2012, 03:27
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Если я правильно понял pcntl_fork распараллеливает работу на сервере. Т. е. клиент послал один запрос, сервер создал несколько потоков... А я посылаю много запросов, эти запросы всё равно будут храниться в стеке.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #4 (permalink)  
Старый 17.02.2012, 12:19
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от FINoM
Т. е. клиент послал один запрос, сервер создал несколько потоков...
Не совсем правильно, я так понял вы хотите разгрузить клиента от ожидаемых запросов. Для этого и есть fork. Тоесть все просто.
Делаете запрос на сервер, сервер создает дополнительный поток. А из основного выходит, тоесть отпускает клиента. Клиент же в свою очеред через пару минут снова обращается к серверу для получения информации о завершении обработки данных в потоке, если порожденный поток выполнил свою работу, он к примеру на сервере устанавливает некий триггер в сессии/БД это уж вам решать как сохранить, клиент обращается к серверу и проверив триггер понимает завершен поток или нет, если да то получает уже данные обработанные из сессии/БД.
Ответить с цитированием
  #5 (permalink)  
Старый 17.02.2012, 13:02
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

примерно так:

<?php
	// Создаем сессию
	$expireTime = 60*60*24*30;
	session_set_cookie_params( $expireTime );
	session_start();

	// Подготавливаем массив процессов
	if ( !isset( $_SESSION['forks'] ) ) {
		$_SESSION['forks'] = array();
	}

	if ( isset( $_GET['action'] ) ) {

		switch( $_GET['action'] ) {

			case "startProcess":

				// генерим уникальный ключ для процесса
				$processId = md5( mktime() );
				// ставим процессу статус не завершен
				$_SESSION['forks'][ $processId ] = false;

				// создаем процесс
				$pid = pcntl_fork();
				// С этого участка кода сразу же начнет работать дочерний поток

				if ( $pid == -1 ) {
					// Если поток создать не удалось

					// Уничтожаем инфу о процессе
					unset( $_SESSION['forks'][ $processId ] );

					exit( "Create process failed" );
				} else if ( $pid ) {
					// Сюда попадет родительский поток, тоесть основной

					exit( "Process started. Current process PID: ".$processId );
				} else {
					// сюда попадет дочерний/порожденный поток

					// ......... обрабатываем данные

					// ставим статус завершен
					$_SESSION['forks'][ $processId ] = true;

					// завершаем процесс
					exit();
				}

				break;

			case "processStatus":
				// Если передали ID процесса и он есть в массиве процессов
				if ( isset( $_GET['pid'] ) && isset( $_SESSION['forks'][ $_GET['pid'] ] ) ) {

					// Проверяем статус
					if ( $_SESSION['forks'][ $_GET['pid'] ] ) {

						// Уничтожаем инфу о процессе
						unset( $_SESSION['forks'][ $processId ] );

						$status = "complete";
					} else {
						$status = "working";
					}

					exit( "Process status ".$status );
				}

				exit( "Process not found" );
				break;
			default;
		}
	}
?>
Ответить с цитированием
  #6 (permalink)  
Старый 17.02.2012, 13:07
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

запускать это дело примерно так:
Стартануть процесс:
http://somesite.com/fork.php?action=startProcess

Проверить статус:
http://somesite.com/fork.php?action=processStatus&pid={PROCESSID}
Ответить с цитированием
  #7 (permalink)  
Старый 20.02.2012, 13:48
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от FINoM
Как сделать так, чтоб один клиент мог своими действиями создавать два независимых процесса (а не один процесс со стеком запросов) на сервере,
[telepath mode]вызывать session_write_close как можно быстрее или не запускать 2 одинаковых запроса в ff/chrome[/telepath mode]

Последний раз редактировалось x-yuri, 20.02.2012 в 14:47.
Ответить с цитированием
  #8 (permalink)  
Старый 20.02.2012, 14:48
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

кстати, интересно, что опера выполняет один запрос, если в двух вкладках попытаться открыть один и тот же url
Ответить с цитированием
  #9 (permalink)  
Старый 18.03.2012, 01:19
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Ребята тупо удалили сессию, запросы стали обрабатываться параллельно
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #10 (permalink)  
Старый 20.03.2012, 19:50
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
Ajax - отсылается несколько запросов. DorianLeroy Общие вопросы Javascript 0 26.09.2011 18:46
php session а в ajax Sadist_dead AJAX и COMET 1 19.08.2011 18:35
Одновременное количество AJAX запросов decadent AJAX и COMET 18 03.06.2011 18:16
Отследить окончание нескольких ajax запросов mikel AJAX и COMET 2 11.03.2011 17:14