高性能PHP7(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-06 03:48:34

点击下载

作者:AltafHussain

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

高性能PHP7

高性能PHP7试读:

内容简介

本书从PHP所需环境讲起,涉及环境搭建与配置设置等内容,能够帮助有一定计算机基础的读者实现PHP运行环境的搭建及PHP周边软件的安装配置。书中亮点内容是介绍PHP 7特性的部分,同时也告诉读者哪些语法将会被废弃,对读者上手PHP 7有极大的帮助。除介绍PHP 7的新特性外,本书用大量章节介绍如何使用PHP 7及周边软件来构造高性能的Web应用程序,同时介绍了一些PHP开发的最佳实践,帮助读者更好地理解Web项目与PHP应用程序开发。附录部分为读者介绍了一些不错的工具,讲解了MVC与开发框架等周边知识,能够帮助读者更好地开发PHP项目。

译者序

我从本科二年级开始,就使用PHP开发一些项目,那时PHP 5才刚刚在国内被运用起来。记得那时使用PHP开发项目,由于没有遇到高并发大流量的场景,所以也算得心应手。直到毕业后在新浪平台架构部工作时,因为开发一些平台项目会遇到被多个项目调用的情况,所以PHP性能低下的问题便被突显出来。从那时开始,我在做基本开发工作的同时,也会关注代码质量与运行性能。当时PHP的优化手段更多的是通过优化自身代码来尽量避免糟糕代码的出现。后来在百度工作期间,我们的一个模块在一天内会被请求20亿次(现在也许更高),因为移动业务发展迅猛,流量涨得很快,PHP项目的性能缺陷愈加被放大,所以那时便开始使用一些工具(例如xhprof)去细化问题,在优化代码、调整架构的同时,关注上下游性能、网络开销等PHP项目周边的调整。虽然通过各种努力能够在当时正常承载线上业务,但性能低下问题依然是一个很大的困扰。

在我入职链家网的前后,PHP社区预发布了最新的PHP 7版本。在PHP 7正式发布后,链家网的PHP工程师们考虑到有鸟哥坐镇链家网,于是在第一时间升级了线上PHP 7环境,在不用做太多框架和代码调整的情况下,大幅降低了整体的线上机器负载。PHP 7版本在性能方面的调整,让传统PHP Web项目能够轻松获得整体的性能提升。记得鸟哥分享过不少能够实现负载减轻一半以上的公司案例,相信随着越来越多的公司、用户使用PHP 7,这样的案例会越来越多。随着PHP开发人员的不断努力,PHP工程师会更专注业务场景而不必再多操心性能问题。

本次与博文视点合作,我们有着共同的目标——将PHP 7的新特性、运用方法更快地传递给中国的PHP工程师们。因此特在博文视点张春雨先生的邀请下,决定尽快用工作之余的时间将本书翻译完成并推广上市。由于我的个人精力实在有限,因此邀请了链家网同事祁冰、左晓杰与我一同翻译此书,本书的第4、5、6章由祁冰翻译,第7章及附录由左晓杰翻译,其余部分由我翻译。若是让读者在阅读时感到口吻不一致,还望包涵。

本书作者在PHP 7发布的第一时间撰写了此书,内容包括环境搭建、软件安装、PHP 7新特性、PHP与数据优化、性能测试等多个方面,并且也提到了PHP最佳实践,以及一些工具、框架的使用,非常适合有一定PHP基础的工程师们阅读。即便你不是PHP工程师,只要有一定的计算机基础,相信你也能够通过认真阅读此书并加以实践来掌握PHP开发与优化技术,获得PHP 7相关的技术理解。全书通俗易懂且图文并茂,实践案例丰富,相信一定能够吸引读者阅读。同时,本书目标清晰,全书都在围绕如何使用PHP及周边技术来优化性能、缩短用户等待时间这一主题。如果你的业务场景对程序性能、等待时间有一定要求,那么千万不要错过此书。

再次感谢祁冰、左晓杰在本书翻译过程中付出的努力!因为我们一同充任链家网的技术支撑角色,非常了解彼此的甘苦。链家网发展迅速,技术需求不断,大家日常工作量都很饱和,基本都是深夜或假期时抽空翻译,这份对技术分享的热情实属难得!同时,我必须感谢我的家人给予的支持、鼓励,特别感谢我的爱人,因为她的更多承担才让我有时间和精力完成此事。当然,如原著作者所说,我们都应该感谢PHP社区开发人员做出的努力,他们为PHP工程师们提供了更好的开发语言,在解决了我们痛点的同时还为未来提供了更多的可能!谢谢!吕毅 链家网平台架构师

关于作者

Altaf Hussain是一位在PHP领域具有6年以上经验的全栈工程师及移动应用开发者,他在巴基斯坦获得电气工程学士学位,其间专攻计算机和通信,兼具电气工程师的理论知识与软件工程师的内涵。

Altaf曾在团队中担任系统工程师,使用汇编语言与C语言为测试机器人开发系统控制软件,之后他对Web技术非常感兴趣,并自此投身Web领域。Altaf曾在工作中使用过许多PHP框架,例如Zend、Laravel、Yii,同时他也使用过不少开源项目,例如Drupal、WordPress、PrestaShop和Magento。Altaf自主设计并实现了两套CMS系统,实现了多语言支持、全线控制、翻译能力以及不同种类的多语言内容管理。现如今,Altaf是一家时尚企业shy7lo.com的技术主管,工作职责是管理公司内部与国外的研发团队,进而落实Magento和Laravel应用程序的开发与部署工作。除了Web应用程序外,Altaf还开发过iOS、Android应用程序,例如在Lumen构建API。Altaf是面向服务架构(SOA)的狂热爱好者,并成功地在多个项目中使用它。

Altaf非常关注Web性能,并在高速发展与可扩展的生产环境中运用了最新的技术,如PHP 7、Nginx、Redis、Varnish等。他是Debian系统的爱好者,并已将其应用于所有Web应用程序的运行环境中。

工作之余,Altaf喜欢写写文章,他的文章大多发表于programmingtunes.com和techyocean.com上。与此同时,Altaf已经撰写了几本由Packt出版的书,包括Learning Phalcon PHP、Mastering jQuery Mobile、PrestaShop Module Development。

致谢

我要感谢我的父母、妻子和儿子Haashir Khan,他们在这本书的创作过程中以及我的整个职业生涯中都给了我很大帮助。没有他们的帮助和支持,这本书不可能完成。我还要感谢PHP社区打造的这一神器,使Web开发人员的工作和生活变得更美好。

关于审校者

Raul Mesa Ros自2006年以来便一直从事与Web开发相关的工作,他之前做Java相关工作,后来转投PHP领域,并获得了一些资格认证,例如Zend官方授予的ZCE、ZFC。在积累了几个大流量的Web项目开发经验后,Raul现在对DevOps的理念很感兴趣。

Raul目前是EuroMillions.com的高级Web开发工程师,使用DevOps和PHP技术,同时作为负责人还带领着多个中小型项目。

Raul的Twitter是@rmrbest。

我要感谢我的妻子Noemi和我的女儿Valeria,感谢她们的支持和对我的爱,同时也感谢我的父亲在1992年为我买了我的第一台电脑。

序言

近些年来,PHP社区始终面临一个巨大问题:性能。在性能问题上,无论使用多么强悍的机器,PHP都会存在一定的瓶颈。在PHP 5.4、PHP 5.5、PHP 5.6版本中,性能开始有所提升,但在高并发的场景下PHP依然会暴露出性能低下的问题。PHP社区开发了一些像Alternative PHP Cache(APC)、Zend OpCache这样的缓存工具,希望借此缓存opcode以达到更高性能,这个做法的确在一些场景下起到了作用。

为了解决PHP的性能问题,Facebook开发并开源了他们的内部项目HipHop Virtual Machine(HHVM)。如HHVM官网介绍,它通过使用即时编译(JIT)在保持了灵活开发的同时显著提升了PHP性能。HHVM相比于PHP有很大的性能提升,从而被广泛应用到如Magento这样的生产环境中。

PHP曾希望通过PHP Next Generation(PHPNG)来与HHVM抗衡,PHPNG项目主要通过重写和优化Zend引擎内存管理以及PHP数据格式来提升性能,这也成为PHPNG的核心目标。全球的工程师都开始积极对比PHPNG与HHVM,并且结果表明,PHPNG性能优于HHVM。

最后,在PHP主干中融入了PHPNG以及一系列的优化与重写后,PHP 7正式发布并带来了重大的性能提升。PHP 7依然没有采用JIT方案,但其性能绝佳,与使用JIT技术的HHVM差异很小。这个版本从性能上相对于从前的历史版本具有非常大的进步。本书内容

第1章,搭建环境。介绍如何搭建不同的开发环境,其中包括Nginx、PHP 7、运行在Windows上的Percona Server、多种的Linux发行版,以及安装Vagrant虚拟机。

第2章,PHP 7的新特性。介绍众多PHP 7中引入的新特性,例如类型提示、使用use集体声明、匿名类、统一的变量语法、新的操作符。新的操作符有组合比较符、Null合并运算符等。

第3章,PHP 7应用性能提升。介绍如何用不同的技术提升和扩展PHP 7应用的性能。在这章,我们采用合并与精简内容、全页缓存、安装并配置Varnish等手段来优化Nginx和Apache、CDN、CSS、JavaScript。最后,介绍了一个巧妙的方法构建应用开发环境。

第4章,提升数据库性能。内容包括如何优化MySQL性能以及如何配置出高性能的Percona Server,同时也会介绍多种用来监控数据库性能的工具。数据库部分的内容包含了如何优化Memcached与Redis缓存数据。

第5章,调试和分析。介绍如何定位与分析性能问题,包括如何使用Xdebug、Sublime Text3、Eclipse、PHP DebugBar定位性能问题并分析性能数据。

第6章,PHP应用的压力/负载测试。介绍如何使用不同工具进行压力、负载测试。其中包括Apache JMeter、ApacheBench和Siege测试负载情况,并会以一些开源PHP项目(Magento、Drupal、Wordpress)为例,分别在PHP 7与PHP 5.6的环境中进行负载测试并加以对比。

第7章,PHP编程最佳实践。介绍一个生产高质量编码的最佳实践案例。包含了编码规范、设计模式、面向服务架构、测试驱动开发、Git和部署等。

附录A,提升开发效率的工具。介绍Composer、Git和Grunt watch这三个工具的更多细节。

附录B,MVC和框架。介绍MVC设计模式与一些最为流行的PHP开发框架,例如Laravel、Lumen、Apigility。阅读准备

本书将涉及下面这些软件,你需要有一台能够兼容它们最新版本的设备。● 操作系统:Debian或Ubuntu。● 软件:Nginx、PHP 7、MySQL、PerconaDB、Redis、

Memcached、Xdebug、Apache JMeter、ApacheBench、Siege

和Git。目标读者

本书适合具有一定PHP编程基础的人。如果你更加关注应用性能,那么这本书将非常适合你!排版约定

在本书中,根据内容的不同将采用各种不同的文字风格。下面举例介绍它们的样式与含义。

文本代码、数据库表名、文件夹名、文件名、文件后缀、路径名、伪URL地址、用户输入以及Twitter路径,会以下列方式展示给读者:“我们可以通过include关键字来表示包含其他的内容。”

代码块将会以如下形式显示。 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME complete_path_webroot_ folder$fastcgi_script_name; include fastcgi_params; }

