problemino php: perchè è così lento?

Area di discussione libera.

Moderatore: Staff

Regole del forum
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
alex.franci
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: mer 26 lug 2006, 10:26
Località: Bologna
Contatta:

problemino php: perchè è così lento?

Messaggio da alex.franci »

ciao a tutti!
sono alle prime armi con php e stavo cercando di fare una pagina che passati i parametri 'date' e 'img' aprisse l'immagine richiesta con la possibilità di andare indietro e avanti fra le immagini della directory.
Questo è il codice

Codice: Seleziona tutto

<html>
<head>
<title>Prova foto</title>
<script type="text/javascript" src="../java_scripts/popup.js">
</head>
<body>

<?php

/****************************************/
/*      Variabili                       */
/****************************************/

$dir_photos="../photos/";
$thumb_script_link="../thumb/thumb.php";


/****************************************/
/*      Funzioni                        */
/****************************************/

//* restituisce true se il file non è un'immagine *
function fImage($file){
	$ext=strtolower(substr($file,-3,3)); //ottiene l'estensione del file
		switch ($ext) {
			case "jpg": break;
			case "peg": break;
			case "bmp": break;
			case "png": break;
			case "gif": break;
			case "iff": break;
			case "tif": break;
			default:    return true; //se non è un'immagine da true
		}
}

//* estrapolazione data *
function sData($dir) {
$year_n = substr($dir,0,4);	//estrapolazione anno
$day_n = substr($dir,6,2);	//estrapolazione numero giorno
if (substr($day_n,0,1) == 0){
	$day_n=substr($day_n,1,1);
}
$month_n = substr($dir,4,2);	//estrapolazione numero mese
switch ($month_n){		//conversione da numero mese a nome mese
	case 1:	$month="Gennaio";	break;
	case 2:	$month="Febbraio";	break;
	case 3:	$month="Marzo";		break;
	case 4:	$month="Aprile";	break;
	case 5: $month="Maggio";	break;
	case 6:	$month="Giugno";	break;
	case 7:	$month="Luglio";	break;
	case 8:	$month="Agosto";	break;
	case 9:	$month="Settembre";	break;
	case 10:$month="Ottobre";	break;
	case 11:$month="Novembre";	break;
	case 12:$month="Dicembre";	break;
}

return $day_n." ".$month." ".$year_n;
}


/****************************************/
/*      Body                            */
/****************************************/

//* controllo se c'è già una richiesta di data *
if (empty($_GET['date'])) {
	$handle=opendir($dir_photos);

	while ($dir = readdir($handle)) {
		if ((is_dir($dir)) && ($dir != ".") && ($dir != "..")) {
			if (empty ($cache))	{ $cache = $dir; }
			//se no prendi la data ultima (appena si clicca escono le foto più recenti)
			elseif ($cache < $dir)	{ $cache = $dir; }
			//aggiungi all'array per la lista di fianco
			$elenco_serate[]=sData($dir);
		}
	}

	$dir=$cache."/";
	closedir($handle);
} else { $dir = $_GET['date']."/"; }  //se c'è già la richiesta di data

echo "date: ".$_GET['date']." img: ".$_GET['img']." dir: ".$dir;

//* echo della lista serate *
foreach ($elenco_serate as $serata){
	echo "<div>".$serata."</div>";
}


