Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Akcja na dowidzenia
Forum PHP.pl > Forum > PHP
Jabol
Mam takie pytanie: Czy jest możliwość, aby w jakiś sposób móc wywołać kawałek kodu przy zamykanie przeglądarki przez użytkownika. Np. ja se coś i przeglądam, i wychodze ze strony i bez mojej wiedzy na serwerze wtedy wykonuje się jakiś kod. Oczywiście chodzi mi o rozwiązanie uniwersalne działające również np. na Lynx'a. Dokładniej chce aby po wyjściu użytkownika ze strony usuwały mi się pewne pliki.
itsme
widzialem skrypt w Javie przy zamknieciu przegladarki pojawial sie komunikat ze byles u nas .... minut proponuje poszukac i zobaczyc czy da sie wywolac odpowiedni adres

a swoja droga mozna rozwiazac to sesjami i podczas wywolania strony sprawdzac mozna jak dlugo user pracuje na stronie i jezeli minie 5 minut od ostatniego klikniecia na jakis link to usunac odpowiednie pliki
DeyV
Zdaje sie że w js akcja onUnload. A wtedy otwierasz małe okienko, gdzie wykonujesz określone akcje, a następnie je zamykasz
Jabol
ta propozycja z sesjami jest niezła, a to z onUnload to nie przejdzie, bo można np. zablokować js, a w Lynxie to JS wogóle nie działa
dziama
no własnie jak dokładniej powinno wyglądać taki skrypt to sprawdzania aktywnosci i ewentualnego usuwania pliku sesji??
Jabol
możesz to zrobić tak:
-zapisujesz datę wejścia na strone (najlepiej w jakieś szybkiej db), może to być normalna godzina, może być również np przeliczona na sekundy.
-robisz[php:1:dbbb9d2fac]<?php
$now=time();
$time_to_die=300;//60*5
$result=mysql_query("SELECT 'user' FROM 'tabela' WHERE 'logged'=1 AND 'last_login'<".$now-$time_to_die);//masz już nazwy userów, którym trzeba coś zrobić "na dowidzenia"
/*np. mysql*/mysql_query("UPDATE 'tabela' SET 'logged'=0 WHERE 'last_login'<".$now-$time_to_die);
?>[/php:1:dbbb9d2fac]
-gotowe
members_of_mayday
Tak też jest poprawnie :

[php:1:b3aa3d9593]

<?
$db = mysql_connect("localhost", "root", "bytom") ;
mysql_select_db("edu", $db);
$res = mysql_query ("SELECT * FROM user ");
while($row = mysql_fetch_array($res))
{
$akt=$row["akt"];
$username= $row["username"];
$time = time();
$auttime = 300;
$lasttime = $akt + $auttime;

if ($time>$lasttime)
{
echo "";
}else{
echo "<font color=a72763> $username</fomt> :";
}
}
?>[/php:1:b3aa3d9593]
kwiateek
Cytat
Tak też jest poprawnie

Popoprawnie to owszem może jest, ale w jakim celu odciążać bazę danych od tego typu czynności skoro jest taka możliwość? W przypadku dwóch poprawnych możliwości powinno postawić się w drugiej mierze (albo w kolejnej w zależnosci od ustalonych przez siebie priorytetów) na szybkość funkcjonowania skryptów.
members_of_mayday
sugerujesz , że mój skrypt jest wolniejszy niż od Jabol'a.

Cel hmm może dlatego żeby ta baza szybciej pracowała szczerzę mówiąc niezastanawiałęm się . ale masz przykłąd zastosowania np zliczania osób zalogowanych na stronie,śledzenia uzytkowników itp. za pomocą If i wyciągania z bazy pewnych danych wydaje mi się ze to łatwiejsz i b korzystne dla osób które chcą coś takiego umieści na stronach swojich serwisów

P.s szybkość u mnie j znakomita biorąc pod uwagę że w bazie np z userami było by ok. 20000 rekordów . ile sek trwało by wykonanie skryptu a ile przez IF questionmark.gif

bo ja nie wiem moim zdaniem If był by szybszy

