我正在尝试创建一个界面,用于在托管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"
答案 0 :(得分:0)
由于您已经提到过这是一个内部工具,您可以考虑使用runkit来在运行时删除常量,以便以后重新定义:http://www.php.net/manual/en/function.runkit-constant-remove.php
害怕没有 - 即使你可以,你也不会得到你正在寻找的行为,因为常量(define
)只能创建一次,并且就像其余的执行一样。它们不能被删除,也不能在此后更改。
不幸的是,您将不得不重新设计脚本(例如,使用变量而不是常量)。
答案 1 :(得分: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设置运行而不是继续循环本身!