Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Чем это делается?
цитата
27/05/12 в 08:36
 Lexikon
есть скрипт обработки строковых данных из формы. Чем можно следить за процесом обработки визуально?
Кинул в форму 10к строк, все это записывается в файл. По логике то понятно как определять.
От общего числа всех строк вычитать каждую сделаную.
и писать к примеру сделано 1 из 10000
Ну или смотреть сколько строк в результирующем файле и по тому же принципу
сделано 1 из 10000
Но как я понял пхп сам такое не делает, он может только сказать, всё, сделал icon_smile.gif
цитата
27/05/12 в 09:25
 StrangeInscription
Навскидку тут надо разделять непосредственно обработчик и скрипт, который будет отдавать информацию о текущем прогрессе.
Примерно так:
при сабмите формы отправляется один ajax-запрос и начинается периодический опрос другого скрипта, который возвращает значения вида "5%", "8%" и т.д.

Другой вариант, что сабмит формы будет не со всеми данными, а "порционно" происходить. То есть жмёшь кнопку, а вместо 10 тысяч на сервер уходит лишь 1000, при получении ответа изменяется индикатор прогресса и отправляется ещё 1000.

Заключительный вопрос: сколько времени затрачивается скриптом на обработку среднестатистической порции данных? Может быть индикатор вовсе не нужен?
цитата
27/05/12 в 11:05
 Lexikon
один процесс из строки длится примерно 2-3сек
просто в цикле есть еще загрузка изображения на локальную машину и его обработка поэтому так долго.
цитата
27/05/12 в 11:27
 ibiz
php делает такое trollface.png
команда flush();
попробуй такой скрипт:
Код:

while($j<10){
echo ++$j;
sleep(3);
flush();
}
цитата
27/05/12 в 12:08
 Lexikon
ок, спасибо. попробую
чет уже который раз ставлю +8 а выдается другая циферка icon_confused.gif
цитата
27/05/12 в 12:09
 StrangeInscription
В таком случае я бы, на самом деле, сделал бы js-цикл со стороны клиента.
цитата
27/05/12 в 12:19
 Lexikon
мне тоже кажется что нужно не пхп
попробовал

while($j<10){
echo ++$j;
sleep(3);
flush();
}

но ничего.

я заполняю форму жму выполнить и пока в браузере крутиться круг вместо курсора показывая что работа идет. Но пока все не закончится ничего не отобразиться.

у меня в начле скрипта стоит set_time_limit(0);
ибо времни на полную обработку уходит до нескольких часов поэтому лимиты снял
цитата
27/05/12 в 12:35
 Lexikon
как я понял чтоб чтото отображалось должно быть прерывание
что то типа:
старт цикла, пауза, отображение, старт и так пока идет работа.
цитата
27/05/12 в 12:41
 StrangeInscription
Так может тогда проще не городить форму, интерфейс, а запускать из консоли (ssh), там и прогресс проще выводить, и ошибки отлавливать.
цитата
27/05/12 в 12:49
 Lexikon
к сожаленью даже не в курсе о чем речь, знания пхп скудны.
если не сложно ткни где можно почитать.
спасибо!
цитата
27/05/12 в 12:59
 StrangeInscription
Если есть ssh-доступ к машине, на которой всё выполняется, то:
1. Скрипт переделывается с обработки входных данных из формы на обработку входных данных из файла. То есть у тебя там где-то есть конструкция вида Код:
$data = $_POST['data'];
которую надо будет сменить на Код:
$data = file('./uploadedfile');
Также в цикле делаешь вывод информации о прогрессе: в каждой итерации срабатывает счётчик вида Код:
$i++
и вывод Код:
echo $i . ' from ' . count($data) . ' done' . PHP_EOL;

2. По ftp или scp закачивается файл с данными (содержимое формы) на сервер к скрипту.
3. Заходишь по ssh, запускаешь screen (на случай неполадок с сетью), cd /path/to/your/script; php ./yourscript.php

Если приведёшь пример скрипта, то можно прям тут его модифицировать.
цитата
27/05/12 в 15:12
 Lexikon
