Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Powolne generowanie strony podczas przesyłania tablicy przez $_POST
Forum PHP.pl > Forum > PHP
artur_rut
Witam,

Potrzebuję przesłać między stronami informację o tym, które z checkbox'ów użytkownik zaznaczył.
Ponieważ checkbox'y są generowane w pętli (docelowo ich ilość ma się zmieniać dynamicznie), wynik zapisywany jest do tabeli.
Zastosowana przeze mnie metoda działa, ale strona generuje się ponad 3 sekundy... To trochę długo jak na tak prostą operację...
Jeśli ktoś mógłby wyjaśnić mi na czym polega problem to będę wdzięczny :-)
Poniżej zamieszczam programy.

Pozdrawiam,
Artur

Plik "1.php":

CODE

<?php
echo '<div align=center>';
echo '<form action="2.php" method="post">';
echo '<input type="submit" value="OK"><br><br>';
echo '<table border="1">';

for ($i=0; $i<=100; $i++)
{
echo '<tr><td>p '.$i.'</td><td><input type="checkbox" name="zaznaczone['.$i.']"></td></tr>';
}
echo '</table>';
echo '</form></div>';
?>


Plik "2.php":
CODE

<?php
$mtime = microtime();
$mtime = explode(' ', $mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;

$zaznaczone=$_POST['zaznaczone'];

echo '<div align=center>';

for ($i=0; $i<=100; $i++)
{
if ($zaznaczone[$i] == 'on') echo '<br>zaznaczone ['.$i.'] : = on';
else echo '<br>zaznaczone ['.$i.'] : = off';
}

$mtime = microtime();
$mtime = explode(" ", $mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$totaltime = ($endtime - $starttime);

echo (' <br> Generowanie strony trwalo ' .$totaltime. ' seconds.');
echo '</div>';
?>
domis86
wolny serwer?
sprobuj wygenerwoac tyle samo wierszy, ale nie z chceckboxem tylko np z obrazkiem jakims albo jakims tekstem, i zobacz czy tyle samo zajmie czasu
artur_rut
No sęk w tym, że nie jest to wina serwera.
Jeśli wygeneruje 100-elementową tablicę i prześlę ją przez $_SESSION to wysyłanie trwa ok. 1 ms.
Gdy tablica jest generowana w taki sposób jak podałem trwa to ok. 3 sekund...
Próbowałem przesłać dane z formularza przez $_SESSION, ale nie udało mi się tego dokonać - no i koło się zamyka...
Dość długo już nad tym siedzę i nie widzę sensownego rozwiązania...

Pozdrawiam,
Artur
domis86
zrob zamiast checkboxow texty (type="text") i zobacz czy tez jest wolno
artur_rut
Po wpisaniu (type="text") strona generuje się w 0,0004 s.
Gdy zmienię na (type="checkbox") i nie zaznaczam żadnego checkbox'a - strona generuje się 0,03 s.
Wystarczy że zaznaczę jeden checkbox i czas wzrasta do ponad 3 sekund...
O co w tym chodzi questionmark.gif?
wwalc
Moim zdaniem problem leży w tym, że masz buga w 2.php.
Daj sobie print_r na zaznaczone. Zobaczysz, że ta tablica trzyma jedynie zaznaczone wartości.
Jeśli nic nie zaznaczysz, 2.php generuje jeden błąd E_NOTICE.
Jeśli zaznaczysz cokolwiek masz (101 - ilosć zaznaczonych) * E_NOTICE.
Jeśli błędy są logowane do error_loga a ten jest sporych rozmiarów (lub musisz konkurować o dostęp do niego z innymi równie wadliwymi skryptami ;-)), czas wykonywania skryptu może się wydłużyć.
Hint: isset(), empty().
domis86
hmm sprobuj 2.php zamiast for zastosowac foreach
kszychu
Jeśli robisz to pod Firefoxem, to sprawdź pod operą. Miałem formularz, który pod FF generował się 15sekund. Pod operą trwało to niecałą sekundę.
artur_rut
Cytat(wwalc @ 26.03.2008, 10:02:00 ) *
Moim zdaniem problem leży w tym, że masz buga w 2.php.
Daj sobie print_r na zaznaczone. Zobaczysz, że ta tablica trzyma jedynie zaznaczone wartości.
Jeśli nic nie zaznaczysz, 2.php generuje jeden błąd E_NOTICE.
Jeśli zaznaczysz cokolwiek masz (101 - ilosć zaznaczonych) * E_NOTICE.

Dziękuję bardzo za pomoc - miałeś rację.
Nie wiedziałem że przeszukiwanie tabeli w taki sposób jak ja to zrobiłem generuje błędy.
Po zamianie pętli for na:
CODE
for ($i=0; $i<=100; $i++)
{
if (isset($zaznaczone[$i])) echo 'zaznaczone ['.$i.'] : = on';
else echo 'zaznaczone ['.$i.'] : = off';
}

strona generuje się w 0,0003 sekundy - i o to chodziło ! :-)
Cytat
Jeśli błędy są logowane do error_loga a ten jest sporych rozmiarów (lub musisz konkurować o dostęp do niego z innymi równie wadliwymi skryptami ;-)), czas wykonywania skryptu może się wydłużyć.

Ostatnie pytanie: skąd wiedziałeś że skrypt generuje błędy ? Podczas wyświetlania strony w przeglądarce taka informacja nie jest wyświetlana, a uruchamianie tego skryptu z wiersza poleceń: 'php 2.php' nie ma sensu, bo nie będzie miał danych wejściowych - to tak na przyszłość... :-)

Jeszcze raz dziękuję wszystkim za pomoc,
Pozdrawiam,
Artur
domis86
Artur w fazie pisania aplikacji zawsze ustawiaj se:
  1. <?php
  2. error_reporting(E_ALL | E_STRICT);
  3. ?>

na poczatku i bedziesz widzial wszystkie bledy
artur_rut
Cytat(domis86 @ 26.03.2008, 11:40:05 ) *
Artur w fazie pisania aplikacji zawsze ustawiaj se:
error_reporting(E_ALL | E_STRICT);


Dzięki za radę. Error_reporting miałem domyślnie włączone, ale jak się okazuje nie miałem włączonego display_errors.

Po wpisaniu
ini_set('display_errors','1');
komunikaty o błędach są wyświetlane.

Pozdrawiam,
Artur
MajareQ
ini_set('display_errors','true'); ? tongue.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.