1、出现性能瓶颈如何定位解决
a. 分析硬件资源占用
查看CPU利用率、内存利用率
ps -aux中(a指代all——所有的进程,u指代userid——执行该进程的用户id,x指代显示所有程序,不以终端机来区分)
检查数据库网络延迟
ping xx
b. 代码性能分析工具
xphrof|php7tideways_xhprof -- 主动性能分析
《安装Tideways和Toolkit对PHP代码进行性能分析》
swoole-tracker 可以监测php-fpm
c. 优化方案
使用缓存
PHP缓存工具
yac是用于PHP的快速,无锁的共享内存用户数据缓存。它可以用来代替APC或本地memcached。
使用php内置函数
php数组函数
array_merge 如果两个或更多个数组元素有相同的键名,则最后的元素会覆盖其他元素
array_reduce(array,myfunction,initial) 函数发送数组中的值到用户自定义函数,并返回一个字符串
isset 语言构造器:isset()会同时检查键和值,只有当健存在,对应的变量不为NUll的时候才会返回TURE
array_key_exists 函数:这个函数会返回TRUE,只要键值存在,即使值为NULL
使用PHP扩展
通过php扩展替代高频逻辑
d. 日常代码规范化注意事项
减少使用PHP魔法函数
合理使用内存unset
正则表达式
避免在循环中做运算
减少计算密集型业务
2、笔试题
a. 简述如何实现单点登录
单点登录全称Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分。
client -- service1 -- seo认证
登录
1* 用户client访问 service1跨域
,检查是否登录,如果没有;
2* 带上自己的地址目的地址
为参数跳转到认证中心,sso检查是否登录,如果没有:跳转到登录页,登录;
3* 生成令牌token添加到目的地址
,并跳转到service1;
4* service1 请求sso,检查token是否有效,如果有,注册用户;
5* service1 使用token与client进行通讯。
注销
1* 用户client向 service1 发起注销请求,注销;
2* service1向sso请求使token失效。
b. MYSQL优化总结
MYSQL优化总结、(全栈须知)8.MYSQL优化总结
【背诵】合理建表-表结构优化,规范SQL-查询优化
数据库表结构设计:分库、分表、大表分区、字段冗余+属性设置
第一范式(确保每列保持原子性);
第二范式(确保表中的每列都和主键相关);
第三范式(确保每列都和主键列直接相关,而不是间接相关)。
SQL及索引:SELECT语句优化、索引、逻辑简化
系统配置和硬件
开启查询缓存
c. 一致性相关:转账、秒杀
悲观锁(Pessimistic Lock)
一锁二查三更新。通常来讲在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select … for update操作来实现悲观锁。
需要注意的是, FOR UPDATE
生效需要同时满足两个条件时才生效:
- 数据库的引擎为 innoDB
操作位于事务块中(BEGIN/COMMIT)
set autocommit=0; //设置完autocommit后,我们就可以执行我们的正常业务了。具体如下: //0.开始事务 begin;/begin work;/start transaction; (三者选一就可以) //1.查询出商品信息 获取锁 select status from t_goods where id=1 for update; //2.根据商品信息生成订单 insert into t_orders (id,goods_id) values (null,1); //3.修改商品status为2 update t_goods set status=2; //4.提交事务 撤销锁 commit;/commit work;
乐观锁(Optimistic Lock)
实际更新数据的最后一步再去拿一下锁就好。
- SELECT data AS old_data, version AS old_version FROM …;
- 根据获取的数据进行业务操作,得到new_data和new_version
UPDATE SET data = new_data, version = new_version WHERE version = old_version
if (updated row > 0) {
// 乐观锁获取成功,操作完成
} else {
// 乐观锁获取失败,回滚并重试
}##### 借助文件排他锁
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX | LOCK_NB))
{
//..处理订单
flock($fp,LOCK_UN);
}##### 消息队列
如何实现跨行转账功能
client -- server1 -- server2
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。