Работа с циклом и массивом

cdi

Новичок
Работа с циклом и массивом

Здравствуйте!
Есть два вопроса, если не сложно, помогите алгоритмом решения или конкретно скриптиком
1) Осуществляю запись в файл
PHP:
$file_open = fopen ($file_name, "w+") or print"Ошибка открытия $file_name";
for ($i=START; $i <= END; $i += STEP)
{
$j = ($i/STEP)+1;
$ydata[$j] = Y($i);
$xdata[$j] = X($i);
$string = $xdata[$j].",".$ydata[$j]."\r\n";
fwrite ($file_open, $string);
}
fclose ($file_open);
на сервере установлен лимит времени на выполнение скрипта 30с. В зависимости от заданных пользователем значений констант START, END, STEP выполнение цикла может превысить 30с. Как уведомить пользователя, что лимит превышен ? А существующий файл $file_name не был заменён файлом-полуфабрикатом, наверное, данные сначала необходимо записать в сессию, и если пользователь вложился в отведённое время, значения вписать в файл. Или я не в том направлении мыслю?

2) Есть массив, полученный из формы

PHP:
for ($i=20 ; $i>=0; $i--)
{
print "<input type=\"text\" name=\"s[$i]\"><br>\n";
}
как проверить, полученные данные на факт того, что бы не менее 2-х элементов массива $s были больше нуля ? У меня получается как-то грамостко и коряво, что приводить пример просто совестно.

Заранее благодарю.
 

Demiurg

Guest
1. какого размера тогда у тебя получается файл ?

2. не бойся, покажи что получается. Если получается, то уже хорошо.
 

lucas

Guest
А существующий файл $file_name не был заменён файлом-полуфабрикатом, наверное, данные сначала необходимо записать в сессию, и если пользователь вложился в отведённое время, значения вписать в файл.
Нужно писать сначала во временный файл.
В случае успеха этой процедуры -- переименовать его в реальный.
 

cdi

Новичок
В случае успеха этой процедуры ...
А как определить успех или облом ?

-~{}~ 14.06.04 14:21:

А может поступить по метоту определения времени генерации страницы:

1. До цикла ставим точку отсчёта времени
2. Непосредственно в цикле сверяем текущее время с предустановленным ранее и если условие выполнилось то цикл обрываем и выдаём ошибку.

Попробывал такое и не совсем устраивает: расчитанных даных записа^лось в файл почти в половину раз меньше, ну и как следствие нагрузка по более + тормоза.
 

Фанат

oncle terrible
Команда форума
что же это за цикл такой, если время получения microtime() ощутимо сравнимо с временем исполнения одной итерации?

зачем писать в файл по чайной ложке если такие тормоза?
почему не записывать сразу все?
 

cdi

Новичок
Originally posted by Фанат
...зачем писать в файл по чайной ложке если такие тормоза?
почему не записывать сразу все?
Это я созбаю выборку для построения специфического графика
 

Vlad DraKula

Guest
cdi
30с - это не вермя по таймеру, а лимит процессорного времени и это не одно и тоже так 30с процессорного времени могут выдится в несколько минут реального!

cdi
а какой предполагаемый размер файла?

cdi
я бы посоветовал про оптимизировать алгоритм!
я за 30с успеваю скачать 200мб из сети побить на куски про Б64"ть и послать по почте.
 

cdi

Новичок
30с - это не вермя по таймеру, а лимит процессорного времени и это не одно и тоже так 30с процессорного времени могут выдится в несколько минут реального!
И какой выход?

а какой предполагаемый размер файла?
Максимальный примерно в районе 15 кб
 

Vlad DraKula

Guest
cdi

попробуй так:

PHP:
for( $i = START, $s = '', $j = $i/STEP+1; $i <= END; $i += STEP, $j++)
{
  $ydata[$j] = Y($i);
  $xdata[$j] = X($i);
  $s .= $xdata[$j].','.$ydata[$j]."\r\n";
}

