- Home
- Categorie
- Coding e Sistemistica
- PHP
- Ho un problema alla mia chat e cerco qualcuno che mi aiuti a risolverlo
-
Ho riletto il codice di messaggi.php (scusa se prima non l'avevo fatto con attenzione.
In pratica ogni volta che visualizzi i messaggi lui apre il file e lo risalve con gli ultimi 70 messaggi.
Non mi sembra un granchè, poichè dato che quello script è il più richiamato (ogni 10 secondi da ogni utente, ogni volta apre il file e riscrive. E' possibile che sia qui il problema.
trasforma messaggi.php cosi:
[php]<html>
<head>
<title>Messaggi degli utenti</title>
<?php
include("config.php");
echo "<meta http-equiv="refresh" content="$time_refresh">";
?>
<script language="javascript">
function apri(nick_ut)
{
window.open("profilo.php?nick=" + nick_ut,nick_ut,"width=500, height=300, left=200");
}
</script></head>
<body>
<?php
if (!(file_exists($file_mess))) {
$fpw = fopen($file_mess,"w"); fclose($fpw);
}
$rows_file=file($file_mess);
$rows_file_ord=array_reverse($rows_file);
$count=count($rows_file_ord);for ($i=0;($i<$count && $i<$num_messag);$i++)
{
$dati_utente=explode("|",$rows_file_ord*);
$nick=$dati_utente[0];
$msg=$dati_utente[1];
$nick=stripslashes($nick);
$msg=stripslashes($msg);
$nick = str_replace('[em1]','<img src="emoticons/em1.gif">',$nick);
$msg = str_replace('[em1]','<img src="emoticons/em1.gif">',$msg);
for ($x=1;$x<25;$x++)
{
$img="em".$x;
$img2="[".$img."]";
$path="<img src="emoticons/$img.gif">";
$msg = str_replace("$img2","$path",$msg);
}
for ($x=1;$x<25;$x++)
{
$img="em".$x;
$img2="[".$img."]";
$path="<img src="emoticons/$img.gif">";
$nick = str_replace("$img2","$path",$nick);
}echo "<b><font face=\"verdana\" size=\"2\" color=\"#000000\">$nick</font>: </b>"."<font face=\"verdana\" size=\"2\">".$msg."</font><br>";
}
//$online_ut=array_reverse($online_ut);
/*
fopen($file_mess,"w");
$ins_msg=fopen($file_mess,"a+");
for ($i=0;$i<$num_messag;$i++) fwrite($ins_msg,$online_ut*);
fclose($ins_msg);
*/
?>
</body>
</html>[/php]Ora ne sono quasi sicuro, è qui il problema.
L'unica cosa che è cambiata è che il mio script visualizza i messaggi solamente.
Poi io farei uno script chiamato maintenance.php che richiamato via cron ogni 10 o 30 minuti rielabora il file (usando flock) e gli lascia soltanto gli ultimi 70 messaggi.
Se non sono stato abbastanza chiaro o se hai bisogno di ulteriori chiarimenti scrivi pure.
-
allora, io ho messo il codice modificato come hai detto, poi rispiegami il tutto che voglio capire anch'io:
allora cosa faceva il file prima e cosa fa adesso che è modificato
cosa serve se creo il file maintenance.phppoi il file che hai modificato alla fine il codice è visualizzato in arancione, perche?:
[PHP]//$online_ut=array_reverse($online_ut);
/*
fopen($file_mess,"w");
$ins_msg=fopen($file_mess,"a+");
for ($i=0;$i<$num_messag;$i++) fwrite($ins_msg,$online_ut*);
fclose($ins_msg);
*/[/PHP]aspetto delucidazioni e ti ringrazio per tutto quello che mi hai detto fin'ora!:)
-
Ho lavorato partendo dal tuoi, il codice decommentato e quello sotto accusa.
Il tuo script ad ogni caricamente (ogni dieci secondi per utente)
- leggeva i messaggi dal file
- ne visualizzava 70
- Riapriva il file scriveva gli ultimi 70
Il punto 3 è quello fondamentale.
In pratica per non far si che il file raggiungesse grandi dimensioni, apriva il file e ne risalvava gli ultimi 70.Il punto 1 e 2 sono fondamentali per lo script messaggi.php (e ci credo!!!)
Il punto 3 lo puoi separare.
Per esempio puo fare tramite cron un richiamo di un file (che io ho chiamato maintenance.php) che risetta i messaggi agli ultimi 70.
Ma anziche farlo molto spesso come accadeva prima, puoi farlo ogni 10 minuti.
Poi dipende da quanti messaggi si scrivono, il tempo di "reset", puoi deciderlo tu.File maintenance.php:
[php]<?php
include("config.php");
if((file_exists($file_mess))) {
$rows_file=file($file_mess);
$rows_file_ord=array_reverse($rows_file);
$count=count($rows_file_ord);for ($i=0;($i<$count && $i<$num_messag);$i++) { $online_ut*=$rows_file_ord*; } $online_ut=array_reverse($online_ut); $ins_msg=fopen($file_mess,"w+"); if (flock($ins_msg, LOCK_EX)) { for ($i=0;$i<$num_messag;$i++) fwrite($ins_msg,$online_ut*); flock($ins_msg, LOCK_UN); } else { echo "Errore lock"; } fclose($ins_msg);
}
?>[/php]Non ho controllato lo script, se vi è qualche errore correggilo tu.
-
@ayrton2001 said:
Ho lavorato partendo dal tuoi, il codice decommentato e quello sotto accusa.
Il tuo script ad ogni caricamente (ogni dieci secondi per utente)
- leggeva i messaggi dal file
- ne visualizzava 70
- Riapriva il file scriveva gli ultimi 70
Il punto 3 è quello fondamentale.
In pratica per non far si che il file raggiungesse grandi dimensioni, apriva il file e ne risalvava gli ultimi 70.Il punto 1 e 2 sono fondamentali per lo script messaggi.php (e ci credo!!!)
Il punto 3 lo puoi separare.
Per esempio puo fare tramite cron un richiamo di un file (che io ho chiamato maintenance.php) che risetta i messaggi agli ultimi 70.
Ma anziche farlo molto spesso come accadeva prima, puoi farlo ogni 10 minuti.
Poi dipende da quanti messaggi si scrivono, il tempo di "reset", puoi deciderlo tu.File maintenance.php:
[php]<?php
include("config.php");
if((file_exists($file_mess))) {
$rows_file=file($file_mess);
$rows_file_ord=array_reverse($rows_file);
$count=count($rows_file_ord);for ($i=0;($i<$count && $i<$num_messag);$i++) { $online_ut*=$rows_file_ord*; } $online_ut=array_reverse($online_ut); $ins_msg=fopen($file_mess,"w+"); if (flock($ins_msg, LOCK_EX)) { for ($i=0;$i<$num_messag;$i++) fwrite($ins_msg,$online_ut*); flock($ins_msg, LOCK_UN); } else { echo "Errore lock"; } fclose($ins_msg);
}
?>[/php]Non ho controllato lo script, se vi è qualche errore correggilo tu.
ciao ayrton, il file messaggi.php che hai modificato l'ho già messo e i messaggi si vedono e tutto ok, ma devi bene spiegarmi cosa intendi farmi con quel file maintenance.php.
Quel file maintenance che mi hai postato nel tuo ultimo messaggio l'ho già provato ma appena apro il file la pagina è bianca, spiega bene cosa devo fare perchè (credo tu abbia capito, di php poco ne so)...
-
Certo che è bianca, non invia nessun output !!!
L'ho spiegato in questo passaggio:
Il tuo script ad ogni caricamente (ogni dieci secondi per utente)
- leggeva i messaggi dal file
- ne visualizzava 70
- Riapriva il file scriveva gli ultimi 70
Il punto 3 è quello fondamentale.
In pratica per non far si che il file raggiungesse grandi dimensioni, apriva il file e ne risalvava gli ultimi 70.Il punto 1 e 2 sono fondamentali per lo script messaggi.php (e ci credo!!!)
Il punto 3 lo puoi separare.
Per esempio puo fare tramite cron un richiamo di un file (che io ho chiamato maintenance.php) che risetta i messaggi agli ultimi 70.
Ma anziche farlo molto spesso come accadeva prima, puoi farlo ogni 10 minuti.
Poi dipende da quanti messaggi si scrivono, il tempo di "reset", puoi deciderlo tu.In poche parole:
il file maintenance.php resetta il file messaggi.txt conservando gli ultimi 70 messaggi.Se fai partire lo script anche se da pagina bianca noterai che le dimensioni del file messaggi.txt diminuiranno.
-
boh ayrton non ci capisco più niente, anche adesso il file è bianco.
Ma devo aggiungere qualche pezzo di codice su qualche file per far funzionare sto maintenance o che altro?
Ma questa cosa del maintenance è obbligatoria farla o no?
E qual'è la sua funzione? La sua funzione prima quale pezzo di codice la faceva?
E poi come fanno i messaggi a comparire pure ora che hai tolto qualche pezzo di codice da messaggi.php?
Spiegami bene perchè sono a terra sennò, ciao aspetto istruzioni.:?
-
la funzione del maintenance è quella di resettare il file di testo e di riscriverci dentro le ultime 70 righe
utile per far si che tutto funga alla perfezione
-
ah ho capito serve a fare questo allora, ma qualcuno mi spiega per bene se il file maintenance.php bianco è normale o deve contenere e/o visualizzare qualcosa una volta aperto, e poi io devo aggiungere qualche pezzo di codice su messaggi.php perchè esso funzioni o è tutto ok come tu ayrton me l'hai scritto?
-
comunque ayrton se mi rispondi a queste domande ne sarei felice...sarebbe molto utile....
Ma devo aggiungere qualche pezzo di codice su qualche file per far funzionare sto maintenance o che altro?
Ma questa cosa del maintenance è obbligatoria farla o no?
E qual'è la sua funzione? La sua funzione prima quale pezzo di codice la faceva?
E poi come fanno i messaggi a comparire pure ora che hai tolto qualche pezzo di codice dal file messaggi.php, non basterebbe questo? o bisogna assolutamente fare anche il maintenance?
-
ciao ayrton, rileggendo, ho notato un particolare, guarda che il file messaggi.txt tiene sempre e teneva anche prima solo 70 messaggi non è che ne contenesse 1000 o che so io e lui manteneva solo i 70 recenti...forse hai interpretato male...e poi il codice in arancione posso eliminarlo o che? ciao aspetto tue notize...
-
@giulio3x said:
ah ho capito serve a fare questo allora, ma qualcuno mi spiega per bene se il file maintenance.php bianco è normale o deve contenere e/o visualizzare qualcosa una volta aperto, e poi io devo aggiungere qualche pezzo di codice su messaggi.php perchè esso funzioni o è tutto ok come tu ayrton me l'hai scritto?
Che non visualizzi niente è normale, poichè verrà richiamato via cron e la sua utilità è solo quella di mantenere in dimensioni contenute il file messaggi.txt.
messaggi.php dovrebbe andare bene cosi. Provalo.
-
@giulio3x said:
comunque ayrton se mi rispondi a queste domande ne sarei felice...sarebbe molto utile....
Tempo permettendo@giulio3x said:
Ma devo aggiungere qualche pezzo di codice su qualche file per far funzionare sto maintenance o che altro?
No.
@giulio3x said:
Ma questa cosa del maintenance è obbligatoria farla o no?
Se vuoi mantenere le dimensioni del file messaggi.txt, si. E te lo consiglio anche in termini di prestazioni.
@giulio3x said:
E qual'è la sua funzione? La sua funzione prima quale pezzo di codice la faceva?
La sua funzione è quella di far si che il file messaggi.txt non accumuli sempre messaggi fino a diventare un file di 1-2-3Gb
La sua funzione veniva effettuata dal codice che ho commentato in messaggi.php@giulio3x said:
E poi come fanno i messaggi a comparire pure ora che hai tolto qualche pezzo di codice dal file messaggi.php, non basterebbe questo? o bisogna assolutamente fare anche il maintenance?
Se non vuoi che il file fra un mese non pesi 1 Gb, si
-
@giulio3x said:
ciao ayrton, rileggendo, ho notato un particolare, guarda che il file messaggi.txt tiene sempre e teneva anche prima solo 70 messaggi non è che ne contenesse 1000 o che so io e lui manteneva solo i 70 recenti...forse hai interpretato male...e poi il codice in arancione posso eliminarlo o che? ciao aspetto tue notize...
Lo so che ne conteneva solo 70.
Ma non puoi aprire il file e salvare gli ultimi 70 ogni decimo di secondo.
E' logico che perdevi messaggi.Il codice commentato puoi eliminarlo.
Credo cmq di essere stato molto chiaro. Mi hai fatto ripetere le stesse cose almeno 4 volte. Più di cosi non so che dire. Magari non mi esprimo bene
-
@ayrton2001 said:
Ho lavorato partendo dal tuoi, il codice decommentato e quello sotto accusa.
Il tuo script ad ogni caricamente (ogni dieci secondi per utente)
- leggeva i messaggi dal file
- ne visualizzava 70
- Riapriva il file scriveva gli ultimi 70
Il punto 3 è quello fondamentale.
In pratica per non far si che il file raggiungesse grandi dimensioni, apriva il file e ne risalvava gli ultimi 70.Il punto 1 e 2 sono fondamentali per lo script messaggi.php (e ci credo!!!)
Il punto 3 lo puoi separare.
Per esempio puo fare tramite cron un richiamo di un file (che io ho chiamato maintenance.php) che risetta i messaggi agli ultimi 70.
Ma anziche farlo molto spesso come accadeva prima, puoi farlo ogni 10 minuti.
Poi dipende da quanti messaggi si scrivono, il tempo di "reset", puoi deciderlo tu.File maintenance.php:
[php]<?php
include("config.php");
if((file_exists($file_mess))) {
$rows_file=file($file_mess);
$rows_file_ord=array_reverse($rows_file);
$count=count($rows_file_ord);for ($i=0;($i<$count && $i<$num_messag);$i++) { $online_ut*=$rows_file_ord*; } $online_ut=array_reverse($online_ut); $ins_msg=fopen($file_mess,"w+"); if (flock($ins_msg, LOCK_EX)) { for ($i=0;$i<$num_messag;$i++) fwrite($ins_msg,$online_ut*); flock($ins_msg, LOCK_UN); } else { echo "Errore lock"; } fclose($ins_msg);
}
?>[/php]Non ho controllato lo script, se vi è qualche errore correggilo tu.
ultima cosa ayrton tu mi dicesti di controllare il file maintenance.php ma visto che php poco ne so dimmi se l'hai scritto giusto o devo aggiungere magari <html><head> sia all'inizio che alla fine e grazie.
-
@giulio3x said:
ultima cosa ayrton tu mi dicesti di controllare il file maintenance.php ma visto che php poco ne so dimmi se l'hai scritto giusto o devo aggiungere magari <html><head> sia all'inizio che alla fine e grazie.
niente tag html.Più di provare, facendo un backup del file messaggi.php !!!
Carica il file messaggi.php nuovo.
Controlla che la chat funzioni- Se non funziona scrivi qui il problema
- Se funziona passa avanti.
Visualizza (credo usi un client ftp) la dimensione del file messaggi.txt
La vedrai aumentare. E fin qui ci siamo.Carica il file maintenance.php
Richiamalo via browser- Se da errori scrivi qui l'errore
- Se non da errori, passa avanti
Ricontrolla la dimensione del file messaggi.txt, diminuirà. Tutto normale.
Controlla che la chat funzioni, e appena vedi che la dimensione del file messaggi.txt diventa di circa 1 mb segnati l'orario e fai partire il file maintenance.php.
Esegui questo più volte.
Mettiamo caso che l'intervalo medio tra gli orari da te segnati e 20 minuti.
Vai nel tuo pannello (se lo hai) oppure utilizza un sito che effettua schedulazioni (cron) e fai in modo che il file maintenance.php venga richiamato ogni 20 minuti.
-
ciao ayrton ho fatto tutte le prove che mi hai detto e in effetti in un primo momento il file messaggi.txt seganava 8,20 kb e subito dopo aver fatto partire il file maintenance segnava 8,08 kb, poi rigurado il cron non so come fare per settare che parta in automatico ogni 20 minuti, tu parlavi di qualche sito ne conosci qualcuno?....oppure bisogna magari integrare l'istruzione nella pagina config.php?, ciao e grazie per tutto quello che mi hai detto fin'ora!:)
-
@giulio3x said:
ciao ayrton ho fatto tutte le prove che mi hai detto e in effetti in un primo momento il file messaggi.txt seganava 8,20 kb e subito dopo aver fatto partire il file maintenance segnava 8,08 kb, poi rigurado il cron non so come fare per settare che parta in automatico ogni 20 minuti, tu parlavi di qualche sito ne conosci qualcuno?....oppure bisogna magari integrare l'istruzione nella pagina config.php?, ciao e grazie per tutto quello che mi hai detto fin'ora!:)
Prima di tutto ti consiglio di leggere questo: http://it.wikipedia.org/wiki/Crontab
Se non hai un pannello come cpanel o simile allora usa un servizio di cron esterno:
http://www.siteuptime.com/
http://www.crontab.it/Non li ho mai provati. Se cerchi su google ne troverai altri
-
ayrton è meglio che metto l'apertura ogni minuto, 5 minuti o può bastare 20 minuti?
e se io lo metto ogni minuto potrei ripiombare nello stesso problema che perdo messaggi o no?:?
-
[quote]Controlla che la chat funzioni, e appena vedi che la dimensione del file messaggi.txt diventa di circa 1 mb segnati l'orario e fai partire il file maintenance.php.
Esegui questo più volte.
Mettiamo caso che l'intervalo medio tra gli orari da te segnati e 20 minuti.
Vai nel tuo pannello (se lo hai) oppure utilizza un sito che effettua schedulazioni (cron) e fai in modo che il file maintenance.php venga richiamato ogni 20 minuti.[quote]In questo modo individui quale è il tempo ideale.
Magari inizialmente puo essere anche 20 minuti.
Però piu di fare prove...
Inizia con 20 e tieni d'occhio il tutto. Se fila liscio lascia, altrimenti metti 15 minuti. Se fila liscio lascia, altrimenti metti 10 minuti. E cosi via.
Ogni minuto mi sembra una vera esagerazione.
Dopo venti minuti che dimensioni ha raggiunto il file?Non sapendo quanti utenti sono connessi, quanti messaggi scrivono in media al minuto, di quanti caratteri è composto in media ogni messaggio, posso solo dirti di provare.
-
ok ayrton, farò delle prove, quindi per ora grazie ti faccio sapere tra un mesetto come funziona e se è tutto ok!
spero di ritrovarti sempre qui disponibile come lo sei sempre stato!
ciao e grazie!