本文节选自我们近期出版的书籍《Jump Start PHP Environment》,SitePoint Premium会员可免费获取。纸质版和电子书在全球各大书店有售,您也可以在此处订购。希望您喜欢这篇节选并发现它有用。
我们将重点介绍应用程序环境。我们还将讨论诸如XAMPP之类的*AMP捆绑包以及为什么它们是一个糟糕的选择;生产/开发一致性;以及性能和调试。
应用程序环境是指应用程序在其生命周期的各个阶段可能存在的环境:生产环境、开发环境和预发布环境。
环境一词是指应用程序周围的硬件和软件;也就是说,所有用于为其提供动力的东西。
我们将从最简单的环境开始:生产环境。
当您部署应用程序时——换句话说,将其上传到服务器并使其对目标受众公开访问——您是在将其投入生产或使用。生产环境是您的应用程序的最终目的地,您代码的目的。
在应用程序的生命周期中,生产环境是实时服务器——一台服务器计算机,其设置允许其他人连接到它并查看您的网站。此实时服务器将被配置为尽可能高效地服务您的应用程序。您在开发过程中使用的所有额外文件都将通过称为编译或构建的过程从应用程序中删除,这将在后面进一步解释。
在生产环境中,您的网站被认为是实时的(或已部署的),并且可以通过其自己的域名访问;例如,https://www.php.cn/link/52eea859b07495d44fb844cdcecdf239。
这相当于厨师在餐厅做饭并将食物送到订购它的顾客手中。
在开发环境中,您的应用程序正在积极开发中。开发环境是您作为开发人员用来开发应用程序的计算机,包括您所有团队成员的计算机,无论他们是否在您附近或远程。需要注意的是,尽管涵盖了这两个方面,但开发环境更多地是指您的应用程序所处的状态,而不是它的物理位置——应用程序处于正在开发的状态。
在开发环境中,您可以使用各种工具——从IDE(参见第2章)到单元测试库和标准修复程序、编译器和构建器、文件监视器等等——任何您需要完成手头工作的东西。
如果我们将我们的应用程序比作智能手机,那么制造它的装配厂就是开发环境。此环境包含所有必要的部件——屏幕、外壳、电池、各种LED——并且每个部件在用于构建智能手机单元之前都会单独进行测试。这称为单元测试——确保每个单元都能工作。
有关应用程序开发中单元测试的示例,请参见本章末尾名为“对于那些想要更多的人”的部分。
为了进一步说明智能手机组装的比喻,正在测试的电池可能需要单独的充电器附件,或者可能需要使用带有合成手指的机械臂来测试屏幕,以确保屏幕的触摸灵敏度正常工作。
所有这些附加组件仅在开发期间存在。从开发环境转换为生产环境(也称为部署)时,这些附加组件将被删除。对于我们的应用程序,这意味着前面提到的编译/构建步骤:各种CSS和JavaScript文件合并在一起并缩小,以减小网站的大小,使其在人们访问时显得更快;单元测试被忽略并留在开发环境中;并且发生各种其他优化(本章后面介绍)——所有这些都是为了在声明准备就绪时使最终产品最大限度地发挥其吸引力和潜力。
当您在自己的计算机上进行开发时,无法访问URL https://www.php.cn/link/2c70bf4df3f4bfe2322ecf7a8803418c。
简而言之,虚拟主机向安装在您计算机上的服务器程序发出指令,例如:如果用户在浏览器中请求http://mysite.com,则通过PHP运行文件mysite.php并在浏览器中显示其输出。
如您所见,这与实时网站的常规请求流程几乎相同。但是,是什么让浏览器向我们自己的计算机的服务器程序请求mysite.com域名,而不是在互联网的名称服务器上查找它呢?主机文件。
主机文件是每个操作系统上都存在的特殊文件。我们在第1章名为“对于那些想要更多的人”的部分中简要提到了它。它包含域名及其相应IP地址的列表,以便您计算机上的任何浏览器都可以读取它并直接转到IP地址,而无需与DNS通信以检查要转到哪里。在Windows上,该文件位于C:WindowsSystem32driversetchosts,在Linux和Mac机器上,它位于/etc/hosts。如果您将IP-名称对放入此文件中,计算机将服从它。我们现在就可以尝试一下。别害怕——没有什么会出错的。准备好了吗?
在Windows上,输入搜索字段,键入“记事本”,出现后,右键单击它并选择“以管理员身份运行”。然后,系统将要求您确认。在打开的窗口中,选择“文件”>“打开”,然后转到:我的电脑>C:>Windows>System32>drivers>etc。在记事本窗口的右下角,您可能需要选择“所有文件”,以便显示hosts文件。双击打开它。
在Linux/Mac机器上,通过搜索打开终端。在Linux上,通过在终端中键入sudo gedit以管理员身份打开默认文本编辑器。系统将要求您输入管理员密码。在OS X上,输入sudo /Applications/TextEdit.app/Contents/MacOS/TextEdit,这将执行相同的任务。在这两个编辑器中的任何一个中,转到“文件”->“打开”,然后输入目录/etc以查找hosts文件。双击打开它。
打开文件后,请注意前几行:它们都以哈希符号(#)开头。这表示它们是注释,对文件没有影响。这些用于向用户解释文件的目的,它们也存在于PHP中。
现在,在所有这些注释行下,添加以下行:
<code>208.117.229.217 bing.com</code>
保存文件并在浏览器中打开http://bing.com。您刚刚成功地将所有对Microsoft搜索引擎Bing的请求重定向到Google!当然,我们不想保留这些更改;您可以随意删除此行或在其前面放置哈希符号以将其转换为注释,然后保存文件。您应该能够像往常一样再次访问http://bing.com。
使用此方法,我们稍后将所有浏览器对http://mysite.com(这将是我们应用程序的示例域名)的请求重定向到我们自己的计算机的服务器。这将使我们能够轻松测试我们网站的开发版本,而无需将其部署到实时环境。
预发布环境是包含生产环境副本(也称为镜像)的单独服务器(或多台服务器)。在小型公司或项目中,预发布环境通常会被跳过。它旨在尽可能地与生产环境相似,安装的软件版本匹配,配置值相同,等等。预发布用于执行最终测试;例如,Facebook可能会重新设计其首页,在将其部署到生产环境供所有用户查看之前,它会将其部署到其预发布服务器,以便员工(也称为质量保证团队的专用非程序员)可以像定期使用一样先测试所有内容。如果一切顺利,则会发生从预发布到生产的最终部署。
预发布超出了本书的范围,但了解它总是有好处的。在虚拟机和小型一次性项目时代,预发布可能是多余的,只有在更大的长期Web应用程序中才会发挥作用。
在此上下文中,我们还必须介绍维护模式。它是一个模式,而不是一个环境,因为应用程序周围的环境不会改变——只有应用程序的状态会改变。它通常只是生产服务器上的一个开关,告诉那些试图访问该网站的人一些类似“马上回来,正在调整!”的话。
在开始PHP开发时,下载和安装XAMPP、WAMP、MAMP或EasyPHP等软件包非常诱人。这些名称中的AMP代表“Apache、MySQL和PHP”。XAMPP在末尾添加了另一个P,用于Perl语言。第一个字母指的是操作系统:Windows、Linux、Mac OS X,或者在XAMPP的情况下,是跨平台的(意味着它可以在任何操作系统上运行)。
这些捆绑包包含您需要在计算机上快速轻松地运行PHP应用程序的所有软件。只需单击一下,您就可以安装编写第一个PHP脚本所需的一切。那么,这其中的坏处在哪里呢?
让我们逐一解决这些问题。
每当您在计算机上安装诸如*AMP堆栈之类的软件时,您的计算机的一部分就会损坏。即使您稍后删除该软件,通常也会留下令人不舒服的痕迹——通常以Windows中的注册表项或Linux上的文件残留物形式出现。事实上,这在Linux上尤其明显。虽然Windows和OS X应用程序安装在一个应用程序文件夹中,所有相关文件都在其中,但在Linux上,安装软件就像用猎枪射击一座用乐高积木建造的城堡一样。单击一下,它们就到处都是。
随着时间的推移,您将安装另一个库、另一个软件包、另一个工具。在进一步开发应用程序时,您将继续添加补充软件,也许会添加完全不同的项目,因为您已经开始并行处理一个新项目。也许app1需要一个PHP扩展来编辑图像,而app2需要一个PHP扩展来允许它将代码打包到封闭源代码存档中,以便您的代码对竞争对手隐藏起来。随着时间的推移,您的机器上将有数百兆字节的开发软件,却不知道您是否仍然需要它。
您的机器将变慢,应用程序将变得不太可用,您的开发机器——您正在使用的计算机——将与您最终打算在其上部署应用程序的生产服务器大相径庭,以至于您将无法优雅地处理这种差异。您最终将经常在实时网站上与错误作斗争,并让您的访问者非常恼火。
通过依赖这些预构建的软件包,您还会剥夺自己学习系统管理工作(简称ops)的经验。在较大的公司中,Ops是一个团队或负责人,负责服务器问题——无论是修复错误、安装新软件、升级现有软件等等。在较小的团队中或为客户单独工作时,基本的系统管理是一项必备技能。
虽然能够一键安装计算机上所需的一切非常方便,但在服务器上没有用户界面,因此无法单击;您需要掌握设置服务器软件所需的命令,以便它可以运行您的PHP应用程序。否则,您要么注定要雇用服务器管理员来帮助您,要么更糟糕的是,使用共享主机(第6章中解释的一个恐怖故事)。
通过拒绝依赖这些*AMP捆绑包,您将被迫手动安装服务器和其他软件,这将迫使您克服学习曲线——如果您认真对待这条职业道路,这些知识将以多种方式对您有所帮助。此外,掌握基础知识实际上并不难,正如您将在本书后面看到的那样。
假设app1和app2构建在PHP 5.3上,运行MySQL 4.0,并打算部署到由Apache(服务器软件)驱动的服务器上。然后,有一个新的要求:确保app1可以在PHP 5.6和MySQL 5.1上运行,并且可以由Nginx(另一个与Apache竞争的服务器程序,发音为“engine x”)驱动。哦,现在怎么办?
我们可以将PHP更新到较新的版本并检查app1是否仍然有效,但是我们如何在不意外地使用PHP 5.3中不可用的代码的情况下继续开发app2呢?同样,我们可以将MySQL升级到5.1并检查它是否仍然有效,但是我们如何知道MySQL在5 版本中是否丢弃了一些旧功能,即使我们修复了app1以在5.1上运行,这些功能也会破坏app2呢?毕竟,app2仍然需要在4.0上运行,因为它可能仍然部署在这样的生产服务器上。哎呀,我们如何处理Apache与Nginx的问题?我们是否在计算机上安装两个Web服务器并分别进行测试?我们如何切换它们?我们如何确保我们记得在一个运行时测试我们的网站?
这仅仅是针对两个应用程序而言。现在想象一下,如果您必须处理来自十个不同客户的十几个应用程序,每个应用程序都有不同的要求。这一切很快就变得不再有趣了。
通过虚拟机可以轻松解决不同软件版本的这种分离问题,我们将在第4章中讨论。
最后,如果我们尝试安装新版本的PHP,但出现问题怎么办?这种情况在OS X和Linux中尤其常见——现在我们机器上安装的PHP版本都不起作用,而且事实证明不可能让单个站点运行。真是一团糟!我们不是可以轻松地恢复到之前的运行状态,而是被迫花费一整天来调试我们自己的系统并试图使其运行——不一定是正确的版本,而是仅仅运行。
如果我们只需要输入一个命令就可以让事情恢复到10分钟前的状态,那不是很好吗?好吧,我们可以!这也将在第4章中演示。
这个听起来很复杂的说法实际上很简单——我们实际上之前已经间接地谈到了它。生产/开发一致性意味着使生产环境和开发环境尽可能相似,最好是完全相同,这样您开发的任何内容都将自动在生产环境中运行,而无需任何额外的配置或调试或调整。
由于节省了大量时间,因此实现一致性对于工作流程非常重要。避免为应用程序在生产环境中运行而不得不做任何额外的工作,这意味着您可以自由地将时间和精力集中在真正有益于应用程序上下文的重要的业务相关逻辑问题上,而不是不断地追赶。在开发中进行更改,然后必须在生产中进行两次更改才能使更改显现出来,这充其量是乏味的,最坏的情况会损害项目的健康。您永远不知道团队中的谁会犯错误,导致应用程序向用户显示错误屏幕。
实现一致性的最佳方法是在您的开发环境中运行与生产环境中完全相同的软件。例如,如果您打算将应用程序部署到运行Ubuntu Linux 14.04操作系统的服务器上的生产环境中,那么最好也在此操作系统上进行开发。但是,如果我们运行的是Windows,因为我们喜欢使用游戏等高级多媒体内容,或者我们需要一些在Linux操作系统上根本不存在的强大的图像和视频处理软件,该怎么办?我们是否应该放弃我们所有的其他兴趣,在Windows上安装Linux,并努力实现一致性而不是其他任何东西?或者我们是否应该放弃一致性并冒险,同时保持我们的计算机强大、美观和稳定,坚持我们选择的操作系统?
幸运的是,有一种第三种方法可以使您同时获得两全其美:虚拟机(在第4章中介绍)。
我们需要介绍的应用程序环境的最后几个方面是确保应用程序快速(性能)且无错误(调试)。本节完全是理论性的;只是为了让您知道稍后在遇到这些术语时会有什么期望。
性能是通过各种优化方法实现的。与该词的含义相反,在应用程序开发中,优化通常具有多个层次,而且很少有更改会立即带来完美的解决方案。性能包括但不限于以下几个方面:
那么,如何衡量性能或查找错误呢?有很多工具可以用于分析PHP应用程序(这就是查找错误和衡量应用程序各个方面的性能所称的)。两个更好的工具是Z-Ray和Blackfire(我们不会在本书中介绍它们,因为它们超出了本书的范围)。
需要注意的是,一个常见的初学者错误是微优化。例如,曾经有人认为使用单引号与字符串($var = 'Some String')比双引号($var = "Some String")更快。这种优化可以带来的性能提升可以忽略不计,而且几乎总是微不足道的;相反,改进复杂的SQL查询或缓存远程HTTP调用总是会大一个数量级。如有疑问,请使用基准测试和真实数据(例如来自Z-Ray或Blackfire的数据),切勿使用您的直觉。
在本章中,我们探讨了应用程序环境,涵盖了应用程序在其生命周期的给定阶段周围存在的各种生态系统。我们讨论了虚拟主机以及如何配置您的计算机以将网站URL重定向到您自己的PHP安装,而不是在线查找结果,并且我们讨论了非常重要的开发/生产一致性。
如果这一切看起来过于复杂,请不要灰心。这仅仅是因为到目前为止,我们几乎只处理了理论——这是勇敢地进入实践领域所必需的理论。在下一章中,我们将使用一些虚拟机亲自动手操作。
在应用程序领域中,测试各个组件被称为单元测试——测试每个单独的代码集,以便您知道它是否有效。
例如,您的应用程序的一部分可能具有从每个名称中删除本地符号并将其转换为美国友好的字母的能力。我的姓氏“Škvorc”将因此转换为“Skvorc”。将Škvorc转换为Skvorc是一小段代码,或一个单元。这个单元是可以测试的;也就是说,对于任何给定的“Škvorc”输入,我都期望输出“Skvorc”。然后,我可以编写一个单元测试,这是一个定义输入和所需输出的文件,当我运行它时,它会测试此功能是否仍然有效。如果两个月后,我更改了应用程序中的某些内容,我可以轻松运行此测试(仍然存在)并检查此转换是否仍然有效。这种工作流程确保您可以稍后升级应用程序,而无需担心破坏您之前构建并忘记的内容。在我们本章开头关于智能手机的比喻中,一个单独的可测试单元可以是触摸屏或电池。
PHP应用程序环境是Web开发的一个重要方面。它提供了一个受控的环境,开发人员可以在其中构建、测试和部署他们的PHP应用程序。此环境包括PHP解释器、Web服务器和数据库系统。它允许开发人员以一致且可预测的方式管理应用程序的不同方面,例如配置设置、错误处理和数据库连接。这导致更有效的开发流程和更高质量的应用程序。
PHP应用程序环境专为Web开发而设计。它们配备了促进创建动态网页和Web应用程序的功能。与其他一些编程环境不同,PHP环境支持各种数据库,并与各种操作系统兼容。它们还提供了广泛的错误报告和日志记录功能,这可以极大地帮助调试和故障排除。
PHP应用程序环境通常包含三个主要组件:PHP解释器、Web服务器和数据库系统。PHP解释器负责执行PHP脚本。Web服务器处理HTTP请求和响应。数据库系统根据PHP应用程序的要求存储和检索数据。这些组件共同为开发、测试和部署PHP应用程序提供了一个全面的平台。
设置PHP应用程序环境包括安装和配置必要的组件。这包括PHP解释器、Web服务器(例如Apache或Nginx)和数据库系统(例如MySQL或PostgreSQL)。安装这些组件后,需要将它们配置为协同工作。这可能包括设置数据库连接、配置PHP设置以及设置Web服务器以处理PHP脚本。
管理PHP应用程序环境的最佳实践包括保持环境最新、定期备份数据以及监控环境的性能。遵循安全最佳实践也很重要,例如使用安全连接、保护敏感数据以及定期检查漏洞。此外,使用版本控制系统可以帮助管理更改并跟踪应用程序的不同版本。
PHP应用程序环境提供了广泛的错误报告和日志记录功能。可以配置这些功能以提供有关在执行PHP脚本期间发生的错误的详细信息。此信息对于调试和故障排除非常宝贵。此外,可以将PHP环境设置为以不会中断用户体验的方式处理错误,例如通过显示自定义错误页面。
是的,PHP应用程序环境可用于移动应用程序开发。PHP是一种服务器端脚本语言,这意味着它可以用于创建移动应用程序的后端。此后端可以处理诸如处理数据、与数据库交互和管理用户会话等任务。但是,对于移动应用程序的前端,您通常会使用不同的技术,例如HTML、CSS和JavaScript。
使用PHP应用程序环境有很多优点。它为开发、测试和部署PHP应用程序提供了一个受控且可预测的环境。它支持各种数据库,并与各种操作系统兼容。它还提供了广泛的错误报告和日志记录功能,这可以极大地帮助调试和故障排除。此外,PHP环境通常易于设置和管理。
保护PHP应用程序环境涉及多个步骤。这包括使用安全连接、保护敏感数据、定期更新环境以及检查漏洞。遵循PHP编码的最佳实践也很重要,例如验证和清理用户输入、为数据库查询使用预处理语句以及避免使用已弃用的函数。
是的,可以自定义PHP应用程序环境以满足项目的特定需求。这可能包括配置PHP设置、设置数据库连接以及自定义Web服务器。此外,还有许多可用的工具和库可以扩展PHP环境的功能,例如用于快速应用程序开发的框架、测试工具以及用于处理图像处理、XML解析等任务的库。
以上是PHP应用程序环境的详细内容。更多信息请关注PHP中文网其他相关文章!