当需要读者注意代码中的某些部分时,对应的关键信息将加粗表示。 server { ... ... root html; index index.php index.html index.htm; ...

所有命令行的输入与输出都会显示如下。 php-cgi –b 127.0.0.1:9000

新术语和重点词会加粗显示。例如菜单栏和对话框中的文本,会以下面的形式显示:“点击Next按钮进入下一个窗口。”警告或重要信息将会出现在这样的方框里。提示或技巧会以这样的方式显示。读者反馈

读者反馈是非常珍贵的内容,我们一直关注并且欢迎。请让我们知道你是否喜欢本书,我们期望得到反馈,你的反馈能够促使我们进步。

反馈方式:向faq@phei.com.cn发送邮件,注明书名与你的反馈内容。

如果你在某个领域有一定的经验并对写书感兴趣,那么请关注我们官网上的作者指南http://www.broadview.com.cn/support/4。代码下载

你可以下载所有已购买的博文视点书籍的相关资源,链接为http://www.broadview. com.cn/30938。勘误提交

虽然我们已经很谨慎地来保证书籍内容的准确性,但错误仍然可能存在。如果你在某本书中发现错误——无论是正文还是代码中的错误——请告诉我们,我们都将不胜感激。这样,你不仅帮助了其他读者,也帮助我们改进了后续版本。如果发现任何勘误,可以在博文视点网站相应图书的页面提交勘误信息。一旦你找到的错误被证实,提交的信息就会被接受,我们的网站上也会发布这些勘误信息。你可以随时浏览图书页面,查看已发布的勘误信息。1 搭建环境

PHP 7已经正式发布,在之前的很长一段时间里,PHP社区都在讨论它。促使PHP 7诞生的主要因素是“性能”,因为在过去的时间里,PHP社区都不得不一直面对其在大规模应用场景下的性能低下问题,即使是小型应用程序在面对大流量场景时,这个问题也会突显。尽管服务器资源在不断增长,但它对上述场景的帮助并不大,因为性能问题的瓶颈在于PHP语言自身。在这期间出现了很多种缓存技术方案,例如APC缓存等,但它们只是治标不治本。所以,PHP社区迫切需要一款能够显著提升PHP应用性能的新版本,此时, PHPNG项目便随之而来。

PHPNG全称为PHP Next Generation,它是PHP的一个全新分支,主要的目标是提升应用性能。一些人认为PHPNG属于即时编译(Just In Time,JIT),但实际上,它是基于Zend Engine的一次重构,以针对性能问题进行专项优化。PHPNG是PHP 7项目的基础,通过PHP官网的wiki可以看到PHPNG项目已经被并入PHP 7的开发主干。

在开发PHP应用之前,开发环境应当提前准备好。这一节中,我们会专注介绍如何在不同的操作系统上搭建开发环境,例如在Windows上和一些不同发行版的Linux上。

本章将介绍以下几点:● 搭建Windows环境● 搭建Ubuntu或Debina环境● 搭建CentOS环境● 搭建Vagrant

其他没有提到的操作系统就不在这里展开了,我们只讲解本书中涉及的系统,它已基本覆盖了行业内大部分的系统。搭建Windows环境

在Windows系统中已经有很多PHP集成环境工具,这些工具打包了Apache、PHP、MySQL等PHP开发常用的软件,使得这些集成安装与使用都非常简单。这些工具大部分采用Apache搭配PHP 7作为WebServer,这样的集成环境有XAMPP、WAMPP、EasyPHP。其中只有EasyPHP同样也可以采用Nginx搭配PHP 7使用的方式作为Webserver,并且支持Webserver在Nginx、Apache之间轻松切换。XAMPP软件还可以运行在Linux与MacOS上。而WAMP与EasyPHP只能运行在Windows环境中。这三个中的每个都适用于本书,但是相比之下更推荐支持Nginx的EasyPHP。关于WebServer软件,本书推荐使用Nginx。

读者可以自行选择这三个集成环境工具中的任何一个,但是我们应当更深入掌握WebServer的每一个细节,所以我们独立安装Nginx、PHP 7、MySQL,并且设置好它们之间的连接,手动将它们配置到一起。Nginx的Windows版本可以从http://nginx.org/en/ download.html下载。虽然用其他主线版本没有什么问题,但更推荐使用稳定版本。PHP的Windows版本可以从http://windows.php.net/download/下载,下载与系统匹配的32位或64位的非线程安全版本。

操作步骤

1.根据上面提示框内的信息下载Nginx、PHP的二进制程序,复制Nginx到一个自定义目录。假如我们计划着用系统中的D盘作为开发目录,那么便复制Nginx到这个开发目录或者其他自定义的目录下,之后再将PHP复制到Nginx目录下,或者找一个固定的目录用于存放PHP程序。

2.在PHP文件夹下,你会发现有两个.ini文件,分别是php.ini-development与php.ini-production。选择其中之一并改名为php.ini,之后PHP会以这个文件作为配置文件。

3.按住Shift键并用鼠标右击PHP目录,打开命令行窗口。新打开的命令行窗口所在的目录路径应该与当前的路径相同,执行以下命令启动PHP。 php-cgi -b 127.0.0.1:9000

参数-b用于告诉PHP我们希望启动FastCGI服务。执行上述命令将会绑定PHP到127.0.0.1这个IP地址的9000端口上。至此,PHP便运行起来了。

4.配置Nginx。打开nginx_folder/conf/nginx.conf文件,首先在配置文件的服务器配置信息中添加根目录和默认首页文件,具体如下。 server { root html; index index.php index.html index.htm;

5.现在配置Nginx,让它在启动时通过FastCGI模式与PHP通信。在nginx. conf配置中,去掉下面这块配置的注释即可启用。 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME complete_path_webroot_folder$fastcgi_script_name; include fastcgi_params; }

注意,fastcgi_param配置中加粗部分的complete_path_webroot_folder路径的默认值是nginx目录中的一个HTML目录。假设Nginx安装到了D:\nginx目录下,那么,这个HTML目录则对应着D:\nginx\html。另外,fastcgi_param配置中的符号“\”需要用符号“/”加以替换。

6.在Nginx目录下,通过以下命令重启Nginx。 nginx -s restart

7.Nginx重启之后,打开浏览器,输入Windows服务器、设备的IP地址或主机名,就可以看到Nginx欢迎页面。

8.现在,验证PHP的安装情况以及它与Nginx的工作情况,在webroot目录下创建一个info.php文件,并且编辑下列代码。

9.最后,通过浏览器访问http://你的ip/info.php,我们将会看到PHP信息与服务器信息页面。至此我们已经完美搭建好Nginx与PHP环境并开始运行。在Windows与Mac OS X系统上,我们推荐安装一个Linux虚拟机,并在Linux环境里安装这些软件以获得更好的性能。同时,在Linux中一切都很容易管理。目前有很多的Vagrant镜像可以拿来即用,例如Nginx、Apache、PHP 7、Ubuntu、Debian、CentOS以及其他的一些优秀软件,都可以在https://puphpet.com 的精简界面上找到。Vagrant box的另一个非常好的工具是Laravel Homestead。搭建Debian或Ubuntu环境

Ubuntu系统源自于Debian系统,所以这一节介绍的内容在Ubuntu与Debian上是通用的。我们会用到Debian 8 Jessie与Ubuntu 14.04服务器长久支持版本,所有操作流程在Desktop桌面版本同样适用。

首先,在Debian与Ubuntu系统中添加Repo源。Debian

在写这本书时,Debian还没有提供官方的PHP 7 Repo源。所以,在Debian系统上,我们将用dotdeb的Repo源来安装Nginx与PHP 7,步骤如下。

1.打开并编辑文件/etc/apt/sources.list,在文件的最后添加如下两行。 deb http://packages.dotdeb.org jessie all deb-src http://packages.dotdeb.org jessie all

2.在系统的终端中执行下列命令行。 wget https://www.dotdeb.org/dotdeb.gpg sudo apt-key add dotdeb.gpg sudo apt-get update

第一步的作用是将dotdeb的Repo源添加到Debian的源列表中,第二步中的命令会刷新并缓存源数据到本机。Ubuntu

与Debian情况相似,在写此书时,Ubuntu也没有提供官方的PHP 7 Repo源,所以,我们依然使用第三方的Repo源来安装PHP 7,步骤如下。

1.在终端中执行下列两行命令。 sudo add-apt-repository ppa:ondrej/php sudo apt-get update

2.Repo源已经添加好,我们可以开始安装Nginx与PHP 7了。其余的操作在Debian与Ubuntu系统中几乎是一样的,因此下面的内容就不再像添加Repo源那样分开讲解了。

3.安装Nginx,在终端中执行下列命令(Debian与Ubuntu)。 sudo apt-get install nginx

4.安装成功后,可以通过浏览器输入本机主机名或IP来确认是否安装成功。如果你看到下图所示页面,那么证明Nginx已经安装成功。

这里提供三条非常有用的Nginx命令。● service nginx start:启动Nginx服务器。● service nginx restart:重启Nginx服务器。● service nginx stop:停止Nginx服务器。

5.通过下面的命令安装PHP 7。 sudo apt-get install php7.0 php7.0-fpm php7.0-mysql php7.0-mcrypt php7.0-cli

这条命令会安装PHP 7与一些常用的模块,例如PHP Cli命令行模块。验证PHP 7是否安装成功,可以在终端中输入如下命令。 php -v

6.如果输入上述命令后,终端中显示如下的PHP版本信息,则证明你已成功安装了PHP 7。

7.至此,我们需要配置Nginx与PHP 7。首先拷贝Nginx的默认配置/etc/nginx/ sites-available/default到/etc/nginx/sites-available/www.packt.com. conf中,可通过如下命令实现。 cd /etc/nginx/sites-available sudo cp default www.packt.com.conf sudo ln -s /etc/nginx/sites-available/www.packt.com.conf /etc/nginx/sites- enabled/www.packt.com.conf

拷贝默认的配置文件,并且创建一个新的虚拟主机配置文件www.packt.com. conf,同时创建软链接到sites-enabled目录。将虚拟主机所使用的域名作为配置文件的文件名前缀,这种做法可以让其他人很容易明白配置的作用,是非常提倡的。

8.打开并编辑/etc/nginx/sites-available/www.packt.com.conf文件,编辑下面加粗部分的内容。 server { server_name your_ip:80; root /var/www/html; index index.php index.html index.htm; location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_index index.php; include fastcgi_params; } }

