关闭

63条PHP编程技巧

174人阅读 评论(0) 收藏 举报
分类:

  1、 尽量采用大量的PHP内置函数。

    2、 使用echo代替print,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如

 

    echo $str1,$str2;

 

    3、 不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?

    4、 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。

    5、 注销那些不用的变量尤其是大数组,以便释放内存。

    6、 并非要用类实现所有的数据结构,数组也很有用。

    7$row['id']的效率是$row[id]7倍。

    8、 在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。

    9、 如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER['REQUEST_TIME']要好于time()

    10、 函数代替正则表达式完成相同功能,str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。

    11、注意代码编写的缩进。

    12、 如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。

    13、 使用选择分支语句(译注:即switch case)好于使用多个ifelse if语句。

    14、 用@屏蔽错误消息的做法非常低效。

    15、 打开apachemod_deflate模块。

    16、 数据库连接当使用完毕时应关掉。

    18、 错误消息代价昂贵。

    19、 尽量不要在for循环中使用函数,比如for ($x=0; $x < count($array); $x)每循环一次都会调用count()函数。

    20、 在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。

    21、 递增一个全局变量要比递增一个局部变量慢2倍。

    22、 递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。

    23、 递增一个未预定义的局部变量要比递增一个预定义的局部变量慢910倍。

    24、 仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量),PHP大概会检查看是否存在全局变量

    25、 方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。

    26、 派生类中的方法运行起来要快于在基类中定义的同样的方法。

    27、 调用带有一个参数的空函数,其花费的时间相当于执行78次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。

    28、 用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。当然,只有当你不需要在字符串中包含变量时才可以这么做。

    29、 用 echo输出多个字符串时,用逗号代替句点来分隔字符串,速度更快。

    30Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢210倍。尽量多用静态HTML页面,少用脚本。

    31、 除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%100%的性能,以免除编译开销。

    32、 尽量做缓存,可使用memcachedmemcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码(OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。

    33、 当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用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"; }

 

    34、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。

    35、不要使用array_key_exists,用isset来判断键值是否在数组中存在

    36、避免使用__set__get等魔术方法

    37、使用include/require代替include_once/require_once,且尽量使用绝对路径

    38、不要把count/strlen/sizeof等放到for循环的条件语句中

    39、尽量使用foreach代替for/while

    40、字符串包含变量时使用双引号而不是单引号,如:

 

    echo "hi, $name, nice to meet you";

 

    41、读取小文件使用fread,读取大文件使用file_get_contents,特大的文件使用fseek

    42、使用 ip2long()long2ip()函数来把IP地址转化成整型存储,可以使计算一个特定的地址是不是在一个区段内更简单,而且加快了搜索和排序的速度

    43、在验证 email地址时使用checkdnsrr()函数验证域名是否存在,这个内置函数能够确认指定的域名能够解析成IP地址

    44、考虑抛弃 mysql_*系列函数改用改进版的mysqli_*系列函数

    45、学会爱上三元运算符

    46、如果在项目中感觉到有可复用的部分,在写下一行代码前先看看 PEAR中是否已经有了,这个在线资源库包含了超过400个可以复用的程序片段,这些程序片段可以立即用到你的程序里。除非说你的项目真的是非常特别的,你总能找到帮你节省时间的PEAR

    47、用 highlight_file()来自动的打印出格式化的很漂亮的源代码

    48、使用 error_reporting(0)函数来防止用户看到潜在的敏感错误信息。在理想情况下,发布服务器应该在php.ini里完全禁止。但是如果你用的是一个共享的web服务器的话,你没有自己的phpini文件,那么这种情况下你最好的选择就是在所有脚本的第一行前加上error_reporting(0)

    49、在网数据库中存储很大的字符串之前使用 gzcompress()gzuncompress()来显式的压缩/解压字符串

    50、通过"引用"传递参数的方法从一个函数中得到多个返回值

    51、完全理解"魔术引号"SQL注入的危险性,最简单的防止sql注入的方法:在phpini中将magic_quotes设置为On,使用mysql_real_escape_string()函数转义

    52、数据库连接当使用完毕时应关掉,不要用长连接

    53、对global变量,应该用完就unset()掉;

    54、不要相信用户提交的数据,一定使用htmlentities()htmlspecialchars()先进行转义

    55、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的CJava代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes)$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增

    56、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存

    57、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现

    58、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈

    59mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%

    60、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的

    61、优化Select SQL语句,在可能的情况下尽量少的进行InsertUpdate操作

    62、循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?)

    63、多维数组尽量不要循环嵌套赋值

 64、看php.ini中的一些对性能影响较大的参数应该如何设置。
