8
votes

Comment peut-on conçue les systèmes de plugin afin qu'ils ne gaspillent pas autant de ressources?

J'essaie de construire une base Système de plug-in comme si vous trouvez souvent dans un CMS comme WordPress. Vous avez un dossier de plugins qui attachent dans l'opération du système principal via des notifications d'événements utilisant un [Strong> Observer ou Modèle de conception

Le problème est que c'est impossible pour le système de savoir quels événements le plugin veut agir - de sorte que le système doit donc charger chaque plugin pour chaque demande de page juste à Découvrez si ce plugin est réellement nécessaire à un moment donné. Inutile de dire que c'est beaucoup de ressources gaspillées là-bas, dans le cas de WordPress, qui ajoute à plusieurs MB supplémentaires de mémoire pour chaque demande!

Y a-t-il des moyens alternatifs de faire cela?

Par exemple, existe-t-il un moyen de charger tout cela une fois, puis de mettre en cache les résultats afin que votre système sait comment faire des plugins de chargement paresseux? En d'autres termes, le système charge un fichier de configuration qui spécifie tous les événements que la plugin souhaite lier, puis l'enregistre à l'APC ou à quelque chose pour les demandes futures?

Si cela fonctionne également mal, il existe peut-être une structure de fichiers spéciale qui pourrait être utilisée pour faire des suppositions éduquées sur lorsque certains plugins sont inutiles pour remplir la demande.


0 commentaires

3 Réponses :


0
votes

Je sauverais le nom de la classe du plugin avec ses événements souscrit dans un fichier de configuration, puis enregistrez le fichier de configuration analysé dans APC, par exemple. Ensuite, lorsqu'un événement est déclenché, le système peut charger des cours de plugin appropriés au besoin.


2 commentaires

Juste ce que j'ai dit - mais, plus d'idées sur la mise en œuvre d'un système comme celui-ci?


Oui, j'ai paraphrasé votre réponse assez étroitement! J'aurais une classe de bus où vous pouvez publier des événements et ces poignées de chargement des plug-ins. Vous pouvez gérer l'enregistrement des plug-ins via un travail cron ou un processus de course à long terme.



3
votes

J'ai un outil de gestion du plugin, mais je ne l'ai utilisé que tous les utilisés avec des plug-ins principalement sur la procédure, et avec toutes les inclusions généralement chargées à la fois. Mais pour une API d'événement et de chargement paresseux, je pouvais imaginer d'utiliser des emballages peu profonds pour la gestion du plug-in et de recourir à l'autoloading pour les extensions réelles.

<?php
include_once("user/feature-plugin-123.php");
include_once("user/otherplugin2.php");
include_once("user/wrapper-for-htmlpurifier.php");
$cfg["pretty"] = 1;


0 commentaires

2
votes

WordPress et d'autres systèmes CMS sont de très mauvais exemples.

Ce que nous devons comprendre est que modulaire, presque toujours plus lourd. P>

Le meilleur schéma que j'ai jamais travaillé pour résoudre cette situation est un plugin de classe basé sur une convention de dénomination stricte utilisant un chargeur automatique. P>

Donc, avant d'utiliser le plugin, vous devez créer une instance, ou utiliser des fonctions statiques. p>

Vous pouvez même appeler le plugin comme: p>

<?php

    spl_autoload_register('systemAutoload');

    function systemAutoload($class)
    {
        $parts = explode('_',$class);


        switch($parts[1])
        {
            case "Plugin":
                include("/plugins/{$parts[2]}/{$parts[2]}.php");
            break;
        }

        // ...    

    }

?>


1 commentaires

Oui, la raison pour laquelle WordPress et les autres sont tellement ballées sont parce qu'ils ne prennent pas en charge l'autoload, ils ne font donc que charger toutes les demandes. Quoi qu'il en soit, vous avez raison que la conservation d'un schéma de dénominage de classe strict est la voie à la mapper des rappels à la classe de plug-in correspondante sur le système de fichiers afin que les classes ne soient que chargées au besoin. Toutefois, vous devez utiliser un autochargeur compatible PSR-0 afin de pouvoir toujours utiliser les classes d'autres systèmes (comme Zend) si nécessaire.