$file_open = fopen ($file_name, 'wt+') or print '?????? ???????? '.$file_name;
fwrite ($file_open, $s);
fclose ($file_open);
 

Vlad DraKula

Guest
Фанат
ты про cdi ?
я думаю что нет...
если это то что я думаю(если связано со спамом) то это все сделано слишком не оптимально.
 

cdi

Новичок
PHP:
function getmicrotime(){
   list($usec, $sec) = explode(" ",microtime());
   return ((float)$usec + (float)$sec);
   }

$w_start=0;
$w_step = 0.001;
$w_end = 30;

function X ($w)  // моя громосткая функция, к-я заставила некоторых подумать, что я спамер
{                // только не спрашивайте, что это такое, так действительно нужно :)
 $x = round ( exp(log(sqrt( (pow (sin($w),2)) + (pow (cos($w),2)) ))/10) * cos (atan2 (10, cos($w))) , 3 );
return $x;
}


$time_start1 = getmicrotime();
X(20);
$time_end1 = getmicrotime();

$time = $time_end1 - $time_start1;    // время расчёта одной точки
$num_point = $w_end / $w_step;        // кол-во точек
$all_time = $time * $num_point;       // время расчёта всех точек

$time_start2 = getmicrotime();
for ($i=$w_start; $i<=$w_end; $i+=$w_step) X($i);    // считаем весь цикл
$time_end2 = getmicrotime();

$all_time_real = $time_end2 - $time_start2;

echo $time.'<br>'.$all_time.'<br>'.$all_time_real;  // полное несоответствие :(

/* Коенчно можно, вернее, нужно, вместо расчёта одной точки взять, например, 10%
всех предпологаемых точек и выявить их врямя расчёта, а потом пересчитывать на все
остальные, только я сомневаюсь, что переменные $all_time и $all_time_real приблизятся
друг к другу. Более того в полном цикле идёт запись в файл, а не просто просчёт значений,
что опять идёт в минус данному способу оценки времени выполнения цикла*/

// ТАК СУЩЕСТВУЕТ ЛИ КАКОЙ-ЛИБО СПОСОБ ГРАМОТНО РЕАЛИЗОВАТЬ ПОДСЧЁТ ВРЕМЕНИ ВЫПОЛНЕНЯ
// ЦИКЛА И КОРРЕКТНО ЭТО ПОКАЗАТЬ ПОЛЬЗОВАТЕЛЮ ?
 

Vlad DraKula

Guest
cdi
что то я не очень понял причем зесь тайм аут и твой последний пост!
 

IL78

Guest
cdi, а ты уверен, что твоя "громоздкая" ф-ция одинаково быстро выполняется для $w=0.01 и для $w=20 ;)?

PHP:
// после описания ф-ции X

// грубая прикидка с единичным шагом
for ($i=0; $i<30; $i++) {
	$time_start1 = getmicrotime();
	X($i);
	$time_end1 = getmicrotime();
	$time += ($time_end1 - $time_start1); 
}
$time /= 30; // СРЕДНЕЕ время расчёта одной точки на рабочем интервале


$time_start0 = getmicrotime();
$time_end0 = getmicrotime(); 
$time0 = $time_end0 - $time_start0; // столько занимает один подсчет времени)
   
$num_point = $w_end / $w_step;        // кол-во точек
$all_time = $time * $num_point;       // время расчёта всех точек
$all_time1 = ($time-$time0) * $num_point;       // время расчёта всех точек за вычетом времени самого измерения времени расчета)

$time_start2 = getmicrotime();
for ($i=$w_start; $i<=$w_end; $i+=$w_step) X($i);    // считаем весь цикл
$time_end2 = getmicrotime();

$all_time_real = $time_end2 - $time_start2;

echo $time.'<br>'.$time0.'<br>'.$all_time.'<br>'.$all_time1.'<br>'.$all_time_real;
Несоотвествие заметно уменьшилось)

И ИМХО временая переменная в ф-ции несильно нужна. Чем плохо return round ( exp(log... ?
 
Сверху