我刚刚阅读了Twelve-Factor App,它看起来像是一套非常全面的规则,适用于基于网络的应用程序。它在它的例子中使用了python或rails,但从来没有php ...我想知道哪些因素的宣言可以应用于PHP项目以及如何?
由于
答案 0 :(得分:16)
简答:
所有要点都适用于PHP ,因为十二个因素应用宣言专门针对网络应用。
PHP非常难以遵守12个因素,特别是在第2,7,8,9项(作为7和8的副作用)和12(部分)中。实际上这是我在整个“PHP糟透了”的咆哮中听到的第一个真正有根据的论点,这在Ruby和Python社区很常见(不要误解我,我认为Ruby和Python是更好的语言,但我不讨厌PHP,并且明确地讨厌“我的语言更好”的咆哮。)
说到这一点,可能是你的PHP项目不是一个Web应用程序或SaaS,而只是一个简单的网站,所以你可能只是认为不需要十二个因素。
长答案:逐点分析:
代码库:不是问题
依赖关系: PEAR的工作方式完全违背了这一点,因为梨系列依赖关系是在系统范围内安装的,通常你没有统一的宣言来声明它们。 PHP设置通常也要求您将软件包添加到操作系统安装中以获得一些库。最后AFAIK在PHP中没有提供隔离工具,如“virtualenv”,“rbenv”或“rvm”(或者如果它存在于PHP社区中不受欢迎)编辑:作曲家({ {3}})似乎对依赖关系做了正确的事情,它仍然没有隔离PHP版本,但对于所有其余的它应该没问题。
配置:一些PHP框架不太适合这样做,但肯定有其他一些表现良好,所以它不是平台本身的缺陷
< / LI>支持服务:不应该是一个问题,尽管可能需要稍微破解一些框架才能将资源作为资源进行管理
构建,发布,运行:这完全适用于PHP,因为这绝对不仅仅涉及“编译”。有人可能会争辩说PHP社区的几个项目和托管平台滥用直接FTP等等,但这并不是PHP本身的缺陷,并且对于这个项目做正确的事情并没有真正的障碍。
进程:这绝对是PHP的关注点。 PHP完全能够运行纯粹的无状态进程(重点是无状态这个词),实际上有几个框架可以让你的生活更轻松。例如,symfony提供开箱即用的会话管理与memcached或数据库存储而不是常规会话
端口绑定:简单地说,这一点基本上要求您反向代理并将实际的Web服务器嵌入应用程序而不是分离的组件。这使得PHP处于非常难以遵守的地位。尽管有很多方法可以做到这一点(请参阅关于使用PHP作为FastCGI的回复),这绝对不是最常用的,也不是最好的支持方式来提供PHP应用程序,就像在其他社区(例如Ruby,Node.js)一样。
进程:这在PHP中并非不可能。然而,有几个元素使PHP难以遵守。即对项目6和7缺乏良好支持;事实上,生成新进程的PHP API并不是很好用;特别是Apache的mod_php处理其工作者的方式(这是迄今为止最常见的PHP部署架构)
可处置性:如果您使用正确的工具,那么PHP上没有什么可以防止您创建快速,一次性,整洁的Web和工作进程。但是我认为,由于根据第7点和第8点很难实现基础过程模型,因此9作为副作用变得有点麻烦
Dev / prod parity 这是非常平台无关的,我会说最难做的事情之一。 PHP也不例外,但它也没有特别的障碍。实际上,宣言中命名的大多数工具都可以应用于PHP项目
日志:让您的应用程序与执行环境中的日志系统无关,这在PHP上是完全可行的
管理进程:关于这一点,PHP最重要的缺陷是缺少REPL shell。关于其余部分,像Symfony这样的几个框架允许您编写管理任务(例如基于Doctine的数据库迁移)并在与“常规”Web环境相同的环境中运行它们。
由于PHP社区正在发展,它可能已经纠正了一些提到的错误。
答案 1 :(得分:3)
构建,发布,运行:适用于已编译的代码,而不是PHP中的情况。所以这 点不是你需要看的东西。
我对这12个因素没有任何权威,但我对该部分的解读是作者不同意的。它不仅仅是关于编译,而是关于在小(代码的快照)和大(代码使用的任何库)中管理依赖关系。
想象一下,你是一个新的开发者,他们说,“好吧,这是一个自定义的PHP应用程序,所以......
a)自定义代码实际上是两个子项目,分别位于repo A和repo B中。
b)您需要创建一个类似的目录布局,然后
c)检查每个子项目的代码到这个子目录和这个子目录中。
d)您还需要这三个开源PHP库:
库Foo 3.1版, 库Bar的版本2.3,和 库Bat。5.6版本。
e)从他们的家庭项目站点下载并解压缩,然后将它们复制到这个目录,该目录和另一个目录。
f)然后你需要在外部库中设置这些配置,
g)以及我们两个自定义代码项目中的这些配置。
h)一旦完成所有操作,tar / gzip全部,将其上传到QA服务器并将其解压缩到htdocs。
在这组步骤中没有编译,但你可以打赌有很多建设。
完成所有设置和工作是构建步骤。
使用tar / gzip拍摄工作版本的快照是发布步骤。
SCP /将其打包到QA服务器的htdocs目录中是运行时步骤。
您可能会说上面的某些步骤是不必要的 - 库应该在系统级别部署并且只是导入。在12factors.net网站上,我会说作者更喜欢为应用程序单独和单独导入它们。它以更多的磁盘空间为代价来回避依赖版本问题(并不是任何人关心的)。将所有这些依赖项作为本地到应用程序进行管理会有更多麻烦,但这就是构建/发布/运行时方案的重点。
答案 2 :(得分:2)
自从您阅读它之后它可能已经发生了变化 - 现在有一些PHP示例,尽管其中一些似乎是对十二因素概念的否定。
普通mod_php网站违反12个因素的方法之一是VII. Port binding。从宣言:
十二因素应用程序是完全独立的,不依赖于将Web服务器运行时注入执行环境来创建面向Web的服务。 Web应用程序通过绑定到端口并侦听进入该端口的请求来将HTTP作为服务导出。
然而,apache / php可以用这样的东西哄骗这个世界观:
https://gist.github.com/1398498
不完美,但大部分都有效。要测试它,请安装foreman:
gem install foreman
然后在克隆gist的目录中运行它:
领班开始
然后访问
答案 3 :(得分:-2)
请不要将此帖作为参考,这是在2011年写的,自那以后,许多事情都发生了变化......编程的世界是恒定的演变。 2011年的观点并非在2018年仍然有效。
我刚读了几行每一点,这里是对文档的分析:
代码库:每个人,不管是不是php,即使对于小项目也应该有代码库
依赖:PHP使用包含和代码库,只需将代码复制到服务器即可轻松移植。有时你使用PEAR然后如果服务器不支持它,你必须手动复制和安装pear。我大多数时候都使用Zend Framework,因此只需使用ftp upload复制框架代码。
配置:php应用程序通常会有一个可存储配置的可写配置文件。存储位置是您作为开发人员的选择,但它通常位于应用程序的根目录或设置/配置文件夹中。
支持服务:PHP确实在大多数时间使用支持服务,例如MySQL。其他常见服务取决于您的应用程序是Twitter和Facebook。您可以使用他们的API与他们进行通信并存储/检索数据以便使用。
构建,发布,运行:适用于已编译的代码,而不是PHP中的情况。所以这一点不是你需要看的东西。
进程:HTTP是无状态的并且是SERVED,因此,除了Web服务器之外,您通常没有任何进程。这并不完全正确,因为Web服务可能与您打包或为其创建的应用程序捆绑在一起。但是,为了标准,您通常不必在Web世界中使用流程。
端口绑定:PHP根本不适用于端口绑定,因为它不是挂钩到地址的进程,Apache,NGinx或Lighttpd会为您执行此操作。阅读#6/7让我明白网站永远不会是一个十二因素应用程序。
并发:这一点再次讨论了不适用于PHP网页的流程。这一点适用于提供内容的服务器。
可处置性:这一点讨论了流程的速度。显然,不是一个过程的PHP网站不适用,但总是注意到你的网站应该尽快执行页面...总是考虑这个块或那个代码块,看看它是否已经过优化。
Dev / Prod Parity :这一点在任何应用开发中都至关重要。您永远不希望两个应用程序版本之间存在较大差距,否则升级可能会变得麻烦。此外,永远不要创建应用程序的客户端特定版本。始终找到允许在模板级别配置/自定义应用程序的方法,这样您就可以使应用程序尽可能接近所有已安装的版本。
日志:日志总是一件好事,它们允许您按照代码的过程而不必将其输出到屏幕。我最喜欢的策略是在Linux控制台内“tail -f logfile”,看看我执行代码时发生了什么。
管理员进程:不适用,在php中,您没有进程,但您确实拥有可以使用用户名和密码保护的页面。