IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

Optimiser mon code pour palier un problème de mémoire


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre du Club
    Inscrit en
    Août 2010
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 99
    Points : 53
    Points
    53
    Par défaut Optimiser mon code pour palier un problème de mémoire
    Bonsoir, je sollicite votre appui pour l'optimisation d'un code que j'utilise pour afficher le contenu d'un dossier MP3.
    Le code permet d'écouter aussi le MP3 en ligne et de le télécharger.
    Mon problème est que je suis confronté presque chaque jour à un problème de "limite de mémoire" sur le site.
    L'hebergeur (obambu.com) me suggère d’optimiser mes codes php pour gagner en mémoire.
    Mon code qui affiche le contenu du dossier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    <?php
    $dir_nom = '.'; // dossier listé (pour lister le répertoire courant : $dir_nom = '.'  --> ('point')
    $dir = opendir($dir_nom) or die('Erreur de listage : le répertoire n\'existe pas'); // on ouvre le contenu du dossier courant
    $fichier= array(); // on déclare le tableau contenant le nom des fichiers
    $dossier= array(); // on déclare le tableau contenant le nom des dossiers
    $nb_fichier = 0;
     
    while($element = readdir($dir)) {
        if($element != '.' && $element != '..') {
            if (!is_dir($dir_nom.'/'.$element)) {
                $extension = pathinfo($element, PATHINFO_EXTENSION);
                if (($extension == 'mp3')||($extension == 'MP3')) {
                    $fichier[] = $element;
                }
            } else {
                $dossier[] = $element;
            }
        }
    }
    closedir($dir);
     
    if(!empty($fichier)){
    rsort($fichier);// pour le tri croissant, rsort() pour le tri décroissant
    // on compte le nombre de pages nécessaires
    $nfichier = 20;$nombre_pages = ceil(count($fichier) / $nfichier);
    $page_actuelle = isset($_GET['page']) ? intval($_GET['page']) : 1;
     
    // on decoupe le tableau contenant les fichiers au niveau de la page qu'on veut 
    $fichier = array_slice($fichier, ($page_actuelle - 1) * $nfichier, $nfichier);
    	echo "<p id=\"titre\">Liste des MP3 </p>";
    	foreach($fichier as $lien) {
    		// On enlève l'extension du fichier et les 5 première caractère
    		$vowels = array("-","_","%","@");
    		$onvowels = array(" ","-","'","'");
    $sanstiret = str_replace($vowels, $onvowels, "$lien");
    		$simplenom = substr($sanstiret, 5);
    		$pos_point = strpos($simplenom, '.');
    $nomdufichier_sans_extension = substr($simplenom, 0, $pos_point);
    // FIN DE LA COUPURE DE L'EXTENSION	
    		$nb_fichier++; // On incrémente le compteur de 1
    			echo "<li><a href=\"audio.php?telecharge=$lien\">$nomdufichier_sans_extension</a></li>";
    			echo "<center><audio controls preload=\"none\"> <source src=\"$lien\"/></audio><br/></center>";
    				$nom_file = "../../../compteurs/$lien.txt"; 
    				if (file_exists($nom_file)) {  
    				echo "<a href=\"audio.php?telecharge=$lien\">Téléchargé </a>"; 
    				include("../../../compteurs/$lien.txt"); 
    				} 
    				else {   
    				echo "<a href=\"audio.php?telecharge=$lien\">Téléchargé </a>0 fois<br/> "; } 
     
     
    		}
     
    	if( $page_actuelle <= 1 && $nombre_pages == 1 )
        echo '';
    	else 
    echo'Liste des Pages:';
    // on met un lien pour chaque page, le lien donne le numéro de page a afficher
    for ($i = 1; $i <= $nombre_pages; $i ++) {
    if( $page_actuelle <= 1 && $nombre_pages == 1 )
        echo ' ';
    	else 
    echo'<a href="?page=' . $i . '" class="page">'  . $i .  '</a>';
    }
    echo"</center>";
    $precedent = $page_actuelle-1;
    $suite = $page_actuelle+1;
    echo'<br>';
     
    if( $page_actuelle <= 1 && $nombre_pages != 1 ) // Si la page actuel n'est pas supérieur à 1  
    echo '<p align="right"><a href="?page=' . $suite . '">Suivant</a></p>'; 
     
    else if( $page_actuelle ==  $nombre_pages && $nombre_pages != 1 ) // Si on n'est pas à la dernière page 
    echo '<p align="left"><a href="?page=' . $precedent . '">Précedent</a></p>';
     
    else if( $page_actuelle <= 1 && $nombre_pages == 1 ) // Si c'est une seule page  
    echo '';
     
    else // Si on est ni au premier ni au dernier
    echo '
    <center>
    <table border="0" width="100%">
        <tr>
            <td width="30%"><a href="?page=' . $precedent . '">Précedent</a></td>
            <td width="40%">&nbsp;</td>
            <td align="right" width="30%"><a href="?page=' . $suite . '">Suivant</a></td>
        </tr>
    </table>
    </center>'; 
     
     }	
     
    	if(!empty($dossier)) {
    	sort($dossier); // pour le tri croissant, rsort() pour le tri décroissant
    	echo "<p id=\"titre\">Liste des autres dossier de la même catégorie</p> \n\n";
     
    		foreach($dossier as $lien){
    			echo "<li><a href=\"$dir_nom/$lien/\">$lien</a></li>";
    		}
     
    }	
    ?>
    Que puis-je changer dans ce code ci-dessus pour gagner en mémoire php sur mon serveur mutualisé


    Le code qui reçois la variable pour les téléchargements dans le ficher audio.php est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?php
    //recuperation de ma variable 
    $chemin = ($_GET['telecharge']); 
    $nom_file = "../../../compteurs/$chemin.txt";
    $texte = "1";
    if (file_exists($nom_file)) {
    $monfichier = fopen('../../../compteurs/'.$chemin.'.txt', 'r+');
    $telec = fgets($monfichier); // On lit la première ligne (nombre de téléchargement)
    $telec++; // On incrémente la variable 
    fseek($monfichier, 0); // On remet le pointeur au début du fichier
    fputs($monfichier, $telec); // On écrit la nouvel valeur dans le fichier" cpt.txt"
    fclose($monfichier);
    }
    else {
    // création du fichier
    $f = fopen($nom_file, "wb");
    // écriture
    fputs($f, $texte );
    // fermeture
    fclose($f);
    }
     
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($chemin));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($chemin));
    readfile($chemin);
    exit;
    ?>
    à noter que ce code ne permet pas de morceler le fichier pour le téléchargement or si j'enlève le "audio.php?telecharge=" les fichier se télécharge avec fonction reprise et en plusieurs morceaux (avec internet download manager).
    Comment faire pour que mon fichier audio.php autorise le téléchargement en morceau avec fonction reprise?
    Merci!

    Ci-joint une image de la saturation de mon serveur
    Nom : site sature.jpg
