PHP与MySQL高性能应用开发.html.pdf
《PHP与MySQL高性能应用开发.html.pdf》由会员分享,可在线阅读,更多相关《PHP与MySQL高性能应用开发.html.pdf(78页珍藏版)》请在三一文库上搜索。
1、序 曾经我与你一般,年少时期,对人生只知努力,却不知何往,只得上下求索,东寻西觅。于是求知识、读文字、写代码、做架构,时至而立之年方初识端倪。几年来亲历创业,一路走来有技术的积 累,亦有技术外的磨砺。比照更多的同路者,做自己最擅长的才更有力量。 当今社会,如你我这样依靠技术成就理想的开发者,共同特征是吃苦耐劳,也有一些完美主义。我们在互联网上获取大量知识,而上面的信息多数可受其益,但陈旧错漏之文仍有,条理逻辑亦差强人 意,难免蒙受其弊。因此,纸质图书阅读对于开发者来说仍有必要。 开发类书籍创作大都不是轻松的工作,但我心中一直存有一份责任,那就是让更多的朋友能够解惑并能目标明确地向前,让“Ope
2、n&Share”的开源理念得到更多理解,这也是我能够坚持的初心。 每晚在称为“中国硅谷”的中关村软件园区,从窗外看着外面灯火通明的百度大厦,还有很多人在加班工作。也有很多技术类的创业者,他们都在执着地用自己的双手浇灌未来的理想之花。每当此 时,耳畔听着西山风声,手中的键盘声响起,眼前屏幕的文字跃动,是另一种喜悦。 创新来源于每天的思考与实践,梦想方能不绝于缕。互联网的新技术每天都在发展,关于LAMP/LNMP开发、高性能、高扩展的话题也一直在更新发展中。 本书持续写了两年有余,其中针对PHP升级,部分内容也同步做了更新,特别是PHP7的发布。书中内容符合PHP5.6及以上版本。希望本书能够帮助
3、你避免在开发时遇到坑,或者简单问题复杂化,进 而提高编码效率。 人生处处是战场,作为开发者的我们,需要每日积跬步行千里,不断实践让自己更加优秀。既然你已经准备好了,就让我们充满感激和动力,出发! 杜江(别名:洛逸) 前言 在过去的十几年间,LAMP开源技术推动着互联网开发,有4000万以上的网站在使用LAMP&LNMP技术平台驱动。 在互联网和移动互联网平台中,其中Facebook、开心网、新浪网、Yahoo!、百度、腾讯、搜狐、网易及各个视频网站全部或大部分使用的是LAMP&PHP技术。 与其说Web的伟大创新,不如说是创新者的智慧,还有PHP技术的鲁棒性与相对于其他语言的快速、灵活、敏捷性
4、,给互联网这个亦庄亦娱的行业带来强大的动力。 近年来,PHP与互联网正一起创造着流行。2000年前后,PHP应用于Yahoo!网站,国内门户网站腾讯、新浪、优酷、凤凰及众多在线网络游戏厂商等也都全部或部分使用PHP技术。同时,PHP也为 互联网的新兴网站创造了一个又一个神话。 Craigslist.org是在全美第6名、全球第20名的分类信息网站,每月有1000万独立访问量和30亿页面浏览量,它使用LAMP技术开发,国内类似的网站如赶集网、百姓网也全部使用PHP技术。 维基百科(Wikipedia),也称为自由的百科全书。它是由全球不同民族、不同语言共同编撰的一部网络百科全书,由PHP开发,并
5、以Mediawiki开放源代码。 Yelp是美国最大的店铺点评网站,相当于中国的大众点评网,2009年婉拒了Google近6亿美元的收购要约,目前已成为消费者购买与体验商品的最佳社区,国内有安居客、蚂蚁、小猪短租、好车无忧 等类似网站也全部使用了PHP技术。 SNS(Social Networking System)巨头Facebook,是全球最大的LAMP网站,目前已有超过15亿用户,超过Google。目前这个全球最火热的社区,已演化为人们生活不可缺少的工具。国内类似的 SNS网站,如开心网、同学网、腾讯朋友等全部使用PHP开发。而Facebook的社交开发商(Social Game Dev
6、eloper),如Zynga等社交游戏厂商也应用了PHP开发,因为Facebook的巨大应用量而赚得 盆满钵满。 随着Twitter的流行,使国内微博网站愈加火爆,如新浪微博、腾讯微博等网站全部使用了PHP开发。而热门、模式创新的网站,非F和G莫属,它们分别是基于位置的地图 服务和团购商品的服务,而这些网站的中国版如美团、团宝等网站使用的也是PHP技术。 PHP在电子商务社交化电子商务领域,以及企业软件上同样大展身手,如淘宝前端使用PHP、Prestashop、ShopEx、Magento、eCart、osCommerc等。可以预见的是,在未来还会有新的互联网 神话出现,而加速这些网站前进的P
7、HP将继续担当主力。 还有企业级开发领域,如Zend、SugarCRM、DotProject等,也在使用PHP来实现云计算等企业级开发领域。而且在当今如火如荼的移动互联网以及网页游戏开发领域,还有PHP for Android等框架 来帮助开发者实现本地化App开发的想法,而且App的后面也可使用PHP来提供API服务接口。 PHP并非万能,但凭借它实用高效的优势,在Web开发领域,PHP和MySQL无疑是“世界上最好的语言”。 现今,国内的各个互联网公司均面临两大问题和挑战:第一,高流量、高负载的商务应用使Web系统不堪重负;第二,价格高昂的带宽、硬件、商业软件等成本高居不下,越来越多的互联
8、网公司开始 拥抱开源的LAMP/LNMP平台。 同时,PHP也在不断更新。我们需要有众多热爱编程开发,有扎实的基础以及丰富的实际编程经验,有创新、有思想的工程师,加入到PHP开发的行列中。 为什么要使用本书 如果你已经看过市场上很多初级类书籍,却还在寻找PHP编程思想、底层原理、编程技巧、可伸缩性、可靠性、开发规范等内容,那么就请使用本书,相信可以获取更多新鲜与深入的主题。 本书为读者带来的是一系列实用的、进阶的“干货”,相信定会给你的程序生涯和未来发展带来帮助。 书中主要介绍如下主题: 解惑:掌握PHP编程中的“长尾”细节。 深入:PHP面向对象高级开发。 浅出:PHP开发中的调试与技巧。
9、编程之道:透彻理解面向对象开发思想与设计模式。 更快:使用OpCode缓存。 扩展:memcached及扩展应用。 搜索:Sphinx全文搜索引擎。 为了提供更好的实用性,本书除了详解PHP中的深度开发外,还提供了相应的代码实例。读者可登录21CTO()本书相关页面下载。 本书写给谁 本书适合PHP中级开发及以上资质的读者,需要读者充分了解PHP技术,可结合其他书籍进行同步阅读。 本书读者对象可为PHP研发工程师、软件架构师、系统架构师。本书也可作为IT运维人员、DBA、计算机专业本科以上学生的参考用书。 本书特点 书中讲解了PHP 5.6以上及PHP7.02版本的新特性,涵盖了目前大中型网站
10、使用的研发技术,包括扩展、伸缩、负载、优化等,以及实际研发中的解决方案。本书不只停留在代码应用层,还包括架构方 面的方法与思路,相信会帮助读者更好掌握PHP。 致谢 感谢机械工业出版社杨福川、高靖雅和李艺,以及曾经并肩战斗的朋友,是你们的鼓励才能使本书得以展现给各位。PHP由PHP开发小组和众多的PHPer共建。同样,本书也得到了很多同仁的支持, 在此一并致谢! 社区支持 如果你从本书中发现错误或漏洞,或者发现一些有价值和感兴趣的内容,可登录本书的技术支持平台:21CTO()与笔者进行交流。 同时,欢迎大家提出宝贵意见,以便在本书再版时为读者带来更好的体验。 第1章 PHP解惑 和其他语言相比
11、,PHP给人的印象是入门简单的语言。当你的技术能力达到一定阶段时,会发现情况并非如此。PHP采用“极简主义”,就是以入门容易为准则设计的,在十几年的持续发展历程中, 它早已成为一个开源领域的语言且具备现代语言特性的平台之一,在Web开发领域,我们相信PHP就是“世界上最好的语言”。 人无完人,语言也一样。天下事物都需要花大量精力去研究实践,深入下去不是易事,了解越多越敬畏。况且Web开发又是个严谨创意,如不能通透理解隐藏在后面的深层机制,就有可能损害应用的 性能,导致低级错误的发生。 互联网产品的特性是小步快跑,快速迭代。这就经常需要我们直接开发,为快速实现功能而忽略一些性能、降低代码质量,但
12、上线后一定要对代码进行整理、优化与修正。事实上,有的开发者从事开 发若干年,却未必会对一些技术原理深究,加上网上大量的开源代码,借Google、Github等发扬拿来主义,复制粘贴未经推敲的代码,似乎没花太大力气就完成了任务。由于不同的架构设计,没有经过 严谨的代码审核,这样的代码怎么能保证产品正常运行? 古人有这样一句话“勿以浮沙筑高台”,即不要在浮沙上面建筑高台。基础不扎实,台子搭得再高也会倒掉,没有坚实的基础,是无法做好开发的。为保证开发的网站平台健壮,使平台能够承载 更高的流量,需要理解、领悟更多的技术点,才能写出高质量、高扩展、高性能的代码。 1.1 省略结束标签的便利性 一个优秀的
13、程序员会在编码前习惯把PHP标签成对写完,再写功能逻辑我也不例外,不过有一次忘记了写结束标签,却发现也能正常运行,当时感觉很奇怪,还以为是神奇的PHP高度容错的结 果。 其实对于PHP编译器来说,脚本的结束标签“?”是可选的,在写程序时你可以忽略它。你或许碰见过:在使用include()、require()或输入输出缓冲函数时,页面顶部有时多空行或者出 现“header had send”之类的错误信息,这类问题与结束标签有关。省略结束标签适合纯PHP文件,如果是PHP与HTML混合开发,则不可省略。 忽略结束标签不仅能少写两个字符,还让我们的开发更顺利,何乐而不为。 1.2 emtpy、is
14、set、is_null的区别 变量在所有计算机语言中均有提供,它用来保存数值、文本、对象等内容。我们可以把变量看作一个有名称的桶,里面放着一个值,这个值可以是数字、字符串或对象,以及包含你想到的任何合法的 内容。 PHP提供了3个用于测试变量值的函数,分别是:isset()、empty()和is_null()。这几个函数均返回布尔值,有时使用不当会造成意想不到的结果,需要详细说明。 比如,用isset()和empty()返回的结果是相反的,但有时却并非一直如此,下面我们一起来了解这几个函数的具体区别。 isset()用来检测一个变量是否已声明且值不为NULL。换句话说,只能在变量值不是NULL
15、时返回真值。 empty()用来检测一个变量是否为空,也就是说有如下情况时返回真值:变量是一个空字符串,false,空数组array(),NULL,0,以及被unset删除后的变量。 提示 在PHP5.5之后,empty()函数可以接受任意类型的表达式。 正确地检查一个变量是否为空,可使用如下格式: if(empty($approve) /etc 这种形式可适用在PHP的任意版本中。如果你用的是PHP5.5以上版本,可以使用如下格式: if(empty(0) /etc if(empty(CreateNew() /etc 以上格式在PHP5.5以上版本中均可以使用,如果小于该版本会返回解析错误。
16、 is_null()函数用来判断变量内容是否是NULL值,即返回真值的条件仅为变量是NULL时。值得一提的是,is_null()是isset()函数的反函数,区别是isset()函数可以应用到未知变量,但 is_null()只能针对已声明变量。 我们用一张表格来汇总这些函数返回值的不同之处(表1-1),表中空白表示函数返回布尔值假(false)。 表1-1 测试函数返回值的区别 1.3 布尔值的正确打开方式 关于布尔值,在PHP中可以这么来写: 有点儿像孔乙己的“茴香豆”写法,这3段代码都可以正常运行。但是,哪个最好?哪个是正确的?在PHP中,常量规定为大写,第二行代码显然是正确的。 下面我们
17、再来看一下比较语句。比较常用于两个变量之间,但是,也会有这样的代码: price) echo function return TRUE; else echo function return FALSE; ? 可以看到,这段代码也没有错,但不怎么容易理解。仔细看,这个分支里面的表达式是一个变量跟一个对象方法的赋值,并不是一个布尔值运算,很容易把人引入不正确的思路。 这种方法尽量不要用。正确的写法可以是这个样子的: $user_id = $user-getUserId() 1.4 变量作用域实践 我们知道,在PHP中定义一个变量后,在脚本任意位置都可以存取访问,这被称为“全局变量”,而定义在函数或
18、类的方法中的变量只可以在函数内部访问,这叫作“局部变量”。 使用局部变量可以使源代码易于管理,试想如果所有的变量都是全局的,任何位置都可访问、修改它的内容,如果变量重名就可能发生“污染”。通过声明局部变量来限制一个变量的存取范围,可以 让代码模块化,易调试,让应用运行更健壮。 下面我们就来看看如何使用全局变量和局部变量,如代码清单1-1所示: 代码清单1-1 使用全局变量与局部变量 “; getvar(); echo “The value of $globalName is: $globalName“; echo “The value of $localName is: $localName“
19、;? 该脚本运行后将显示如下内容: Hello, 老杜! The value of $globalName is: Raymond The value of $localName is: 在上面的代码中,我们一共创建了两个变量:其中$globalName是全局变量,它没有在任何函数体里;另一个是名为$localName的局部变量,是在sayHello()函数里内部定义的。 程序运行时先是调用sayHello()函数,显示的是“hello,Raymond!”,接下来用echo显示两个变量,分别是$globalName和$localName。由于$globalName是定义在函数之外的全局变量,在
20、 脚本任何位置都可以访问,因此显示为“Raymond”。而$localName定义在sayHello()函数内部,只能在函数内访问。脚本中使用echo来访问这个局部变量,而PHP不允许外部访问此局部变量。因此 运行时,PHP认为程序要创建一个新的全局变量$localName,并将默认值初始化为空,所以显示的时候是空白的。 PHP允许函数内部可访问外部全局变量,只需在函数中使用global关键字即可。我们来看代码清单1-2: 代码清单1-2 使用全局变量与局部变量 “; global $globalName; echo “Hello, $globalName!“; sayHello();? 该段
21、脚本会输出下面的内容: Hello, Harry! Hello, 老杜! 由于在sayHello()函数里使用了global来声明$globalname为全局性质,因此它的内容被打印了出来。 1.5 多维数组排序 使用PHP开发应用,几乎就是一直跟数组打交道。PHP数组的强大和灵活性能够解决大部分应用的问题。在数组编程中,常用的有sort()、ksort()等相关函数,使用它们就可以很方便地处理一维 数组,比如按键值降序和升序排列。 这些函数不能用于多维数组,但是在开发中常常是对多维数组排序处理。下面我们定义一个二维数组,如代码清单1-3所示: 代码清单1-3 定义一个标准二维数组 这是一个简
22、单的二维数组,数组的元素也是数组。我们可能需要对userid这个键排序,或者按汉字或英文字符排序。 为了给多维数组进行排序,我们需要自定义排序函数,然后再调用sort()、usort()、ksort()这些函数,让这些函数使用自定义函数。 uasort函数接受两个参数,并且返回一个值表示哪个参数应该排在前面。负数或FALSE意味着第一个参数应该排在第二个参数之前。正数或者TRUE表示第二个参数应该排在前面,如果值为0,则表示 两个参数相等。 下面,我们对前面的数组第一个键进行排序,代码清单1-4是一个自定义函数。 代码清单1-4 将数组按键值排序的自定义函数 function my_compa
23、re($a, $b) if ($a1 “; 1.6 超级全局数组 超级全局数组(super global array)是由PHP内置的,无须开发者重定义。PHP执行时会自动将当前脚本需要收集的数据分类保存在这些超级全局数组中,这些数组有十多个分类,每个数组保存的内 容和功能不同,如表1-2所示。 表1-2 超级全局数组的分类与功能 $GLOBALS超级全局数组可以让我们在函数里访问全局变量,如代码清单1-6所示: 代码清单1-6 在函数中访问外部变量 “; sayHello(); / 将显示 “你好, 我是全局变量“? 1.7 global关键字与global数组的区别 你也许记得,前面我们提
24、到过global关键字和global数组。那么问题来了,它们长得如此像,似乎功能也相同,到底有什么区别?我们分别来看一下。 $GLOBALSvar是外部的全局变量本身,global$var是外部$var的同名引用或者指针,如代码清单1-7所示: 代码清单1-7 删除全局变量 因为$var1变量被删除,所以没有内容显示出来。请再看如下代码: 此段代码意外地打印了1。这是为什么?因为删除的只是个别名引用,其本身的值并没有任何更改。 global$var与&$GLOBALSvar等价,相当于调用外部变量的一个别名,所以上面代码中的$var1和$GLOBALSvar1指向的是同一个变量。 PHP的全局
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PHP MySQL 性能 应用 开发 html
链接地址:https://www.31doc.com/p-5519029.html