预置的配置文件内容是不完善的,我们选择性地保留必须的配置内容,并且加以改动。

在预置的配置信息中,webroot根目录是/var/www/html,这意味着PHP代码和其他的一些所需文件都要放到这个目录下。在index配置项添加index.php,Nginx会在未获得文档路径时默认使用index.php文件。

我们为PHP添加location区块内容时包含了PHP的一些配置,例如fastcgi_pass选项,它确定了PHP 7 FPM的socket路径。在这个案例中,我们使用Unix socket来让Nginx与PHP通信,效率比TCP/IP要高很多。

9.做了这些修改后,重启Nginx服务。此时通过在webroot下创建info.php文件,并且编辑如下代码内容,来验证PHP与Nginx配置是否正确。

10.现在通过浏览器访问http://你的服务器IP/info.php,若能看到PHP的配置信息页面,则说明配置成功!PHP与Nginx都已经配置完毕。如果Nginx与PHP运行在一个系统中,PHP监听回环IP在端口9000上,则这个端口可以修改为其他任意端口。我们如果希望通过TCP/IP端口运行PHP,请修改fastcgi_pass配置,例如键入127.0.0.1:9000作为该项配置。

现在开始安装Percona Server。Percona Server基于MySQL而产生,并且在MySQL基础上进行了性能优化。我们会在第三章详细介绍Percona Server。现在先来在Debian/Ubuntu上安装Percona Server,步骤如下。

