PHP - 加载另一个文件(如果存在)

时间:2012-01-16 21:56:06

标签: php

有一段时间我有一个网站,这个网站已经发展成长了几百个单独的php文件。大约2年前,我制作了同一网站的移动版本。我决定只复制主文件,调整页眉和页脚以实现移动友好。其余的工作按预期进行;我现在说50%的兼容性。 一些子目录我决定使用ln -s而不是复制它们而不是复制它们。这解决了剩余的45%。

最近我遇到了一个令人不安的情况。对于移动版本和整个网站,此sym链接子目录中的一个文件需要完全不同。对于普通文件,我只会制作一个硬拷贝,并修改内容,但对于sym链接目录中的文件,这是不可能的。

有没有人碰到这个?我该如何解决这个问题?

这是文件布局&例如:

/var/www/domain.com/
/var/www/mobile.domain.com/

/var/www/mobile.domain.com/images -> /var/www/domain.com/images
/var/www/mobile.domain.com/tools -> /var/www/domain.com/tools

如果我需要修改文件/tools/help/wizard/configure.php,那么我就不能拥有该文件的唯一文件

我想到的一种方法,但不喜欢修改移动header文件以检查类似的内容:

if (file_exists("/var/www/mobile.domain.com/_overwrite_/" . $requested_file)) {
    // ... include it instead of running the actual file
}

这似乎是一种丑陋的做法。 Apache指令也可以这样做(我不知道,但我猜它是ModRewrite)

3 个答案:

答案 0 :(得分:1)

您提出的问题是文件系统级问题。要在文件系统级别解决它,您可以简单地为目录中的每个条目创建符号链接,但要覆盖的条目除外。

如果您想要/tools/help/wizard/configure.php的特殊mobile.domain.com,那么请使用目录级别的软链接

/var/www/mobile.domain.com/tools -> /var/www/domain.com/tools

您可以为工具中的每个条目建立软链接,但help除外:

/var/www/mobile.domain.com/tools/file1 -> /var/www/domain.com/tools/file1
/var/www/mobile.domain.com/tools/file2 -> /var/www/domain.com/tools/file2
/var/www/mobile.domain.com/tools/file3 -> /var/www/domain.com/tools/file3

创建一个物理目录tools/help,并为除wizard之外的每个条目建立软链接;并创建一个物理目录wizard,并为除configure.php以外的每个条目建立软链接:

/var/www/mobile.domain.com/tools/help/fileH1 -> /var/www/domain.com/tools/help/fileH1
/var/www/mobile.domain.com/tools/help/fileH2 -> /var/www/domain.com/tools/help/fileH2
/var/www/mobile.domain.com/tools/help/fileH3 -> /var/www/domain.com/tools/help/fileH3
/var/www/mobile.domain.com/tools/help/wizard/fileW1 -> /var/www/domain.com/tools/help/wizard/fileW1
/var/www/mobile.domain.com/tools/help/wizard/fileW2 -> /var/www/domain.com/tools/help/wizard/fileW2
/var/www/mobile.domain.com/tools/help/wizard/fileW3 -> /var/www/domain.com/tools/help/wizard/fileW3
/var/www/mobile.domain.com/tools/help/wizard/configure.php`

现在,mobile.domain.com中的包含将获取存在的自定义物理文件,并且通过软链接将从不存在自定义的主站点中获取文件。

使用所有这些软链接创建目录并不繁琐,只需编写一个简单的shell脚本来列出源目录的内容,并在目标目录中为每个目录创建一个软链接。

每次向/var/www/mobile.domain.com添加文件时,更新/var/www.domain.com中的软链接都会非常繁琐。这是为单个站点构建原始代码,然后尝试将其扩展到多个站点的结果。重新设计代码可以改进处理文件添加和删除的方式,但这需要投入大量精力。我从你的问题中解决了这个问题,你试图避免重新设计你的代码。

我会注意到有一种方法可以在PHP对象层次结构级别处理此问题。如果domain.com的PHP文件定义了对象和类,那么您可以让mobile.domain.com的PHP文件定义domain.com的子类,只需要您需要的修改。这样,mobile.domain.com只需要包含那些PHP文件来定义不同的模块。

答案 1 :(得分:0)

尝试在移动标头中设置常量:

define(IS_MOBILE_VIEW, true);

然后在你加载的文件中,移动版本必须不同,只需在开头做一个简单的检查并加载适当的其他文件:

if(defined(IS_MOBILE_VIEW) && IS_MOBILE_VIEW) {
    require_once '/var/www/mobile.domain.com/other_file.php';
} else {
    //rest of file, you can also use a return; in the if clause 
    //or something similar if you don't want to enclose the whole logic in
    //an else clause
}

答案 2 :(得分:0)

我认为没有比你描述的更好的方法。事实上,如果所有的include语句都在一个地方(header.php?),那么它看起来像是一个不错的解决方案,因为你将能够从应用程序的其余部分隐藏这个逻辑。我认为它没有任何缺点。

如果你想更进一步,你也可以将它抽象成一个函数并用它替换你的include调用,这样就可以在不必触及代码的情况下覆盖你想要的任何文件。

将来您可能还想了解PHP的autoload功能。