0

0

PHP 优化详解_PHP教程

php中文网

php中文网

发布时间:2016-07-20 11:13:08

|

1508人浏览过

|

来源于php中文网

原创

笔者收集的这些技巧来源较广,完整性不能保证。 由于数量较多,这些优化技巧没有经过测试。请各位看官在使用之前自行测试,毕竟这些技巧是否能派上用场,还是需要由PHP所在的独特环境所决定的。

目录索引

 

找到瓶颈(Finding the Bottleneck)

面对一个性能问题是,第一步永远是找到问题产生的原因,而不是去看技巧列表。搞明白产生瓶颈的原因,找到目标并且实施修复,然后再重新测试。查找瓶颈只是万里长征的第一步,这里有些常用技巧,希望对最重要的第一步找到瓶颈能有所帮助。

  • 使用监控方法(比如监控宝),进行benchmark和监控,网络,特别是网络状况瞬息万变,做得好的话5分钟就可以找到瓶颈。
  • 剖析代码。必须了解那部分代码耗时最多,在这些地方多多关注。
  • 想找到瓶颈,请检查每个资源请求(比如,网络、CPU、内存、共享内存、文件系统、进程管理、网络连接等等……)
  • 先对迭代结构和复杂的代码进行benchmark
  • 在在真实负载下用真实数据进行真实测试,当然,如果可以最好用产品服务器。

缓存 (Caching)

有些人认为缓存是解决性能问题最有效的办法之一,试试这些:

立即学习PHP免费学习笔记(深入)”;

  • 使用OPCODE(操作码)缓存,这样脚本就不会在每次访问时重新编译一次。比如:启用Windows平台上的windows缓存扩展。可以缓存opcode,文件,相对路径,session数据和用户数据。
  • 考虑在多服务器环境下使用分布式缓存
  • 在调用imap_header()之前先调用imap_headers()

编译 vs. 解释(Compiling vs. Interpreting)

将PHP源码编译成机器码。动态解释执行同样的编译,但它是按行执行的。编译为opcode是折中选择,它可以将PHP源码翻译为opcode,之后opcode再转为机器码。以下为关于编译与解释的相关技巧:

  • 上线之前将PHP代码编译为机器码。opcode缓存尽管并不是最好的选择,但依旧比解释型来得强。或者,考虑将PHP代码编译成一个C扩展。
  • PHP的opcode编译器(bcompiler)还不能在产品环境中使用,但是开发者应该关注http://php.net/manual/en/book.bcompiler.php.

代码减肥 (Content Reduction)

越少越块。 这些技巧可以帮助减少代码:

  • 每页提供更少的功能
  • 清理网页内容
  • 如果解释型执行,请清理注释和其他空白
  • 减少数据库查询

多线程与多进程(Multithreading & Multiprocessing)

由快到慢依次为:

PHP不支持多线程,但是可以用C写多线程的PHP扩展。有一些办法可以使用多进程或模拟多进程,但支持的并不是很好,没准儿比单进程还慢。

字符串(Strings)

字符串处理,是大多数编程语言中最常用的操作之一。这里有些技巧可以帮我们让字符串处理速度更快一些:

  • PHP的连接运算(点运算),是最快的链接方式
  • 避免在print中链接字符串,用逗号分割后用ECHO
  • 尽可能使用str_前缀的字符串函数替代正则表达式
  • pos()比preg_mach()和ereg()都快
  • 有人说单引号包裹字符串比双引号更快,有人说没有区别。当然,如果想在字符串中引用变量,单引号没戏。
  • 如果想判断字符串长度是否小于某值(比如5),请使用isset($s[4])
  • 如需将多个小字符串连接成一个大字符串,试着先开启ob_start输出缓存,再用echo输出到缓冲区,完成后使用ob_get_contents读取字符串

正则表达式(Regular Expressions)

