Demande d'aide pour optimisation de mon script

darknessneo Messages postés 45 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 9 septembre 2007 - 27 mai 2007 à 17:58
darknessneo Messages postés 45 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 9 septembre 2007 - 27 mai 2007 à 22:32
Bonjours à tous.
Voila, j'ai fait un script en partant de rien. Mes connaissances en php sont très... bref...
après plus de 1 semaine de galère voici ce que j'ai pondu...
pour info:
il s'agit d'un script qui va:
afficher une liste de répertoires dans un include d'une page quelconque.
chaque lien dirigera vers une page index dans le répertoire selectionné (toujours dans le meme include de la page ou sera appelé la liste)
la page index va afficher toutes les images présentes dedans en miniature, avec un nombre x d'images par lignes, et Y colonnes par page.

Voila, c'est une description très sucsinte de mon script...
il en existe évidement des tomes, des galeries photos, mais moi j'en voulais une que l'on puisse integrer tranquillement à n'importe quelle page web dans un tableau via un include. Hors la plupart des scripts que j'ai trouvé étaient tous trop perfectionnés, soit en imitant l'explorateur windows, soit en ayant des fonctions tellement customisés, que la moindre modification de l'affichage rendait toute utilisation en dehors de la page index incluse dans le script que mes pages web en devaient anarchiques.

Donc voici mon script...

Premiere page...
Enfaite la premiere page est la votre. Imaginons qu'il s'agisse de la page... bidon.php
Dans cette page un include vers la page explorermanga.php

dans cette page explorermanga nous mettrons donc ceci:
<tr>
<td colspan="3" id="borduretitre">Liste des MANGAS disponible
</td>
</tr>
<tr>
<td height="21" id="bordure"></td>
</tr>
<tr>
<td colspan="3" id="tableau" align="center">
<?php
function filelist ($startdir="./", $searchSubdirs=1, $directoriesonly=0, $maxlevel="all", $level=1) {
$ignoredDirectory[] = ".";
$ignoredDirectory[] = "..";
$ignoredDirectory[] = "_vti_pvt";
$ignoredDirectory[] = "_vti_cnf";
$ignoredDirectory[] = "_private";
global $directorylist;
if (is_dir($startdir)) {
if ($dh = opendir($startdir)) {
while (($file = readdir($dh)) !== false) {
if (!(array_search($file,$ignoredDirectory) > -1)) {
if (filetype($startdir . $file) == "dir") {
$directorylist[$startdir . $file]['dir'] = 1;
$directorylist[$startdir . $file]['name'] = $file;
}}}
closedir($dh);
}}
return($directorylist);
}
$files = filelist("images/",1,1); //ici le dossier qu'on scan est le dossier images/
foreach ($files as $list) {
echo "" . $list['name'] ."
";
}?>
</td>
</tr>

le but dans cette page, est de lister tout les sous-répertoires d'un dossier précis
le but étant de ce retrouver avec uen liste de liens dont le nom est celui des dossiers
qui seront sur mon site des noms de manga.

Quand nous cliquerons sur un des liens, nous afficherons alors une page index qui se trouvera
dans chaque dossier image
cette page index aura pour mission de s'occuper des miniatures de chaque image (jpg, gif et png)
elle s'occupera aussi de genrer un nombre X de page suivant le nombre d'images du dossier et le
nombre max d'images que l'on affichera par page.
Nous afficherons également la taille, l'extension, et aussi la résolution de l'image.

voici donc la page index.php:

