 
			
				23.09.2016, 13:44
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 30.09.2014 
					
					
					
						Сообщений: 32
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				ajax php и bootstrap
			 
			
		
		
		
		Здравствуйте! 
В общем у меня уже недели две как кризис не могу идти дальше    А дело вот в чём. Раньше-то я работал с ajax и всё нормально было. Теперь потребовалась обработка большого числа строк для сайта заказчика. Ну понятное дело обработчик в php файле и всё работает. Но, поскольку строк достаточно много, обязательно требуется прогрессбар... и вот тут начинается самое интересное. У меня не получается его организовать даже с банальным циклом for и sleep... Ну я понимаю, что делаю лишь бы что.... покажу. Таймер прикручивал, пробовал через кукисы... толку нет. Мне бы понять механизм, как таймер из скрипта срабатывает.... В интернете полно уроков по загрузке файла, а по работе со строками нет   
$(document).ready(function(){
  $('#start-data').submit(function(event){
  event.preventDefault();
  var form = $(this);
  var data = form.serialize();
		$("#start-data").hide();
	  $("#progress").show();
	  $.ajax({
	    type: "POST",
	    dataType: "text",
	    url: 'functions.php',
      async: true,
	    data: data,
	    success:function(html) {
				if (Cookies.get('errorflag')==1) {
					console.log('bad');
				}
	      else {
					console.log('good');
				}
	    },
			error: function (jqXHR, exception) {
			var msg = '';
				if (jqXHR.status === 0) {
						msg = 'Нет соединения.\n Проверьте подключение к Интернету.';
				} else if (jqXHR.status == 404) {
						msg = 'Искомая страница не найдена. [404]';
				} else if (jqXHR.status == 500) {
						msg = 'Internal Server Error [500].';
				} else if (exception === 'parsererror') {
						msg = 'Запрос JSON не найден.';
				} else if (exception === 'timeout') {
						msg = 'Истекло время ожидания скрипта!';
				} else if (exception === 'abort') {
						msg = 'Ajax запрос прерван.';
				} else {
						msg = 'Неизвестный тип ошибки!.\n' + jqXHR.responseText;
				}
				msg =  msg+"\n<strong>Если не можете сами исправить пишите мне!</strong>"
				$('#error').show();
				$('#error').append(msg);
			}
	  });
	  setTimeout(function run() {
	    var timer = Cookies.get('Timer');
	    if (timer < 99){
	      if ($("#progress div").css("width") != timer) $("#progress div").css("width", timer+"%");
	      setTimeout(run, 1000);
	    }
	    else {
				$("#progress").hide();
	      $("#result").show();
	    }
	  }, 1000);
});
});
И functions.php
 
$progress = 0;
for($i=0;$i<100;$i++){
sleep(2);
$progress = $i;
}
echo $progress;
Хотя бы подскажите что читать... Спасибо!  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось usesa, 23.09.2016 в 13:47.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				23.09.2016, 14:33
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.01.2015 
					
					
					
						Сообщений: 12,989
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от usesa
			
		
	 | 
 
	| 
		потребовалась обработка большого числа строк
	 | 
 
	
 
 А что значит обработка, каких строк, и большого числа это сколько?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				23.09.2016, 18:54
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 30.09.2014 
					
					
					
						Сообщений: 32
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от laimas
			 
		
	 | 
 
	| 
		А что значит обработка, каких строк, и большого числа это сколько?
	 | 
 
	
 
 Да не особо важно какие. Ну там тысяч 100 строк обычно, из них выбирается штук 10, с ними различные манипуляции совершаются. И задачу не проблема разбить на проценты. Скрипт работает верно, результат я получаю и вывожу куда надо. Вопрос как сделать визуализацию вот этого $progress, которое я получаю в процессе обработки строк. Это пожелание заказчика. То есть, вот файл functions.php я уточню сейчас, что в выводе не прогресс, а результат работы скрипта.
 
$progress = 0;
for($i=0;$i<100;$i++){
sleep(2);
$progress = $i;
}
$result = 'some result';
echo $result;
Может таймер я поставил не туда, может результат $progress нужно в json поставить, потому что я ставил в куки - не работает... в общем, ткните меня носом, где я не так мыслю... спасибо!  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				24.09.2016, 02:43
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.01.2015 
					
					
					
						Сообщений: 12,989
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 То есть, ради развлечь пользователя искусственно создаем еще и дополнительную задержку на сервере помимо естественного времени на работу скрипта? Обычно в таких случаях оптимизируют работу сервера с единственной целью - уменьшить время отклика, а у вас все наоборот. Если РНР версии 5.5 то OPCache в помощь. 
 