1.在系统终端中敲击如下命令来添加Percona Server的Repo源。 sudo wget https://repo.percona.com/apt/percona-release_0.1-3.$(lsb_ release -sc)_all.deb sudo dpkg -i percona-release_0.1-3.$(lsb_release -sc)_all.deb

第一行命令是将Repo包从Percona的Repo源中下载下来;第二行命令则是下载安装这个Repo包到/etc/apt/sources.list.d/percona-release.list中。

2.执行如下命令来安装Percona Server。 sudo apt-get install percona-server-5.5

输入命令按回车后,安装进程将开始运行,其间会花些时间下载一些依赖文件。虽然Percona Server 5.6已经完全可用,但在本书中,我们使用Percona Server 5.5。

安装期间,会有如下图所示的界面弹出,提示我们设置Percona Server的ROOT密码。

虽然这是一项可选设置,但依然建议大家进行设置。在输入密码与确认密码后,安装进程将继续进行。

3.安装结束后,可以通过如下命令验证是否安装成功。 mysql —version

终端中会显示Percona Server的版本信息。前面说过,Percona Server是MySQL的一个分支,因此所有的MySQL命令、查询语句、设置都可以在Percona Server上继续使用。搭建CentOS环境

CentOS是RedHat企业版(RHEL)的一个分支,同时也是企业操作系统的代表。服务器系统采用CentOS是很普遍的,特别是基于CentOS搭建共享主机。