Affichages : 217
Taille : 113,2 Ko

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Rassure moi c'est 3go cumulé, pas 3go en simultané ?

    Tu peux essayer de mettre un avant le readfile()
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Inscrit en
    Août 2010
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 99
    Points : 53
    Points
    53
    Par défaut
    Bonjour et merci pour la réponse.
    Au fait j'ai oublié de préciser que je suis un pure novice en php et que le script je les ramasser sur le net.
    Je cherche le code
    pour inséré le
    mais je ne trouve même pas la ou je dois mettre ob_en_clean ()
    Merci de me situer d'avantage.
    Je suis sur un hébergement mutualisé donc je ne sais pas si c'est 3G0 cumulé ou Simultané. Ou puis-je regardé ça?

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    ton readfile est ligne 31
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre du Club
    Inscrit en
    Août 2010
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 99
    Points : 53
    Points
    53
    Par défaut
    Ok je vois maintenant, je cherchai ça dans le 1er fichier qui lit les MP3.

    Mais es-ce que dans mon code qui liste les mp3 ya quelque chose susceptible de bouffé ma mémoire?

  6. #6
    Membre du Club
    Inscrit en
    Août 2010
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 99
    Points : 53
    Points
    53
    Par défaut
    J'ai mis votre code mais le fichier se télécharge toujours en 1 morceau, pas de fonction reprise.
    mon code final est donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php
    //recuperation de ma variable 
    $chemin = ($_GET['telecharge']); 
    $nom_file = "../../../compteurs/$chemin.txt";
    $texte = "1";
    if (file_exists($nom_file)) {
    $monfichier = fopen('../../../compteurs/'.$chemin.'.txt', 'r+');
    $telec = fgets($monfichier); // On lit la première ligne (nombre de téléchargementses)
    $telec++; // On incrémente la variable 
    fseek($monfichier, 0); // On remet le pointeur au début du fichier
    fputs($monfichier, $telec); // On écrit la nouvel valeur dans le fichier" cpt.txt"
    fclose($monfichier);
    }
    else {
    // création du fichier
    $f = fopen($nom_file, "wb");
    // écriture
    fputs($f, $texte );
    // fermeture
    fclose($f);
    }
     
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($chemin));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($chemin));
    ob_end_clean();
    readfile($chemin);
    exit;
    ?>
    ou bien le code c'est pour gagner en mémoire et non morceler le fichier pour autoriser la fonction reprise dans les téléchargement
    Nom : te.jpg
