Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 27/05/12 в 08:36 |
есть скрипт обработки строковых данных из формы. Чем можно следить за процесом обработки визуально?
Кинул в форму 10к строк, все это записывается в файл. По логике то понятно как определять.
От общего числа всех строк вычитать каждую сделаную.
и писать к примеру сделано 1 из 10000
Ну или смотреть сколько строк в результирующем файле и по тому же принципу
сделано 1 из 10000
Но как я понял пхп сам такое не делает, он может только сказать, всё, сделал
|
|
|
|
С нами с 30.04.12
Сообщения: 51
Рейтинг: 157
|
Добавлено: 27/05/12 в 09:25 |
Навскидку тут надо разделять непосредственно обработчик и скрипт, который будет отдавать информацию о текущем прогрессе.
Примерно так:
при сабмите формы отправляется один ajax-запрос и начинается периодический опрос другого скрипта, который возвращает значения вида "5%", "8%" и т.д.
Другой вариант, что сабмит формы будет не со всеми данными, а "порционно" происходить. То есть жмёшь кнопку, а вместо 10 тысяч на сервер уходит лишь 1000, при получении ответа изменяется индикатор прогресса и отправляется ещё 1000.
Заключительный вопрос: сколько времени затрачивается скриптом на обработку среднестатистической порции данных? Может быть индикатор вовсе не нужен?
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 27/05/12 в 11:05 |
один процесс из строки длится примерно 2-3сек
просто в цикле есть еще загрузка изображения на локальную машину и его обработка поэтому так долго.
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 27/05/12 в 11:27 |
php делает такое
команда flush();
попробуй такой скрипт:
Код: |
while($j<10){
echo ++$j;
sleep(3);
flush();
}
|
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 27/05/12 в 12:08 |
ок, спасибо. попробую
чет уже который раз ставлю +8 а выдается другая циферка
|
|
|
|
С нами с 30.04.12
Сообщения: 51
Рейтинг: 157
|
Добавлено: 27/05/12 в 12:09 |
В таком случае я бы, на самом деле, сделал бы js-цикл со стороны клиента.
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 27/05/12 в 12:19 |
мне тоже кажется что нужно не пхп
попробовал
Код: [развернуть] | while($j<10){
echo ++$j;
sleep(3);
flush();
} |
но ничего.
я заполняю форму жму выполнить и пока в браузере крутиться круг вместо курсора показывая что работа идет. Но пока все не закончится ничего не отобразиться.
у меня в начле скрипта стоит set_time_limit(0);
ибо времни на полную обработку уходит до нескольких часов поэтому лимиты снял
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 27/05/12 в 12:35 |
как я понял чтоб чтото отображалось должно быть прерывание
что то типа:
старт цикла, пауза, отображение, старт и так пока идет работа.
|
|
|
|
С нами с 30.04.12
Сообщения: 51
Рейтинг: 157
|
Добавлено: 27/05/12 в 12:41 |
Так может тогда проще не городить форму, интерфейс, а запускать из консоли (ssh), там и прогресс проще выводить, и ошибки отлавливать.
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 27/05/12 в 12:49 |
к сожаленью даже не в курсе о чем речь, знания пхп скудны.
если не сложно ткни где можно почитать.
спасибо!
|
|
|
|
С нами с 30.04.12
Сообщения: 51
Рейтинг: 157
|
Добавлено: 27/05/12 в 12:59 |
Если есть ssh-доступ к машине, на которой всё выполняется, то:
1. Скрипт переделывается с обработки входных данных из формы на обработку входных данных из файла. То есть у тебя там где-то есть конструкция вида Код: | $data = $_POST['data']; |
которую надо будет сменить на Код: | $data = file('./uploadedfile'); |
Также в цикле делаешь вывод информации о прогрессе: в каждой итерации срабатывает счётчик вида и вывод Код: | echo $i . ' from ' . count($data) . ' done' . PHP_EOL; |
2. По ftp или scp закачивается файл с данными (содержимое формы) на сервер к скрипту.
3. Заходишь по ssh, запускаешь screen (на случай неполадок с сетью), cd /path/to/your/script; php ./yourscript.php
Если приведёшь пример скрипта, то можно прям тут его модифицировать.
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 27/05/12 в 15:12 |
понял, пологаю что в моем случае это невозможно. нет всего того что нужно, по крайней мере на данный момент.
спасибо.
решил что без этого обойдусь, это просто думал не проблема, а выходит не всё так просто, в моем случае.
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 27/05/12 в 15:52 |
Lexikon писал: | понял, пологаю что в моем случае это невозможно. нет всего того что нужно, по крайней мере на данный момент.
спасибо.
решил что без этого обойдусь, это просто думал не проблема, а выходит не всё так просто, в моем случае. |
все возможно, просто не разобрался или не до конца понял некоторых вещей, можешь загуглить "php progress bar" там даже в процентиках можно выводить процесс исполнения
я такой делал для аплоада фоток и все прекрасно работало во всех браузерах, кроме ИЕ, там у меня проблемы с css
|
|
|
|
С нами с 03.02.11
Сообщения: 842
Рейтинг: 301
|
Добавлено: 27/05/12 в 15:55 |
Lexikon писал: | выходит не всё так просто, в моем случае. |
попробуй в скрипте вставить что-то вроде:
Код: | echo str_repeat(' ', 256)."\r\n"; //не обязательно. если юзаешь IE, то в начале файла надо сделать вывод 256 пробелов: - вот такой тупой осел.
echo $n." строка из ".$x."<br>\r\n"; //"\r\n" обязателен. браузер пока не получит строку целиком - ничего не выведет.
ob_flush(); //иногда flush не пашет - настройки пхп видимо...
flush(); |
еще можно, чтобы скрипт писал положение дел в файл, а уже этот файл выводить в iframe и рефрешить его каждые 3-5 сек...
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 27/05/12 в 19:12 |
Lexikon писал: | я заполняю форму жму выполнить и пока в браузере крутиться круг вместо курсора показывая что работа идет. Но пока все не закончится ничего не отобразиться. |
Естественно, ты же форму синхронным методом сабмитишь.
Вот как это делается на самом деле.
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 (здесь будет храниться прогресс)
Все четыре файла должны быть в одной папке.
Вопросы?
|
|
|
|