什么是大型站点最可扩展的基于PHP的目录结构?

joh*_*ack 28 php directory

我正在创建一个非常大的基于PHP MVC的站点,它将拥有一个庞大的php类库,javascripts和许多css文件(更不用说MVC的大量文件).

我有史以来第一次花时间计划一个干净有序的目录结构.

您通常使用哪些目录结构,哪些目录结构在有数千个文件时最容易管理?

Ste*_*nte 24

这是我的设置.对于小型 - 非常大的项目(包括社交网络)来说,这对我来说非常有用.
这些文件夹都存在于我的主应用程序文件夹中:

  • config - 包含自定义PHP配置文件
  • css - 包含项目的CSS文件
  • helpers - 包含'helper'文件(每个文件是函数的集合)
  • 图像 - 包含项目的图像
  • js - 包含项目的Javascript文件
  • lib - 包含特定于项目的PHP类
  • 模块 - 我的MVC框架允许将站点部分打包为模块
    • 博客 - 示例模块
      • 控制器 - 包含模块的控制器
      • models - 包含模块的模型
      • views - 包含模块的视图
  • views - 包含应该可全局访问的视图(页眉,页脚等)

所有目录显然都可以包含进一步组织文件的子文件夹.例如,'css'文件夹可以包含名为'web'和'mobile'的子文件夹.'images'文件夹可以包含'user_uploaded'文件夹,然后可以包含`'profile'.当然,您可以根据需要添加文件夹,在一个项目中,我有一个名为"uploaders"的文件夹,它只包含独立的上传脚本.

我还使用方便的方法来帮助构建我想要加载的文件名.例如,我的loadView()将在当前模块目录中查找视图文件,或者如果传递可选的$ module参数,它将特别在该模块的文件夹中查找.

我希望这有帮助.

  • 这意味着所有人都可以看到所有PHP代码,配置等,除非你使用像.htaccess这样的服务器魔术 (4认同)
  • OIS是对的.在此设置中,如果有人知道文件名,他们可以从浏览器中调用它.我在切换到Symfony(隐藏所有后台文件)之前发布了这个答案,我绝对建议将所有非公共文件移到公共Web访问之外. (3认同)

OIS*_*OIS 19

您应该有一个目录作为Web根目录,其中只有您希望暴露给整个Internet的文件才能驻留.

project/
 web/
  index.php
  css/
  js/
  images/
 config/
 lib/
Run Code Online (Sandbox Code Playgroud)
  • web /是向访问者显示的根
  • lib /是这里的库文件夹,以及autoload查找文件的位置.

您可以向项目/类似控制器,模块,视图,助手等添加更多子文件夹.这取决于您的框架.

编辑:

如果您使用作曲家(我推荐),也许使用npm和grunt,你的文件结构将会更少:

project/
    web/
        js/
        css/
        images/
        index.php
    cli/
    config/
        config.php
    node_modules/
    src/
    test/
    vendor/
    composer.json
    composer.lock
    packages.json
Run Code Online (Sandbox Code Playgroud)
  • web /包含所有公共文件
  • cli /脚本和程序从命令行而不是Web运行
  • config /拥有你所有的配置文件(在git中你忽略了config.php而不是没有用户名,密码,验证码和表前缀/后缀以及其他"秘密"的config.dist.php)
  • node_modules /拥有来自npm的所有库文件(在git中我建议你把它放在子模块中)
  • src包含psr4结构中的所有本地PHP文件,在composer.json中设置为自动加载
  • test /拥有你的src类的所有单元测试,在composer.json中的autload-dev中设置(记得在live上使用composer install --no-dev,如果你没有太多类,可以添加-o)
  • 供应商拥有来自composer的所有库文件和ONE AND ONLY autoload.php将包含在web/index.php和任何cli脚本中(在git中我建议您忽略此供应商文件夹)

根据项目需要添加其他文件夹和文件.

对于部署使用此结构:

/sites/project/ (project is your projectname)
    current (alias to current release folder releases/v1.1.0)
    previous (optional alias to previous release folder releases/v1.0.1)
    releases/
        v1.0.0/ (git checkout of tag v1.0.0)
        v1.0.1/ (git checkout of tag v1.0.1)
        v1.1.0/ (git checkout of tag v1.1.0)
    shared/ (has all your shared files and folders to be aliased in all releases - maybe something like GlusterFS)
Run Code Online (Sandbox Code Playgroud)

制作部署脚本.像这样的东西:

首先备份db或将其复制到新数据库,将git repo复制到带有release标签的新文件夹,获取所有git子模块,运行composer install --no-dev,设置共享文件夹和上传图像等文件的任何别名配置文件,使用grunt生成js/css以及更少或等效,使用标记指向新文件夹的当前别名,运行更新数据库脚本,重新启动nginx/apache/fpm-php服务,运行测试以检查网站是否已启动.

有一个脚本可以回到以前的版本(或指南,所以你知道该怎么做).


mau*_*ris 5

对于包含的核心文件:approot/inc /

对于数据访问功能和类位于:approot/dao /

对于javascripts:approot/scripts /

对于CSS:approot/styles /

对于图像:approot/img /

对于静态内容(通常用于用户个人资料图片或上传的图像):approot/static /

对于缓存:approot/caches /

对于模板或视图文件:approot/templates /

所有页面文件:approot /

从结构Samstyle PHP框架


我在这里发布的答案来自2009年.多年来发布了更多标准,包括PSR-0,其中涵盖了文件夹结构的主题.我还有一个新的(我觉得它更好)文件夹结构与Packfire框架.