# vi /etc/php.ini
(1) PHP函数禁用找到:
disable_functions =
该选项可以设置哪些PHP函数是禁止使用的,PHP中有一些函数的风险性还是相当大的,可以直接执行一些系统级脚本命令,如果允许这些函数执行,当PHP程序出现漏洞时,损失是非常严重的!以下我们给出推荐的禁用函数设置:
disable_functions = phpinfo,passthru,exec,system,popen,chroot,escapeshellcmd,escapeshellarg,shell_exec,proc_open,proc_get_status
需注意:如果您的服务器中含有一些系统状态检测的PHP程序,则不要禁用shell_exec,proc_open,proc_get_status等函数。
(2) PHP脚本执行时间找到:
max_execution_time = 30
该选项设定PHP程序的最大执行时间,如果一个PHP脚本被请求,且该PHP脚本在max_execution_time时间内没能执行完毕,则PHP不再继续执行,直接给客户端返回超时错误。没有特殊需要该选项可保持默认设置30秒,如果您的PHP脚本确实需要长执行时间则可以适当增大该时间设置。
(3) PHP脚本处理内存占用找到:
memory_limit = 8M
该选项指定PHP脚本处理所能占用的最大内存,默认为8MB,如果您的服务器内存为1GB以上,则该选项可以设置为12MB以获得更快的PHP脚本处理效率。
(4) PHP全局函数声明找到:
register_globals = Off
网络上很多关于PHP设置的文章都推荐将该选项设置为On,其实这是一种及其危险的设置方法,很可能引起严重的安全性问题。如果没有特殊的需要,强烈推荐保留默认设置!
(5) PHP上传文件大小限制找到:
upload_max_filesize = 2M
该选项设定PHP所能允许最大上传文件大小,默认为2MB。根据实际应用需求,可以适当增大该设置。
(6) Session存储介质找到:
session.save_path
如果你的PHP程序使用Session对话,则可以将Session存储位置设置为/dev/shm,/dev/shm是Linux系统独有的TMPFS 文件系统,是以内存为主要存储方式的文件系统,比RAMDISK更优秀,因为可以使用DISKSWAP作为补充,而且是系统自带的功能模块,不需要另行配置。想想看,从磁盘IO操作到内存操作,速度会快多少?只是需要注意,存储在/dev/shm的数据,在服务器重启后会全部丢失。不过这对于 Session来说是无足轻重的

65、 Opcache
记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, 所以之前测试时期就发生了有人一直没有启用Opcache的事情. 启用Opcache非常简单, 在php.ini配置文件中加入:
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1"

 66、 使用新的编译器
使用新一点的编译器, 推荐GCC 4.8以上, 因为只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能提升(Wordpres的QPS角度衡量)
其实GCC 4.8以前的版本也支持, 但是我们发现它支持的有Bug, 所以必须是4.8以上的版本才会开启这个特性.

 67、 HugePage
我之前的文章也介绍过: 让你的PHP7更快之Hugepage , 首先在系统中开启HugePages, 然后开启Opcache的huge_code_pages.
以我的CentOS 6.5为例, 通过:
$sudo sysctl vm.nr_hugepages=512

分配512个预留的大页内存:
$ cat /proc/meminfo | grep Huge
AnonHugePages: 106496 kB
HugePages_Total: 512
HugePages_Free: 504
HugePages_Rsvd: 27
HugePages_Surp: 0
Hugepagesize: 2048 kB

然后在php.ini中加入:
复制代码 代码如下:
opcache.huge_code_pages=1
这样一来, PHP会把自身的text段, 以及内存分配中的huge都采用大内存页来保存, 减少TLB miss, 从而提高性能.

 68、 Opcache file cache
开启Opcache File Cache(实验性), 通过开启这个, 我们可以让Opcache把opcode缓存缓存到外部文件中, 对于一些脚本, 会有很明显的性能提升.
在php.ini中加入:
复制代码 代码如下:
opcache.file_cache=/tmp
这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件, 可以跨PHP生命周期存在.

 69、 PGO
如果你的PHP是专门为一个项目服务, 比如只是为你的Wordpress, 或者drupal, 或者其他什么, 那么你就可以尝试通过PGO, 来提升PHP, 专门为你的这个项目提高性能.
具体的, 以wordpress 4.1为优化场景.. 首先在编译PHP的时候首先:
复制代码 代码如下:
$ make prof-gen

然后用你的项目训练PHP, 比如对于Wordpress:
复制代码 代码如下:
$ sapi/cgi/php-cgi -T 100 /home/huixinchen/local/www/htdocs/wordpress/index.php >/dev/null

也就是让php-cgi跑100遍wordpress的首页, 从而生成一些在这个过程中的profile信息.

最后:
$ make prof-clean
$ make prof-use && make install

这个时候你编译得到的PHP7就是为你的项目量身打造的最高性能的编译版本.

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:139408次
    • 积分:3411
    • 等级:
    • 排名:第10150名
    • 原创:213篇
    • 转载:45篇
    • 译文:3篇
    • 评论:13条
    最新评论