понял, пологаю что в моем случае это невозможно. нет всего того что нужно, по крайней мере на данный момент.
спасибо.
решил что без этого обойдусь, это просто думал не проблема, а выходит не всё так просто, в моем случае.
цитата
27/05/12 в 15:52
 ibiz
Lexikon писал:
понял, пологаю что в моем случае это невозможно. нет всего того что нужно, по крайней мере на данный момент.
спасибо.
решил что без этого обойдусь, это просто думал не проблема, а выходит не всё так просто, в моем случае.


все возможно, просто не разобрался или не до конца понял некоторых вещей, можешь загуглить "php progress bar" там даже в процентиках можно выводить процесс исполнения trollface.png
я такой делал для аплоада фоток и все прекрасно работало во всех браузерах, кроме ИЕ, там у меня проблемы с css trollface.png
цитата
27/05/12 в 15:55
 AWD
Lexikon писал:
выходит не всё так просто, в моем случае.
попробуй в скрипте вставить что-то вроде:
Код:
echo str_repeat(' ', 256)."\r\n"; //не обязательно. если юзаешь IE, то в начале файла надо сделать вывод 256 пробелов: - вот такой тупой осел.

echo $n." строка из ".$x."<br>\r\n"; //"\r\n" обязателен. браузер пока не получит строку целиком - ничего не выведет.
ob_flush(); //иногда flush не пашет - настройки пхп видимо...
flush();
еще можно, чтобы скрипт писал положение дел в файл, а уже этот файл выводить в iframe и рефрешить его каждые 3-5 сек...
цитата
27/05/12 в 19:12
 Yacc
Lexikon писал:
я заполняю форму жму выполнить и пока в браузере крутиться круг вместо курсора показывая что работа идет. Но пока все не закончится ничего не отобразиться.

Естественно, ты же форму синхронным методом сабмитишь. icon_smile.gif

Вот как это делается на самом деле.

index.html (или index.php, или где там у тебя форма):

Код:
<!DOCTYPE html>
<html>
   <head>
      <script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
      <script>
         var intervalID = false;
         var hardJob = function () {
            jQuery.ajax({ // Сабмитим форму асинхронно
               type: 'POST',
               url: 'job.php',
               data: jQuery("#data").serializeArray(),
               success: function () {
                  window.clearInterval(intervalID);
                  intervalID = false;
                  jQuery('#progress-bar').css('width', '100%').html('Completed');
               }
            });
            if( ! intervalID) {
               jQuery('#progress-bar-wrapper').show();
               intervalID = window.setInterval(function () {
                  jQuery.ajax({ // Раз в секунду запрашиваем прогресс
                     type: 'GET',
                     url: 'progress.php',
                     success: function(progress) {
                        jQuery('#progress-bar').css('width', progress + '%').html(progress + '%');
                     }
                  });
               }, 1000);
            }
         };
      </script>
      <style>
         #progress-bar-wrapper {
            background:#ddd;
            width:200px
         }
         #progress-bar {
            background:#fd0;
            color:#000;
            height:20px;
            padding:0;
            width:200px
         }
      </style>
   </head>
   <body>
      <form id="data">
         <input type="button" value="Submit" onclick="hardJob()"/>
      </form>
      <div id="progress-bar-wrapper"  style="display:none;">
         <div id="progress-bar" style="width:0%"></div>
      </div>
   </body>
</html>


job.php (здесь процессится форма):

Код:
<?php
$file = realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR.'progress.txt';
$total = 13;
$p = 100 / $total;
for($progress = 0; $progress < $total; $progress += 1) {
   file_put_contents($file, floor($progress * $p));
   sleep(1); // Якобы процессится форма
}
?>


progress.php (здесь отдаётся прогресс):

Код:
<?php
header('Pragma: no-cache');
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Thu, 1 Jan 1970 00:00:00 GMT');
header('Content-type: text/html');
echo file_get_contents( realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR.'progress.txt' );
?>


progress.txt (здесь будет храниться прогресс)
Код:


Все четыре файла должны быть в одной папке.

Вопросы? icon_smile.gif


Эта страница в полной версии