有一段时间我有一个网站,这个网站已经发展成长了几百个单独的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)
答案 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功能。