十二要素应用程序宣言如何应用于PHP项目?



我刚刚阅读了十二要素应用程序,它看起来是一套非常全面的规则,适用于基于web的应用程序。它在示例中使用python或rails,但从不使用php…我想知道宣言中的因素可以应用于PHP项目,以及如何?

谢谢

短答:

所有要点都适用于PHP,因为十二要素应用宣言专门针对web应用。

PHP很难遵守十二因子,特别是在项2,7,8,9(作为7和8的副作用)和12(部分)中。实际上,这是我在Ruby和Python社区中听到的第一个真正有根据的论点,即"PHP烂透了"(不要误解我的意思,我认为Ruby和Python是更好的语言,但我不讨厌PHP,而且绝对讨厌"我的语言更好"的咆哮)。

话虽如此,可能你的PHP项目不是一个web应用程序或SaaS,而只是一个简单的网站,所以你可能只是认为12个因素不是必要的。

长答案:逐点分析将是:

  1. 代码:不是问题

  2. Dependencies: PEAR的工作方式完全违背了这一点,因为PEAR依赖项是在系统范围内安装的,通常你没有一个统一的声明来声明它们。对于PHP设置来说,通常要求您向操作系统安装中添加包以获得可用的库。最后,AFAIK没有一个工具在PHP提供隔离像"virtualenv","rbenv"或"rvm"(或者如果它存在是不受欢迎的PHP社区)Edit: Composer (http://getcomposer.org/)似乎做正确的关于依赖关系,它仍然不隔离PHP版本,但对于所有其余的应该是好的。

  3. Config:一些PHP框架不太适合这样做,但肯定有其他框架做得很好,所以这不是平台本身的缺陷

  4. 后台服务:应该不是太大的问题,尽管可能不得不破解一些框架为了管理服务作为资源

  5. Build, release, run:这完全适用于PHP,因为这绝对不仅仅涉及"编译"。有人可能会说,PHP社区的一些项目和托管平台滥用了直接FTP等,但这不是PHP本身的缺陷,而且在这方面做正确的事情没有真正的障碍。

  6. Processes:这绝对与PHP有关。PHP完全能够运行纯无状态进程(重点是无状态这个词),实际上有几个框架使您的工作变得轻松。例如,symfony使用memcached或数据库存储提供开箱即用的会话管理,而不是常规会话

  7. 端口绑定:通过简化它,这一点基本上要求你反向代理,并将实际的web服务器嵌入到应用程序中,而不是作为一个分离的组件。这使PHP处于一个很难遵守的位置。尽管有很多方法可以做到这一点(参见关于使用PHP作为FastCGI的回复),但这绝对不是最常见的,也不是最好的支持方式来服务PHP应用程序,因为它是在其他社区(例如Ruby, Node.js)。

  8. Processes:这在PHP中不是不可能的。然而,有几个因素使PHP难以遵守。即缺乏对项目6和7的良好支持;事实上,生成新进程的PHP API并不是很好使用;特别是Apache的mod_php处理worker的方式(这是迄今为止最常见的PHP部署模式)

  9. Disposability:如果你使用了正确的工具,PHP中没有什么固有的东西可以阻止你创建快速、一次性、整洁的web和worker进程。然而,我认为,由于底层流程模型很难按照第7点和第8点实现,那么第9点作为副作用就变得有点麻烦了

  10. Dev/prod parity:这与平台无关,我想说这是最难做到的。PHP也不例外,但它也没有特别的障碍。实际上,宣言中提到的大多数工具都可以应用到PHP项目中

  11. Logs:让你的应用程序不知道执行环境中的日志系统在PHP上是完全可行的

  12. Admin processes:关于这一点,PHP最重要的缺陷是它缺乏REPL shell。至于其他方面,像Symfony这样的一些框架允许你编写管理任务(例如基于docine的数据库迁移),并在与"常规"web环境相同的环境中运行它们。

由于PHP社区正在发展,它可能已经纠正了上面提到的一些错误。

Build, release, Run:适用于编译后的代码,而不是PHP中的情况。所以这点不是你需要看的东西。

我并没有声称这12个因素的任何权威,但我对这部分的阅读是作者不同意的。这不仅仅是关于编译,而是关于管理小(代码的快照)和大(代码使用的任何库)的依赖关系。

假设你是一个新的开发人员,他们说,"好吧,这是一个自定义的php应用程序,所以…

a)自定义代码实际上是两个子项目,分别位于repo a和repo b中。

b)你需要像这样创建一个目录布局,然后

