Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
Чем это делается?
Новая тема
Ответить
цитата
27/05/12 в 08:36
Lexikon
есть скрипт обработки строковых данных из формы. Чем можно следить за процесом обработки визуально?
Кинул в форму 10к строк, все это записывается в файл. По логике то понятно как определять.
От общего числа всех строк вычитать каждую сделаную.
и писать к примеру сделано 1 из 10000
Ну или смотреть сколько строк в результирующем файле и по тому же принципу
сделано 1 из 10000
Но как я понял пхп сам такое не делает, он может только сказать, всё, сделал
цитата
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 делает такое
команда flush();
попробуй такой скрипт:
Код:
while($j<10){
echo ++$j;
sleep(3);
flush();
}
цитата
27/05/12 в 12:08
Lexikon
ок, спасибо. попробую
чет уже который раз ставлю +8 а выдается другая циферка
цитата
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" там даже в процентиках можно выводить процесс исполнения
я такой делал для аплоада фоток и все прекрасно работало во всех браузерах, кроме ИЕ, там у меня проблемы с css
цитата
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 писал:
я заполняю форму жму выполнить и пока в браузере крутиться круг вместо курсора показывая что работа идет. Но пока все не закончится ничего не отобразиться.
Естественно, ты же форму синхронным методом сабмитишь.
Вот как это делается на самом деле.
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
(здесь будет храниться прогресс)
Код:
Все четыре файла должны быть в одной папке.
Вопросы?
Новая тема
Ответить
Эта страница в полной версии