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

2022-08-30 22:18:53

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

谢谢


答案 1

简短的回答:

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

PHP很难遵守十二个因素,特别是在项目2,7,8 9(作为7和8的副作用)和12(部分)中。实际上,这是我在整个“PHP很糟糕”的咆哮中听到的第一个真正有根据的论点,这在Ruby和Python社区中很常见(不要误会我的意思,我认为Ruby和Python是更好的语言,但我不讨厌PHP,并且肯定讨厌“我的语言更好”的咆哮。

话虽如此,您的PHP项目可能不是Web应用程序或SaaS,而只是一个简单的网站,因此您可能只是认为十二因素不是必需的。

长答案:逐点分析将是:

  1. 代码库:不是问题

  2. 依赖关系:PEAR的工作方式与这一点背道而驰,因为pear依赖关系是系统范围的,通常你没有一个合并的宣言来声明它们。PHP 设置通常也需要您将软件包添加到操作系统安装中,以使某些库可用。最后,AFAIK在PHP中没有一个工具来提供像“virtualenv”,“rbenv”或“rvm”这样的隔离(或者如果它存在,在PHP社区中并不流行) 编辑:Composer(http://getcomposer.org/)似乎在依赖关系方面做得很好,它仍然没有隔离PHP版本,但对于所有其他版本,它应该没问题。

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

  4. 支持服务:应该不是一个大问题,尽管可能不得不稍微破解一些框架才能将服务作为资源进行管理

  5. 构建,发布,运行:这完全适用于PHP,因为这显然不仅仅涉及“编译”。有人可能会争辩说,PHP社区上的几个项目和托管平台滥用了直接FTP等,但这不是PHP本身的缺陷,并且在这个项目上做正确的事情也没有真正的障碍。

  6. 过程:这显然是PHP关注的问题。PHP非常能够运行纯粹的无状态进程(重点是无状态这个词),实际上有几个框架让你的生活变得轻松。例如,symfony 通过 memcached 或数据库存储而不是常规会话提供开箱即用的会话管理。

  7. 端口绑定:通过简单地介绍它,这一点基本上要求您反向代理并将实际的Web服务器嵌入到应用程序上,而不是作为单独的组件。这使得PHP处于非常难以遵守的位置。尽管有一些方法可以做到这一点(请参阅有关使用PHP作为FastCGI的回复),但这肯定不是为PHP应用程序提供服务的最常见或最佳支持的方式,因为它在其他社区(例如Ruby,Node.js)。

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

  9. 一次性:如果您使用正确的工具,PHP上没有任何固有的东西可以阻止您创建快速,一次性,整洁的Web和工作进程。但是,我认为,由于底层流程模型很难按照第7点和第8点实现,因此9作为副作用变得有点麻烦。

  10. 开发/生产奇偶校验:这是非常平台不可知的,我会说是最难做到的之一。PHP也不例外,但它也没有特定的障碍。实际上,宣言上提到的大多数工具都可以应用于PHP项目。

  11. 原木:在执行环境中让应用程序与日志系统无关,这在 PHP 上是完全可行的

  12. 管理流程:关于这一点,PHP最重要的缺陷是它缺少REPL shell。关于其余的,像Symfony这样的几个框架允许您对管理任务进行编程(例如基于Doctine的数据库迁移),并在与“常规”Web环境相同的环境中运行它们。

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


答案 2

构建,发布,运行:适用于编译代码,这在PHP中是没有的。所以这一点不是你需要看的。

我不认为在这12个因素上有任何权威,但我对这一部分的解读是,作者会不同意。这不仅仅是编译,而是关于管理小型(代码快照)和大型(代码使用的任何库)中的依赖项。

想象一下,你是一个新的开发人员,他们说,“好吧,这是一个自定义的php应用程序,所以......

a) 自定义代码实际上是两个子项目,分别位于存储库 A 和存储库 B 中。

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

c) 将每个子项目的代码签入此子目录和此子目录中。

d) 你还需要这三个开源的PHP库:

库 Foo 的 3.1 版、库栏的 2.3 版和 Bat 库的 5.6 版。

e)从他们的主项目站点下载它们并解压缩它们,然后将它们复制到此目录,该目录和其他目录中。

f) 然后,您需要在外部库中设置这些配置,

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

h)一旦完成所有工作,将其全部压缩/gzip,将其上传到QA服务器并将其解压缩到htdocs中。

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

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

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

SCP'ing/解压缩到 QA 服务器的 htdocs 目录中是运行时步骤。

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


推荐