接下来我们一步步配置CentOS系统中的开发环境。安装Nginx

1.因为CentOS默认是不提供Nginx的Repo信息的,所以我们需要手动添加Nginx RPM后才可以安装。首先执行如下命令,添加Nginx Repo到CentOS系统中。 sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release- centos- 7-0.el7.ngx.noarch.rpm

2.通过下面的命令看看有哪些Nginx的版本可以用于安装。 sudo yum --showduplicates list Nginx

这条命令会显示最新的可供安装的稳定版本Nginx信息,在本书写作时,有Nginx 1.8.0与Nginx 1.8.1两个版本可供安装。

3.执行如下命令安装Nginx。 sudo yum install Nginx

Nginx的安装就这样开始了!

4.在CentOS系统中,Nginx安装结束后不会自动启动,所以,安装后的第一步是将Nginx设置为随系统启动,可通过如下命令实现。 systemctl enable Nginx.service

5.启动Nginx。 systemctl start Nginx.service

6.启动Nginx之后,与介绍Debian的章节相似,可以通过浏览器输入本机名或IP进行访问,看看是否能出现Nginx欢迎页面。如果显示Nginx欢迎页面,说明Nginx安装成功。

通过如下命令,我们可以检查安装了哪一个版本的Nginx。 Nginx -v

