“常见问题”的版本间的差异
(未显示2个用户的18个中间版本) | |||
第166行: | 第166行: | ||
== 进程间的通信方式 == | == 进程间的通信方式 == | ||
== fpm == | == fpm == | ||
+ | * 进程管理方式pm,静态、动态。 | ||
* 合适的超时时间request_terminate_timeout、max_execution_time | * 合适的超时时间request_terminate_timeout、max_execution_time | ||
* 看服务器性能,设置进程数量max_children | * 看服务器性能,设置进程数量max_children | ||
* fpm进程处理最大请求数max_requests | * fpm进程处理最大请求数max_requests | ||
− | |||
== nginx == | == nginx == | ||
第192行: | 第192行: | ||
hash冲突的情况:链地址法。next设置为相同hash的索引,然后在映射表里的值替换成当前元素在bucket中的位置。 | hash冲突的情况:链地址法。next设置为相同hash的索引,然后在映射表里的值替换成当前元素在bucket中的位置。 | ||
+ | |||
+ | == 处理负载,高并发?== | ||
+ | |||
+ | # HTML静态化 | ||
+ | #: 效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。 | ||
+ | # 图片服务器分离 | ||
+ | #: 把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛等 | ||
+ | # 数据库的优化,包括合理的事务隔离级别、SQL语句优化、索引优化 | ||
+ | #: 避免慢查询过多阻塞 | ||
+ | # 数据库集群和库表散列及缓存,使用缓存、尽量减少数据库IO | ||
+ | #: 数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。 | ||
+ | # 镜像: | ||
+ | #: 尽量减少下载,可以把不同的请求分发到多个镜像端。 | ||
+ | # 负载均衡: | ||
+ | #: Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。 | ||
+ | |||
+ | == Laravel请求生命周期 == | ||
+ | |||
+ | #、Laravel 采用了单一入口模式,应用的所有请求入口都是 public/index.php 文件。 | ||
+ | #、注册类文件自动加载器 : Laravel通过 composer 进行依赖管理,无需开发者手动导入各种类文件,而由自动加载器自行导入。 | ||
+ | #、创建服务容器:从 bootstrap/app.php 文件中取得 Laravel 应用实例 $app (服务容器)。 | ||
+ | #、创建 HTTP / Console 内核:传入的请求会被发送给 HTTP 内核或者 console 内核进行处理 | ||
+ | #、载入服务提供者至容器:在内核引导启动的过程中最重要的动作之一就是载入服务提供者到你的应用,服务提供者负责引导启动框架的全部各种组件,例如数据库、队列、验证器以及路由组件。 | ||
+ | #、分发请求:一旦应用完成引导和所有服务提供者都注册完成,Request 将会移交给路由进行分发。路由将分发请求给一个路由或控制器,同时运行路由指定的中间件 | ||
+ | |||
+ | https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/80637277 | ||
+ | |||
+ | == php生命周期 == | ||
+ | # 模块初始化阶段 --- php_module_startup() | ||
+ | 这个阶段主要进行php框架、zend引擎的初始化操作。这个阶段一般是在SAPI启动时执行一次,对于FPM而言,就是在fpm的master进行启动时执行的。php加载每个扩展的代码并调用其模块初始化例程(MINIT),进行一些模块所需变量的申请,内存分配等。 | ||
+ | # 请求初始化阶段 --- php_request_startup() | ||
+ | 当一个页面请求发生时,在请求处理前都会经历的一个阶段。对于fpm而言,是在worker进程accept一个请求并读取、解析完请求数据后的一个阶段。在这个阶段内,SAPI层将控制权交给PHP层,PHP初始化本次请求执行脚本所需的环境变量。 | ||
+ | # 执行脚本阶段 --- php_execute_script() | ||
+ | php代码解析执行的过程。Zend引擎接管控制权,将php脚本代码编译成opcodes并顺次执行 | ||
+ | # 请求关闭阶段 --- php_request_shutdown() | ||
+ | 请求处理完后就进入了结束阶段,PHP就会启动清理程序。这个阶段,将flush输出内容、发送http响应内容等,然后它会按顺序调用各个模块的RSHUTDOWN方法。 RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。 | ||
+ | # 模块关闭阶段 --- php_module_shutdown() | ||
+ | 该阶段在SAPI关闭时执行,与模块初始化阶段对应,这个阶段主要是进行资源的清理、php各模块的关闭操作,同时,将回调各扩展的module shutdown钩子函数。这是发生在所有请求都已经结束之后,例如关闭fpm的操作。(这个是对于CGI和CLI等SAPI,没有“下一个请求”,所以SAPI立刻开始关闭。) | ||
+ | |||
+ | |||
+ | == 504问题排查 == | ||
+ | Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI | ||
+ | |||
+ | * 问题排查:nginx错误日志,fpm日志,应用日志。 | ||
+ | ** nginx作为调用方交由php处理的任务长时间没有返回、php作为服务提供者,严重耗时,长时间延迟。 | ||
+ | ** php-fpm模式下,php处理耗时比较长任务时,会发生堵塞。 | ||
+ | * 解决 | ||
+ | ** 修改配置,最大内存,执行时间。。。 | ||
+ | ** 如果是数据库耗时,优化数据库结构,比如加索引 | ||
+ | ** 如果是程序耗时,可以采用异步的方法, | ||
+ | |||
+ | |||
+ | == laravel orm加全局条件? == | ||
+ | |||
+ | # 实现Illuminate\Database\Eloquent\ScopeInterface接口,apply方法 | ||
+ | # 重写boot方法, static::addGlobalScope(new ScopeName); | ||
+ | |||
+ | |||
+ | == laravel 事件 == | ||
+ | # 创建事件、 监听器 | ||
+ | # EventServiceProvider中注册 | ||
+ | # event函数调用 | ||
+ | |||
+ | == sql优化举例 == | ||
+ | # 加索引 | ||
+ | # 尽量避免计算,大于小于不等于、使用函数、隐式类型转换 | ||
+ | # like ”%“开头的 | ||
+ | # 批量insert | ||
+ | # 分页 | ||
+ | |||
+ | * sql语句优化,索引优化 | ||
+ | * 使用缓存、尽量减少数据库IO | ||
+ | * 分布式 | ||
+ | |||
+ | == sql语句的执行顺序 == | ||
+ | 开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果 |
2019年10月29日 (二) 23:03的最新版本
目录
- 1 cookie 和 session 的区别
- 2 post 和 get 的区别
- 3 转发和重定向的区别
- 4 堆栈区别
- 5 并发和并行的区别
- 6 索引
- 7 存储引擎
- 8 数据库,事务,隔离级别,存储引擎
- 9 redis,有什么优势 -memcache对比
- 10 http\https
- 11 数据库的存储引擎应用场景,索引结构
- 12 大数据量的优化
- 13 设计一个权限系统
- 14 算法题
- 15 红黑树
- 16 多线程,sleep,wait,yield
- 17 restful
- 18 设计模式,单例模式,适配器模式
- 19 操作系统,死锁
- 20 快排时间复杂度
- 21 nginx可承受的压力
- 22 项目
- 23 服务调用超时可能由什么造成
- 24 进程间的通信方式
- 25 fpm
- 26 nginx
- 27 php array 结构
- 28 处理负载,高并发?
- 29 Laravel请求生命周期
- 30 php生命周期
- 31 504问题排查
- 32 laravel orm加全局条件?
- 33 laravel 事件
- 34 sql优化举例
- 35 sql语句的执行顺序
cookie 和 session 的区别
- 作用范围不同,Cookie 保存在客户端(浏览器),Session 保存在服务器端。
- 存取方式的不同,Cookie 只能保存 ASCII,Session 可以存任意数据类型,一般情况下我们可以在 Session 中保持一些常用变量信息,比如说 UserId 等。
- 有效期不同,Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭或者 Session 超时都会失效。
- 隐私策略不同,Cookie 存储在客户端,比较容易遭到不法获取,早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取;Session 存储在服务端,安全性相对 Cookie 要好一些。
- 存储大小不同, 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie。
分布式session
ip_hash Session 复制 缓存中间件
post 和 get 的区别
https://www.w3school.com.cn/tags/html_ref_httpmethods.asp
GET 用于获取信息,是无副作用的,是幂等的,且可缓存 POST 用于修改服务器上的数据,有副作用,非幂等,不可缓存
- 安全?post请求不会保留在浏览器历史记录中
GET | POST | |
---|---|---|
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。 |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 能被缓存 | 不能缓存 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。 |
历史 | 参数保留在浏览器历史中。 | 参数不会保存在浏览器历史中。 |
对数据长度的限制 | 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 | 无限制。 |
对数据类型的限制 | 只允许 ASCII 字符。 | 没有限制。也允许二进制数据。 |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。
在发送密码或其他敏感信息时绝不要使用 GET ! |
POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。 |
可见性 | 数据在 URL 中对所有人都是可见的。 | 数据不会显示在 URL 中。 |
转发和重定向的区别
转发
1. 是服务器内部的重定向,服务器直接访问目标地址的 url网址,把里面的东西读取出来,但是客户端并不知道,因此用forward的话,客户端浏览器的网址是不会发生变化的。
2. 关于request: 由于在整个定向的过程中用的是同一个request,因此forward会将request的信息带到被重定向的地址中。
重定向
1.是客户端的重定向,是完全的跳转。即服务器返回的一个url给客户端浏览器,然后客户端浏览器会重新发送一次请求,到新的url里面,因此浏览器中显示的url网址会发生变化。
2.因为这种方式比forward多了一次网络请求,因此效率会低于forward。
堆栈区别
并发和并行的区别
行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
索引
不走索引
行级锁和表级锁
行级锁定的优点:
· 当在许多线程中访问不同的行时只存在少量锁定冲突。
· 回滚时只有少量的更改。
· 可以长时间锁定单一的行。
行级锁定的缺点:
· 比页级或表级锁定占用更多的内存。
· 当在表的大部分中使用时,比页级或表级锁定速度慢,因为你必须获取更多的锁。
· 如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表,比其它锁定明显慢很多。
· 用高级别锁定,通过支持不同的类型锁定,你也可以很容易地调节应用程序,因为其锁成本小于行级锁定。
存储引擎
- InnoDB
数据库,事务,隔离级别,存储引擎
- 数据库,三大范式
redis,有什么优势 -memcache对比
数据存储位置
- redis: 内存、磁盘(数据持久化)
- memcache: 内存
存储数据的类型(都是键值对的形式)值的类型:
- redis:list、set、hash、string、zset等
- memcache:string
http\https
- 默认端口不同80:443
- https需要颁发证书
- HTTPS协议的安全性更高
- https缺点
- 速度慢
- 服务器成本
数据库的存储引擎应用场景,索引结构
MyISAM表使用B型树索引。 读取场景下性能好,表锁,不能事务
InnoDB是为处理巨大数据量时的最大性能设计。B树。由于是行锁,写入、更新速度可能会快。
MEMORY表被存储在内存中,且默认使用哈希索引
为什么索引结构默认使用B-Tree,而不是hash,二叉树,红黑树?
- hash:虽然可以快速定位,但是没有顺序,IO复杂度高。
- 二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高。
- 红黑树:树的高度随着数据量增加而增加,IO代价高。
为什么建议使用自增长主键作为索引。
结合B+Tree的特点,自增主键是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插入到最后。总之就是减少分裂和移动的频率。
大数据量的优化
- 分区、分表、分库
设计一个权限系统
算法题
红黑树
多线程,sleep,wait,yield
restful
设计模式,单例模式,适配器模式
操作系统,死锁
快排时间复杂度
nginx可承受的压力
项目
- 项目难点
- 架构优化
- 难点
- 主要业务
服务调用超时可能由什么造成
- 网络问题,是否繁忙?
- cpu、内存排查,cpu消耗高,处理不过来
- 服务端有没有收到请求,看请求响应时间
- 客服端网络、cpu等有问题
进程间的通信方式
fpm
- 进程管理方式pm,静态、动态。
- 合适的超时时间request_terminate_timeout、max_execution_time
- 看服务器性能,设置进程数量max_children
- fpm进程处理最大请求数max_requests
nginx
- worker_processes 8; #nginx进程数,建议按照cpu数目来指定,一般为它的倍数,平时设置为2倍。
- 静态资源缓存
- nginx打开文件的最大个数
- buffer: 如果buffer太小,Nginx会不停的写一些临时文件,这样会导致磁盘不停的去读写
php array 结构
hashtable+映射表的方式
hash=>映射表=>bucket
映射表与bucket长度相同
hash冲突的情况:链地址法。next设置为相同hash的索引,然后在映射表里的值替换成当前元素在bucket中的位置。
处理负载,高并发?
- HTML静态化
- 效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。
- 图片服务器分离
- 把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛等
- 数据库的优化,包括合理的事务隔离级别、SQL语句优化、索引优化
- 避免慢查询过多阻塞
- 数据库集群和库表散列及缓存,使用缓存、尽量减少数据库IO
- 数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。
- 镜像:
- 尽量减少下载,可以把不同的请求分发到多个镜像端。
- 负载均衡:
- Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。
Laravel请求生命周期
- 、Laravel 采用了单一入口模式,应用的所有请求入口都是 public/index.php 文件。
- 、注册类文件自动加载器 : Laravel通过 composer 进行依赖管理,无需开发者手动导入各种类文件,而由自动加载器自行导入。
- 、创建服务容器:从 bootstrap/app.php 文件中取得 Laravel 应用实例 $app (服务容器)。
- 、创建 HTTP / Console 内核:传入的请求会被发送给 HTTP 内核或者 console 内核进行处理
- 、载入服务提供者至容器:在内核引导启动的过程中最重要的动作之一就是载入服务提供者到你的应用,服务提供者负责引导启动框架的全部各种组件,例如数据库、队列、验证器以及路由组件。
- 、分发请求:一旦应用完成引导和所有服务提供者都注册完成,Request 将会移交给路由进行分发。路由将分发请求给一个路由或控制器,同时运行路由指定的中间件
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/80637277
php生命周期
- 模块初始化阶段 --- php_module_startup()
这个阶段主要进行php框架、zend引擎的初始化操作。这个阶段一般是在SAPI启动时执行一次,对于FPM而言,就是在fpm的master进行启动时执行的。php加载每个扩展的代码并调用其模块初始化例程(MINIT),进行一些模块所需变量的申请,内存分配等。
- 请求初始化阶段 --- php_request_startup()
当一个页面请求发生时,在请求处理前都会经历的一个阶段。对于fpm而言,是在worker进程accept一个请求并读取、解析完请求数据后的一个阶段。在这个阶段内,SAPI层将控制权交给PHP层,PHP初始化本次请求执行脚本所需的环境变量。
- 执行脚本阶段 --- php_execute_script()
php代码解析执行的过程。Zend引擎接管控制权,将php脚本代码编译成opcodes并顺次执行
- 请求关闭阶段 --- php_request_shutdown()
请求处理完后就进入了结束阶段,PHP就会启动清理程序。这个阶段,将flush输出内容、发送http响应内容等,然后它会按顺序调用各个模块的RSHUTDOWN方法。 RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。
- 模块关闭阶段 --- php_module_shutdown()
该阶段在SAPI关闭时执行,与模块初始化阶段对应,这个阶段主要是进行资源的清理、php各模块的关闭操作,同时,将回调各扩展的module shutdown钩子函数。这是发生在所有请求都已经结束之后,例如关闭fpm的操作。(这个是对于CGI和CLI等SAPI,没有“下一个请求”,所以SAPI立刻开始关闭。)
504问题排查
Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI
- 问题排查:nginx错误日志,fpm日志,应用日志。
- nginx作为调用方交由php处理的任务长时间没有返回、php作为服务提供者,严重耗时,长时间延迟。
- php-fpm模式下,php处理耗时比较长任务时,会发生堵塞。
- 解决
- 修改配置,最大内存,执行时间。。。
- 如果是数据库耗时,优化数据库结构,比如加索引
- 如果是程序耗时,可以采用异步的方法,
laravel orm加全局条件?
- 实现Illuminate\Database\Eloquent\ScopeInterface接口,apply方法
- 重写boot方法, static::addGlobalScope(new ScopeName);
laravel 事件
- 创建事件、 监听器
- EventServiceProvider中注册
- event函数调用
sql优化举例
- 加索引
- 尽量避免计算,大于小于不等于、使用函数、隐式类型转换
- like ”%“开头的
- 批量insert
- 分页
- sql语句优化,索引优化
- 使用缓存、尽量减少数据库IO
- 分布式
sql语句的执行顺序
开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果