c)检查每个子项目的代码到这个子目录和这个子目录。

d)您还需要以下三个开源PHP库:

库Foo的3.1版本,库Bar的2.3版本,以及

e)从他们的主项目站点下载它们并解包,然后将它们复制到这个目录,那个目录和另一个目录。

f)那么你需要在外部库

中设置这些配置

g)和这些配置在我们的两个自定义代码项目中。

h)一旦这一切都完成了,tar/gzip全部,上传到QA服务器,解压缩到htdocs。

在这组步骤中没有编译,但是你可以打赌有很多构建。

让所有这些设置和工作是构建步骤。

使用tar/gzip获取工作构建的快照是发布步骤。

SCP/解包到QA服务器的htdocs目录是运行时步骤。

您可能会说上面的一些步骤是不必要的——这些库应该部署在系统级别,并且只需要导入即可。在12factors.net网站上,我想说作者更喜欢你为应用程序单独导入它们。它以更多磁盘空间为代价避免了依赖版本控制问题(没有人关心)。将所有这些依赖关系作为本地应用来管理会有更多的麻烦,但这就是构建/发布/运行时方案的要点。

这可能已经改变了-现在有一些PHP示例,尽管其中一些看起来像是十二因素概念的否定。

普通mod_php网站违反十二因素的方式之一是VII。端口绑定。来自宣言:

这个十二要素应用程序是完全自包含的,不依赖于在运行时将web服务器注入到执行环境中来创建面向web的服务。web应用程序通过绑定到一个端口,并监听从该端口进入的请求,将HTTP作为服务导出。

但是,apache/php可以通过这样的方式进入这个世界观:

https://gist.github.com/1398498

不完美,但在大多数情况下是有效的。要进行测试,请安装foreman:

install foreman

然后在你克隆到的目录下运行:

工头开始

然后访问

http://localhost: 5000/foo

不要把这篇文章当作参考,这是2011年写的,从那以后很多事情都发生了变化…编程的世界是在不断发展的。2011年的观点不一定在2018年仍然有效。


我只读了每一点的几行,下面是我对文件的分析:

  1. Codebase:每个人,php或不应该有一个代码库,即使是小项目

  2. 依赖项: PHP使用包含和代码库,您应该总是能够通过简单地将代码复制到服务器来轻松地移植。有时您使用PEAR,但如果服务器不支持它,则必须手动复制并安装PEAR。我大部分时间使用Zend Framework,所以它只是通过ftp上传复制框架的代码。

  3. Config: php应用程序通常有一个可写的配置文件来存储配置。作为开发者,你可以选择将其存储在哪里,但通常是在应用程序的根目录或settings/config文件夹中。

  4. 支持服务: PHP大多数时候使用支持服务,比如MySQL。其他基于你的应用的常见服务是twitter和facebook。你可以使用它们的API与它们通信,并存储/检索要使用的数据。

  5. Build, release, Run:适用于编译后的代码,而不是PHP中的情况。所以这一点你不需要看

  6. Processes: HTTP是无状态的并且是服务的,因此,除了web服务器之外通常没有进程。这并不完全正确,因为web服务可能与您打包或为其创建的应用程序捆绑在一起。但是,为了标准的缘故,您通常不必在web世界中使用流程。

  7. 端口绑定: PHP根本不适用端口绑定,因为它不是一个钩子到地址的进程,Apache, NGinx或Lighttpd为你做了这个。阅读#6/7让我明白,一个网站永远不可能是一个十二因素的应用程序。

  8. 并发性:这一点同样适用于不适用于PHP网页的进程。这一点适用于提供内容的服务器。

  9. 处置性:这一点讨论了进程应该有多快。显然,PHP网站不是一个进程不应该适用,但始终注意,你的网站应该执行页面尽可能快…总是考虑这个或那个代码块,看看它是否被优化了。

  10. Dev/Prod Parity:这一点在任何应用开发中都至关重要。你绝对不希望两个应用版本之间有太大的差距,否则升级会变得很麻烦。此外,永远不要为应用创建特定于客户端的版本。总是想办法让你的应用在模板级别被配置/自定义,这样你就可以让你的应用尽可能接近所有安装的版本。

  11. 日志:日志总是一个好东西,它们允许你跟踪你的代码过程,而不必输出到屏幕上。我最喜欢的策略是在linux控制台中"tail -f logfile",看看在我执行代码时发生了什么。

  12. 管理进程:不适用,在php中,你没有进程,但你有可以使用用户名和密码保护的页面

最新更新