在服务器上,我们安装了Nginx 1.8.1版本。

至此便将Web Server安装完毕了。安装PHP 7

1.在这一环节中,我们需要安装PHP 7 FPM,并且通过配置实现Nginx与PHP 7搭配工作。在本书写作时,CentOS还没有提供官方的Repo信息,所以,我们有两种安装PHP 7的方法:一是通过PHP 7源码编译安装;二是使用第三方Repo源进行安装。通过源码安装稍微有些烦琐,所以此处我们通过第三方Repo源来安装。本书会采用更新及时的Webtatic提供的Repo源来快捷安装PHP 7。当然还有很多其他的Repo源可以用于安装,读者可以自行选择。

2.添加Webtatic的Repo源到CentOS Repo列表中,通过下面的命令可以完成。 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release- latest-7. noarch.rpm rpm –Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

3.成功添加Repo源后,执行下面命令可以查看哪些版本可以安装。 sudo yum -showduplicates list php70w

在本书写作的时候,PHP 7.0.3是可安装的最新版本。

4.通过执行下面的命令来安装PHP 7,以及一些它需要的相关依赖模块。 sudo yum install php70w php70w-common php70w-cli php70w-fpm php70w-mysql php70w-opcache php70w-mcrypt

5.通过一种很简单的方式安装PHP 7的核心代码与它周边的一些必要模块。首先看看目前有哪些可用,执行下面的命令可以看到一个很长的列表,列出了PHP 7支持的所有模块。 sudo yum search php70w-

6.以PHP 7需要用到的gd模块为例,gd可通过如下命令进行安装。 sudo yum install php70w-gd

如果想一次性安装很多模块也是可以的,用空格将模块名隔开,同样的命令就可以批量安装PHP 7需要的模块了。

现在通过下面的命令来检测一下已经安装好的PHP版本。 php -v

执行上述命令,显示我们安装了PHP 7.0.3版本。

7.关于PHP的启动、停止、重启,可通过下面的命令实现。 sudo systemctl start php-fpm sudo systemctl restart php-fpm sudo systemctl stop php-fpm

8.通过Nginx与PHP-FPM让它们工作起来吧。首先编辑Nginx的虚拟主机配置文件,文件位于/etc/nginx/conf.d/default.conf,可以通过vi、nano或是其他你熟悉的编辑器打开。编辑时,确保下面的两项配置被设置在server区块中。 server{ listen 80; server_name localhost; root /usr/share/nginx/html; index index.php index.html index.htm;

9.为PHP配置Nginx的location区块内容。 location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }

此处设置用于开启Nginx与PHP之间的连接,因此非常重要。譬如fastcgi_pass 127.0.0.1:9000用于高速Nginx服务器,PHP-FPM运行在127.0.0.1这个IP机器上的9000端口上,这里的配置与之前提到的Debian、Ubuntu的配置相似。

10.至此,我们可以写一些代码来验证安装情况。创建一个info.php文件,内容如下。

保存文件后,访问http://你的服务器IP/info.php或者http://你的服务器机器名/info.php,如果看到Nginx的欢迎页面,说明PHP与Nginx安装成功了。安装Percona Server

1.在CentOS上安装Percona Server的方式与上文中描述的流程类似,区别在于此处需要特殊设置一下Repo源。通过下面的命令添加Percona Server在CentOS上的Repo源。 sudo yum install http://www.percona.com/downloads/percona-release/ redhat/0.1-3/percona-release-0.1-3.noarch.rpm

Repo源安装完成后,会看到一行提示完成的信息。

2.通过下面的命令检查Repo源,执行后会列出所有存在的Percona包信息。 sudo yum search persona

3.通过下面的命令安装Percona Server 5.5。 sudo yum install Percona-Server-server-55

执行命令后安装流程就会运行起来,其间也会出现Debian、Ubuntu中提到的设置界面,操作方法相似,这里不再赘述。

