1. 聚能聊>
  2. 话题详情

如何保证PHP系统的稳定性和高性能

一个良好的系统有两个重要的衡量的指标。一个是高性能,另一个是稳定性。高性能即代表着占用更少的资源,提供更多的服务。稳定的系统,才值得信赖。那么如何保证系统的高性能和稳定性呢?这既要有宏观的规划,也要有细节的积累。

就这个话题,大家一起来谈谈如何保证PHP系统的高性能和稳定性。

参与话题

奖品区域 活动规则 已 结束

  • 奖品一

    淘公仔 x 2

  • 奖品二

    阿里云代金券 x 2

  • 奖品三

    聆听专属T恤衫 x 1

61个回答

14

idealities 已获得淘公仔 复制链接去分享

高性能,一个就是运行环境的优化,另一个是代码本身的优化。

运行环境的优化,覆盖面也很广,包括系统层面的内核,文件系统类型,数据库及缓存服务本身的性能优化,再到PHP解释器的性能优化等等,PHP不同运行方式的差异(比如Apache模块,还有PHP-FPM等等)。

代码优化方面,我觉得可维护性和代码可读性的重要性大于高性能。代码优化可以借助profiling工具来分析,找到真实访问条件下,处理瓶颈在哪里,再去做针对性的优化。当然自己在初次设计和实现的时候,就需要做一定的整体考虑,例如怎么设计能够减少数据库的查询次数,如何减少重复的操作,了解同一问题的多种解决办法哪一种效率更高(包括算法上的差异,以及PHP的不同方式导致的差异等等),如何设计缓存来提高缓存命中率等等。有一些设计需要在体验和效率上做个权衡。

保证稳定性,同样也分运行环境和代码本身。前者要对线上服务做完整的监控,这个有很多完善和强大的开源工具可以使用,保障基础环境是稳定可控的,并且能够及时发现问题,进行修复。至于代码,除了尽量做完整的测试,开发的时候就需要考虑可能的问题。另外针对PHP,开发环境可以把error_reporting完全打开。还有需要知道常见的安全问题(XSS,SQL注入,CSRF,越权等),毕竟安全问题也是稳定的一部分。

4

楚松666 已获得阿里云代金券 复制链接去分享

PHP 应用的高性优化,很多时候我们把业务代码做一些优化,反而是简单又高效的。

  1. 业务的异步解耦,比如,我们把耗时的多个分表数据的排行榜,通过其他服务做分布统计,然后再综合,最终输出到 redis list 中,那我们前端 PHP 在调用数据的时候,就不用实时计算了。
  2. 缓存的多级处理,业务复杂以后,经常看到一份相同的数据读取 N 次,尽管是有缓存服务器,但是读取的时候也会有网络 I/O 的开销,考虑到我们 PHP 一般使用场景下都是单进程,使用频率高的,则应该优先使用进程内缓存。然后再本地缓存,然后再到网络缓存。
  3. 单例的运用,不要小看了对象的构造,很多时候我们在同一进程中,会发现同时构造了 N 多相同的对象。每一次的初始化都是一块内存的开辟和 CPU 的消耗。
王峻然 回复

奶奶的病毒

xingehome 回复

进程内的缓存可以通过单例模式实现,本地缓存怎么处理?网络缓存怎么处理?

exinnet 回复

本地缓存 yac
网络缓存 memcached redis

xingehome 回复
回复@exinnet:

yac我去PECL看了下都在beta版本,不知道是否可靠,实际应用是否成熟。

xingehome 回复
回复@exinnet:

memcached redis这些都是内存级别的缓存,网络缓存怎么实现?

评论
3

glowdangao 已获得聆听专属T恤衫 复制链接去分享

exinnet 回复

👍 赞。内容不错。为了方便大家查看,放到了我博客上。
http://www.bo56.com/download/Performance_Optimization_From_Momo_Api_Team.pdf

glowdangao 回复

感谢海龙哥推荐。

glowdangao 回复

在去年基础上,今年我们进行了PHP7的升级,使用微服务实现了并行和异步调用。效果都很明显。

物联网菜鸟 回复

