如何设计插件系统才能不浪费这么多资源?

2024-04-17

我正在尝试建立一个基本的插件系统 https://stackoverflow.com/a/3356922/99923就像您在 WordPress 等 CMS 中常见的那种。您有一个插件文件夹,它们通过使用事件通知的方式与主系统的操作相关联Observer or Event设计模式。

问题是它的不可能的让系统知道哪些事件插件想要采取行动 - 因此系统必须为每个页面请求加载每个插件,只是为了查明在某个时刻是否确实需要该插件。不用说,这浪费了很多资源——对于 WordPress,每个请求都会增加几 MB 的额外内存!

有其他方法可以做到这一点吗?

例如,有没有一种方法可以一次性加载所有这些内容,然后缓存结果,以便您的系统知道如何延迟加载插件?换句话说,系统加载一个配置文件,指定插件希望绑定的所有事件,然后将其保存在 APC 或其他内容中以供将来请求?

如果这也表现不佳,那么也许有一个特殊的文件结构可以用来对何时不需要某些插件来满足请求进行有根据的猜测。


我确实有一个插件管理工具,但我只将它与主要的程序插件一起使用,并且所有包含的内容通常会立即加载。但对于基于事件和延迟加载的 API,我可以想象使用浅层包装器进行插件管理,并采用自动加载来实现实际扩展。

<?php
  /**
   * api: whatever
   * version: 0.1
   * title: plugin example
   * description: ...
   * config: <var name="cfg[pretty]" type="boolean" ...>
   * depends: otherplugin
   */

 $plugins["title_event"] = "TitleEventClass";
 $plugins["secondary"] = array("Class2", "callback");
?>

在此示例中,我假设插件 API 是一个简单的列表。这个例子feature-plugin-123.php脚本除了在加载时添加到数组之外什么也不做。所以即使你有十几个功能插件,也只会产生额外的费用include_once each.

但是主应用程序/或插件 API 可以只实例化提到的类(或者new $eventcb;对于原始类名或call_user_func_array用于回调)。反过来,它将实际任务卸载到自动加载器。因此,您拥有一个双系统,其中一部分管理列表,另一部分定位真正的代码。

因此我仍然想象一个简单的config.php它只列出插件和设置,如下所示:

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

再次记住,这些只是包装器/数据脚本,带有可管理性的插件描述。人们也可以使用实际的register_even()API 并在每个中定义一个附加的包装函数。但列出类名似乎是最简单的选择。

前面提到的管理工具有点生锈而且丑陋:http://milki.include-once.org/genericplugins/ http://milki.include-once.org/genericplugins/
但如果你只需要一个列表(sql表)而不需要设置管理,那么它是不需要的。该开销仅用于漂亮打印插件元数据并保持人类可读config.php.

综上所述:

spl_autoload()在 include_path 上,以及一个简单的事件->类名注册表,每个包装脚本一个,只需一次包含所有内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何设计插件系统才能不浪费这么多资源? 的相关文章

  • Laravel 验证:对 null 的成员函数调用失败()

    这段代码几天前还可以工作 但我似乎做了一些事情导致它崩溃 我有这条路线 Route post admin routemanagement AdminController addRoute 看起来像这样 public function add
  • 提交表单后重定向是一个好习惯吗?

    我最近开始在提交网站上的某些表单 主要与购物车应用程序相关 后进行 header 重定向 到同一页面 以便用户不会通过刷新页面来执行意想不到的操作或者 后退 或 前进 并刷新页面 这是可以接受的做法吗 这是标准做法 称为redirect a
  • printf() 字符串中的名称 PHP 说明符

    PHP 中有没有一种方法可以像 Python 一样命名我的说明符 我想要这个 PHP 版本 foo array name gt 24 printf name d foo 我在 google 或 php 手册中找不到任何相关内容 好问题 通过
  • 下拉 Ajax onchange SonataAdminBundle Symfony2 问题

    我正在尝试在 SonataAdminBundle 中实现 onchange 下拉菜单 我的实体就像 class BuilderHomePage var integer ORM Column name id type integer null
  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • 比较 PHP 中的 unix 时间戳 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 在 PHP 中我有 diff abs
  • 三层 Asp.Net 应用程序中的异常处理

    1 据我了解 在three tierAsp Net应用程序我们应该通过以下方式实现异常处理 a 我们应该把try catch围绕代码块 位于三层中的任何一层 我们希望页面能够从该代码块正常恢复 当此代码生成异常时 b 我们不应该放try c
  • 为什么 opcache 没有刷新?

    我用guzzlehttp guzzle封装在拉拉维尔 8 升级到后PHP 8 I get Symfony Component ErrorHandler Error FatalError Invalid opcode 117 2 0 in f
  • 如何向 opencart 管理添加新模块?

    我想在 opencart 管理中将子菜单项 位置 添加到 目录 菜单项 在选择位置时 我想看到我自己的位置管理视图页面 该页面与 opencart 数据库中我自己的位置表相互关联 请让我知道在哪里以及创建什么 mvc 才能在开放购物车中实现
  • 为什么 symfony DOMCrawler 对象无法在依赖的 phpunit 测试之间正确传递?

    我有一个适用于我的 symfony 应用程序的 phpunit 测试套件 在该测试文件中 我在不同的测试之间有一些依赖关系 并在依赖关系之间传递一个 DOMCrawler 对象 这样我就不必每次都导航到它 但是 在采用我所做的方法时 您似乎
  • 根据 WooCommerce 中的特定付款方式添加费用

    在 WooCommerce 中 我需要为特定支付网关申请自定义手续费 我这里有这段代码 如何向 WooCommerce Checkout 添加手续费 http www endocreative com add handling fee wo
  • 解析 PHP 多维数组

    这里 下面给出 是我正在做的一些非常简单的 php 解析多维数组的事情 我只是搜索 突出显示 键 然后将一些键值对存储在另一个数组中 有没有更好的方法来实现这一点 我的意思是关于性能 而不是有 n 个 foreach 循环来达到你想要的效果
  • 如果在 Woocommerce 中应用了任何优惠券代码,请删除一些支付网关

    我开始从事小型 Woocommerce 项目 我有 3 个支付网关进入这家商店 Paypal 信用卡和直接银行转账 我想要的是 如果使用优惠券代码 我想从可用的支付网关中禁用 或删除 Paypal 和信用卡 并仅保留 直接银行转账 作为可用
  • PHP:检查任何基于拉丁语的语言中的字母字符?

    使用 PHP 我想检查一个字符串仅包含字母字符 我不想允许任何数字或特殊字符 例如 ctype alpha 对于这个目的来说似乎很棒 问题是我想允许重音字母 例如法语等 例如 我想允许 L rien 我知道ctype alpha 可以与se
  • method_存在于父类php中

    我正在尝试使用 php 函数 method exists 但我需要检查该方法是否存在于对象的父类中 so class Parent public function myFunction class Child extends Parent
  • 严格标准:资源 ID#73 用作偏移量,转换为整数

    我使用这个 PHP 函数获取 MySql 结果 function fetcharray query id if query id query id this gt query res if query id this gt q array
  • 自定义 php 论坛 - 显示新的/未读的帖子

    我自己使用 php 编写了一个自定义论坛脚本 我决定不使用 phpbb 和其他工具 因为我希望我所做的事情具有 100 的灵活性 不过我遇到了一个问题 如何向用户显示帖子是否是新的 未读的 我想到了两种解决方案 1 饼干 2 数据库 我不想
  • 超慢的表格布局性能

    我遇到了糟糕的 TableLayout 性能 我在这里读过一些帖子 谈论同样的事情 Android 动态创建表 性能不佳 https stackoverflow com questions 9813427 android dynamical
  • 精简 PHP 和 GET 参数

    我使用 Slim PHP 作为 RESTful API 的框架 如何在 Slim PHP 中从 URL 获取 GET 参数 例如 如果我想使用以下内容 http api example com dataset schools zip 999
  • Google Analytics PHP(发送信息)

    大意 我正在开发一个项目 我需要使用 Google Analytics 服务器端 我不需要检索信息 但我需要发送信息 我最终可以发送 js 脚本客户端 但在这种情况下它不是一个选项 以下大多数链接都非常旧 2012年 检索 不是我需要的 我

随机推荐