4.安装进程执行完以后,我们能够看到安装完成的信息。搭建Vagrant环境

Vagrant是为开发者搭建开发环境提供的工具。Vagrant提供了简单易用的命令行界面,用于安装虚拟机,并且这些虚拟机中包含我们需要的全部工具。Vagrant使用一种名为Vagrant Boxes的载体,里面有Linux操作系统与常用的一些开发工具。Vagrant支持Oracle VM VirtualBox与VMware。在本书中,我们使用VirtualBox来进行实践。

Vagrant有一些PHP 7的载体,包括Laravel Homestead与Rasmus PHP7dev。接下来我们介绍如何在Windows、Mac OS X系统上配置并运行Rasmus PHP7dev载体。

我们在设备上会用到VirtualBox和Vagrant。VirtualBox可以从https://www.virtualbox.org/wiki/Downloads中下载, Vagrant可以从https://www.vagrantup.com/ downloads. Html中下载,请选择适合自己操作系统的版本。关于Rasmus PHP 7dev的VagrantBox介绍可以在github上查看,网址是https:// github.com/rlerdorf/php7dev。

执行下面的步骤。

1.创建一个目录,例如我们在D盘上创建了一个PHP7目录。然后进入这个目录的命令行模式,操作方式是按住Shift键和鼠标右键,选择通过命令行打开。

2.在命令行中执行下面的命令。 vagrant box add rasmus/php7dev

此时便会开始下载VagrantBox并出现如下图所示的界面。

3.下载完毕后,我们需要初始化并配置它,同时将它添加到VirtualBox中。可以通过下面的命令实现。 vagrant init rasmus/php7dev

这条命令将会添加载体到VirtualBox中并开始配置,当执行完毕后,将显示如下图所示的界面。

4.下面的命令可以完整地安装并启动VagrantBox。 vagrant up

这条命令的执行需要一些时间,当它执行结束,载体就安装完毕并可以运行了。

5.首要的事情是更新VagrantBox里面的全部程序。这个载体运行的系统是Ubuntu,通过在php7dev目录下进入命令行并执行如下命令便可以实现。 vagrant ssh

执行该命令后我们将通过SSH登录到虚拟机上。在Windows系统上,如果SSH没有安装或没有配置到PATH系统环境变量中,PuTTY软件则可以提供帮助。该软件可以从http://www.chiark.greenend.org.uk/~sgtatham/put ty/download.html中下载。PuTTY会启动127.0.0.1上的2222端口用于SSH服务,Vagrant与SSH使用相同的用户名和密码。

6.当我们登录VagrantBox的操作系统时,执行下面的命令可更新所有软件与系统。包括系统内核、Nginx、MySQL、PHP 7,以及这个载体内的其他软件。 sudo apt-get update sudo apt-get upgrade

7.至此,VagrantBox便可以完全用于日常开发了。你可以通过在浏览器输入IP来访问这个VagrantBox,如果你不知道如何查找VagrantBox的IP,则可以通过SSH登录虚拟机后执行下面的命令来完成。 sudo ifconfig

执行后将显示出很多详细信息,从中找出虚拟机的IPv4地址并加以使用。本章小结

在本章中,我们搭建了开发所需的基本环境。我们在Windows设备上安装了Nginx与PHP 7,并且在Debian、Ubuntu系统中安装配置了Nginx、PHP以及Percona Server 5.5。之后我们又在CentOS中安装了Nginx、PHP、Percona Server 5.5。最后介绍如何在Windows设备上安装配置Vagrant Box。

在下一章中,我们将学习PHP 7的新特性,例如类型声明、命名空间的集体声明、太空船操作符等。2 PHP 7新特性

PHP 7具有很多用于编写高性能、高效代码的新特性,同时也移除了一些历史版本中过时的特性,这些过时的特性如果在PHP 7中使用会触发一个Error错误。目前大多数的Fatal错误都可以异常捕获,所以PHP不再显示一些不标准的Fatal错误,取而代之的是抛出一个携带着很多可用信息的异常。

在本章中,我们会介绍以下几方面内容:● 类型声明● 命名空间的集体声明● 匿名类● 老式构造函数的摒弃● 太空飞船操作符● null合并运算符● uniform变量语法● 诸多改动OOP特性

PHP 7提供了一些OOP新特性,这些新特性可以让工程师写出更加清晰、有效的代码。在本节中,我们将详细介绍这些新特性。类型声明

在使用PHP 7之前,我们在函数和类之间传递参数时不必声明变量类型。同样地,在返回数据时也不必声明变量类型。任何数据类型都可以被传递、返回。这样便给PHP带来一个很大的问题——PHP不清楚你传递的是什么类型的变量,函数、方法接收到的变量也不知道是什么类型。为了解决这个问题,PHP 7引入了类型声明,目前明确的有两类变量可以声明类型:形参、返回值。接下来会详细介绍这两方面。

类型声明在OOP与PHP程序中属于同一个特性,因为它既可以用在程序的函数中,也可以用在对象的方法中。

