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

时间:2009-09-07 04:25:37

标签: php directory

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

有史以来第一次,我实际上是在花时间计划一个干净整洁的目录结构。

您通常使用哪种目录结构,哪些目录结构最容易管理?

10 个答案:

答案 0 :(得分:24)

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

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

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

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

我希望这会有所帮助。

答案 1 :(得分:19)

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

project/
 web/
  index.php
  css/
  js/
  images/
 config/
 lib/
  • 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
  • web /包含所有公共文件
  • cli /脚本和程序从命令行而不是网络
  • 运行
  • 配置/拥有你所有的配置文件(在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 如果你没有太多的课程)
  • 供应商拥有来自作曲家的所有库文件和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)

制作部署脚本。像这样:

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

让脚本返回到以前的版本(或指南,以便您知道该怎么做)。

答案 2 :(得分:5)

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

对于数据访问功能,类位于: 为approot / DAO /

对于javascripts: 为approot /脚本/

对于CSS: 为approot /形式/

对于图片: 为approot / IMG /

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

对于缓存: 为approot /高速缓存/

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

所有页面文件: 为approot /

来自Samstyle PHP Framework

的结构

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

答案 3 :(得分:4)

根据我的经验,你永远不能为此做好计划。您可以尝试遵循框架所做的事情,但我发现我从未完全适应他们的模式。

我建议在最大目录中保留20个文件的经验法则。如果您发现需要更多,只需创建一些子目录并在其中移动常用组件。

答案 4 :(得分:2)

我将codeigniter用于小型和大型项目。 它的MVC功能适中。

  • codeIgniter \ system \ application \ config:包含所有类型的配置文件,如DB,支付网关,ftp配置,路由和...
  • codeIgniter \ system \ application \ models:包含各种数据库类,你应该根据需要创建子文件夹,我用过customer,mailData,paymentModel,report,web-service等....
  • codeIgniter \ system \ application \ views:包含将作为客户端输出的各种文件,如果可能,您应该考虑重用这些文件。像模型一样,您必须创建子文件夹,如管理,报告,电子邮件,email_template .....
  • codeIgniter \ system \ application \ controllers:这是最重要的部分。这将有助于创建SEO网址,所以这次你应该更加小心子文件夹。您可以创建类似管理,产品,报告,订单......并考虑控制器类功能的良好名称。

这些是针对PHP / HTML文件的。

现在关于其他文件:

  • codeIgniter \ images:for the images
  • codeIgniter \ scripts:用于Java脚本及其框架
  • codeIgniter \ styles:用于CSS
  • codeIgniter \ uploads:对于上传的文件,如果您不想将文件放入数据库

有关详细信息,请参阅codeIgniter框架。

这里“codeIgniter”是批准

答案 5 :(得分:1)

这主要是一个偏好问题,快速谷歌搜索会揭示许多不同的项目结构。但如果有一个商定的标准,那将是非常好的。我认为PHP Package Development Standards的这个initiative是一个很好的选择。

这是他们建议的目录结构:

  • bin / :命令行可执行文件
  • config / :配置文件
  • docs / :文档文件
  • public / :网络服务器文件
  • 资源/ :其他资源文件
  • src / :PHP源代码
  • 测试/ :测试代码

答案 6 :(得分:1)

这是我目前正在使用的结构

public/           
  assets/         /* js, css, imgs, ... */
  index.php
src/
  config/         /* for config files */
  helpers/        /* for functions */
  libraries/      /* for free classes that are not MVC classes */
  models/         /* for M in MVC */
  views/          /* for V in MVC */                   
  controllers/    /* for C in MVC */
  vendor/         /* for vendors files */
  uploads/        /* for uploaded images, docs, ... */

答案 7 :(得分:0)

查看symfony 1.4symfony 2目录结构。选择最直观的方式。

答案 8 :(得分:0)

我认为这取决于项目的规模。这是我主要使用的:

项目/
  的index.php
  IMG /
  CSS /
  JS /
  意见/
  功能/

只要所有项目文件都有条理......

答案 9 :(得分:0)

尽管问题有点老了,但我仍然建议建议我在基于SOA的应用程序中一直在使用的最新可伸缩应用程序结构,并且绝对可以正常工作。

myApplication/

    app/
        config/ 
        +         this can include custom MVC structure
    cli/ 
    docker/
    lib/        - most commonly reusable components
    logs/
    public/     - should contain all publicly exposable web contains
    sql/        - db migration stuffs
    tests/      - compulsory test
    tools/      - application addon tools like any kinds of rulset etc
    vendor/