正则表达式为们带来了灵活多样的比较与查找字符串的方法,单他的性能开销却着实不低

  • 尽可能使用STR_前缀的字符串处理函数代替正则表达式
  • 使用[aeiou]的不是(a|e|i|o|u)
  • 正则表达式越简单速度越快
  • 尽可能不要设置PCRE_DOTALL修饰符
  • 用^.*代替.*
  • 简化正则表达式。(比如使用a*代替(a+)*

迭代结构 (Iteration Constructs (for, while))

迭代(重复,循环)是最基本的结构化编程方法,很难想像有不使用它的程序。这里有些技巧,帮助我们改进迭代结构的性能:

  • 尽可能讲代码移出到循环外(函数调用、SQL查询等等……)
  • 使用i=maxval;while(i–)代替for(i=0;i
  • 使用foreach迭代集合与数组

选择结构 (Selection Constructs (if, switch))

与迭代结构相同,选择结构也是最基本的结构化变成方法。以下技巧或许能改善性能:

  • switches和else-if中,应该将最近常出现true的列在前面,较少出现true的请靠后
  • 有人说if-else比swtich/case快,当然,有人反对。
  • 用elseif替代else if.

函数与参数 (Functions & Parameters)

将函数的代码分解成小函数代码可以消除冗余,让代码具有可读性,但代价是什么?这里有些技巧,以帮助更好的使用函数:

iWebShop开源商城系统
iWebShop开源商城系统

iWebShop是一款基于PHP语言及MYSQL数据库开发的B2B2C多用户开源免费的商城系统,系统支持自营和多商家入驻、集成微信商城、手机商城、移动端APP商城、三级分销、视频电商直播、微信小程序等于一体,它可以承载大数据量且性能优良,还可以跨平台,界面美观功能丰富是电商建站首选源码。iWebShop开源商城系统 v5.14 更新日志:新增商品编辑页面规格图片上传优化商品详情页面规格图片与主图切

下载
  • 引用传递出对象和数组,而不是传值
  • 如果只在一个地方使用,使用内联。如果在多个地方调用,考虑内联,但请注意可维护性
  • 了解你所用函数的复杂度。比如similar_text()为O(N^3),这意味着字符串长度增加一倍,处理时间将增加8倍
  • 不要通过“返回引用”来提升性能,引擎会自动优化它。
  • 以常规方式调用函数,而不是使用call_user_func_array()或eval()

面向对象结构 (Object-Oriented Constructs)

PHP的面向对象特性,可能会影响到性能。以下提示可以帮助我们尽量减少这种影响:

  • 不是一切都需要面向对象, 性能的损失可能会超过其优点本身
  • 创建对象比较慢
  • 如果可以,尽可能时候用数组而不是对象
  • 如果一个方法可以静态化,请静态声明
  • 函数调用比派生类方法调用要快,派生类方法调用比基类调用要快
  • 考虑将基类中最常用的代码复制到派生类中,但要注意维护性隐患
  • 避免使用原生的getters与setters。如果不需要他们,请删除并且属性公开
  • 创建复杂的PHP类时,考虑使用单件模式

Session处理 (Session Handling)

创建sessions有很多好处,但有时会产生没必要的性能开支。以下技巧可以帮助我们最大限度减少性能开支:

  • 不要使用auto_start
  • 不要启用use_trans_sid
  • 将session_cache_limited设置为private_no_expire
  • 为虚拟主机(vhost)中的每个用户分配自己的目录
  • 使用基于内存的session处理,而不是基于文件的session处理

类型转换 (Type Casting)

从一种类型转换为另一种类型需要成本

压缩(Compression)

在传输前,压缩文本和数据:

  • 使用ob_start()在代码起始处
  • 使用ob_gzhandler()可以下载提速,但是注意CPU开支
  • Apache的mod_gzip模块可以即使压缩

错误处理(Error Handling)

错误处理影响性能。我们能做的是:

  • 记录错误日志,别再使用“@”抑制错误报告,抑制对性能一样有影响
  • 不要只检查错误日志,警告日志一样需要处理

声明、定义与范围(Declarations, Definitions, & Scope)

创建一个变量、数组或者对象,对性能都有影响:

  • 有人说,声明和使用全局变量/对象,比局部变量/对象要快,有人反对。请测试再决定。
  • 在使用变量前声明所有变量,不要声明不使用的变量
  • 在循环中尽可能使用$a[],避免使用$a=array(…)

内存泄漏(Memory Leaks)

如果内存分配后不释放,这绝对是个问题:

  • 坚持释放资源,不要指望自带/自动的垃圾回收
  • 使用完后尽量注销(unset)变量,尤其是资源类和大数组类型的
  • 使用完毕就关闭数据库连接
  • 每次使用ob_start(),记得ob_end_flush()或者ob_end_clean()

不要重复发明轮子(Don’t Reinvent the Wheel)

为什么要花费时间去解决别人已经解决的问题?

  • 了解PHP,了解它的功能和扩展。如果你不知道,可能会无法利用一些现成的功能
  • 使用自带的数组和字符串函数,它们绝对是性能最好的。
  • 前人发明的轮子,并不意味着在你的环境下吸能是最好的,多多测试

代码优化(Code Optimization)

  • 使用一个opcode optimizer
  • 如果将被解释运行,请精简源码

使用RAM(Using RAM Instead of DASD)

RAM比磁盘快很多很多,使用RAM可以提升一些性能:

  • 移动文件到Ramdisk
  • 使用基于内存的session处理,而不是基于文件的session处理

使用服务(Using Services (e.g., SQL))

SQL经常被用来访问关系型数据库,但我们的PHP代码可以访问许多不同的服务。下面是一些访问服务是需要牢记的:

  • 不要一遍又一遍地问服务器向东的事情。使用memoization缓存第一次的结果,以后访问直奔缓存;
  • 在SQL中,使用mysql_fetch_assoc()代替mysql_fetch_array(),可以减少结果集中的整数索引。以字段名访问结果集,而不用索引数字。
  • 对于Oracle数据库,如果没有足够的可用内存,增加oci8.default_prefetch。将oci8.statement_cache_size设置为应用中的语句数
  • 请使用mysqli_fetch_array()替换mysqli_fetch_all(), 除非结果集将发送到其他层进行处理。

安装与配置(Installation & Configuration)

安装与配置PHP时,请考虑性能:

  • 添加更多内存
  • 删除竞争性的应用与服务
  • 只编译所需要用的扩展
  • 将PHP静态编译进APACHE
  • 使用-O3 CFLAGS开启所有编译器优化
  • 只安装所需使用的模块
  • 升级到最新版本的次要版本。主板本升级,等到第一次bug修复后再进行,当然,也别等太久
  • 为多CPU环境进行配置
  • 使用 -enable-inline-optimization
  • 设置session.save_handler=mm ,以 -with-mmto编译,使用共享内存
  • 使用RAM disk
  • 关闭resister_global和magic_quotes_*
  • 关闭expose_php
  • 关闭 always_populate_raw_post_data 除非你必须使用它
  • 非命令行模式下请关闭register_argc_argv
  • 只在.php文件中使用PHP
  • 优化max_execution_time, max_input_time, memory_limit与output_buffering的参数
  • 将Apache配置文件中allowoverride设置为none提升文件/目录的访问速度
  • 使用-march, -mcpu, -msse, -mmmx, and -mfpmath=sseto使CPU最优化
  • 使用MySQL原生驱动(mysqlnd)替换libmysql、mysqli扩展以及PDO MYSQL驱动
  • 关闭 register_globals、register_long_arrays以及register_argc_argv. 开启auto_globals_jit.

其他(Other)

还有些技巧比较难归类:

  • 使用include()、require(),避免使用include_once()和require_once()
  • 在include()/require()中使用绝对路径
  • 静态HTML被PHP生成的HTML要快
  • 使用ctype_alnum、ctype_alpha以及ctype_digit代替正则表达式
  • 使用简单的servlets或CGI
  • 代码在产品环境中使用时,尽可能写日志
  • 使用输出缓冲
  • 请使用isset($a)代替比较$a==null;请使用$a===null代替is_nul($a)
  • 需要脚本开始执行时间,请直接读取$_SERVER[’REQUEST_TIME’],而不是使用time()
  • 使用echo替代print
  • 使用前自增(++i)代替后自增(i++),大多数编译器现在都会优化,但是他们不优化时,请保持这样的写法。
  • 处理XML,使用正则表达式代替DOM或者SAX
  • HASH算法:md4, md5, crc32, crc32b, sha1比其他的散列速度都要快
  • 使用spl_autoload_extensions时,文件扩展名请按最常用–>最不常用的顺序,尽量排除掉压根不用的。
  • 使用fsockopen或fopen时,使用IP地址代替域名;如果只有一个域名,使用gethostbyname()可以获取IP地址。使用cURL速度会更快。
  • 但凡可能,用静态内容代替动态内容。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/440393.htmlTechArticle笔者收集的这些技巧来源较广,完整性不能保证。 由于数量较多,这些优化技巧没有经过测试。请各位看官在使用之前自行测试,毕竟这些...

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

616

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

194

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

91

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

54

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

598

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

56

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号