大神,我是一名大学生,求推荐一些适合初级学习PHP方面的书,谢谢了🙏🙏🙏

评论
1

51干警网 复制链接去分享

用钱砸。性能不足就上服务器,上人优化。

idealities 回复

简单粗暴。。

周老汉 回复

这个不咋靠谱

楚松666 回复

不错的思路

聚小编 回复

土豪的世界我们不懂...

机智的monkey 回复

靠谱

waiter 回复

管用

小灰兔 回复

除此之外别无他法

51干警网 回复

是吧。我感觉也是~

huang_jack 回复

大实话

ibluesocial 回复

前期可以做系统优化,和LAMP优化 ,系统优化个人认为,能够提高性能5% 就已经优化的很好了, LAMP优化默认性能很低,需要做优化,能够提高很难多。随着业务的用户的增长,前期可以花钱加硬件效果很好,当你的业务量达到一定量的时候,单纯提升硬件效果已经不明显了,这个时候需要做逻辑梳理,数据库分库分表,业务藉口。

51干警网 回复

@信海龙 这不失是一个方法吧。

fsdsdfsd 回复

大实话

评论
1

lidoooudou 已获得阿里云代金券 复制链接去分享

看了大家的分享很受益。说下自己的工作经历,还望指正。
其实这个性能和架构不是谁都能经历的,如果不是大公司业务不饱满,性能的老板一般不是很关心。
任何一个公司都不是一出来架构就很牛逼,性能优化到位,而是从小到大慢慢演变的。
我13年到一家公司做电商的,创业公司那时候上的基本就是php+mysql,也没有多大业务量。后来拿了点钱,做活动,量上来了,会出现某些页面的卡顿(因为刚开始没有任何优化/(ㄒoㄒ)/),我们对数据进行了分离,单独的数据库服务器,加了很多缓存,再后来公司倒闭了/(ㄒoㄒ)/
辞职后去了一家公司,也是做电商的,那时候海淘比较火,这家公司也挺火。在优化上做了很多,比如业务分割,使用了nosql存储大部分的非关键性的数据(定时入mysql),redis等各种的缓存,感觉业务分割后性能上去了,还有其他。次年这个公司也倒闭,(ps许诺的投资没有到位);
再后来我就去了一家只有8个人的创业公司,(不要跟我谈优化了,我们不需要,伤心中……)其实最好的优化就是找一家比较靠谱的公司,有业务,有需求咱们再谈优化。以上是我的吐槽,见笑了……
最想突然想去大公司了,一直在小公司打杂,没有去过大公司,想去看看,开开眼界,不知道到阿里这样的公司要求……楼下你说呢。
在这个过程中看着阿里云日渐完善,功能越来越多,阿里云完全可以提供所有的基础服务。哒哒哒 不说,今天晚上要约前台妹子呢,我先走了。

exinnet 回复

看了你的经历,感觉你需要一张代金券。😝^_^

评论
1

a1213800 已获得淘公仔 复制链接去分享

PHP 应用的高性优化,很多时候我们把业务代码做一些优化,反而是简单又高效的。

业务的异步解耦,比如,我们把耗时的多个分表数据的排行榜,通过其他服务做分布统计,然后再综合,最终输出到 redis list 中,那我们前端 PHP 在调用数据的时候,就不用实时计算了。

缓存的多级处理,业务复杂以后,经常看到一份相同的数据读取 N 次,尽管是有缓存服务器,但是读取的时候也会有网络 I/O 的开销,考虑到我们 PHP 一般使用场景下都是单进程,使用频率高的,则应该优先使用进程内缓存。然后再本地缓存,然后再到网络缓存。

单例的运用,不要小看了对象的构造,很多时候我们在同一进程中,会发现同时构造了 N 多相同的对象。每一次的初始化都是一块内存的开辟和 CPU 的消耗。

exinnet 回复

对于缓存总结的不错。
如果使用进程内缓存的时候,要注意一个坑,就是缓存数据更新后,要及时更新进程内的缓存。
之前遇到过,把请求期间所有的查询结果都缓存在进程内。方法A更新数据后,方法B获取的数据还是旧的数据。
原因就是,方法A更新数据的时候,并没有让进程内的缓存失效或者更新缓存。