//* controllo se è stata cliccata un'immagine *
if (!(empty($_GET['img']))){
echo "aaaaaa: ".$dir_photos.$dir;
	while ($file = $dir_photos.$dir) {
	  if (($file != ".") && ($file != "..")) {
		/*$counter++;
		switch ($counter){
			case 1:
				$succ=$file;
				break;
			case 2:
				$current=$succ;
				$succ=$file;
				break;
			case 3:
				$prev=$current;
				$current=$succ;
				$succ=$file;
				$counter=0;
				break;
		}

	echo $counter;

	if ($current == $_GET['img']) {
		echo "<table>\n";
		echo "<tr>\n";
		echo "<td>\n";
		echo "</td>\n";
		echo "<td>\n";
		echo "</td>\n";
		echo "<td>\n";
		echo "</td>\n";
		echo "</tr>\n";
		echo "</table>\n";
		echo "<a href=\"photos.php?dir=\"".$dir."\"><p>torna indietro</p></a>";
	   }*/
	echo "pippo";
	}

	}
} else {

//* scrittura html *
$handle = opendir($dir);
echo "handle: ".$handle;
while ($file = readdir($handle)) { //per ogni immagine della directory $dir
if (($file != ".") && ($file != "..")) {
	if (!fImage($file)) { //controllo se il file è immagine
		echo "<a href=\"";
		echo "./".$dir.$file;
		echo "\" onclick=\"PrevFoto('".$dir.$file."');return(false)\">";
		echo "<img src=\"".$thumb_script_link."?img="."./".$dir_photos.$dir.$file."\">";
		//aggiungerci height alt ecc
		echo "</a>\n<br>\n";
	}
}
}
}

?>
</body>
</html>
solo che quando passo il link "http://localhost/personal/photos/photos ... IC0004.JPG" per esempio sta lì tre minuti con la CPU al 100% e non fa nulla.
qual'è il problema? grazie mille

Avatar utente
capitanfuturo
Linux 0.x
Linux 0.x
Messaggi: 43
Iscritto il: gio 5 ott 2006, 14:10
Località: Padova
Contatta:

Messaggio da capitanfuturo »

scusami ma se non dai nessun parametro funziona?

Avatar utente
linus.bash
Linux 3.x
Linux 3.x
Messaggi: 976
Iscritto il: ven 10 feb 2006, 12:58
Località: Bologna
Contatta:

Messaggio da linus.bash »

Ciao,

non sono un esperto ma credo che il problema reale sia l'accesso dei dati a /thumb/thumb.php che per qualche ragione impiega + del previsto. Controllerei anche quel file. La mia supposizione parte dal fatto che i rallentamenti sono quasi sempre dovuti a database o file di database.

Saluti, e scusa se ho detto una cavolata. ;)

Poi non credo che inserire una pagina php in una con body html sia una cosa esatta...di solito c'è la pagina con il codice php, una di estensione .tpl con il codice html e la terza che richiama le due pagine...la cosa è un pò + complessa ma + funzionante.

Avatar utente
alex.franci
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: mer 26 lug 2006, 10:26
Località: Bologna
Contatta:

Messaggio da alex.franci »

capitanfuturo ha scritto:scusami ma se non dai nessun parametro funziona?
sìsì, funziona.

per il thumb.php... cioè: sì è un po' lento ma non è quello: l'ho commentato e non va comunque, mentre se commento la parte che fa i cicli per $succ, $current e $prev lo script funziona.
bho...

Avatar utente
linus.bash
Linux 3.x
Linux 3.x
Messaggi: 976
Iscritto il: ven 10 feb 2006, 12:58
Località: Bologna
Contatta:

Messaggio da linus.bash »

Ciao, scusami per quello che stò per chiederti...ma il codice l'hai fatto tu?

Lo dico perchè rileggendolo dopo il tuo intervento ho notato che hai scritto :

Codice: Seleziona tutto

if ($file != ".") && ($file != "..")
che significa di non prendere in considerazione i file che seguono. Quindi Tu hai usato un "case" 1-2-3...se non deve prenderli in considerazione ma poi nel resto del codice si la CPU non sa più dove sbattere la testa...editando il codice mi sembra ovvio che funge. Meglio cancellarlo.


Saluti.

Avatar utente
alex.franci
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: mer 26 lug 2006, 10:26
Località: Bologna
Contatta:

Messaggio da alex.franci »

ho risolto...
mancava una graffa... -.-'

okay okay prometto che non lo faccio più :D

grazie per la pazienza!!!
ciaociao

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Messaggio da aschenaz »

Comunque, secondo me, quel codice andrebbe alleggerito e di molto.
Ad esempio, al posto degli switch-case, puoi usare benissimo degli array e negli if, puoi evitare le tonde per ogni condizione.
Ciao,
nino

