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

Langage PHP Discussion :

execution de code avec file_get_contents()


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut execution de code avec file_get_contents()
    Bonjour à tous,
    Je suis confronté à un pb qui m'échappe. Je souhaite utiliser le système de cache PHP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ob_start();
    print_r(serialize($tab_inst));
    $page = ob_get_contents(); // copie du contenu du tampon dans une chaîne
    ob_end_clean(); // effacement du contenu du tampon et arrêt de son fonctionnement
    file_put_contents($filecache, $page);
    J'ai créé 4 fichiers cache sur mon serveur
    Au chargement d'une page, je dois lire le contenu de mes données en cache, je fais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return json_encode (unserialize(file_get_contents($filecache)));
    Si j'appelle 4 fois (pour mes 4 fichiers en cache) ce code, alors mon code php s'arrête en plein milieu de mon code, sans comprendre pourquoi.
    Si je supprime un appel, donc j'appelle uniquement 3 fois le file_get_contents(), alors le code fonctionne parfaitement bien.

    Il faut savoir que mes fichiers ne sont pas gros (20ko max)
    Il faut également savoir que ce code est appelé dans un contexte de moteur de recherche en base de données, donc assez lourd, beaucoup de boucle foreach ...

    J'ai donc pensé que j'avais un problème de memory_limit, j'ai boosté, mais cela n'a rien changé ...

    Pour testé, j'ai remplacé le file_get_contents par du fread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $filename = "/cache/monfichier.html";
    $handle = fopen($filename, "r");	
    $contents = fread($handle, filesize($filename));
    fclose($handle);
    $t = unserialize($contents);
    return json_encode ($t);
    mais j'ai le même comportement

    Je n'ai plus d'idée, je sèche !!
    Avez-vous une idée ? des orientations à me conseiller ?

    Merci d'avance pour votre coup de main

    Cyril

  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
    Qu'est ce que tu veux dire par "mon code php s'arrête en plein milieu" ?
    Ca se manifeste comment ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    Dans mon fichier php principal (algo du moteur de recherche), la méthode (la fonction) ne va pas jusqu'au return final.
    Je pose donc quelques traces pour comprendre ou ça plante.
    Je me suis rendu compte que mes traces étaient retournées jusqu'à la ligne 384 et après ... les traces ne sont affichées.
    Il n'y a aucun bug à la ligne 385 (ni après), puisque lorsque j'enlève mes appels aux méthodes (comme expliqué précédemment - file_get_contents), tout marche nickel !!

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    en fait, pour être plus précis, la ligne ou ça plante, je me suis amusé à écrire ce petit morceau de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $ff = array ();
    for ($a = 0; $a<10000 ; $a++)
    {
         	array_push ($ff, $a);
    }
    ce code est parfaitement exécuté par le serveur, cela signifie que le code le serveur ne cesse pas de fonctionner à cette ligne précisément.

    Si je supprime ce bout de code est que je remets ma requête sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $rs = mysql_query("SELECT DISTINCT id, title FROM $matable WHERE $rq_title", $db) or die(mysql_error());
    alors celle-ci n'est pas exécuté.
    Je précise que cette requete fonctionne très bien et ne possède pas d'erreur.
    C'est comme si le serveur en avait trop et ne pouvait plus exécuter de requete sql ????
    ?????

  5. #5
    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
    Si tu enlèves le die() il se passe quoi ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    tu m'as mis sur la piste Sabotage, je soulevé une erreur qui était masquée, mais j'ai besoin d'une petite explication s'il vous plait.

    En fait, j'avais le message d'erreur "No database selected", il me faut donc refaire le mysql_select_db.
    Mais pourquoi ?
    Est-ce le ob_end_clean(); (voir le code de mon premier message) qui est un peu violent ?? il y a une explication rationnelle ?

    Merci Sabotage pour ton aide

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    oups je dis une bétise, je ne passe pas par le ob_end_clean, mais uniquement par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    json_encode (unserialize(file_get_contents($filecache)))
    Donc, pourquoi suite à 4 appels de cette méthode, je suis obligé de refaire un mysql_select_db ?

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    une chose a faire quoi qu'il en soit serait de passer par PDO...

    mais en mysql je pense à un truc, libérer la ressource générée par mysql_query? qui aurait ouvert une pipe qui ne serait pas fermée?

    ah aussi, comme je me suis laissé avoir :

    http://php.net/manual/fr/function.ob-flush.php

    ob_flush => dans un contexte de stream ca envoie le tampon de sortie
    ob_clean => Efface le tampon de sortie

    ce qui en fait parrait assez logique d'avoir a utiliser les deux...
    Conception / Dev

Discussions similaires

  1. Executer un CustomTool avec du code
    Par Olivier782 dans le forum C#
    Réponses: 3
    Dernier message: 09/06/2011, 11h23
  2. Executer le code vb avec un compte different
    Par kciope dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 25/09/2009, 07h54
  3. Executer un code C# sous Linux avec Nant
    Par nadabb dans le forum Administration système
    Réponses: 6
    Dernier message: 20/08/2009, 10h03
  4. Réponses: 7
    Dernier message: 10/02/2009, 14h41
  5. Réponses: 4
    Dernier message: 21/11/2007, 18h21

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