评论
4

稀饭不加糖 复制链接去分享

1.梳理业务逻辑及优化业务逻辑。
一般业务场景大多都来自于产品经理,他们并不一定很了解底层的实现。

2.结合业务场景来系统架构
功能强大,通用...等。都不一定是你当前业务场景最佳的选择。
有很多项目,都是在之前项目 或 找一个开源的项目 基础之上修改。通常这样的项目为了更加通用,做了很多额外的功能,和性能上的妥协。

3.PHP 代码级别的优化
这个就得参考架构设计之初定义的开发规范。
如果有些执行时间长的操作,考虑分解 异步...等。这些方案网上很多。

4.加上缓存 或 NoSQL
这个没什么好说的,还是结合业务场景选择。哪里需要用哪里。

**5.服务端的优化。
这个就是运行环境的优化了。

6.最后就是堆机器了
最后就用钱砸吧!到了这样的级别,钱都是大把的有了。也不在乎这点了。

注:监控,log 是必须的。时刻检测你系统运行的状态,选择合适的优化方案。

exinnet 回复

赞,总结的不错。除了上面说的外,我再加一点,降级策略。

评论
1

秋天日记 复制链接去分享

稳定性和高性能。这个可以从PHP本身开始,php.ini和php-fpm.conf 的配置也很重要的!
小内存的机器,php-fpm的进程管理方式应为dynamic,否则反之。一般一个php-fpm进程占用内存20~30M左右,最大进程数的一般在 剩余内存/30M 左右比较合适。也可通过配置php-fpm的slow.log,来找到慢的地方进行优化,这是最简单不过了。
数据读写方面。如MySql 数据库啥的 要根据实际情况设置读写超时,Curl 这些也是,程序慢一般都是取数据这些地方,大不可没超时设置或者一条SQL写成一坨。
使用缓存。可以根据自己的应用设计一套缓存接口,在取数据的时候通过缓存接口来取。
另外,一条数据无论是在数据库或者缓存服务器的,应尽量避免重复读取。
至于代码执行速度嘛,除了"换一种写法",也有各种PHP代码加速器。

exinnet 回复

配置方面,之前特意整理过。
PHP.INI的配置,需要注意的项:
display_errors 是否显示错误信息。开发环境建议为on,生产环境关闭 off。
error_reporting 报错错误级别。E_ALL & ~E_DEPRECATED & ~E_STRICT
max_execution_time 每个脚本执行的最大时间,单位秒。5。
max_input_time 最大解析时间。从接收数据到开始执行脚本结束。
max_input_nesting_level 设置变量最大嵌套深度。
max_input_vars 接受变量最大个数。
memory_limit 脚本内存最大使用量。20M。
default_socket_timeout 基于socket流的默认超时时间。
disable_functions 不可用函数列表。exec, passthru, proc_open, popen, shell_exec, system, assert
output_buffering 开启输出缓存。4096字节。

PHP-FPM.CONF的配置项需要注意的点:
backlog 完成连接socket队列长度。默认值 65535。根据实际情况调整。
emergency_restart_threshold 如果出现指定次数的SIGSEGV SIGBUS错误重启php-fpm
emergency_restart_interval 重启php-fpm 的时间
pm.max_children 允许开启的最大进程数。200
pm.max_requests 一个php-fpm子进程处理多少个请求,自动退出。
pm.status_path 查看php-fpm状态的路径。
ping.path=/ping 检测php-fpm是否还能处理请求
access.log 请求处理日志。可以记录每个请求的cpu和内存使用情况等信息。
request_slowlog_timeout 超过指定时间的请求属于慢请求
slow_log 慢日志路径。会记录下超时时正在执行的代码行
request_terminate_timeout 超过指定时间,进程会被kill掉

李懿桀1117 回复

可以帮我处理一下吗?

凌风哥哥 回复

$$ x = b^2/4ac $$

评论
2

曾杨 复制链接去分享

保证高能性和稳定性可以从代码上解决,写出好的算法就行了,但是保证高能性的同时可能会牺牲一部分稳定性,反之亦然。

