php高性能
⑴ 怎样提高php运行效率
1、 如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
2、$row[’id’] 的速度是$row[id]的7倍。
3、echo 比 print快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo$str1,$str2。
4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。
5、注销那些不用的变量尤其是大数组,以便释放内存。
6、尽量避免使用__get,__set,__autoload。
7、require_once()代价昂贵。
8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。
9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于 time()。
10、函数代替正则表达式完成相同功能。
11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。
12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。
13、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。
14、用@屏蔽错误消息的做法非常低效,极其低效。
15、打开apache的mod_deflate模块,可以提高网页的浏览速度。
16、数据库连接当使用完毕时应关掉,不要用长连接。
17、错误消息代价昂贵。
18、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。
19、递增一个全局变量要比递增一个局部变量慢2倍。
20、递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。
21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。
22、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。
23、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。
24、派生类中的方法运行起来要快于在基类中定义的同样的方法。
25、调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。
26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。
27、除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。
28、尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。
29、当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。
(举例如下)
if (strlen($foo) < 5) { echo “Foo is too short”$$ }
(与下面的技巧做比较)
if (!isset($foo{5})) { echo “Foo is too short”$$ }
调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。
34、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或 Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。
35、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。
36、并非要用类实现所有的数据结构,数组也很有用。
37、不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?
38、当你需要时,你总能把代码分解成方法。
39、尽量采用大量的PHP内置函数。
40、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。
41、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。
42、mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。
43、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用 file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;
44、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;
45、优化Select sql语句,在可能的情况下尽量少的进行Insert、Update操作;
46、尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);
47、循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);
48、多维数组尽量不要循环嵌套赋值;
49、在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;
50、foreach效率更高,尽量用foreach代替while和for循环;
51、用单引号替代双引号引用字符串;
52、“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;
53、对global变量,应该用完就unset()掉。
⑵ 如何使用 PHP 构建一个高性能的弹幕后端服务
随着WEB2.0的流行,现在很多网站都流行使用“弹幕”这种形式来实现互动。
弹幕(barrage),中文流行词语,原意指用大量或少量火炮提供密集炮击。大量以字幕弹(dàn)出形式显示的评论同时在屏幕上飘过的现象也被称为弹幕。
作为PHPer的我们,看到现在各种网站都有酷炫的弹幕飞过,我们是不是也想给自己的网站加入弹幕功能呢?
首先弹幕的后端其实说白了和公共聊天室的后端原理十分相似,都是一个客户端发送消息给服务端,服务端再将收到的消息广播给其他的客户端。对于后端来说他们几乎没区别,区别就在于前端。
好在我们有一个前端弹幕插件,这个插件是一个jquery插件,github地址:https://github.com/chiruom/jquery.danmu.js,基本上会使用jquery语法,看看示例代码就可以傻瓜化使用。
前端已经有了解决方案,但是后端呢?前端如何与后端通讯?用传统的ajax轮询吗?不行,这样效率太低,想想各大火爆的直播平台都是同一时间几万人在线,几千人同时发弹幕,如果靠ajax轮询一个php接口的话服务器会吃不消的。且弹幕消息存储方案略显复杂,有人问为什么要存储呢?因为ajax使用的HTTP协议是无状态协议,A客户端和B客户端之间对于服务器来说没有任何标志,如果服务器要确保A客户端和B客户端分别在两次请求的时候服务器只返回这两个客户端没有获取过的弹幕消息,那么服务器端就必须使用一个缓存来标识某某客户端看过哪条弹幕消息。综上所述ajax可以实现小规模的弹幕通信方案,但是很麻烦。
好在最新的HTML5中加入了WebSocket协议,我们可以通过WebSocket这种基于HTTP协议之上的即时通信协议来替代ajax这种传统的我问你答的老旧通信模式。而我们是PHPer,对于我们这种只懂PHP的人该如何编写WebSocket服务端呢?好在我们又得知PHP有一个Swoole扩展,我们在PHP语言中使用它可以很方便的构建一个WebSocket服务端。
关于Swoole的介绍可以参照他的官网http://www.swoole.com/,下面引用官网对它的一段简短的介绍。
PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端。
Swoole可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 使用PHP+Swoole作为网络通信框架,可以使企业IT研发团队的效率大大提升,更加专注于开发创新产品。
先别被Swoole这么多的功能吓到了。我们先关注这里面的重点Swoole内置了Http/WebSocket服务器端/客户端意味着我们可以通过它构建WebSocket的服务端。看到这里我们是不是就急急忙忙去拿官网的WebSocket服务端代码做测试呢?不,Swoole是一个PHP扩展,意味着我们还得去安装它。是不是直接去下载so文件然后在php.ini中加入extension=swoole.so就可以了呢?还不是,我们先去看看Swoole扩展的依赖,这也是我们使用任何语言的任何外部包,外部模块,外部扩展最先要了解的问题。
参考官网:http://wiki.swoole.com/wiki/page/7.html环境依赖
仅支持linux,FreeBSD,MacOS,3类操作系统
Linux内核版本2.3.32以上
PHP5.3.10以上版本,包括PHP7
gcc4.4以上版本或者clang
cmake2.4+,编译为libswoole.so作为C/C++库时需要使用cmakePHP版本依赖
swoole仅支持PHP5.3.10或更高版本,建议使用PHP5.4+swoole不依赖php的stream、sockets、pcntl、posix、sysvmsg等扩展。PHP只需安装最基本的扩展即可意味着我们Windows下是无法使用这个扩展了(其实可以借助cygwin在win下使用swoole,但是考虑到我们使用swoole扩展就是为了性能,也为了熟悉以后的生产环节部署做准备,强烈推荐在linux下开发),那么我们把开发环境转移到Linux下进行吧。
接着还要求Linux内核版本为2.3.32以上,PHP为5.3.10以上,那么我们就用最新的CentOS吧,这个版本的yum安装的php直接就是PHP7最新版,根本无需考虑其他问题,当然你喜欢图形界面,用Ubuntu也可以。其他的基本上最新的Linux发行版都是符合版本要求的。
接着我们便来安装这个扩展,推荐使用PECL来安装,只需要一条pecl install swoole
即可,非常方便。当然你要编译安装,具体步骤请参考http://wiki.swoole.com/wiki/page/6.html安装完扩展之后在命令行下输入
php -m
检查,如果有swoole那么说明安装成功了。
接下来就正式开始我们的编码旅程了。
开始编码旅程之前我们先看看最基础的效果原型是什么样子没错就是这个样子,两个浏览器之前完全独立使用Websocket连接服务端,因此对于服务端来说这两个浏览器就相当于两个完全处在不同机器上的客户端。
效果看完了就开始来讲代码吧。
我们先看看官网的WebSocket服务端示例代码。
$serv = new Swoole\Websocket\Server("127.0.0.1", 9502);$serv->on('Open', function($server, $req) {echo "connection open: ".$req->fd;
});
$serv->on('Message', function($server, $frame) {echo "message: ".$frame->data;
$server->push($frame->fd, json_encode(["hello", "world"]));});
$serv->on('Close', function($server, $fd) {echo "connection close: ".$fd;
});
$serv->start();
我们看到这个代码的第一行先是new了一个WebSocket服务端对象,并且在构造方法中的第一个参数指定了服务端监听的IP,第二个参数指定了服务端监听的端口。然后使用on方法为每一个事件设置了回调函数,最后一行start方法正式开始运行服务端。
这种写法非常像Javascript里面的异步调用,这也是Swoole中的事件驱动异步非阻塞特性,正因为是这种特性,每一个独立的事件(请求)会在服务端接收到之后分别异步处理,他们之间无需互相等待,这也是Swoole性能高的原因所在。
我们来分别剖析一下每一个事件的含义。
$serv->on('Open', function($server, $req) {echo "connection open: ".$req->fd;
});
顾名思义,Open表示打开一个新的链接,并且在事件触发之后echo出连接上服务端的客户端id,该客户端唯一id为回调函数第二个参数中的fd字段。这也是服务端区分客户端的唯一id。
$serv->on('Message', function($server, $frame) {echo "message: ".$frame->data;
$server->push($frame->fd, json_encode(["hello", "world"]));});
同样顾名思义,Message表示消息到达服务端的事件,并且在事件触发之后echo出发送给服务端的数据,该数据为回调函数第二个参数的data字段。另外我们还看到它调用了$server->push,这是回调函数的第一个参数中的push方法,它是一个服务端给客户的发送数据的方法,第一个参数为要发送的客户端id,第二个为要发送的数据,这里的含义是向发给服务端消息的那个客户端发送["hello", "world"]这个数组(方括号写数组为PHP5.4的新特性,如果你是PHP5.3请使用传统的array工厂函数生成数组)经过json序列化之后的数据。
$serv->on('Close', function($server, $fd) {echo "connection close: ".$fd;
});
最后一个事件Close更加容易理解,就是关闭事件,当然关闭的不是服务端,而是客户端,可以理解为客户端与服务端断开连接的事件。回调函数中的代码含义为echo出与服务端断开连接的那个客户端id。
基本的API都清楚了,下面就直接看代码吧,短短二十行而已。
https://github.com/cw1997/danmu-demo/blob/master/server.php$server = new swoole_websocket_server("0.0.0.0", 1997);$server->on('open', function (swoole_websocket_server $server, $request) {echo "server: handshake success with fd{$request->fd}\n";//$request->fd 是客户端id});
$server->on('message', function (swoole_websocket_server $server, $frame) {echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";//$frame->fd 是客户端id,$frame->data是客户端发送的数据//服务端向客户端发送数据是用 $server->push( '客户端id' , '内容')$data = $frame->data;
foreach($server->connections as $fd){
$server->push($fd , $data);//循环广播
}
});
$server->on('close', function ($ser, $fd) {echo "client {$fd} closed\n";
});
$server->start();
这里最核心的广播代码其实还用到了一个之前没有提到过的成员,也就是swoole_websocket_server对象的connections成员,这个成员中保存了所有已连接上该WebSocket服务端的fd,也就是客户端id。因此我们只要在message事件中使用foreach遍历该成员,循环将所有服务端收到的弹幕消息都发送给其他已连接上该服务端的客户端即可。
后端讲完了再讲讲前端吧。
前端代码也不是很多https://github.com/cw1997/danmu-demo/blob/master/index.htmlvar ws = new WebSocket("ws://192.168.1.107:1997");ws.onopen = function(){
console.log("握手成功");
ws.send('hello world!!!');
};
ws.onmessage = function(e){
console.log("message:" + e.data);
var time = jQuery('#danmu').data("nowtime") + 1;var text_obj = '{ "text":"' + e.data + '" , "color":"green" ,"size":"1","position":"0","time":"' + time + '" ,"isnew":" "}'; //构造加上了innew属性的字符串danmu对象console.log(text_obj);
var new_obj = eval('(' + text_obj + ')'); //转化为js对象jQuery('#danmu').danmu("add_danmu", new_obj); //向插件中添加该danmu对象};
ws.onerror = function(){
console.log("error");
};
核心代码都在这里,使用new WebSocket("ws://192.168.1.107:1997")创建一个WebSocket客户端连接对象,通过该对象的各种事件进行对应的操作,和服务端是不是很像?更多代码解释可以参考源代码中的注释,这里不做更多介绍。
看到这里相信作为一名PHPer的你也可以开发出属于自己的弹幕系统了。这里展示的只是一个最基础最原始的弹幕平台。我们也了解到了使用PHP开发一个弹幕平台需要涉及到的技术有WebSocket,Swoole扩展,甚至碰到了很多初级开发者平时不怎么接触的工具,比如说PECL,比如说Linux。
其实PHP结合Swoole扩展还可以做很多事情,比如说对接各种家电,对接各种硬件接口实现在Web端实时控制家电,又比如说结合树莓派做智能小车,通过web端进行遥控等等,各种新奇的玩法等你发现。谁说PHP只能做Web开发?PHP拥有了Swoole扩展其实能做的事情还有很多,Swoole就像他的宣传标题一样:重新定义PHP。
⑶ 提高PHP开发效率的技巧
用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。
1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
2、$row[’id’] 的速度是$row[id]的7倍。
3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。
4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。
5、注销那些不用的变量尤其是大数组,以便释放内存。
6、尽量避免使用__get,__set,__autoload。
7、require_once()代价昂贵。
8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。
9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。
10、函数代替正则表达式完成相同功能。
11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。
⑷ 鸟哥:让PHP 7达到最高性能的几个Tips
在php.ini配置文件中加入:
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1"
⑸ 让PHP网站跑的更快 如何优化PHP
php(做为现在的主流开发语言)是一种执行起来非常迅速的编程语言,但是比起仅仅优化代码来说仍然值得优化php(做为现在的主流开发语言)本身。
本文我们将根据一些实效阐述为什么优化php(做为现在的主流开发语言)本身要比优化代码来的更贴切,以及为什么需要理解根据php(做为现在的主流开发语言)在你的服务器上其他相关子系统的表现找出瓶颈并修复之。与此同时,我们也提到了如何优化您的php(做为现在的主流开发语言)代码来让他们拥有更快的执行速度。
获得高性能
当我们谈及好的性能,往往不仅仅是指您的php(做为现在的主流开发语言)代码执行起来有多快。性能是一套在可量化评测和速度之间取出的平衡。仅仅依靠使用更少资源的代码执行起来也许比在高速缓存中之行的代码更慢,并且相同的一组(在高速缓冲中执行的)代码可以在同时并发执行在一台Web服务器上。
在下面的例子中,A.php(做为现在的主流开发语言)算作一位尽可能跑得快的赛跑选手,而B.php(做为现在的主流开发语言)是一个几乎可以以同一慢速永远跑下去的马拉松选手。轻负荷情况下,A.php(做为现在的主流开发语言)可以充分的快,但是当流量增加后,B.php(做为现在的主流开发语言)的性能表现将仅仅降低一点点而A.php(做为现在的主流开发语言)会垮掉。
让我们来通过一个事实来验证此说法更深远的本质意义。假设我们需要读取一个250K的文件并生成一个关于此文件的HTML概要。我们写了两个脚本来做同样一件事:hare.php(做为现在的主流开发语言)将一次性读取整个文件到内存中,然后一步执行到位;而tortoise.php(做为现在的主流开发语言)每次只读取文件的一行,并且决不超过内容容量。结果Tortoise.php(做为现在的主流开发语言)因为多次读写需要更多的系统回应而慢得多。"
程序每执行一次,hare.php(做为现在的主流开发语言)需要0.04秒CPU执行时间和10Mb的内存,而tortoise.php(做为现在的主流开发语言)需要0.06秒CPU执行时间和5Mb的内存。服务器共有100Mb实际内存容量并且其CPU有99%是空闲的。我们同时假定执行这样一个简单事件不产生内存碎片。
当有10各程序并发执行时,hare.php(做为现在的主流开发语言)将发生内存溢出(10 ×10 = 100)。与此同时,tortoise.php(做为现在的主流开发语言)仍将有50Mb空余内存可用!11个程序并发执行将使hare.php(做为现在的主流开发语言)彻底“溃败”因为它开始需要使用虚拟内存——执行速度有可能降低到其常规速度的一半以下;而且现在每一个单独程序进程需要0.08秒CPU执行时间。而此期间,tortoise.php(做为现在的主流开发语言)仍旧运行在其常规CPU执行时间——0.06秒!
以下表格中,执行得更快的php(做为现在的主流开发语言)脚本使用粗体区分开来:
------------------------------------------------------------------------------------------
| 连接数 | 每执行1次HTTP请求所需CPU执行时间(秒)| 每执行10次HTTP请求所需CPU执行时间(秒)| 每执行11次HTTP请求所需CPU执行时间(秒)|
------------------------------------------------------------------------------------------
| hare.php(做为现在的主流开发语言) | 0.04 | 0.04 | 0.88(内存溢出) |
------------------------------------------------------------------------------------------
| tortoise.php(做为现在的主流开发语言) | 0.06 | 0.60 | 0.66 |
------------------------------------------------------------------------------------------
如您在上例中看到的,获得更好的性能不再仅仅是写出执行起来更快的php(做为现在的主流开发语言)程序。高性能php(做为现在的主流开发语言)表现需要对底层硬件知识以及操作系统、软件支持如Web服务器、数据库等有一个良好认识和理解。
瓶颈
以上两个例子让我们看到了(性能)下降的瓶颈所在。当拥有无限大容量的内存时,hare.php(做为现在的主流开发语言)的确是始终比tortoise.php(做为现在的主流开发语言)快。但是,仅仅认为内存是php(做为现在的主流开发语言)整体性能的瓶颈所在显得过于单纯——实际上远不止这些:
(a) 网络
你的网络有可能是最大的瓶颈所在。如果你有10M的带宽——最多你只能获得1M/秒的传输速度。如果假设每个php(做为现在的主流开发语言)页为30k,那么每秒仅仅只传输33页就将使你的网络带宽达到饱和。更多导致瓶颈产生的因素包括频繁访问低速DNS,或者网络设备仅能获得十分有限的存储。
(b) CPU
如果你监视一下你的CPU负荷情况,发送一个纯静态HTML页面并不会增加CPU负担——就像我们以上提到的,此时瓶颈在于网络。当然啦,对于由php(做为现在的主流开发语言)生成的复杂动态页面,你的CPU速度自然将成为限制因素之一。拥有包含多个CPU的服务器或者一个服务器阵列将减轻因CPU带来的影响。
⑹ 高性能PHP应用开发的目录
第1章基准测试技术1
1.1PHP应用程序栈1
1.2基准测试实用工具2
1.3定义请求/响应生命周期3
1.4Apache Benchmark4
1.4.1安装Apache Benchmark4
1.4.2运行Apache Benchmark5
1.4.3弄清响应的含义6
1.4.4ab选项标记8
1.4.5ab陷阱11
1.5Siege12
1.5.1安装Siege12
1.5.2运行Siege13
1.5.3分析结果13
1.5.4Siege选项标记15
1.5.5测试很多URL15
1.6影响基准测试数字16
1.6.1地理位置16
1.6.2旅行的数据包16
1.6.3响应的大小16
1.6.4代码复杂性17
1.6.5浏览器行为18
1.6.6Web服务器设置18
1.7小结19
第2章提高客户端下载和呈现性能20
2.1优化响应的重要性21
2.2Firebug21
2.2.1安装Firebug22
2.2.2Firebug性能选项卡22
2.2.3Console选项卡23
2.2.4Net选项卡25
2.3YSlow26
2.3.1YSlow v2规则集26
2.3.2安装YSlow27
2.3.3启动YSlow28
2.4Page Speed30
2.4.1安装Page Speed31
2.4.2运行中的Page Speed31
2.5优化工具32
2.5.1JavaScript优化33
2.5.2JavaScript的放置位置33
2.5.3精简JavaScript36
2.6精简工具37
2.7YUI Compressor38
2.8Closure Compiler38
2.8.1减少资源请求39
2.8.2使用服务器端压缩39
2.9图像压缩39
第3章PHP代码优化43
3.1PHP最佳实践43
3.1.1PHP的经济性45
3.1.2require与require_once45
3.1.3提前计算循环长度47
3.1.4使用foreach、for、while循环访问数组元素49
3.1.5文件访问50
3.1.6更快速地访问对象属性52
3.2使用VLD、strace和Xdebug一探究竟54
3.2.1用VLD查看Opcode函数54
3.2.2使用strace进行C级跟踪56
3.3发现瓶颈58
3.3.1Xdebug 2:PHP调试工具58
3.3.2验证安装60
3.3.3安装基于GUI的工具61
3.4小结64
第4章Opcode缓存65
4.1回顾路线图65
4.2PHP的生命周期66
4.3Opcode缓存工具68
4.3.1Alternative PHP Cache68
4.3.2XCache75
4.3.3用XCache缓存76
4.3.4XCache设置77
4.3.5eAccelerator78
4.3.6eA设置82
4.4小结84
第5章变量缓存85
5.1应用程序的性能路线图85
5.2实现变量缓存的价值86
5.3示例项目:创建表87
5.3.1获取记录88
5.3.2计算读取数据库的开销89
5.4APC缓存93
5.4.1将数据添加到缓存中93
5.4.2对APC进行基准测量94
5.5Memcached96
5.5.1安装Memcached96
5.5.2启动Memcached服务器97
5.5.3在PHP中使用Memcached97
5.6小结101
第6章选择正确的Web服务器102
6.1选择适合你的Web服务器程序包103
6.1.1安全性和稳定性非常重要103
6.1.2找到具有丰富知识的工程师非常重要103
6.1.3你的网站主要是静态内容103
6.1.4你在托管服务中托管103
6.1.5你正在使用不常见的PHP扩展103
6.2Web服务器的使用情况图表103
6.3Web服务器请求的处理104
6.4Web服务器硬件105
6.5对Web服务器进行分类106
6.6Apache HTTPD106
6.6.1Apache Daemon命令行107
6.6.2Apache多处理模块108
6.7了解Apache模块109
6.7.1添加动态Apache模块110
6.7.2删除动态Apache模块110
6.8关于Apache的最后几点111
6.9lighttpd111
6.9.1安装lighttpd111
6.9.2lighttpd配置设置113
6.9.3比较静态负载内容114
6.9.4在lighttpd上安装PHP115
6.10Nginx118
6.10.1安装Nginx118
6.10.2Windows安装121
6.11Nginx作为静态Web服务器122
6.11.1安装FastCGI PHP123
6.11.2Nginx基准测试124
6.12小结126
第7章优化Web服务器和内容交付127
7.1测定Web服务器的性能127
7.2了解应用程序的内存占用情况129
7.3优化Apache中的进程130
7.3.1控制Apache客户端(PreforkMPM)131
7.3.2优化内存使用和防止产生交换131
7.4其他Apache配置调整131
7.4.1使用.htaccess文件和AllowOverride132
7.4.2使用FollowSymlinks133
7.4.3使用DirectoryIndex133
7.4.4关闭HostnameLookup133
7.4.5启用Keep-Alive134
7.4.6使用mod_deflate压缩内容134
7.5扩展到单台服务器之外135
7.5.1使用Round-Robin DNS135
7.5.2使用负载均衡器135
7.5.3使用直接服务器返回137
7.5.4在服务器场的成员之间共享会话138
7.5.5与共享文件系统共享资产139
7.5.6与独立资产服务器共享资产140
7.5.7与内容分发网络共享资产140
7.6使用分布式架构的陷阱141
7.6.1缓存一致性问题141
7.6.2缓存版本问题141
7.6.3用户IP地址跟踪142
7.6.4多米诺骨牌或级联失败效应143
7.6.5部署失败143
7.7监视应用程序144
7.8小结144
第8章数据库优化145
8.1MySQL简介146
8.2了解MySQL存储引擎146
8.2.1MyISAM:原始引擎147
8.2.2InnoDB:专业级的选择147
8.2.3选择存储引擎148
8.3了解MySQL如何使用内存148
8.3.1InnoDB与MyISAM内存使用的比较149
8.3.2每服务器与每连接(线程)内存使用的比较149
8.4查找配置文件150
8.4.1Mysqltuner:优化数据库服务器的内存151
8.4.2示例服务器可能出现的问题154
8.4.3优化InnoDB155
8.5找到有问题的查询155
8.6分析有问题的查询157
8.7PHP数据库应用程序的建议158
8.7.1保持独立的读写连接158
8.7.2默认使用“utf 8”(多字节Unicode)字符集158
8.7.3使用“UTC”日期格式159
8.8小结160
附录A在Windows上安装Apache、MySQL、PHP和PECL161
附录B在Linux上安装Apache、MySQL、PHP和PECL174
⑺ 何时PHP能够像C++那样高性能
首先,个人认为指针决定了快慢。C++可以直接操作指针,而PHP是C封装起来的。
第二、两门语言用途不同。C++做游戏、做操作系统以及做桌面应用程序等。所以经常和内存打交道。PHP主要做web站点。而web站点的快慢主要取决与数据库,PHP这门语言对之的影响和数据库相比较,我感觉可以忽略不计。
最后:我觉得纠结两门语言是否高性能,不是太重要。当然您如果是开发多年的大神,您就当我没说过吧。我还不到那个等级---
⑻ php是世界上最好的语言
PHP是世界上最好的语言。这是网络上广泛流传的一个梗,并不是说PHP就真的是编程最好的语言,其实每款编程语言都有自身的优势以及所专长的领域,并不能简单地说PHP就是最好的编程语言,这多少有点调侃的成分。
PHP优点
(一)流行,容易上手
PHP是目前最流行的编程语言,这毋庸置疑。它驱动全球超过2亿多个网站,有全球超过81.7%的公共网站在服务器端采用PHP。PHP常用的数据结构都内置了,使用起来方便简单,也一点都不复杂,表达能力相当灵活。
(二)开发职位很多
在服务器端的网站编程中PHP会更容易帮助你找到工作。很多互联网相关企业都在使用PHP开发框架,所以可以说市场对PHP的开发程序员的需求还是比较大的。
(三)仍然在不断发展
PHP在不断兼容着类似closures和命名空间等技术,同时兼顾性能和当下流行的框架。版本是7之后,一直在提供更高性能的应用。
(四)可植入性强
PHP 语言在补丁漏洞升级过程中,核心部分植入简单易行,且速度快。
(五)拓展性强
PHP 语言在数据库应用过程中,可以从数据库调取各类数据,执行效率高。
PHP缺点
(一)PHP的解释运行机制
在 PHP 中,所有的变量都是页面级的,无论是全局变量, 还是类的静态成员,都会在页面执行完毕后被清空。
(二)设计缺陷,缺少关注PHP被称作是不透明的语言,因为没有堆栈追踪,各种脆弱的输入。没有一个明确的设计哲学。早期的PHP受到Perl的影响,带有out参数的标准库又是有C语言引入,面向对象的部分又是从C++和Java学来的。
(三)对递归的不良支持
PHP并不擅长递归。它能容忍的递归函数的数量限制和其他语言比起来明显少。
这句话的产生,虽然带有一定php码农个人感情色彩的偏见,但是未尝没有道理。首先,PHP的使用率远远高于其他语言的使用率,在web开发中占有很大份额。
同时PHP作为一种通用开源语言,因其语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛。具有简单易懂的语法、没有奇怪的黑魔法、既能面向过程,又能面向对象、安装后各种扩展集一身、包括但不限于mysql、json、mbstr等,方便至极。
在这种情况下,PHP就被戏称为“世上最好的语言”,当然它也不负众望,成了大部分IT码农的首选。它的门槛低,使得更多新手小白入门快,能快速了解IT这行,以及自己的工作性质。语法简单,很快融入其中,被成为“弱类型语言”。
现在很多重量级的开源项目都会使用PHP语言,企业开发上也越来越支持使用PHP。它成熟的框架,大大缩短开发周期,在加上成本低,导致了市场需求大。
(8)php高性能扩展阅读
主要参考框架
(一)CodeIgniter的优点
1、配置简单,全部的配置使用 PHP脚本来配置,执行效率高;具有基本的路由功能,能够进行一定程度的路由;具有初步的Layout功能,能够制作一定程度的界面外观;数据库层封装的不错,具有基本的MVC功能。
2、快速简洁,代码不多,执行性能高,PHP框架简单, 容易上手,学习成本低,文档详细;自带了很多简单好用的library,框架适合小型应用。
(二)CodeIgniter 缺点
1、把Model层简单的理解为数据库操作。
2、PHP 框架略显简单,只能够满足小型应用,略微不太能够满足中型应用需要。
(三)CakePHP 的优点
1、CakePHP 是最类似于RoR的 PHP 框架,包括设计方式,数据库操作的Active Record方式;设计层面很优雅,没有自带多余的 library,所有的功能都是纯粹的框架,执行效率还不错;数据库层的hasOne,hasMany 功能很强大,对于复杂业务处理比较合适;路由功能,配置功能还不错;自动构建脚手架(scaffold)很强大;适合中型应用;基本实现过了MVC每一层; 具有自动操作命令行脚本功能。
2、文档比较全,在国内推广的比较成功,大部分人都知道CakePHP,学习成本中等。
(四)CakePHP 的缺点
1、CakePHP非常严重的问题是把Model理解为数据库层操作,严重影响了除了数据库之外的操作能力
2、CakePHP的cache功能略显薄弱,配置功能稍嫌弱;CakePHP不适合大型应用,只适合中型应用,小型应用来说略微的学习成本高了点。
参考资料来源:网络-PHP
⑼ PHP开发中如何提高系统的稳定性和可靠性
PHP 应用的高性优化,很多时候我们把业务代码做一些优化,反而是简单又高效的。
业务的异步解耦,比如,我们把耗时的多个分表数据的排行榜,通过其他服务做分布统计,然后再综合,最终输出到redis list中,那我们前端 PHP 在调用数据的时候,就不用实时计算了。
缓存的多级处理,业务复杂以后,经常看到一份相同的数据读取 N 次,尽管是有缓存服务器,但是读取的时候也会有网络 I/O 的开销,考虑到我们 PHP 一般使用场景下都是单进程,使用频率高的,则应该优先使用进程内缓存。然后再本地缓存,然后再到网络缓存。
单例的运用,不要小看了对象的构造,很多时候我们在同一进程中,会发现同时构造了 N 多相同的对象。每一次的初始化都是一块内存的开辟和 CPU 的消耗。
高性能,一个就是运行环境的优化,另一个是代码本身的优化。
运行环境的优化,覆盖面也很广,包括系统层面的内核,文件系统类型,数据库及缓存服务本身的性能优化,再到PHP解释器的性能优化等等,PHP不同运行方式的差异(比如Apache模块,还有PHP-FPM等等)。
代码优化方面,我觉得可维护性和代码可读性的重要性大于高性能。代码优化可以借助profiling工具来分析,找到真实访问条件下,处理瓶颈在哪里,再去做针对性的优化。当然自己在初次设计和实现的时候,就需要做一定的整体考虑,例如怎么设计能够减少数据库的查询次数,如何减少重复的操作,了解同一问题的多种解决办法哪一种效率更高(包括算法上的差异,以及PHP的不同方式导致的差异等等),如何设计缓存来提高缓存命中率等等。有一些设计需要在体验和效率上做个权衡。
保证稳定性,同样也分运行环境和代码本身。前者要对线上服务做完整的监控,这个有很多完善和强大的开源工具可以使用,保障基础环境是稳定可控的,并且能够及时发现问题,进行修复。至于代码,除了尽量做完整的测试,开发的时候就需要考虑可能的问题。另外针对PHP,开发环境可以把error_reporting完全打开。还有需要知道常见的安全问题(XSS,SQL注入,CSRF,越权等),毕竟安全问题也是稳定的一部分。