【问题标题】:Is there a way to overwrite defines from different files?有没有办法覆盖来自不同文件的定义?
【发布时间】:2013-09-11 03:23:30
【问题描述】:

我正在尝试创建一个界面,用于更新托管 20 多个 WordPress 站点的服务器上的所有 WordPress 插件实例。除了我有一个循环之外,我已经完成了所有工作:

require_once($path.'/wp-load.php');
require_once($path.'/wp-admin/includes/admin.php');
require_once($path.'/wp-admin/includes/class-wp-upgrader.php');

其中$path 等于网站目录($path 会随着我的循环的每次迭代而变化)。

我需要以这种方式要求文件的原因是因为wp-load.php 包括(除其他外)一个名为wp-config.php 的文件,它定义了诸如 SQL 数据库之类的东西,每个网站之间都不同。

TL&DR 并陈述我的实际问题:

我有什么办法可以像下面的代码那样做吗?

require_once("dir1/a.php"); // define("VAR","dir1");
echo VAR; // displays "dir1"
unrequire_once("dir1/a.php");

require_once("dir2/a.php"); // define("VAR","dir2");
echo VAR; // displays "dir2"

【问题讨论】:

  • 我想,问题不在于require_once 本身,因为路径不同。您需要取消define
  • @kirilloid 现在我看到了,你说得对。让我解决我的问题。
  • 恐怕没有办法做到这一点。在一个脚本中。您可以通过exec 或其他方式更改您的脚本以在每个站点运行一个 php 脚本。
  • @kirilloid 效率并不是非常重要,因为这将是一个严格的内部工具,所以如果必须的话,我会使用这种方法。我能想到的唯一选择是动态名称间距,这在 PHP 中似乎还不可能。

标签: php wordpress require


【解决方案1】:

由于您提到这是一个内部工具,您可以考虑使用 runkit 来在运行时删除常量,以便以后重新定义它:http://www.php.net/manual/en/function.runkit-constant-remove.php


不要担心——即使你可以,你也不会得到你正在寻找的行为,因为常量 (define) 只能创建一次,并且在其余的执行过程中都是这样。它们不能被删除,也不能在之后更改。

不幸的是,您将不得不重新构建脚本(例如,使用变量而不是常量)。

【讨论】:

  • 您忘记了链接中“常量”中的第二个“t”。那是一个有趣的图书馆。如果没有更好的选择,我会研究一下。
【解决方案2】:

是的:fork 进程。您可以执行以下操作:

foreach ($pathlist as $path) {
    $pid = pcntl_fork();
    if(!$pid) {
        require_once($path.'/wp-load.php');
        require_once($path.'/wp-admin/includes/admin.php');
        break;
    }
}

这将为列表中的每个 $path 创建一个脚本副本,并解决 require_once 问题。

如果它是子进程,您需要“中断”循环,因为您只希望子进程为其单独的 $path 设置运行,而不是继续循环本身!

【讨论】:

    猜你喜欢
    • 2021-02-02
    • 2011-04-15
    • 2011-06-13
    • 2020-03-12
    • 2011-04-28
    • 2023-03-31
    • 2014-02-01
    • 1970-01-01
    • 2018-10-05
    相关资源
    最近更新 更多