ciekawe czy ma sens to co napisałęm ?
Seth
Aby dokladnie wiedziec kiedy user opuscil strone mozemy zastosowac Streaming HTML.
Po stworzeniu calej strony - wyslaniu jej do klienta, na koncu dajemy [manual:6a9a5ff973]flush[/manual:6a9a5ff973]. Ustawiamy [manual:6a9a5ff973]ignore-user-abort[/manual:6a9a5ff973] na true oraz [manual:6a9a5ff973]Set_Time_Limit[/manual:6a9a5ff973] na 0. Odpalamy "nie konczaca sie petle", ktora utrzymuje caly czas polaczenie z klientem. W petli umieszczamy warunek na [manual:6a9a5ff973]connection-aborted[/manual:6a9a5ff973] == true, przed nim musimy umiescic jeszcze flush. Jezeli bedzie prawda uruchamiamy kod, ktory ma byc uruchominny po zamknieciu strony.

Gotowiec tongue.gif:
[php:1:6a9a5ff973]//...
flush();
ignore_user_abort(true);
set_time_limit(0);

while ()
{
flush();

if ( connection_aborted == true )
{
// jakis skrypt, po zamknieciu polaczenia

brake;
}
}[/php:1:6a9a5ff973]
members_of_mayday
sposobów jest sporo smile.gif
i Twój działa
dtektor
Witaj
Pisales 10:48 14-07-2003 to co zamiescilem ponizej, ten kod ktory podales nie dziala, po paru kombinacjach-wychodzi cos takiego ze jak puszczam poprawna petle while-to przegladarka mi sie zawiesza (w neverendingloopie)- 8O , a jak zamykam to zadna z akcji ustawionych nie dziala, probowalem rowniez z register_shutdown_function() i takze to nie pomaga.

Jesli wiesz jak wykonac jakis skrypt po zamknieciu przegladarku (tudziez resecie kompa) to napisz.

z gory dziekuje
Dtektor




Cytat
Aby dokladnie wiedziec kiedy user opuscil strone mozemy zastosowac Streaming HTML.
Po stworzeniu calej strony - wyslaniu jej do klienta, na koncu dajemy [manual:654a0f5c68]flush[/manual:654a0f5c68]. Ustawiamy [manual:654a0f5c68]ignore-user-abort[/manual:654a0f5c68] na true oraz [manual:654a0f5c68]Set_Time_Limit[/manual:654a0f5c68] na 0. Odpalamy "nie konczaca sie petle", ktora utrzymuje caly czas polaczenie z klientem. W petli umieszczamy warunek na [manual:654a0f5c68]connection-aborted[/manual:654a0f5c68] == true, przed nim musimy umiescic jeszcze flush. Jezeli bedzie prawda uruchamiamy kod, ktory ma byc uruchominny po zamknieciu strony.

Gotowiec tongue.gif:
[php:1:654a0f5c68]//...
flush();
ignore_user_abort(true);
set_time_limit(0);

while ()
{
flush();

if ( connection_aborted == true )
{
// jakis skrypt, po zamknieciu polaczenia

brake;
}
}[/php:1:654a0f5c68]
e-Gandalf
Nie specjalnie podoba mi sie ta metoda, szczerze mowiac. Przede wszystkim niesamowicie obciaza serwer, lacze... wszystko. Jesli juz brudzic sie i bawic w takie cos, to lepiej wyglada malutki iframe odswierzany co np. sekunde.
Seth
Sprawdze kod w domu i zobacze co jest nie tak.
scanner
dtektor: Sugerowałbym, abyś nauczył sie poprawnie cytować:

- cytuje się tylko te fragmenty, do których chcemy się ustosunkowac
- wycinamy elementy niepotrzebne
- odpowiadamy POD cytowanym fragmentem.
Seth
Jako, ze po odpoczynku naszla mnie wena tworcza winksmiley.jpg tutaj jest poprawnie dzialajacy kod wykorzystujacy streaming html do utrzymywania polaczenia z klientem oraz sprawdzania kiedy zerwal polaczenie z nasza strona:
  1. <?php
  2. //...
  3.  
  4. // by Seth
  5.  
  6.  
  7. while ( !connection_aborted() )
  8. {
  9. print &#092;"n\";
  10. flush();
  11.  
  12. sleep( 1 );
  13. }
  14.  
  15. // kod na dowidzenia
  16.  
  17. exit();
  18. ?>