idealities 回复

也不全是。不过有时候确实需要折中。

exinnet 回复

完善算法是性能优化的一种手段。除此之外,还有好多需要注意的地方。如,网络IO比较耗时,那就尽量把多次请求合并成一次网络请求。在用户体验可以接受的情况下,可以把一些慢的操作异步化。等。

评论
2

若愚 复制链接去分享

高性能这个需要很多基础的优化,对应我们大部分普通php技术人员人员来说优化方式就是下面这些,服务器使用负载均衡,使用缓存内存数据库,redis或者memcache这类,使用独立服务器承载数据库,比如rds,php尽量使用linux,容器如apache或者nginx根据不同的访问需求调整下内置的系统参数,php程序方面可使用数据库读写分离,根据需求来写程序,不写多余臃肿无用的程序和全局变量,函数等,图片或者js,css的文件可以使用cdn...

exinnet 回复

👍 其实作为PHP技术员,还可以做的更多。如,查询10个用户的资料,有的项目中代码是 for 循环10次。这时就可以改成 一个批量查询。一次查询10个用户信息。毕竟对于web程序来说,网络IO是很耗时的一部分。推荐你看下 glowdangao 总结的文章。 http://www.bo56.com/download/Performance_Optimization_From_Momo_Api_Team.pdf

评论
1

虹天 复制链接去分享

如何做到高性能,阅读性高的php代码,团队该如何合作

exinnet 回复

写出高性能的代码。这个得靠经验。网上的tips也不少。如:
1、合并请求。
2、异步化。
3、缓存。

写出阅读性搞的代码,需要注意几点:
1、结构清晰。避免过多if 或者 for嵌套。单个方法避免过长。
2、逻辑清晰。代码的先后顺序,符合人的思维习惯。
3、命名规范。
4、必要注释。

idealities 回复

推荐一本书,《编写可读代码的艺术》

评论
3

周梦康 复制链接去分享

谈点细节上的,保证系统的稳定性和高性能,监控、日志必不可少。

稳定性的监控

没有监控犹如闭着眼睛开车,何来稳定性呢?比如,数据库服务器已经严重堵塞,而我们却毫无所知,等待我们的只能前端 PHP-FPM 502了。

没有日志记录,监控图表中的事故怎么复盘?比如,监控到昨天某一时间负载陡升,如果不是查看系统日志,就不知道是因为网络 I/O 阻塞导致的。

性能的监控

比如我们在 nginx 访问日志中加上 api 的请求时间,那么我们就可以定期去优化那些耗时最长的 api,php 和 mysql 的慢日志的监控和检查、优化,都是对我们性能的有着显著的提升。

啊!PHP 是世界上最好的语言,这个话题真是一个太大的话题,留个大家一起讨论吧!

小刚1113 回复

日志很重要,查错优化都少不了他。

评论
1

西秦说云 复制链接去分享

php目前如何处理高并发呢?性能不如java,处理模式也不如nodejs的异步处理,该怎么搞?

idealities 回复

Nodejs也不是完美的,单线程是瓶颈。PHP也可以协程,或者通过swoole之类的扩展进行异步。或者你也可以通过扩展来实现某些逻辑,在那里面,pthread甚至ASIO之类的你都可以用了,只是成本高些。

huaerjie 回复

用swoole+协程也能做成高性能的异步处理

xingehome 回复

nodejs虽然是单线程的但是它异步

评论
1

过儿 复制链接去分享

系统结构和代码优化可以有效提高性能,但是终极优化还不太明白!

exinnet 回复

你所说的终极优化是指什么?

评论
1

manongjia 复制链接去分享

架构服务于业务代码,再好的架构也抗不住冗余、低性能的代码。要做到高性能、稳定性,业务代码的可读性、可维护、易扩展是关键。好的代码配合主流的缓存服务,定制出适合业务模型的数据存储结构方式。存储扎实了,保证稳定性,易于快速扩容,恰当的缓存是高性能的关键。

exinnet 回复

对。一个良好的架构也是保障系统稳定的一个关键因素。

评论
1

