1

我正在尝试创建一个界面来更新托管 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');

where$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"
4

2 回答 2

0

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

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 设置运行,而不是继续循环本身!

于 2013-10-30T12:59:03.373 回答
0

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


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

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

于 2013-09-06T22:56:03.390 回答