使用服务器中的常规文件库,除非该文件存在于本地



我们建立了一个CRM网站,人们可以进行预订。

我们即将有更多的客户使用这个系统,这意味着维护是一个有点不同的想法,我们不想为我们创建的每一个(微小的)更新更新15个以上的网站。

我正在寻找一个这样工作的系统:

尝试打开文件/file.txt(例如:file_get_contents("/file.txt")):

  • 如果文件存在于userA的目录中,则返回此文件
    -例如:/home/usera/wwwroot/domainname.ext/file.txt
  • 如果没有:从服务器上的常规指定位置返回文件
    -例如:现在返回:/home/GENERAL_POOL/file.txt(类似于虚拟链接/别名/快捷方式)

我们想要这个,因为会有更多的用户,我只想更新一个文件(保留版本)。如果我添加了一个功能,他们都应该拥有它,因为他们都在同一个代码上工作
本地文件主要是模板和样式表,但也可能是一个例外的PHP文件。

小示例:

  • 假设/saveOrder.php中有一个对saveOrder()的函数。我希望我们所有的客户都使用它,所以我不会在本地创建那个文件,所以他们都从通用池中获取它
    现在我们已经修复了/saveOrder.php中的一个错误,*boom*所有用户都已经修复了(是的,我也意识到这可能带来的危险)
  • 我确实想要为这个用户提供一个自定义样式,所以/style.css被放置在本地,因此可以代替常规池中的文件使用

可能很方便知道的事情:

  • 我们正在使用最新的apache服务器
  • 此服务器专用于此类系统/网站
  • 我们可以随心所欲

我们怎样才能解决这个问题?这样的系统存在吗?如果存在,它叫什么?如果没有,我们怎么能创造这个。我正在寻找最有效的方法,不喜欢破坏.htaccess文件
此外,如果有一种创建版本的方法,那将是很棒的

如果需要更多信息来回答这个问题,请告诉我

这是unionfs fuse的一个用例。

假设您的CMS存储在/home/GENERAL_POOL/
对于每个客户,您都有一个目录,最初为空,名为/home/usera/files/
您希望他的文件从/home/usera/wwwroot/domainname.ext/送达。

使用unionfs fuse,您可以为每个客户使用以下命令:

$ unionfs-fuse -o cow 
             /home/usera/files=RW:/home/GENERAL_POOL=RO 
             /home/usera/wwwroot/domainname.ext

该命令将/home/usera/files/home/GENERAL_POOL合并为/home/usera/wwwroot/domainname.ext

虽然可以提供更多的保险丝选项,但本示例说明了最重要的选项
-o cow启用写时复制,因此当/home/usera/wwwroot/domainname.ext中的文件被修改时,它会被写入顶级读写目录/home/usera/files
由于/home/GENERAL_POOL是只读的,因此它永远不会被此装载点修改,但您在原始目录中进行的任何更新都将自动反映给所有客户端。

读取文件时,第一个目录优先,此处为/home/usera/files。如果在该目录中找不到,将在/home/GENERAL_POOL中进行搜索。

即使现在不考虑这一点,将来也可能需要切换到S3这样的服务。考虑到这一点,使用Flysystem这样的库来抽象文件系统可能是值得的。这也将帮助您进行当前设置。请参阅缓存部分,尤其是适配器缓存。

相关内容

  • 没有找到相关文章

最新更新