第七科 复制链接去分享

我们主要做在线的考试教育这块,消耗的资源也是比较波动,对于稳定性个人感觉系统方面和网站方面是两块,特别是在系统差别不大的情况下,网站代码写的如何是个关键,特别是各种BUG常出,进行更新修复就容易造成网站打不开等问题,虽然能够及时解决也会给用户带来不好的体验,急迫的需求就是如何让我们的程序员让更新文件这方面能完美匹配不同环境下的网站?

idealities 回复

BUG多,还是测试不充分吧。

小刚1113 回复

bug多主要是没有过测试部门

评论
2

w603928848 复制链接去分享

老板要先保持程序员心情稳定,奔放。
online/c7ebb054992b4fcbb9c7113ff2a31bf2_e07f14cd3e274abea705d2a0041ddf42

1

小刚1113 复制链接去分享

各位前辈总结都很好,受益匪浅啊。另外扯一下自己的个人踩的坑。nosql需要根据自己应用场景去设计,比如mc,redis如何选择,redis再使用的过程需要考虑自己业务,选择最佳数据结构,同时需要考虑redis的时间复杂度,还需要估算一下场景需要多大的内存。 如果需要大量计算,最好离线计算,然后把结果放到redis中,这主要看你项目是否能接受延迟处理,一句话,还是的看项目。

安全很重,xss,sql注入,csrf等等

nosql查询结果,再nosql封装一层,把结果写入类的静态变量中,因为刚取出东西很有可能又用到。避免nosql内网传输时间。

对接第三方东西一定要有包容心态,比如第三方登录,第三方广告等等,要允许别人犯错,我们代码要健壮,要做好各种容错机制。别搞得别人挂了,我们这边啥提示都没有。同时做好日志处理。

数据设计要考虑后期1年左右变动,别设计太死。做好er图,分析一下实体,那些是关系,关系表尽量简单。sql优化,比如某个表的sql比较慢,你需要整理这个表所有的sql语句,再把已有索引列出来,看看这个关键查询有那几条,再调整索引。到时候有些不太好优化,需要结合nosql辅助尽量减少这种sql查询。如果表太大,根据业务是否可以分表处理或者分段查询等等。

良好的代码风格,可读性也是服务器稳定前提,到时候别人一看代码,都不敢改。

单台服务器,少量的文件缓存效果不错,大量容易引起磁盘io问题。如果大量静态资源,用cdn。同时详情页面静态化,交互比较多地方用ajax处理。比如温下面的评论用ajax处理。这样不会经常刷新cdn。静态图片那需要输出,不要动不动就是一张大图,现在都支持动态裁剪,cdn缓存,nginx缓存基本够了。

擦,扯多了。

小刚1113 回复

我评论一下

idealities 回复

不错呀。

评论
1

cr180 复制链接去分享

也撸了几年php了,手机敲的,有不对的还望大家一起探讨。

良好的数据表结构设计能让项目赢在起跑线上,所以在敲代码前请先考虑好项目预期数据级别,分布式集群、读写分离、引擎选择、api等等,索引表、缓存表、高性能临时表、事务处理,善用数据表索引,字段类型按需设计。

memcache、redis多多益善但要考虑稳定性

之后的php架构,框架是自己写还是第三方?你确定熟悉第三方框架吗?

项目模块化、公共代码、全局变量、sql语句尽量少做联合查询,缓存场景的设计与利用,分页机制等等。

先规划再动手,再优化。

日志系统、debug、性能分析、备份与防崩溃、附件系统设计等等

变量用完unset,优化是点滴的积累,代码虽然是无所不能的,但别偷懒让它一次给你完成很多的工作,确实需要时可以考虑分布式内部api通讯。

优化需要硬件、环境、数据库、php、前端的整体配合才能获得最高的性能与稳定性

最后最重要的一点,自己不熟悉的领域请交给熟悉它的人,比如服务器参数,轻信他人建议的参数可能让稳定性更差!!

周梦康 回复

经验很丰富啊!

评论
2

旭爱 复制链接去分享

首先你会有CookPHP框架即可,基于PHP7开发,性能高

4