Pagina 1 di 1

problemino php: perchè è così lento?

Inviato: mar 17 ott 2006, 19:19
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

Inviato: mar 17 ott 2006, 20:22
da capitanfuturo
scusami ma se non dai nessun parametro funziona?

Inviato: mar 17 ott 2006, 20:25
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.

Inviato: mar 17 ott 2006, 20:46
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...

Inviato: mar 17 ott 2006, 21:03
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.

Inviato: mar 17 ott 2006, 22:54
da alex.franci
ho risolto...
mancava una graffa... -.-'

okay okay prometto che non lo faccio più :D

grazie per la pazienza!!!
ciaociao

Inviato: mer 18 ott 2006, 7:17
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

Inviato: mer 18 ott 2006, 12:56
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 :)

consigli sul codice

Inviato: gio 19 ott 2006, 15:09
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

Inviato: gio 19 ott 2006, 17:11
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

Inviato: ven 20 ott 2006, 19:17
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?

Inviato: ven 20 ott 2006, 19:54
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