Affichages : 177
Taille : 54,9 Ko

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'était pour le problème de mémoire.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre du Club
    Inscrit en
    Août 2010
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 99
    Points : 53
    Points
    53
    Par défaut
    Ok grand merci le problème de mémoire met mon site hors service presque 12h/24h

    Grand merci.
    Espérons que l'autre code aussi est bien optimisé et que ça ne bouffe pas ma mémoire.

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Tu as combien d'utilisateurs téléchargent ou écoutent les fichiers mp3 en même temps? Les 3 Go ne concernent pas uniquement PHP, elles concernent tout le serveur.

  10. #10
    Membre du Club
    Inscrit en
    Août 2010
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 99
    Points : 53
    Points
    53
    Par défaut
    Difficile de savoir le nombre d'utilisateur qui écoute ou télécharge simultanément sur le site.
    Mais j'ai script statistique qui me donne 800 a 1000 visiteurs sur une journée et souvent 15 a 20 utilisateur en ligne.
    Mais d'autres peuvent être entrain de télécharger des fichiers sur le site sans être en ligne car les liens directs des fichiers mp3 sont souvent partager sur Facebook.
    Merci.

  11. #11
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par dercom Voir le message
    Mais es-ce que dans mon code qui liste les mp3 ya quelque chose susceptible de bouffé ma mémoire?
    Tout dépend de la longueur de cette liste. Déjà tu peux essayer d'utiliser "is_file" à la place de "file_exists". Ensuite peut être faire une pagination ou un système de recherche ajax.

  12. #12
    Membre du Club
    Inscrit en
    Août 2010
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 99
    Points : 53
    Points
    53
    Par défaut
    Merci pour l'assistance.

    Je vais utilisé is_file à la place de file_exit dans mes 2 fichier PHP alors.
    Pour la pagination je pense que mon code le fait déjà ou bien c'est pas la bonne manière?

  13. #13
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Après pour plus de précisions tu peux utiliser memory_get_usage pour faire des mesures...

  14. #14
    Membre du Club
    Inscrit en
    Août 2010
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 99
    Points : 53
    Points
    53
    Par défaut
    "Après pour plus de précisions tu peux utiliser memory_get_usage pour faire des mesures..."

    ça me donne 256 kb

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/03/2013, 05h09
  2. Problème avec un code pour remplir une feuille de calcul
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 31/03/2011, 22h17
  3. Réponses: 1
    Dernier message: 28/01/2010, 11h04
  4. [ImageMagick] Problème dans le code pour redimensionner une image
    Par pierrot10 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 08/06/2007, 14h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo