Pourquoi des fichiers séparés consomment-ils plus de RAM qu’un seul ? (Créer un compte)

  • Statut : non résolu
12 sujets de 16 à 27 (sur un total de 27)
  • Auteur
    Messages
  • #781873
    xknown
    Participant
    Chevalier WordPress
    119 contributions

    Il faut que la configuration de votre serveur web (apache ou nginx) et php soit la même à celle que vous avez en ligne.
    L’on n’a aucune idée si la différence de la taille de la BD influence ce résultat ou pas. L’on ne sait pas ce que votre plugin fait avec ! Sans plus d’information (par exemple, le code), ce n’est plus la peine (au moins pour moi) de continuer cette discussion.

    #781874
    luciole135
    Participant
    Maître WordPress
    13714 contributions
    xknown wrote:
    Il faut que la configuration de votre serveur web (apache ou nginx) et php soit la même à celle que vous avez en ligne.
    L’on n’a aucune idée si la différence de la taille de la BD influence ce résultat ou pas. L’on ne sait pas ce que votre plugin fait avec !

    Je vais tacher de trouver la même version de PHP que celle en ligne soit 5.1.3 R.C.4.

    #781875
    luciole135
    Participant
    Maître WordPress
    13714 contributions
    xknown wrote:
    Sans plus d’information (par exemple, le code), ce n’est plus la peine (au moins pour moi) de continuer cette discussion.

    le code se trouve ici :
    http://plugins.svn.wordpress.org/statpress-visitors/trunk/
    les fichiers des 9 pages optionnelles dans le dossier « pages« , le plugin avec sa fonction principale dans le fichier « statpress.php« , le reste n’est pas du code.

    #781876
    luciole135
    Participant
    Maître WordPress
    13714 contributions
    xknown wrote:
    L’on n’a aucune idée si la différence de la taille de la BD influence ce résultat ou pas. L’on ne sait pas ce que votre plugin fait avec !

    Le plugin est un plugin de stats, il ne fait rien avec la table de données tant que l’administrateur ne veut pas regarder les stats, il se contente de la remplir au fur et à mesure des visites en fonctionnement normal.

    De plus la table la plus grosse est celle installée en LOCAL. En ligne, elle est presque vide.

    Mes mesures se font au moment de son activation. Pas lorsqu’il détecte une visite, car alors, je ne sais pas comment mesurer cela ni d’ailleurs si cela est possible.

    Ce sont les pages qui trient les données brutes avec des requêtes SQL de façon à afficher les stats pour l’administrateur et lui seul (ou ceux qu’il autorise à regarder selon son bon vouloir).

    Les visiteurs ne peuvent pas voir les stats.

    #781877
    xknown
    Participant
    Chevalier WordPress
    119 contributions

    D’accord, il va falloir donc attendre les tests avec la même configuration.

    Mes mesurent se font au moment de son activation. Pas lorsqu’il détecte une visite, car alors, je ne sais pas comment mesurer cela ni d’ailleurs si cela est possible.

    Je comprends, d’après le code la mémoire utilisé par un administrateur est différent à celle utilisé par un visiteur.

    En revenant au sujet principal, il faudrait voir mainenant comment vous avez séparé le code en différents fichiers. Ce que j’ai pu remarquer est que le code n’est pas « propre ». Il y a sûrement des problèmes de sécurité et l’on peut peut-être l’optimiser beaucoup.

    #781878
    luciole135
    Participant
    Maître WordPress
    13714 contributions
    xknown wrote:
    Je comprends, d’après le code la mémoire utilisé par un administrateur est différent à celle utilisé par un visiteur.

    Tout a fait !

    Les pages sont très gourmandes en ressources SQL, c’est pour ça que FREE (mon hébergeur) a cloturé mes pages perso pour un jour et m’a dit par mail de développer le plugin en local. Ne sachant même pas que l’on pouvait installer le site en local, je faisais tous les tests en ligne : un nombre dément de requêtes SQL.

    Le fonctionnement normal du plugin ne consomme presque pas de ressources SQL (une seule insertion dans la base de donnée à chaque visite).

    xknown wrote:
    En revenant au sujet principal, il faudrait voir maintenant comment vous avez séparé le code en différents fichiers.

    Tout simplement, pour chaque fichier PHP j’ai copié dans un nouveau fichier tout ce qui était entre la première balise PHP sans les inclure dans la copie.
    J’ai ajouté à la main la balise de début , j’ai enregistré en PHP UTF8_SANS BOM et c’est tout, les deux versions, celle qui a un bug de mémoire et la suivante ont exactement le même code.

    Mais cette manip (inspirée de mes déboires avec un caractère espace après la balise ?> dont je vous remercie encore de m’avoir sorti de ce mauvais pas) a suffit pour réparer le bug sans que je sache pourquoi !

    xknown wrote:
    Ce que j’ai pu remarquer est que le code n’est pas « propre ». Il y a sûrement des problèmes de sécurité et l’on peut peut-être l’optimiser beaucoup.

    Oh, ça je vous l’accorde volontiers, je n’ai fait au départ qu’améliorer les requêtes SQL :
    1) J’ai divisé dans la page principale le nombre de requêtes par le nombre de jour affichés (l’original fait 4 requêtes par jour affiché dans les graphes donc s’il affiche un graphe de 20 jours, il fait 80 requêtes, pour 30 jours 120 requêtes, pour 50 jours 200 requêtes). Je fais 4 requêtes SQL uniquement indépendamment du nombre de jours affichés). Ce qui a déjà accéléré considérablement la vitesse d’exécution, (je suis passé en ligne avec une table de 15 Mo (45000 lignes) de 10 secondes pour afficher la page à 2 secondes).

    2) Dans la page spyvisitors (le log des visiteurs) je ne fais qu’une seule requête SQL là où l’original en fait autant que de visiteurs affichés : soit 40.

    Pour la partie PHP, j’ai simplement repris le code du StatPress Original en regroupant en fonctions le code qui était recopié plusieurs fois de suite dans la même page ! Bon, j’ai créé quelques fonctions tout seul comme un grand, mais sans plus.

    Toute la partie analyse des données des visiteurs est celle du StatPress original.

    Si vous avez des pistes pour l’optimisation PHP, cela m’intéresse vraiment car c’est ce que je connais le moins bien.

    Pour les problèmes de sécurité, j’aimerai aussi bien savoir comment les résoudre, car le PHP, je me débrouille avec mais comme si c’était de la programmation en Pascal, (le langage que j’ai appris, de fait je n’en connait pas toutes les subtilités).

    Pour l’instant, je me renseigne sur l’optimisation de la table de données qui n’a pas une structure optimale (les données ne sont pas indexées – notamment les dates alors que presque toutes les requêtes SQL trient par un WHERE sur les dates) . De surcroit les dates sont stockées sous forme de texte et non pas d’entier, ce qui multiplie par 3 leur temps de lecture par MySql d’après mes recherches sur le net.
    Les autres données aussi sont stockées en texte alors que des entiers seraient mieux notamment l’IP et le timestamp. J’ai donc une analyse de la structure des données à faire ainsi qu’une optimisation de la table de données.

    Avec des données indexées bien choisies, je pourrais faire une version plus rapide.

    Je cherche à comprendre en regardant comment font les autres plugins comment on fait pour changer la structure d’une table de données existante comme le fait WordPress lors d’une mise à jour. Je veux arriver à faire exactement pareil avec un message qui indique « la base de données à besoin d’être mise à jour« , l’usager accepte et on continue, il refuse et le plugin ne s’active pas.

    Je suis en train de me renseigner dessus (cela ne fait que depuis novembre 2010, donc 9 mois par intermittence que j’ai appris SQL et PHP).

    #781879
    luciole135
    Participant
    Maître WordPress
    13714 contributions
    xknown wrote:
    D’accord, il va falloir donc attendre les tests avec la même configuration.

    Ben, en fait je ne pourrais pas le faire car la version PHP 5.1.3 n’est plus disponible en téléchargement depuis au moins 2 ans :
    http://www.wampserver.com/phorum/read.php?1,55539,printview,page=1

    Les seules versions disponibles sont toutes minimum en PHP 5.2.x.

    #781880
    xknown
    Participant
    Chevalier WordPress
    119 contributions
    luciole135 wrote:
    Les pages sont très gourmandes en ressources SQL, c’est pour ça que FREE (mon hébergeur) a cloturé mes pages perso pour un jour et m’a dit par mail de développer le plugin en local. Ne sachant même pas que l’on pouvait installer le site en local, je faisais tous les tests en ligne : un nombre dément de requêtes SQL.

    Le fonctionnement normal du plugin ne consomme presque pas de ressources SQL (une seule insertion dans la base de donnée à chaque visite).

    En réalité ce type de plugins posent de problèmes lorsqu’un site possède un grand nombre de visiteurs. Ce n’est pas efficient d’écrire dans la BD chaque fois qu’une page est générée.

    Tout simplement, pour chaque fichier PHP j’ai copié dans un nouveau fichier tout ce qui était entre la première balise PHP sans les inclure dans la copie.
    J’ai ajouté à la main la balise de début , j’ai enregistré en PHP UTF8_SANS BOM et c’est tout, les deux versions, celle qui a un bug de mémoire et la suivante ont exactement le même code.

    Mais cette manip (inspirée de mes déboires avec un caractère espace après la balise ?> dont je vous remercie encore de m’avoir sorti de ce mauvais pas) a suffit pour réparer le bug sans que je sache pourquoi !

    Ce n’est pas la peine de diviser le code de cette manière. Comme je vous disais, cela peut être pire car l’interpreteur PHP doit faire une opération d’E/S (entrée/sortie) en plus pour chaque fichier. C’est mieux de les séparer par rapport aux fonctionnalitées apportées. L’idée principale est d’exécuter le minimum de code php necéssaire pour répondre à une requête donnée. Par exemple, suppossons que l’on a un fichier qui contient un ensemble de fonctions qui mélange le code pour l’administrateur et pour le « front-end » :

    <?php

    // code utilisé lorsque le client accède à l'administration et les visiteurs

    Dans ce cas, ce serait plus intéressant de séparer ce code comme suit

     c’est peut-être mieux de le placer dans un autre fichier pour des raisons de clairté
    ….
    } else {
    // code utilisé pour les visiteurs

    }

    Oh, ça je vous l’accorde volontiers, je n’ai fait au départ qu’améliorer les requêtes SQL :
    1) J’ai divisé dans la page principale le nombre de requêtes par le nombre de jour affichés (l’original fait 4 requêtes par jour affiché dans les graphes donc s’il affiche un graphe de 20 jours, il fait 80 requêtes, pour 30 jours 120 requêtes, pour 50 jours 200 requêtes). Je fais 4 requêtes SQL uniquement indépendamment du nombre de jours affichés). Ce qui a déjà accéléré considérablement la vitesse d’exécution, (je suis passé en ligne avec une table de 15 Mo (45000 lignes) de 10 secondes pour afficher la page à 2 secondes).

    2) Dans la page spyvisitors (le log des visiteurs) je ne fais qu’une seule requête SQL là où l’original en fait autant que de visiteurs affichés : soit 40.

    Pour la partie PHP, j’ai simplement repris le code du StatPress Original en regroupant en fonctions le code qui était recopié plusieurs fois de suite dans la même page ! Bon, j’ai créé quelques fonctions tout seul comme un grand, mais sans plus.

    Toute la partie analyse des données des visiteurs est celle du StatPress original.

    Si vous avez des pistes pour l’optimisation PHP, cela m’intéresse vraiment car c’est ce que je connais le moins bien.

    Comme je vous disais precedemment, il faut séparer les fonctionnalités (ce qui n’est pas forcement équivalent à séparer en plusieurs fichiers). J’ai écrit un article (en espagnol) il y a quelques années à ce propos, vous pouvez peut-être prendre quelques idées.

    Pour les problèmes de sécurité, j’aimerai aussi bien savoir comment les résoudre, car le PHP, je me débrouille avec mais comme si c’était de la programmation en Pascal, (le langage que j’ai appris, de fait je n’en connait pas toutes les subtilités).

    Regardez une présentation (en anglais) faite par l’un des développeurs de WordPress. C’est un peu basique, mais cela pourrait être un bon début.

    Pour l’instant, je me renseigne sur l’optimisation de la table de données qui n’a pas une structure optimale (les données ne sont pas indexées – notamment les dates alors que presque toutes les requêtes SQL trient par un WHERE sur les dates) . De surcroit les dates sont stockées sous forme de texte et non pas d’entier, ce qui multiplie par 3 leur temps de lecture par MySql d’après mes recherches sur le net.
    Les autres données aussi sont stockées en texte alors que des entiers seraient mieux notamment l’IP et le timestamp. J’ai donc une analyse de la structure des données à faire ainsi qu’une optimisation de la table de données.

    Avec des données indexées bien choisies, je pourrais faire une version plus rapide.

    Je cherche à comprendre en regardant comment font les autres plugins comment on fait pour changer la structure d’une table de données existante comme le fait WordPress lors d’une mise à jour. Je veux arriver à faire exactement pareil avec un message qui indique « la base de données à besoin d’être mise à jour« , l’usager accepte et on continue, il refuse et le plugin ne s’active pas.

    Je suis en train de me renseigner dessus (cela ne fait que depuis novembre 2010, donc 9 mois par intermittence que j’ai appris SQL et PHP).

    Regardez aussi du côté « mysql slow queries », cela vous donnera des consignes pour les indices (mais comme vous dites, vous devez apparemment en ajouter pour les dates). Utilisez « explain » pour savoir si les indices sont utilisés.

    Du côté de la mise à jour des tables, c’est pas trop compliqué. Vous pouvez faire de la même manière qui fait WP. Vous stockez la version dans la BD, et en utilisant cette information vous pouvez faire tout ce que vous voulez.

    $foo_version = … // par exemple get_option(‘foo_version’)
    if ( version_compare( $foo_version, ‘1.0’ ) < 0) {
    upgrade_from_0_version();
    }
    if ( version_compare( $foo_version, ‘1.5’ ) < 0) {
    upgrade_from_1_blabla();
    }

    #781881
    luciole135
    Participant
    Maître WordPress
    13714 contributions

    Merci beaucoup de toutes ces pistes, je vais étudier chaque lien que vous avez donné avec « Google traduction est mon ami« .

    🙂

    #781882
    luciole135
    Participant
    Maître WordPress
    13714 contributions
    xknown wrote:
    En réalité ce type de plugins posent de problèmes lorsqu’un site possède un grand nombre de visiteurs. Ce n’est pas efficient d’écrire dans la BD chaque fois qu’une page est générée.

    Alors là, vraiment je sèche, comment est-il possible de ne pas écrire dans la table de donnée à chaque visite sans perdre les données de la visite ?

    Au prochain appel de la fonction, ce seront les données de la nouvelle visite qui seront lues dans $_SERVER celle de la visite précédente seront effacées, comment je peux faire çà ?

    #781883
    luciole135
    Participant
    Maître WordPress
    13714 contributions
    xknown wrote:
    Ce n’est pas la peine de diviser le code de cette manière. Comme je vous disais, cela peut être pire car l’interpreteur PHP doit faire une opération d’E/S (entrée/sortie) en plus pour chaque fichier. C’est mieux de les séparer par rapport aux fonctionnalitées apportées. L’idée principale est d’exécuter le minimum de code php necéssaire pour répondre à une requête donnée. Par exemple, suppossons que l’on a un fichier qui contient un ensemble de fonctions qui mélange le code pour l’administrateur et pour le « front-end » :

    <?php

    // code utilisé lorsque le client accède à l'administration et les visiteurs

    Dans ce cas, ce serait plus intéressant de séparer ce code comme suit

     c’est peut-être mieux de le placer dans un autre fichier pour des raisons de clairté
    ….
    } else {
    // code utilisé pour les visiteurs

    }

    Comme je vous disais precedemment, il faut séparer les fonctionnalités (ce qui n’est pas forcement équivalent à séparer en plusieurs fichiers). J’ai écrit un article (en espagnol) il y a quelques années à ce propos, vous pouvez peut-être prendre quelques idées.

    je viens de le faire en ajoutant

    if (is_admin())
    {include ABSPATH.’wp-content/plugins/’.dirname(plugin_basename(__FILE__)).’/admin/luc_admin.php’;
    add_action(‘init’, ‘statpress_load_textdomain’);
    add_action(‘admin_menu’, ‘luc_add_pages’);
    }

    les fonctions d’amin étant désormais toutes dans le fichier luc_admin.php

    Ainsi, si c’est un visiteur qui vient, la partie admin du plugin n’est pas chargée en mémoire.

    C’est une excellente idée, merci beaucoup.

    🙂

    #781884
    luciole135
    Participant
    Maître WordPress
    13714 contributions
    luciole135 wrote:
    xknown wrote:
    En réalité ce type de plugins posent de problèmes lorsqu’un site possède un grand nombre de visiteurs. Ce n’est pas efficient d’écrire dans la BD chaque fois qu’une page est générée.

    Alors là, vraiment je sèche, comment est-il possible de ne pas écrire dans la table de donnée à chaque visite sans perdre les données de la visite ?

    Au prochain appel de la fonction, ce seront les données de la nouvelle visite qui seront lues dans $_SERVER celle de la visite précédente seront effacées, comment je peux faire çà ?

    Ca y est, j’ai pigé, on peut stocker dans un fichier PHP et mettre à jour la Base de données quand l’admin se connecte…
    C’est une solution pour les sites pros, (mon plugin n’est pas fait pour les sites pros, mais pour les individuels qui n’ont pas énormement de visiteurs, enfin, y a un usager qui a quand même 5000 visiteurs par jour et qui l’utilise) à moins de faire payer, je ne pense pas que je le ferais, mais je conserve cette idée en tête, merci !

12 sujets de 16 à 27 (sur un total de 27)
  • Vous devez être connecté pour répondre à ce sujet.