Avatar utente
alex.franci
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: mer 26 lug 2006, 10:26
Località: Bologna
Contatta:

Messaggio da alex.franci »

ninobi ha scritto:Comunque, secondo me, quel codice andrebbe alleggerito e di molto.
Ad esempio, al posto degli switch-case, puoi usare benissimo degli array e negli if, puoi evitare le tonde per ogni condizione.
Ciao,
nino
okay, grazie per il consiglio :)

Avatar utente
alex.franci
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: mer 26 lug 2006, 10:26
Località: Bologna
Contatta:

consigli sul codice

Messaggio da alex.franci »

Sono di nuovo qui che rompo... :D

ho modificato il codice e ora funzione tutto a meraviglia (è anche diventato mooolto più veloce).

Se vi va, se avete voglia, se non avete niente di meglio da fare magari dateci un'occhiata: http://pastebin.ca/209963 . se avete un consiglio su come migliorare o alleggerire il codice, o qualsiasi cosa per migliorare la chiarezza tipo i commenti, o il nome delle variabili, la posizione delle funzioni, l'indentatura... sto facendo i primi passi e, imparando dai grandi :D, vorrei incominciare col piede giusto.

grazie mille

Avatar utente
airex
Linux 1.x
Linux 1.x
Messaggi: 121
Iscritto il: sab 8 lug 2006, 11:03
Slackware: -current
Desktop: xfce
Distribuzione: Slackware64
Località: Milano
Contatta:

Messaggio da airex »

qualche consiglio (ti indico le righe che modificherei e il come):

Linee 29-35:

Codice: Seleziona tutto

   case "jpg": 
   case "peg":
   case "bmp":
   case "png": 
   case "gif": 
   case "iff": 
   case "tif": return false; 
Linea 144:

Codice: Seleziona tutto

      return preg_replace("/^\//","", preg_replace("/\.\./","",$_GET['date'])); // difendiamoci un po' dai furbi
Linea 181:

Codice: Seleziona tutto

   PrintIfDefinedImg( preg_replace("/^\//","", preg_replace("/\.\./","",$_GET['img']))  ); // togliamo possibili path relativi
prova a vedere se funziona così, comunque dovrebbe essere piuttosto a posto

Avatar utente
alex.franci
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: mer 26 lug 2006, 10:26
Località: Bologna
Contatta:

Messaggio da alex.franci »

airex ha scritto:qualche consiglio (ti indico le righe che modificherei e il come):

Linee 29-35:

Codice: Seleziona tutto

   case "jpg": 
   case "peg":
   case "bmp":
   case "png": 
   case "gif": 
   case "iff": 
   case "tif": return false; 
Linea 144:

Codice: Seleziona tutto

      return preg_replace("/^\//","", preg_replace("/\.\./","",$_GET['date'])); // difendiamoci un po' dai furbi
Linea 181:

Codice: Seleziona tutto

   PrintIfDefinedImg( preg_replace("/^\//","", preg_replace("/\.\./","",$_GET['img']))  ); // togliamo possibili path relativi
prova a vedere se funziona così, comunque dovrebbe essere piuttosto a posto
ciao... grazie per i consigli ma non li capisco!!! :? cioè... il primo okay, ma gli altri due no. cosa vuol dire difendiamoci dai furbi? e togliere i path relativi?

Avatar utente
airex
Linux 1.x
Linux 1.x
Messaggi: 121
Iscritto il: sab 8 lug 2006, 11:03
Slackware: -current
Desktop: xfce
Distribuzione: Slackware64
Località: Milano
Contatta:

Messaggio da airex »

le "seconde" modifiche sono per evitare che chi chiama lo script passi al posto dei dati "puliti" qualcosa che possa andare a leggere fuori dai percorsi da te voluti i usando combinazioni di .. e /

esempio: al posto di img=file.jpg potrebbero usare ../../altrofile.txt , andando quindi fuori dai binari da te voluti

Rispondi