Vinnie
16.03.2005, 10:17:13
Mam takie pytanie - może ktoś obeznany z zasadami działania php zna odpowiedź.
Napisałem sobie skrypt do logowania - jeżeli login i hasło było dobre wrzucał co trzeba do sesji, przeładowywał jeszcze raz ekran i wszystko było gut.
Po jakimś czasie nastąpiła konieczność zmiany serwera - na szybszy, lepszy i wogóle. I tu nastąpił problem - logowanie czasem działało, czasem nie. Totalny random - czasem 5 razy pod rząd nie łapał, a łapał za 6-tym. Czasem logował bez problemu kilka razy po sobie - żadnej reguły.
Zacząłem wypisywać komunikaty do debugowania - okazało się, że po podaniu hasła zapisywał co trzeba do sesji, ale jej zawartość znikała po przeładowaniu ekranu (to znaczy czasem znikała, czasem nie). Rozwiązanie wyszło metodą
prób i błędów - trzeba było o pół sekundy opóźnić proces przeładowania ekranu -
zawartość sesji na drugim ekranie istniała i nie było problemu.
I pytanie do kogoś kto zna wnętrze php-a - co się działo w procesie interpretacji kodu, że jeżeli za szybko przeładowywałem ekran gubiłem zawartość dopiero co zapisanej sesji?
scanner
16.03.2005, 11:21:07
Podaj odpowiednie fragmenty kodu. Wróżkami nie jesteśmy.
Podaj również wersje php i Apache na obu serwerach.
Obliguje Cię do tego punkt
IV.2.d Regulaminu Forum.
Vinnie
16.03.2005, 12:38:43
Poprzednio - www.boo.pl
za phpinfo()
Server API Apache 2.0 Handler
php Version 4.3.10
Linux izyda 2.4.26 #5 SMP
Teraz - www.strefa.pl
phpinfo() jest zablokowane, a na stronie dogrzebałem się tylko do notki:
Przydatne informacje dotyczące skryptów php i CGI Na kontach STREFA.PL zainstalowany został skrypt php w wesji 4.2.2.
Serwer WWW działa w środowisku chroot, zaś pliki użytkowników tworzone są z atrybutami '700'. Zastosowane rozwiązanie pozwala na swobodny odczyt jak i zapis plików na serwerze.
Ze względów bezpieczeństwa zablokowane zostały niektóre funkcje systemowe, jak choćby POSIX_. Brak tej funkcji nie wpływa jednak na funkcjonalność samego parsera kodu php.
-----------------------------------------------------------
Kod nie jest jakiś wydumany:
if($act=="Login")
{
$res= *** wynik Selecta na bazie danych ***
$wart = mysql_fetch_row($res);
if ($wart=="") $errorR="1";
else
{
$HTTP_SESSION_VARS['zalogowany']=$wart[0];
$HTTP_SESSION_VARS['adresikony']=$wart[1];
.... i jescze pare takich linijek ...
}
}
*** Rozne inne funkcje, ktore sie nie wywoluja, bo sa na inne okazje ***
if($errorR=="")
{
?>
<script type='css/javascript'>
location.replace("index.php");
</script>
<?
}
else
{
....
}
-------------------------------------------------------------------------
Generalnie chodzilo o to,aby wrzucil wszystko do sesji i jezeli nie ma bledu przeniosl sie do indexa. tymczasem o ile tuz przed location.replace zawartosc sesji byla na miejscu, o tyle w index.php bylo juz czysto (czasem, bo czasem bylo wszystko ok. logowalem sie wielokrotnie w krotkim okresie czasu i nie wykrylem reguly). Pierwsze co zrobilem w trakcie debugowania to dodalem alert() przed location.replace i nagle wszystko zaczelo chodzic bezblednie. Gdy go usunalem skrypt znowu raz dzialal, raz nie. Potem w JS opoznilem przeladowanie używając setTimeout o pół sekundy i wszystkie problemy z czyszczeniem sesji zniknely.
W sumie chodzi, ale zapytałem z ciekawości czy może ktoś się z czymś takim spotkał. Na poprzednim serwerze - www.boo.pl - zjawisko nie występowalo.