Credits

最后更新于:2022-04-01 14:57:01

**Created and maintained by** [Josh Lockhart](http://twitter.com/codeguy) **Project collaborators** [Kris Jordan](http://krisjordan.com/) [Phil Sturgeon](http://philsturgeon.co.uk/) **Project contributors** Loading… **Project sponsors** [New Media Campaigns](http://www.newmediacampaigns.com/) Creative Commons License [![2015-04-30/5542451a9b815](http://box.kancloud.cn/2015-04-30_5542451a9b815.png)](http://creativecommons.org/licenses/by-nc-sa/3.0/) PHP: The Right Way by [Josh Lockhart](http://www.twitter.com/codeguy) is licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License](http://creativecommons.org/licenses/by-nc-sa/3.0/). Based on a work at [www.phptherightway.com](http://www.phptherightway.com/).
';

社区

最后更新于:2022-04-01 14:56:59

PHP 社区多元化并且规模庞大,成员们也乐意并随时准备好帮助新人。你可以考虑加入当地的 PHP 使用者社区 (PUG) 或者参加教大型的 PHP 会议,从中学习更多最佳实践。你也可以使用 IRC 逛逛 [irc.freenode.com](http://webchat.freenode.net/?channels=phpc) 上的 #phpc 频道,也可以关注 [@phpc](https://twitter.com/phpc) 的Twitter 账号。试着去多结交一些新的开发者,学习新的东西,总之,交一些新朋友!其他的社区资源包含 Google+ 的 [PHP Programmer community](https://plus.google.com/u/0/communities/104245651975268426012) 以及 [StackOverflow](http://stackoverflow.com/questions/tagged/php)。 [阅读 PHP 官方事件日历](http://php.net/cal.php) ### PHP 用户群 如果你住在较大的城市,附近应该就有 PHP 用户群。你可以通过基于 [PHP.ug](http://php.ug/) 的 [usergroup-list at php.net](http://php.net/ug.php) 这个地址找到当地的 PUG。也可以通过 [Meetup.com](http://www.meetup.com/find/) 或者使用搜索引擎 (i.e. [Google](https://www.google.com/search?q=php+user+group+near+me)) 搜索 `php user group near me` 。如果你住在比较小的城镇,当地也许还没有 PUG ,如果是这种情形,不妨就开始组建一个。 这里要特别提到两个全球的用户组:[NomadPHP](https://nomadphp.com/) 和 [PHPWomen](http://phpwomen.org/)。NomadPHP 提供每月两次的在线用户组会议,由 PHP 社区里顶尖的高手进行演讲。[PHPWomen](http://phpwomen.org/) 原本是针对女性 PHP 开发者的非排他性的用户组。会员资格发放给那些支持多元化社区的人。PHPWomen 提供了一技术支持,指导和教育的个平台,并且促进了女性的创造力以及专业的氛围。 [了解关于 PHP Wiki 上的用户群](https://wiki.php.net/usergroups) ### PHP 会议 世界各地的 PHP 社区也会举办一些较大型的区域性或国际性的会议,一些知名的社区成员通常会在这些大型活动中现身演讲,这是一个直接和业内领袖学习的好机会。 [查找 PHP 会议](http://php.net/conferences/index.php)
';

资源

最后更新于:2022-04-01 14:56:57

### PHP 官方 * [PHP 官方网站](http://php.net/) * [PHP 官方文档](http://php.net/docs.php) ### 值得关注的大牛 * [Rasmus Lerdorf](http://twitter.com/rasmus) * [Fabien Potencier](http://twitter.com/fabpot) * [Derick Rethans](http://twitter.com/derickr) * [Chris Shiflett](http://twitter.com/shiflett) * [Sebastian Bergmann](http://twitter.com/s_bergmann) * [Matthew Weier O’Phinney](http://twitter.com/mwop) * [Pádraic Brady](http://twitter.com/padraicb) * [Anthony Ferrara](http://twitter.com/ircmaxell) * [Nikita Popov](http://twitter.com/nikita_ppv) ### 指导 [phpmentoring.org](http://phpmentoring.org/) - PHP 社区中的一对一指导。 ### PHP 的 Paas 提供商 [PagodaBox](https://pagodabox.com/) [AppFog](https://appfog.com/) [Heroku](https://devcenter.heroku.com/categories/php) [fortrabbit](http://fortrabbit.com/) [Engine Yard Cloud](https://www.engineyard.com/products/cloud) [Red Hat OpenShift Platform](http://openshift.com/) [dotCloud](http://docs.dotcloud.com/services/php/) [AWS Elastic Beanstalk](http://aws.amazon.com/elasticbeanstalk/) [cloudControl](https://www.cloudcontrol.com/) [Windows Azure](http://www.windowsazure.com/) [Google App Engine](https://developers.google.com/appengine/docs/php/gettingstarted/) [Jelastic](http://jelastic.com/) ### 框架 许多的 PHP 开发者都使用框架,而不是重新造轮子来构建 Web 应用。框架抽象了许多底层常用的逻辑,并提供了有益又简便的方法來完成常见的任务。 你并不一定要在每个项目中都使用框架。有时候原生的 PHP 才是正确的选择,但如果你需要一个框架,那么有如下三种主要类型: * 微型框架 * 全栈框架 * 组件框架 微型框架基本上是一个封装的路由,用来转发 HTTP 请求至一个闭包,控制器,或方法等等,尽可能地加快开发的速度,有时还会使用一些类库来帮助开发,例如一个基本的数据库封装等等。他們用来构建 HTTP 的服务卓有成效。 许多的框架会在微型框架上加入相当多的功能,我们则称之为全栈框架。这些框架通常会提供 ORMs ,身份认证扩展包等等。 组件框架是多个独立的类库所结合起来的。不同的组件框架可以一起使用在微型或是全栈框架上。 * [热门的 PHP 框架](https://github.com/codeguy/php-the-right-way/wiki/Frameworks) ### 组件 正如标题提到的,「组件」是另一种建立,发布及推动开源的方式。现在存在的各种的组件库,其中最主要的两个为: * [Packagist](http://laravel-china.github.io/#composer_and_packagist) * [PEAR](http://laravel-china.github.io/#pear) 这两个组件库都有用來安装及升级的命令行工具,这部分已经在這部分已經在[依赖管理]中解释过。 此外,还有基于组件的构成的框架的提供商提供不包含框架的组件。这些项目通常和其他的组件或者特定的框架没有依赖关系。 例如,你可以使用 [FuelPHP 验证类库],而不使用 FuelPHP 整个框架。 * [Aura](http://auraphp.com/packages/v2) * [FuelPHP](https://github.com/fuelphp) * [Hoa Project](https://github.com/hoaproject) * [Orno](https://github.com/orno) * [Symfony Components](http://symfony.com/doc/current/components/index.html) * [The League of Extraordinary Packages](http://thephpleague.com/) * Laravel’s Illuminate Components * [Eloquent ORM](https://github.com/illuminate/database) * [Queue](https://github.com/illuminate/queue) > Laravel 的 [Illuminate 组件] 和 Laravel 框架将变得更加解耦。 现在我们只列出和 Laravel 框架最没有依赖关系的组件。 ### 其他有用的资源 #### Cheatsheets * [PHP Cheatsheets](http://phpcheatsheets.com/) - for variable comparisons, arithmetics and variable testing in various PHP versions * [PHP Security Cheatsheet](https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet) #### 更多最佳实践 * [PHP Best Practices](https://phpbestpractices.org/) * [Best practices for Modern PHP Development](https://www.airpair.com/php/posts/best-practices-for-modern-php-development) #### PHP 世界 * [PHP Developer blog](http://blog.phpdeveloper.org/) ### 视频教程 #### Youtube 视频 * [PHP Academy](https://www.youtube.com/user/phpacademy) * [The New Boston](https://www.youtube.com/user/thenewboston) * [Sherif Ramadan](https://www.youtube.com/user/businessgeek) * [Level Up Tuts](https://www.youtube.com/user/LevelUpTuts) #### 付费视频 * [Standards and Best practices](http://teamtreehouse.com/library/standards-and-best-practices) * [PHP Training on Pluralsight](http://www.pluralsight.com/search/?searchTerm=php) * [PHP Training on Lynda.com](http://www.lynda.com/search?q=php) * [PHP Training on Tutsplus](http://code.tutsplus.com/categories/php/courses) * [Laracasts](https://laracasts.com/) ### 书籍 市面上有很多关于 PHP 的书,但遗憾的是很多都已经非常陈旧而且不正确的资料。甚至还有出版商发布「 PHP 6 」,这是不存在的书,而且永远不会出现。因为那些书,所以 PHP 的下一个版本为「 PHP 7 」。 这个章节的目录主要是针对 PHP 开发,并且会随着最新的技术趋势而更新。如果你想在这里加入你的书,请发送一个 PR ,我们将会审查你提供的内容是否有相关性。 #### 免费书籍 [PHP The Right Way](https://leanpub.com/phptherightway/) - This website is available as a book completely for free. #### 付费书籍 * [Modernizing Legacy Applications In PHP](https://leanpub.com/mlaphp) - Get your code under control in a series of small, specific steps * [Building Secure PHP Apps](https://leanpub.com/buildingsecurephpapps) - Learn the security basics that a senior developer usually acquires over years of experience, all condensed down into one quick and easy handbook * [The Grumpy Programmer’s Guide To Building Testable PHP Applications](https://leanpub.com/grumpy-testing) - Learning to write testable doesn’t have to suck * [Securing PHP: Core Concepts](https://leanpub.com/securingphp-coreconcepts) - A guide to some of the most common security terms and provides some examples of them in every day PHP * [Scaling PHP](https://leanpub.com/scalingphp) - Stop playing sysadmin and get back to coding * [Signaling PHP](https://leanpub.com/signalingphp) - PCNLT signals are a great help when writing PHP scripts that run from the command line.
';

文档撰写

最后更新于:2022-04-01 14:56:55

### PHPDoc PHPDoc 是注释 PHP 代码的非正式标准。它有许多不同的[标记]可以使用。完整的标记列表和范例可以查看 [PHPDoc 指南]。 如下是撰写类方法时的一种写法: ~~~ <?php /** * @author A Name <a.name@example.com> * @link http://www.phpdoc.org/docs/latest/index.html */ class DateTimeHelper { /** * @param mixed $anything Anything that we can convert to a \DateTime object * * @throws \InvalidArgumentException * * @return \DateTime */ public function dateTimeFromAnything($anything) { $type = gettype($anything); switch ($type) { // Some code that tries to return a \DateTime object } throw new \InvalidArgumentException( "Failed Converting param of type '{$type}' to DateTime object" ); } /** * @param mixed $date Anything that we can convert to a \DateTime object * * @return void */ public function printISO8601Date($date) { echo $this->dateTimeFromAnything($date)->format('c'); } /** * @param mixed $date Anything that we can convert to a \DateTime object */ public function printRFC2822Date($date) { echo $this->dateTimeFromAnything($date)->format('r'); } } ~~~ 这个类的说明使用了 `@author` 和 `@link`标记, `@author` 标记是用來说明代码的作者,在多位开发者的情况下,可以同时列出好几位。其次 `@link` 标记用来提供网站链接,进一步说明代码和网站之间的关系。 在这个类中,第一个方法的 `@param` 标记,说明类型、名字和传入方法的参数。此外,`@return` 和 `@throws` 标记说明返回类型以及可能抛出的异常。 第二、第三个方法非常类似,和第一个方法一样使用一个 `@param` 标记。第二、和第三个方法之间关键差別在注释区块使用/排除 `@return` 标记。`@return void` 标记明确告诉我们没有返回值,而过去省略 `@return void` 声明也具有相同效果(沒有返回任何值)。
';

对象缓存

最后更新于:2022-04-01 14:56:52

有时缓存代码中的单个对象会很有用,比如有些需要很大开销获取的数据或者一些结果集不怎么变化的数据库查询。你可以使用一些缓存软件将这些数据存放在内存中以便下次高速获取。如果你获得数据后把他们存起来,下次请求直接从缓存里面获取数据,在减少数据库负载的同时能极大提高性能。 许多流行的字节码缓存方案也能缓存定制化的数据,所以更有理由好好使用它们了。APCu、XCache 以及 WinCache 都提供了 API,以便你将数据缓存到内存中 最常用的内存对象缓存系统是 APCu 和 Memcached 。APCu 对于对象缓存来说是个很好的选择,它提供了简单的 API 让你能将数据缓存到内存,并且很容易设置和使用。APCu 的局限性表现在它依赖于所在的服务器。另一方面,Memcached 以独立的服务的形式安装,可以通过网络交互,这意味着你能将数据集中存在一个高速存取的地方,而且许多不同的系统能从中获取数据。 值得注意的是当你以 CGI(FastCGI) 的形式使用 PHP 时,每个进程将会有各自的缓存,比如说,APCu 缓存数据无法在多个工作进程中共享。在这种情况下,你可能得考虑 Memcached 了,由于它独立于 PHP 进程。 通常 APCu 在存取速度上比 Memcached 更快,但是 Memcached 在扩展上更有优势。如果你不希望应用程序涉及多个服务器,或者不需要 Memcached 提供的其他特性,那么 APCu 可能是最好的选择。 使用 APCu 的例子: ~~~ <?php // check if there is data saved as 'expensive_data' in cache $data = apc_fetch('expensive_data'); if ($data === false) { // data is not in cache; save result of expensive call for later use apc_add('expensive_data', $data = get_expensive_data()); } print_r($data); ~~~ 注意在 PHP 5.5 之前,APC 同时提供了对象缓存与字节码缓存。APCu 是为了将 APC 的对象缓存移植到 PHP 5.5+ 的一个项目,因为现在 PHP 有了内建的字节码缓存方案 (OPcache)。 更多关于缓存系统的项目: * [APCu](https://github.com/krakjoe/apcu) * [APC Functions](http://php.net/ref.apc) * [Memcached](http://memcached.org/) * [Redis](http://redis.io/) * [XCache APIs](http://xcache.lighttpd.net/wiki/XcacheApi) * [WinCache Functions](http://php.net/ref.wincache)
';

Opcode缓存

最后更新于:2022-04-01 14:56:50

当一个 PHP 文件被解释执行的时候,首先是被编译成名为 opcode 的中间代码,然后才被底层的虚拟机执行。 如果PHP文件没有被修改过,opcode 始终是一样的。这就意味着编译步骤白白浪费了 CPU 的资源。 此时 opcode 缓存就派上用场了。通过将 opcode 缓存在内存中,它能防止冗余的编译步骤,并且在下次调用执行时得到重用。设置 opcode 缓存只需要几分钟的时间,你的应用程序便会因此大大加速,实在没有理由不用它。 PHP 5.5 中自带了 opcode 缓存工具,叫做[OPcache](http://php.net/book.opcache),早期的版本也能通过一定的配置使用它。 更多关于 opcode 缓存的资料: * [OPcache ](http://php.net/book.opcache)(built-in since PHP 5.5) * [APC ](http://php.net/book.apc)(PHP 5.4 and earlier) * [XCache ](http://xcache.lighttpd.net/) * [Zend Optimizer](http://www.zend.com/products/server/)+ (part of Zend Server package) * [WinCache](http://www.iis.net/download/wincacheforphp) (extension for MS Windows Server) * [list of PHP accelerators on Wikipedia](http://en.wikipedia.org/wiki/List_of_PHP_accelerators)
';

缓存

最后更新于:2022-04-01 14:56:48

PHP 本身来说是非常快的,但是但你当发起远程连接、加载文件等操作时也会遇到瓶颈。 幸运的是,有各种各样的工具可以用来加速你应用程序某些耗时的部分,或者说减少某些耗时任务所需要运行的次数。
';

Docker

最后更新于:2022-04-01 14:56:46

### Docker 简介 除了 Vagrant, Docker 是另一个实现生产和开发环境统一的非常棒的方案. Docker 为各种应用程序提供了 Linux 容器. 你可以安装 Docker 镜像, 如 MySQL 和 PostgreSQL 等, 并且不会污染到你的本地机器, 可以看下 [Docker Hub Registry](https://registry.hub.docker.com/), 在这里你可以找到你想要的, 提前配置好的, 允许你简单几部就能运行起来的 Linux 容器. 例子: 在 Docker 里面运行 PHP 应用 在你成功 [安装 Docker](https://docs.docker.com/installation/) 后, 你只需要一步就可以安装 Apache + PHP. 下面的命令, 会下载一个功能齐全的 Apache 和 最新版本的 PHP, 并会设置 WEB 目录 `/path/to/your/php/files` 运行在 http://localhost:8080: ~~~ docker run -d --name my-php-webserver -p 8080:80 -v /path/to/your/php/files:/var/www/html/ php:apache ~~~ 在使用 `docker run` 命令以后, 如果你想停止, 或者再次开启容器的话, 只需要执行以下命令: ~~~ docker stop my-php-webserver docker start my-php-webserver ~~~ 了解更多关于 Docker 的信息 The commands mentioned above only show a quick way to run an Apache web server with PHP support but there are a lot more things that you can do with Docker. 上面的命令能让你轻松使用 Apache + PHP 环境, 然而, Docker 还提供了好多别的命令, 例如, 作为 PHP 程序员, 一个最重要的事情, 是让你的 Web Server 和数据库链接起来, 怎么实现可以仔细看下 [Docker User Guide](https://docs.docker.com/userguide/). * [Docker Website](http://docker.com/) * [Docker Installation](https://docs.docker.com/installation/) * [Docker Images at the Docker Hub Registry](https://registry.hub.docker.com/) * [Docker User Guide](https://docs.docker.com/userguide/)
';

Vagrant

最后更新于:2022-04-01 14:56:43

### Vagrant 简介 [Vagrant](http://vagrantup.com/) 可以让你使用单一的配置信息来部署一套虚拟环境, 最后打包为一个所谓的 box (就是已经部署好环境的虚拟机器). 你可以手动来安装和配置 box, 也可以使用自动部署工具, 如 [Puppet ](http://www.puppetlabs.com/)或者 [Chef ](http://www.opscode.com/). 自动部署工具可以让你快速部署一套一模一样的环境, 避免了一大堆的手动的命令输入, 并且允许你随时删除和重建一个全新的 box, 虚拟机的管理变得更加简单. Vagrant 还可以在虚拟机和主机上分享文件夹, 意味着你可以在主机里面编辑代码, 然后在虚拟机里面运行. 需要更多的帮助? 下面是一些其他的软件, 可以帮助你更好的使用 Vagrant: * [Rove](http://rove.io/): 使用 Chef 自动化安装一些常用的软件, PHP 包含在内. * [Puphpet](https://puphpet.com/): 简单的 Web 图形界面用来生成部署 PHP 环境的 Puppet 脚本, 此项目不仅可以用在开发上, 也可以在生产环境中使用. * [Protobox](http://getprotobox.com/): 是一个基于 vagrant 的一个层, 还有 Web 图形界面, 允许你使用一个 YAML 文件来安装和配置虚拟机里面的软件. * [Phansible](http://phansible.com/): 提供了一个简单的 Web 图形界面, 用来创建 Ansible 自动化部署脚本, 专门为 PHP 项目定制.
';

虚拟化

最后更新于:2022-04-01 14:56:41

在开发和线上阶段使用不同的系统运行环境的话, 经常会遇到各种各样的 BUG, 并且在团队开发的时候, 让所有成员都保持使用最新版本的软件和类库, 也是一件很让人头痛的事情. 如果你是在 Windows 下开发, 线上环境是 Linux (或者别的非 Windows 系统) 的话, 或者团队协同开发的时候, 建议使用虚拟机. 除了大家熟知的 VMware 和 VirtualBox 外, 还有很多工具可以让你快速, 轻松的用上虚拟环境.
';

构建及部署应用

最后更新于:2022-04-01 14:56:39

如果你在手动的进行数据库结构的修改或者在更新文件前手动运行测试,请三思而后行!因为随着每一个额外的手动任务的添加都需要去部署一个新的版本到应用程序,这些更改会增加程序潜在的致命错误。即使你是在处理一个简单的更新,全面的构建处理或者持续集成策略,[构建自动化](http://en.wikipedia.org/wiki/Build_automation)绝对是你的朋友。 你可能想要自动化的任务有: * 依赖管理 * 静态资源编译、压缩 * 执行测试 * 文档生成 * 打包 * 部署 ### 构建自动化工具 构建工具可以认为是一系列的脚本来完成应用部署的通用任务。构建工具并不属于应用的一部分,它独立于应用层 ‘之外’。 现在已有很多开源的工具来帮助你完成构建自动化,一些是用 PHP 编写,有一些不是。应该根据你的实际项目来选择最适合的工具,不要让语言阻碍了你使用这些工具,如下有一些例子: [Phing](http://www.phing.info/) 是一种在 PHP 领域中最简单的开始自动化部署的方式。通过 Phing 你可以控制打包,部署或者测试,只需要一个简单的 XML 构建文件。Phing (基于[Apache Ant](http://ant.apache.org/)) 提供了在安装或者升级 web 应用时的一套丰富的任务脚本,并且可以通过 PHP 编写额外的任务脚本来扩展。 [Capistrano](https://github.com/capistrano/capistrano/wiki) 是一个为 中高级程序员 准备的系统,以一种结构化、可复用的方式在一台或多台远程机器上执行命令。对于部署 Ruby on Rails 的应用,它提供了预定义的配置,不过也可以用它来 部署 PHP 应用 。如果要成功的使用 Capistrano ,需要一定的 Ruby 和 Rake 的知识。 对 Capistrano 感兴趣的 PHP 开发者可以阅读 Dave Gardner 的博文 [PHP Deployment with Capistrano](http://www.davegardner.me.uk/blog/2012/02/13/php-deployment-with-capistrano/) ,来作为一个很好的开始。 [Chef](http://www.opscode.com/chef/) 不仅仅只是一个部署框架, 它是一个基于 Ruby 的强大的系统集成框架,除了部署你的应用之外,还可以构建整个服务环境或者虚拟机。 [Deployer](https://github.com/deployphp/deployer) 是一个用 PHP 编写的部署工具,它很简单且实用。并行执行任务,原子化部署,在多台服务器之间保持一致性。为 Symfony、Laravel、Zend Framework 和 Yii 提供了通用的任务脚本。 适用于 PHP 开发者的 Chef 资源: * [Three part blog series about deploying a LAMP application with Chef, Vagrant, and EC2](http://www.jasongrimes.org/2012/06/managing-lamp-environments-with-chef-vagrant-and-ec2-1-of-3/) * [Chef Cookbook which installs and configures PHP 5.3 and the PEAR package management system](https://github.com/opscode-cookbooks/php) * [Chef video tutorial series](https://www.youtube.com/playlist?list=PLrmstJpucjzWKt1eWLv88ZFY4R1jW8amR) by Opscode, the makers of chef ### 延伸阅读: * [Automate your project with Apache Ant](http://net.tutsplus.com/tutorials/other/automate-your-projects-with-apache-ant/) 持续集成 > 持续集成是一种软件开发实践,团队的成员经常用来集成他们的工作, 通常每一个成员至少每天都会进行集成 — 因此每天都会有许多的集成。许多团队发现这种方式会显著地降低集成问题, 并允许一个团队更快的开发软件。 – Martin Fowler 对于 PHP 来说,有许多的方式来实现持续集成。近来 Travis CI 在持续集成上做的很棒,对于小项目来说也可以很好的使用。Travis CI 是一个托管的持续集成服务用于开源社区。它可以和 Github 很好的集成,并且提供了很多语言的支持包括 PHP 。 延伸阅读: * [使用 Jenkins 进行持续集成](http://jenkins-ci.org/) * [使用 PHPCI 进行持续集成](http://www.phptesting.org/) * [使用 Teamcity 进行持续集成](http://www.jetbrains.com/teamcity/)
';

共享服务器

最后更新于:2022-04-01 14:56:37

### 共享主机 PHP 非常流行,很少有服务器没有安装 PHP 的,因而有很多共享主机,不过需要注意服务器上的 PHP 是否是最新稳定 版本。共享主机允许多个开发者把自己的网站部署在上面,这样的好处是费用非常便宜,坏处是你不知道将和哪些 网站共享主机,因此需要仔细考虑机器负载和安全问题。如果项目预算允许的话,避免使用共享主机是上策。
';

虚拟或专用服务器

最后更新于:2022-04-01 14:56:34

如果你喜欢系统管理员的工作,或者对这方面感兴趣,虚拟或者专用服务器可以让你完全控制自己的生产环境。 ### nginx 和 PHP-FPM PHP 通过内置的 FastCGI 进程管理器(FPM),可以很好的与轻量级的高性能 web 服务器 [nginx ](http://nginx.org/)协作使用。nginx 比 Apache 占用更少内存而且可以更好的处理并发请求,这对于并没有太多内存的虚拟服务器尤其重要。 * [阅读更多 nginx 的内容](http://nginx.org/) * [阅读更多 PHP-FPM 的内容](http://php.net/install.fpm) * [学习如何配置安全的 nginx 和 PHP-FPM](https://nealpoole.com/blog/2011/04/setting-up-php-fastcgi-and-nginx-dont-trust-the-tutorials-check-your-configuration/) ### Apache 和 PHP PHP 和 Apache 有很长的合作历史。Apache 有很强的可配置性和大量的 [扩展模块](http://httpd.apache.org/docs/2.4/mod/) 。是共享主机中常见的Web服务器,完美支持各种 PHP 框架和开源应用(如 WordPress )。可惜的是,默认情况下,Apache 会比 nginx 消耗更多的资源,而且并发处理能力不强。 Apache 有多种方式运行 PHP,最常见的方式就是使用 mode_php5 的 [prefork MPM](http://httpd.apache.org/docs/2.4/mod/prefork.html) 方式。但是它对内存的利用效率并不高,如果你不想深入服务器管理方面学习,那么这种简单的方式可能是你最好的选择。需要注意的事如果你使用 mod_php5,就必须使用 prefork MPM。 如果你追求高性能和高稳定性,可以为 Apache 选择与 nginx 类似的的 FPM 系统 [worker MPM](http://httpd.apache.org/docs/2.4/mod/worker.html) 或者 [event MPM](http://httpd.apache.org/docs/2.4/mod/event.html),它们分别使用 mod_fastcgi 和 mod_fcgid。这种方式可以更高效的利用内存,运行速度也更快,但是配置也相对复杂一些。 * [阅读更多 Apache](http://httpd.apache.org/) * [阅读更多多进程模块](http://httpd.apache.org/docs/2.4/mod/mpm_common.html) * [阅读更多 mod_fastcgi](http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html) * [阅读更多 mod_fcgid](http://httpd.apache.org/mod_fcgid/)
';

Platform as a Service (PaaS)

最后更新于:2022-04-01 14:56:32

PaaS 提供了运行 PHP 应用程序所必须的系统环境和网络架构。这就意味着只需做少量配置就可以运行 PHP 应用程序或者 PHP 框架。 现在,PaaS 已经成为一种部署、托管和扩展各种规模的 PHP 应用程序的流行方式。你可以在 资源部分 查看 PHP PaaS “Platform as a Service” 提供商 列表。
';

服务器与部署

最后更新于:2022-04-01 14:56:30

部署 PHP 应用程序到生产环境中有多种方式。
';

其他测试工具

最后更新于:2022-04-01 14:56:28

除了个别的测试驱动和行为驱动框架之外,还有一些通用的框架和辅助函数类库,对任何的测试方法都很有用。 ### 工具地址 * [Selenium ](http://seleniumhq.org/)是一个浏览器自动化工具 [integrated with PHPUnit](http://phpunit.de/manual/current/en/selenium.html) * [Mockery ](https://github.com/padraic/mockery)是一个可以跟 [PHPUnit ](http://phpunit.de/)或者 [PHPSpec ](http://www.phpspec.net/)整合的 Mock 对象框架 * [Prophecy ](http://laravel-china.github.io/php-the-right-way/1)是个有自己的想法,且非常强大灵活的 PHP 对象 mocking 框架。它整合了 [PHPSpec ](http://www.phpspec.net/)并且可以和 [PHPUnit ](http://phpunit.de/)一起使用
';

行为驱动开发

最后更新于:2022-04-01 14:56:25

有两种不同的行为驱动开发 (BDD): SpecBDD 和 StoryBDD。 SpecBDD 专注于代码的技术行为,而 StoryBDD 专注于业务逻辑或功能的行为和互动。这两种 BDD 都有对应的 PHP 框架。 采用 StoryBDD 时, 你编写可读的故事来描述应用程序的行为。接着这些故事可以作为应用程序的实际测试案例执行。[Behat ](http://behat.org/)是使用在 PHP 应用程序中的 StoryBDD框架,它受到 Ruby 的 [Cucumber ](http://cukes.info/)项目的启发并且实现了 Gherkin DSL 來描述功能的行为。 采用 SpecBDD 时, 你编写规格来描述实际的代码应该有什么行为。你应该描述函数或者方法应该有什么行为,而不是测试函数或者方法。PHP 提供了 [PHPSpec ](http://www.phpspec.net/)框架来达到这个目的,这个框架受到了 Ruby 的 [RSpec project](http://rspec.info/) 项目的启发。 ### BDD 链接 * [Behat](http://behat.org/), PHP 的 StoryBDD 框架, 受到了 Ruby’s [Cucumber ](http://cukes.info/)项目的启发。 * [PHPSpec](http://www.phpspec.net/), PHP 的 SpecBDD 框架, 受到了 Ruby’s [RSpec ](http://rspec.info/)项目的启发。 * [Codeception ](http://codeception.com/)是一个使用 BDD 准则的全栈测试框架。
';

测试驱动开发

最后更新于:2022-04-01 14:56:23

[Wikipedia ](http://en.wikipedia.org/wiki/Test-driven_development)上的定义: > 测试驱动开发 (TDD) 是一种以非常短的开发周期不断迭代的软件开发过程:首先开发者对将要实现的功能或者新的方法写一个失败的自动化测试用例,然后就去写代码来通过这个测试用例,最终通过重构代码让一其达到可接受的水准。Kent Beck, 这个技术创造者或者说重新发现者,在2003年声明TDD 鼓励简单的设计和激励信心。 目前你可以应用的几种不同类型的测试: ### 单元测试 单元测试是一种编程方法来确认函数,类和方法以我们预期的方式来工作,单元测试会贯穿整个项目的开发周期。通过检查各个函数和方法的输入输出,你就可以保证内部的逻辑已经正确执行。通过使用依赖注入和编写”mock” 类以及 stubs 来确认依赖被正确的使用,提高测试覆盖率。 当你创建一个类或者一个函数,你应该为它们的每一个行为创建一个单元测试。至少你应该确认当你输入一个错误参数会触发一个错误,你输入一个有效的参数会得到正确的结果。这会帮助你在开发周期后段对类或者函数做出修改后,确认已有的功能任然可以正常的工作。可替代的方法是在源码中使用 var_dump() ,但这种方法却不能去构建一个或大或小的应用。 单元测试的其他用处是在给开源项目贡献代码时。如果你写了一个测试证明代码有bug,然后修复它,并且展示测试的过程,这样补丁将会更容易被接受。如果你在维护一个项目,在处理 pull request 的时候可以将单元测试作为一个要求。 [PHPUnit ](https://phpunit.de/)是业界PHP应用开发单元测试框架的标准,但也有其他可选的框架: * [atoum](https://github.com/atoum/atoum) * [Enhance PHP](https://github.com/Enhance-PHP/Enhance-PHP) * [PUnit](http://punit.smf.me.uk/) * [SimpleTest](http://simpletest.org/) ### 集成测试 [Wikipedia](http://en.wikipedia.org/wiki/Test-driven_development) 上的定义: > 集成测试 (有时候称为集成和测试,缩写为 I&T)是把各个模块组合在一起进行整体测试的软件测试阶段。它处于单元测试之后,验收测试之前。集成测试将已经经过了单元测试的模块做为输入模块,组合成一个整体,然后运行集成测试用例,然后输出一个可以进行系统测试的系统。 许多相同的测试工具既可以运用到单元测试,也可以运用到集成测试。 ### 功能性测试 有时候也被称之为验收测试,功能测试是通过使用工具来生成自动化的测试用例,然后在真实的系统上运行。而不是单元测试中简单的验证单个模块的正确性和集成测试中验证各个模块间交互的正确性。这些工具会使用代表性的真实数据来模拟真实用户的行为来验证系统的正确性。 ### 功能测试的工具 * [Selenium](http://docs.seleniumhq.org/) * [Mink](http://mink.behat.org/en/latest/) * [Codeception ](http://codeception.com/)是一个全栈的测试框架包括验收性测试工具。 * [Storyplayer ](http://datasift.github.io/storyplayer/)是一个全栈的测试框架并且支持随时创建和销毁测试环境。
';

测试

最后更新于:2022-04-01 14:56:21

为你的 PHP 程序编写自动化测试被认为是最佳实践,可以帮助你建立良好的应用程序。 自动化测试是非常棒的工具,它能确保你的应用程序在改变或增加新的功能时不会影响现有的功能,不应该忽视。 PHP 有一些不用种类的测试工具 (或框架) 可以使用,它们使用不同的方法 - 但他們都试图避免手动测试和大型 QA 团队的需求,确保最近的变更不会破坏既有功能。
';

错误报告

最后更新于:2022-04-01 14:56:19

错误日志对于发现程序中的错误是非常有帮助的,但是有些时候它也会将应用程序的结构暴露给外部。为了有效的保护你的应用程序不受到由此而引发的问题。你需要将在你的服务器上使用开发和生产(线上)两套不同的配置。 ### 开发环境 为了在开发环境中显示所有可能的错误,将你的 `php.ini` 进行如下配置: ~~~ display_errors = On display_startup_errors = On error_reporting = -1 log_errors = On ~~~ > 将值设为 -1 将会显示出所有的错误,甚至包括在未来的 PHP 版本中新增加的类型和参数。 和 PHP 5.4 起开始使用的 E_ALL 是相同的。- [php.net](http://php.net/function.error-reporting) `E_STRICT `类型的错误是在 **5.3.0** 中被引入的,并没有被包含在 `E_ALL `中。然而从 **5.4.0** 开始,它被包含在了 `E_ALL `中。这意味着什么?这表示如果你想要在 5.3 中显示所有的错误信息,你需要使用 -1 或者 `E_ALL | E_STRICT`。 **不同 PHP 版本下开启全部错误显示** * < 5.3 -1 或 E_ALL * 5.3 -1 或 E_ALL | E_STRICT * > 5.3 -1 或 E_ALL ### 生产环境 为了在生产环境中隐藏错误显示,将你的 `php.ini` 进行如下配置: ~~~ display_errors = Off display_startup_errors = Off error_reporting = E_ALL log_errors = On ~~~ 当在生产环境中使用这个配置时,错误信息依旧会被照常存储在 web 服务器的错误日志中,唯一不同的是将不再显示给用户。更多关于设置的信息,请参考 PHP 手册: * [错误报告](http://php.net/errorfunc.configuration#ini.error-reporting) * [显示错误](http://php.net/errorfunc.configuration#ini.display-errors) * [显示启动错误](http://php.net/errorfunc.configuration#ini.display-startup-errors) * [记录错误](http://php.net/errorfunc.configuration#ini.log-errors)
';