Показывают GIF, а если считать в процентах время выполнения, то клиент должен это делать. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				24.09.2016, 14:15
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 08.07.2016 
					
					
					
						Сообщений: 1,332
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 usesa, прогресс-то в браузере надо показывать, а все твои эхи идут в буфер, который пойдет с заголовками в браузер, когда php закроется. Тебе придется на каждую строку или пачку строк поднимать php, получать ответ, рендерить в браузере, снова запрашивать итд. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				24.09.2016, 14:19
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 08.07.2016 
					
					
					
						Сообщений: 1,332
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от usesa
			
		
	 | 
 
	| 
		В интернете полно уроков по загрузке файла, а по работе со строками нет
	 | 
 
	
 
 У тебя же не прогресс загрузки, а прогресс обработки. Загрузку показать ты можешь запросто, она за сек пролетит, а потом просто сиди и жди когда там просерется, на сервере.
 
А ты сделай режим idle для прогресс-бара. Когда данные уходят, чтобы жоператор не скучал, ты гоняй прогресс туда-сюда, типо все под контролем, процесс идет. Лол.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				24.09.2016, 14:20
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 08.07.2016 
					
					
					
						Сообщений: 1,332
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от usesa
			
		
	 | 
 
	| 
		которое я получаю в процессе обработки строк
	 | 
 
	
 
 Сколько времени занимает эта обработка?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				25.09.2016, 14:13
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 30.09.2014 
					
					
					
						Сообщений: 32
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 warren buffet, процесс работы php скрипта от мгновенного, до 15-20 секунд в зависимости от объёма и параметров фильтрации. Я просто не понимаю может, получается, если я делаю асинхронный ajax запрос, таймеры js на странице чтоли всё равно останавливаются? А если нет - откуда я могу считывать прогресс выполнения скрипта. Из куки я уже понял что не могу, может из файла в который сохранять прогресс или ещё как? я просто хочу понять, как делать грамотно. Я видел такие прогрессбары минимум на трёх сайтах, поэтому не вижу ничего необычного в такой просьбе заказчика. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				25.09.2016, 15:12
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 08.07.2016 
					
					
					
						Сообщений: 1,332
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Еще раз 
	
 
	| 
		
			Сообщение от warren buffet
			
		
	 | 
 
	| 
		У тебя же не прогресс загрузки, а прогресс обработки.
	 | 
 
	
 
 
Загрузкой занимается браузер с сервером и это происходит до запуска php скрипта. Скрипт на сервере запускается когда файл уже загружен. Ответ php скрипта реализуется в фазе закрытия php как программы. Поэтому ты не можешь отображать в браузере процессы в php скриптах.
 
Браузер -> сервер -> php -> вывод из буфера -> сервер -> браузер.
 
Прогресс загрузки файла на сервер возможен благодаря взаимодействию браузера и сервера. Браузер посылает кусок байтов, сервер подтверждает - получен кусок, давай другой. До php в этой фазе еще ничего не доходит. Ясно?
 
Чтобы показать прогресс ОБРАБОТКИ данных, придется посылать эти данные кусками и на каждый кусок повторять цепочку
 
Браузер -> сервер -> php -> вывод из буфера -> сервер -> браузер.
 
то есть каждый раз поднимать php (это же всего лишь серверная программа).
 
Таймеры не нужны. Просто берешь данные из файла, читаешь весь файл в массив, или читаешь по строкам, посылаешь на сервер аяксом, получаешь ответ, по факту получения ответа двигаешь прогресс, посылаешь следующую строку или пачку строк и так пока все строки не кончатся.  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				25.09.2016, 15:18
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 08.07.2016 
					
					
					
						Сообщений: 1,332
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Надо бы почитать как уходят из php заголовки. Если немедленно, то можно сэкономить на запусках php, то есть сделать все в рамках одной сессии, однако схема при этом не изменится. Тебе все равно придется посылать строки или пачки строк, получать тем же аяксом заголовки, посылать следующую строку или пачку и двигать прогресс. 
 
Взаимодействие в направлении сервер -> браузер реализуется в тн push технологиях, о которых я ничего не знаю и узнавать не собираюсь. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 
 
 
 
	 | 
 
 
 |