形参类型声明

PHP 7将类型声明变成了可能。PHP 7支持的形参类型声明的类型有整型、浮点型、字符串型、布尔类型,可以用在函数形参及对象的方法形参上。来看看下面的例子。 class Person { public function age(int $age) { return $age; } public function name(string $name) { return $name; } public function isAlive(bool $alive) { return $alive; } } $person = new Person(); echo $person->name('Altaf Hussain'); echo $person->age(30); echo $person->isAlive(TRUE);

在上面的代码中,我们创建了一个Person类,里面有三个方法,每个方法接受不同类型的形参且有着类型声明。如果执行上面的代码,它能够正确运行并通过类型检测。

Age支持浮点数型,例如30.5。所以,如果传递一个浮点数作为age方法的形参,也是可以正常工作的,代码如下。 echo $person->age(30.5);

默认情况下,形参类型声明不是被完全限制的,这就意味着我们可以传递一个浮点数给期望得到整型数的方法。

当然,也可以做一些限制。代码如下。 declare( strict_type=1 );

此时我们若再传递一个浮点数给age方法的话,便会得到一个Uncaught Type Error,这个Fatal错误告诉我们Person::age只能接受一个整型数而非浮点型数。在需要字符串形参的情况下,如果你不提供字符串形参的话,也会出现类似的报错。思考一下下面的代码。 echo $person->isAlive( ‘true’ );

执行上述代码就会生成刚刚的Fatal错误。

返回类型声明

PHP 7的另一个重要特性就是支持返回类型的声明,无论是在函数还是对象的方法中。这有点类似形参类型声明,我们对刚才的Person类稍加修改,代码如下。 class Person { public function age(float $age) : string { return 'Age is '.$age; } public function name(string $name) : string { return $name; } public function isAlive(bool $alive) : string { return ($alive) ? 'Yes' : 'No'; } }

如上面代码所示,返回类型声明使用了data-type语法,对于形参类型声明与返回类型声明一样的情况是无影响的。这样就能区分开它们各自的返回数据类型了。

下面,我们用一个对象返回类型来举例。考虑一下之前的Person类与此处添加了getAddress方法的Person类各自的特点。同时,我们在同一个文件中添加了一个新的类Address,代码如下。 class Address { public function getAddress() { return ['street' => 'Street 1', 'country' => 'Pak']; } } class Person { public function age(float $age) : string { return 'Age is '.$age; } public function name(string $name) : string { return $name; } public function isAlive(bool $alive) : string { return ($alive) ? 'Yes' : 'No'; } public function getAddress() : Address { return new Address(); } }

新增的代码被加粗显示。现在,假设我们调用Person类中的getAddress方法,它将很好地工作,并不会报错。现在,让我们在getAddress方法执行完毕后,返回一个Address类型的数据。 public function getAddress() : Address { return ['street' => 'Street 1', 'country' => ‘Pak']; }

在这个例子中,若使用上述方法会抛出下面这类异常信息。 Fatal error: Uncaught TypeError: Return value of Person::getAddress() must be an instance of Address, array returned

这是因为我们在getAddress方法中返回了一个数组,而不是方法声明的Address类型的返回值。在有返回值声明时,此处仅接受Address类型的返回数据。我们思考这样一个问题:为什么要使用类型声明?使用类型声明有一个明显的好处,即它可以让函数、方法的形参与返回值有所预期,避免出现不必要的数据传递,从而造成错误。

通过上面的例子,我们看到PHP 7的这个特性使代码更清晰且可读性更强,能够清楚地知道怎样的数据类型将会被传递与返回。命名空间与use关键字批量声明

当代码量规模变大的时候,很多类会放在命名空间下,这样方便维护与管理。然而,当出现一个命名空间下有很多类且我们要一次性使用多个类的情况时,我们也不得不逐个将它们声明在代码的顶部。在PHP中,不必区分命名空间子目录下的类,这与其他编程语言情况相似。命名空间只是为类提供了一种逻辑分割。在此书中,我们不限制将子目录的类存放在命名空间何处。

例如,有Publishers/Packt这个命名空间,以及有Book、Ebook、Video、Presentation这四个类。同时,有function.php文件,用于存放常用的函数,有另一个文件constants.php,用于存放一些常量信息,它们都处于命名空间Publishers/ Packt下。所有的类与functions.php、constants.php文件的代码如下。 //book.php namespace Publishers\Packt; class Book { public function get() : string { return get_class(); } }

Ebook类的代码如下。 //ebook.php namespace Publishers\Packt; class Ebook { public function get() : string { return get_class(); } }

Video类的代码如下。 //presentation.php namespace Publishers\Packt; class Video { public function get() : string { return get_class(); } }

同样地,presentation类的代码如下。 //presentation.php namespace Publishers\Packt; class Presentation { public function get() : string { return get_class(); } }

从上面的代码中可以看出,四个类都具有同样的方法,就是将类名通过PHP内置函数get_class()返回。

现在,将下面两个函数添加到functions.php文件中。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载