【问题标题】:unloading php extensions : reverse dl()卸载 php 扩展:反向 dl()
【发布时间】:2012-05-29 18:20:25
【问题描述】:

对于各位大师,PHP 中是否有任何隐藏的宝石可以在运行时卸载特定扩展?

【问题讨论】:

  • 您对此有什么可能的理由?仅仅因为加载了一个扩展,并不意味着你必须使用它。如果由于某种原因您绝对需要删除一个函数,您可以使用 runkit 来完成,尽管我怀疑 if (!function_exists()) { // ... } 或者只是在 php.ini 中使用 disable_functions 禁用它会更合适。
  • @DaveRandom : 源自 pecl_http 和 Cakephp 2.1 之间的 HttpResponse 类名冲突... 唉,看来我得等到下一个版本了。
  • 丑陋的解决方法是修改 CakePHP 源代码并重命名/删除类定义或包含在 if (!class_exists('HTTPResponse')) { // ... }

标签: php runtime php-extension


【解决方案1】:

不,那是not possible,很可能永远不会:

[2011-02-08 11:34 UTC] rasmus@php.net
基于每个请求的扩展卸载根本不可行 性能角度。而且你显然不能卸载并让它卸载 下一个请求,因为下一个请求可能是针对期望 扩展名。

但是,无论如何都不鼓励使用dl() - 在最近的版本中,它仅在 CLI 版本中可用。

【讨论】:

    【解决方案2】:

    从另一个角度来看:无法从正在运行的 PHP 解释器中删除扩展,因为它可能以不可逆转的方式修改了 PHP 解释器的状态。例如,许多扩展在加载时注册类;这些模块中没有代码可以在卸载时取消注册这些类。更糟糕的是,如果您的脚本已经在运行,它可能已经包含这些类的实例,如果在类定义消失的情况下进行操作,则会导致解释器崩溃。

    【讨论】:

      【解决方案3】:

      至于解决方法,如果您使用 PHP CLI 或其内置服务器 (php -S),您始终可以指定 -n/--no-php-ini 以忽略您的 php.ini,因此它会卸载您的所有在运行时扩展。对测试很有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-26
        • 2014-08-29
        • 1970-01-01
        • 2011-07-19
        • 2016-08-13
        • 1970-01-01
        • 2014-06-11
        • 1970-01-01
        相关资源
        最近更新 更多