我已经被投入到使用PHP开发Web应用程序的新工作中。我绝不是PHP的新手,但我以前从未开发过大型应用程序。我想知道如何安排自己的发展,以避免将来遇到麻烦。如何以合理的方式设计和构造应用程序,以使它们可以在功能和性能方面随时间扩展。我在想这样的事情:
- 将后端与前端分开
- 目录结构
我希望能获得指向体系结构和应用程序设计模式,框架和方法的指针,这些指针使我能够以可持续的方式进行大规模PHP Web应用程序开发。
我已经被投入到使用PHP开发Web应用程序的新工作中。我绝不是PHP的新手,但我以前从未开发过大型应用程序。我想知道如何安排自己的发展,以避免将来遇到麻烦。如何以合理的方式设计和构造应用程序,以使它们可以在功能和性能方面随时间扩展。我在想这样的事情:
我希望能获得指向体系结构和应用程序设计模式,框架和方法的指针,这些指针使我能够以可持续的方式进行大规模PHP Web应用程序开发。
Answers:
我参与的最新大型项目的体系结构的示意图。
它只是一个基本的大纲,它是根据实际的体系结构文档改编而成的,其呈现方式类似于典型的n层方法和典型的MVC方法。如您所见,逻辑和数据层是通过服务层(更具体地说是REST API)连接的,该服务层受到Recess(一个鲜为人知的PHP框架)的启发。
不要重新发明轮子
我使用以下三个框架:
PHP框架的庞然大物,具有令人印象深刻的良好代码库和丰富的功能列表。在大型应用程序上,您会发现自己经常调整框架,而我发现ZF的代码库最适合使用。但是请注意,它不是入门级框架。
Kohana最初是CodeIgniter的分支,这足以让我一开始不使用它。如今,它已发展成为一个坚实而优雅的框架,它通过遵循MVC分层方法而彼此区别。HMVC 比MVC允许更大程度地扩展模块化。对于图中的项目,我将Kohana的HMVC修改为ZF,但我已经开始将Kohana用于较小的项目,并考虑将其用于较大的项目。
我之所以只使用它,是因为我继承了一个旧项目,请尽量避免。
正如其他答案所指出的那样,ORM总是很方便。我广泛使用了Doctrine,您应该看一下其针对CouchDB和MongoDB的全新映射器。在大规模应用程序中,可伸缩性是必须的,您应该评估NoSQL解决方案。
综上所述,要记住的重要一点是,大型应用程序通常会面临独特的挑战。您应该评估存在的每种流行的第三方解决方案,并且可能会从几个晦涩的解决方案中受益匪浅。当我第一次评估Recess时,它还远远没有准备好生产,但是它的方法实质上使它进入了项目。
性能
在典型的网站上,您可能不愿使用简单的输出缓存和操作码缓存,但在大型应用程序上,您应该真正考虑内存缓存,最常见的是围绕memcached构建的。
xdebug通常被称为调试器,但也可以用作探查器。我最近开始使用Zend Server,我绝对喜欢它的代码跟踪功能。不幸的是,社区版中没有这些功能,但是xdebug是一个不错的选择。
如果您使用的是Apache,请确保对其进行优化。Nginx的和lighttpd的是显然更好的选择,性能明智的,但我没有用他们很多,我真的不能说。
对于数据库,Doctrine的查询和结果缓存非常有用,特别是与memcached结合使用时。当然,我们不能忘记前端。雅虎的卓越绩效团队汇集了广泛的最佳实践清单。我并不是真正的前端开发人员,但是我已经在个人项目中看到了惊人的结果。
最后,PHP具有全新的垃圾回收机制,值得研究。
安全
至少可以说,PHP安全世界是混乱的。我不是专家,因此请将以下内容视为一般性提示:
里面有很多好东西,但是要快速浏览一下,您应该从前十名开始。并针对这些常见漏洞研究PHP解决方案。
堆栈漏洞
一个好习惯是定期监视PHP的打开的bug。即使您自己不是专家,也几乎总是存在有关安全威胁的变通方法提示。当然,您应该将习惯扩展到堆栈的每个其他部分,尤其是最易受攻击的部分,例如Web服务器和数据库。
IT Security Stack Exchange上的人群可以为您提供更多有教益的答案。
进一步阅读
IBM的developerWorks网站上有大量PHP文章,其中很多都很好。他们有一系列比较PHP Web框架的文章,以及一系列有关使用CakePHP框架的网站的文章。
O'Reilly的旧“ Onlamp”网站上有一篇有关PHP中MVC的文章。该文章的作者进一步详细解释了MVC。
奥赖利(O'Reilly)的文章有些陈旧,但可以帮助您前进。IBM developerWorks的东西真的很好,可以满足您的许多需求。
我从事PHP已有几年了。我完全同意Yannis的观点,这个问题还是有待解决的,我想我会为您提供一些建议。首先,正如Yannis所说,您应该研究MVC,为此,我可以推荐的两个框架是CodeIgniter和Symfony。第一个是轻量级的,并且非常容易上手,但是,您可能只需要添加一些额外的自定义项即可使设置工作正常,很快就会投入使用。Symfony是由Fabien Potencier启动的一个项目,使用软件工程中的许多设计模式,但是,学习曲线比CodeIgniter的陡峭得多。
现在,第二,您应该研究数据库连接,它使我进入了两个最著名的PHP ORM框架Doctrine和Propel。我个人很喜欢Propel,甚至写过关于如何在基于CodeIgniter的应用程序上设置干净的Propel安装的文章,但是Symfony更受Doctrine的欢迎,但您可以使用其中任何一个。如果您想进一步了解Doctrine和Propel,请看一下我前段时间提出的这个问题。
最后,您应该研究一个模板框架,例如Smarty,Dwoo或Twigg。聪明人是最古老的,因此也是最稳定的。Dwoo 继承自Smarty,并添加了一两个东西来更好地支持PHP 5上的OOP。最后,Twigg是提供Symfony团队的模板替代产品,我本人还没有看到它,但是如果它来自Symfony团队, 那就太好了。
希望整个演讲有道理,大卫