<?php
$totalimg = 0;
$page = str_replace('index', '', $_GET['page']);
// on recupere le chemin du fichier index et on enleve index du nom pour en avoir que le chemin repertoire
$dir = $page;
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
$totalimg ++;
}}
closedir($dh);
}
$totalimg = $totalimg - 4;
if (isset($_GET['id'])) // le id permet de faire savoir à la page index quelle page on affiche
$id = $_GET['id'];
else
$id = 1; // si l'id ne contient rien, il s'agit alors de la premiere page
$lmax = 5; // nombre d'image par ligne
$hmax = 4; // nombre de colonnes max par page
$nbpagemax = ceil($totalimg / ($lmax * $hmax)); //on calcul le nombre de page max
function miniature($picture,$rep,$fext) // début de la fonction qui genere les miniatures
{
if (file_exists($rep . \"tb/mini_\" . $picture) == false) {if ($fext \"jpg\") { $source imagecreatefromjpeg($rep . $picture);}elseif ($fext \"gif\") { $source imagecreatefromgif($rep . $picture);}
else { $source = imagecreatefrompng($rep . $picture);}
$destination = imagecreatetruecolor(200, 150); // On crée la miniature vide
$largeur_source = imagesx($source);
$hauteur_source = imagesy($source);
$largeur_destination = imagesx($destination);
$hauteur_destination = imagesy($destination);
imagecopyresampled($destination, $source, 0, 0, 0, 0, $largeur_destination, $hauteur_destination, $largeur_source, $hauteur_source);
imagejpeg($destination, $rep . 'tb/mini_' . $picture);
}
} //fin de la fonction
$page = str_replace('index', '', $_GET['page']);
// on recupere le chemin du fichier index et on enleve index du nom pour en avoir que le chemin repertoire
$dir = $page;
if (file_exists($dir . \"tb/\") == false) { //on verifie ensuite si on possede un dossier tb dans le dossier image
mkdir ($dir . \"tb/\", 0777); // si ce nest pas le cas, on creer le dossier
}
if ($id > 1)
$nombreimage = ($id - 1) * ($lmax * $hmax);
//si ID est superieur a 1 on reprend le compte de la variable la ou elle en etait
else
$nombreimage = 0;
$verifnbimg = 0;
$intervalle = 0;
$nbligne = 0;
$nbpage = 1;
// 2 a la variable, ce qui correspond au fichier index et le repertoire tb, attention tout de meme a ne pas avoir de fichier thunbs.db dans
//le repertoire sous peine de fausser le compte
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
$ext= explode('.',$file); // on recupere l extension du fichier en prenant la derniere chaine de texte apres le dernier point du fichier
$ext=array_pop($ext);if ($ext \"jpg\" OR $ext \"gif\" OR $ext == \"png\"){
// si l extension est une image alors on excute la partie de code qui suitif ($nbligne !$hmax AND $verifnbimg $nombreimage AND $nombreimage <= $id * ($lmax * $hmax)) {
//on verifie qu on affiche bien les images en fonction de la page
miniature($file, $dir, $ext);
// on verifie avec la fonction que la miniature du fichier existe, sinon on la creer
//les lignes qui suivent affiches les miniatures, son nom, son extension et sa tailleif ($ext \"jpg\") { $source imagecreatefromjpeg($dir . $file);}elseif ($ext \"gif\") { $source imagecreatefromgif($dir . $file);}
else { $source = imagecreatefrompng($dir . $file);}
echo \"

Nom: " . str_replace("." . $ext, '', $file) . "

taille : " . ceil(filesize($dir . $file)/1000) . " Ko

" . imagesx($source) . " x " . imagesy($source) . ", \";
//fin de l affichage des miniatures
if ($nombreimage < $totalimg) {
$nombreimage ++;
}
$intervalle ++;
// cette ligne permet de passer a la colonne suivante apres avoir affiche x images
if ($intervalle == $lmax) { $nbligne ++; echo \"----
\"; $intervalle = 0; }
}
$verifnbimg ++;
}}
closedir($dh);
}
}
// maintenant on va creer autant de page qu'il faudra pour afficher toutes les images
if ($nbpagemax > 1) {
// si le nombre d image ne depasse pas le nombre max par page il est inutile d afficher les pages
echo \"----
Pages";
while ($nbpage < $nbpagemax) {
echo " " . $nbpage . ",";
$nbpage++; }
echo " " . $nbpage; }
// on repete encore une fois l instruction avant d afficher la
// derniere page pour eviter de mettre la , a la fin du dernier numero
echo "----,
images : \" . $nombreimage . \"/\" . $totalimg . \"</td>\";
//petit plus, on affiche combien d'image est affiché par rapport au nombre max du dossier
?>

Voila. Donc, il s'agit d'un script lourd, je tiens à noté aussi que je voulais utiliser glob() sur la page index pour récuperer le nombre d'images du dossier,
mais malheureusement les servers ont vérouillés cette fonction par sécurité. Du coup j'ai du faire un listing avec les opendir, etc etc.
Vous remarquerez aussi que j'ai fais un petit calcul un peu hazardeux avec $totalimg, en effet, j'ai soustrait 4 à cette valeur comme ceci:

$totalimg = $totalimg - 4;

la raison de ceci, est que dans le dossier image qu'on choisi, il y aura le répertoire tb des miniatures (ca fait 1)
la page index.php elle meme (ca fait 2)
ainsi que deux répertoire? s'appelant . et .. (ca fait 4)

Je vais refaire le scan de fichier en rajoutant la partie qui controle l'extension du fichier, ainsi je n'aurais plus ce probleme. Je vais le faire meme de suite...

voila c'est fait, j'ai simplement rajouté la meme partie plus bas, qui récupere l'extension du fichier et qui verifie que c'est bien un jpg, gif ou png, si c'est bien le cas, on rajoute 1 a la valeur. Je ne vais pas le modifier ici car cela ne change pas grand chose enfaite.

Maintenant je voudrais savoir comment optimiser ce script pour qu'il soit propre. Je ne veux pas qu'on me change l'orientation de mon script en me proposant d'autres fonctions, ou qu'on me rajoute des mods, je veux qu'on aide a épurer mon script.

Sinon, a la rigueur, la seule chose que je voulais rajouter, c'est le nombre de hits par images. Mais là c'est trop hard pour moi avec mon niveau basique du php et de mysql...

2 réponses

zut69 Messages postés 354 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 26 juin 2012 1
27 mai 2007 à 18:20
bravo, c est bien fait, mais pour le nombre de hits, si tu veux pas t embeter avec du sql tu peux faire avec des fichiers txt si jamais, tu crée un fichier nom-image.txt dont le titre est le nom de ton image et qui contient juste une valeur, le nombre de hits, a chaque clique tu fais +1 c est pas bien compliqué.
0
darknessneo Messages postés 45 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 9 septembre 2007
27 mai 2007 à 22:32
salut, merci pour le compliment, franchement, vu le nombre d heure que j ai passé dessus ca fait plaisir.
Pour les hits, il n y a que deux solutions, ou un fichier text, ou le sql... mais...
je vais publier des galeries d images de plus de 1000 images... je me vois mal generer 1000 fichiers textes sur mon site... c'est plus rapide que de passer par le sql et plus sur aussi... mais c'est tellement plus embetant...

je pense que je vais oculter les hits. Ce n'était qu un plus de toute facon. J'ai réussi a faire ce que je voulais c'est le plus important.
0
Rejoignez-nous