goped
a dlaczego nie mozna uzyc samego if(conection_abordet())?
goped
a i tak w ogole nie moge dojsc ciagledo tego co to jest flush i Streaming HTML
Seth
Cytat
a i tak w ogole nie moge dojsc ciagledo tego co to jest flush

"Wypluwanie" danych do klienta. Wiecej [manual:0b56cd140f]flush[/manual:0b56cd140f]
Cytat
... i Streaming HTML

Streaming HTML to cos podobnego do tego co nazywamy media strumieniowe. Tzn polaczenie z klientem jest przez caly czas utrzymywane. W przypadku zwyklych stron po wyslaniu danych do klienta/przegladarki polaczenie jest zamykane.
Co to nam daje ?
To, ze mozemy wysylac caly czas nowe dane wykorzstujac to, ze jestesmy z uzytkownikiem polaczeni, a wiec zmienne i operacje juz przetworzone mamy w pamieci - czyli nie musimy uzywac np sesji.
Edit: cos takiego uzywa sie np do tworzenia chatow w php gdzie caly skrypt wykorzystujacy Streming HTML caly czas wypluwa (flush) tekst teg co pisza inni.

P.S. Nastepnym razem napiz na PW, a nie tworz nowego tematu !
goped
szybko piszesz :],
a da sie wtedy przy pomocy tego bo spanlezo mowil ze php jest wykonywane i znika jakies tam side server czy jakos tak a czy przy pomocy tego mozna np. funkcje zostawic tak jak zostaja w js? i nie rozumiem, wyplowanie do klienta danych czyli co nam to da?
wiesz wkoncu jestem poczatkujacy biggrin.gif
goped
wielkie ci dzieki chyba wlasnie zaczolem rozumiec, wiesz przewaznie jak do kogos napisalem pisal od tego jest forum ale nie ma sprawy nie bede tworzyl nowego temtu dzieki ci zaraz sprobjem zrobic chata za pomoca tej komendy
Seth
Cytat
a da sie wtedy przy pomocy tego bo spanlezo mowil ze php jest wykonywane i znika jakies tam side server czy jakos tak a czy przy pomocy tego mozna np. funkcje zostawic tak jak zostaja w js?

? Nie rozumiem.

Cytat
i nie rozumiem, wyplowanie do klienta danych czyli co nam to da?

Sproboj zrobic tak, ze tworzysz sobie petle i dawaj wewnatrz print $i."rn"; gdzie $i to kolejne wartosci w petli for. Jak pewnie zauwazysz wartosci te pojawia Ci sie dopiero wtedy kiedy petla sie zakonczy. I tutaj wlasnie pomaga nam flush... jezli dasz go po print odrazu przegladarka Ci go wyswietli.
goped
dzieki tobie i bambosowi zrozumialem to wkoncu wielkie dzieki :]
Nitryt14
A jak nalezalo by przerobić ten skrypt tak zeby jak użytkownik się loguje w tabeli np. uzyt_online się zapisywało ze ten uzytkownik jest teraz on-line a jak się rozłaczy zeby stamtąd usuwalo ten wpis?questionmark.gif

Z góry dziekuje i pozdrawiam
falkor
Dla wszystkich chcacych bawic sie z metoda flush() cytuje kawalek php.ini z wersji 5:
Cytat
Implicit flush tells php to tell the output layer to flush itself
; automatically after every output block.  This is equivalent to calling the
; php function flush() after each and every call to print() or echo() and each
; and every HTML block.  Turning this option on has serious performance
; implications and is generally recommended for debugging purposes only


i odradzam ze wzgledu na wydajnosc.

Czy ma ktos pomysl jak osiagnac dokladny czas ZAMKNIECIA PRZEGLADARKI inna metoda?
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.