<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.yaosong.live/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Yaosong</id>
	<title>YS的笔记 - 用户贡献 [zh-cn]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.yaosong.live/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Yaosong"/>
	<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/wiki/%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/Yaosong"/>
	<updated>2026-05-18T05:41:20Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.35.0-alpha</generator>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=150</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=150"/>
		<updated>2023-06-15T06:00:14Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* 菜单 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==菜单==&lt;br /&gt;
&lt;br /&gt;
*[[PHP]]&lt;br /&gt;
*[[Python]]&lt;br /&gt;
*[[Rabbitmq]]&lt;br /&gt;
*[[钉钉]]&lt;br /&gt;
*[[Nginx]]&lt;br /&gt;
*[[Linux]]&lt;br /&gt;
*[[windows]]&lt;br /&gt;
*[[Laravel]]&lt;br /&gt;
*[[微信X5调试]]&lt;br /&gt;
*[[vim]]&lt;br /&gt;
*[[办事]]&lt;br /&gt;
*[[nas]]&lt;br /&gt;
*[[Golang]]&lt;br /&gt;
&lt;br /&gt;
==工具==&lt;br /&gt;
&lt;br /&gt;
*[http://rufus.ie/ u盘引导盘制作工具]&lt;br /&gt;
*[https://github.com/Genymobile/scrcpy 手机投屏工具]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;seo titlemode=&amp;quot;append&amp;quot; keywords=&amp;quot;php python linux 微信&amp;quot; description=&amp;quot;开发技术笔记&amp;quot;&amp;gt;&amp;lt;/seo&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Nginx&amp;diff=149</id>
		<title>Nginx</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Nginx&amp;diff=149"/>
		<updated>2023-06-15T05:59:25Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：创建页面，内容为“==location的优先级==  在Nginx中，location的优先级顺序如下：  *精确匹配（=） *前缀字符串匹配（^~） *正则表达式匹配（~和~*） *…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==location的优先级==&lt;br /&gt;
&lt;br /&gt;
在Nginx中，location的优先级顺序如下：&lt;br /&gt;
&lt;br /&gt;
*精确匹配（=）&lt;br /&gt;
*前缀字符串匹配（^~）&lt;br /&gt;
*正则表达式匹配（~和~*）&lt;br /&gt;
*前缀字符串匹配&lt;br /&gt;
&lt;br /&gt;
首先，Nginx会检查精确匹配的location。如果找到精确匹配，则搜索终止。如果没有找到精确匹配，则Nginx会检查前缀字符串匹配的location。在这些location中，选择并记住最长匹配前缀的location。如果最长匹配前缀位置具有“^〜”修饰符，则不检查正则表达式。&lt;br /&gt;
&lt;br /&gt;
然后，按照它们在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一个匹配处终止，并使用相应的配置。如果没有找到与正则表达式匹配，则使用先前记住的前缀位置的配置。&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=148</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=148"/>
		<updated>2023-01-13T09:45:34Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* 菜单 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==菜单==&lt;br /&gt;
&lt;br /&gt;
*[[PHP]]&lt;br /&gt;
*[[Python]]&lt;br /&gt;
*[[Rabbitmq]]&lt;br /&gt;
*[[钉钉]]&lt;br /&gt;
*[[Linux]]&lt;br /&gt;
*[[windows]]&lt;br /&gt;
*[[Laravel]]&lt;br /&gt;
*[[微信X5调试]]&lt;br /&gt;
*[[vim]]&lt;br /&gt;
*[[办事]]&lt;br /&gt;
*[[nas]]&lt;br /&gt;
*[[Golang]]&lt;br /&gt;
&lt;br /&gt;
==工具==&lt;br /&gt;
&lt;br /&gt;
*[http://rufus.ie/ u盘引导盘制作工具]&lt;br /&gt;
*[https://github.com/Genymobile/scrcpy 手机投屏工具]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;seo titlemode=&amp;quot;append&amp;quot; keywords=&amp;quot;php python linux 微信&amp;quot; description=&amp;quot;开发技术笔记&amp;quot;&amp;gt;&amp;lt;/seo&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Golang&amp;diff=147</id>
		<title>Golang</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Golang&amp;diff=147"/>
		<updated>2023-01-13T09:40:20Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;性能分析工具pprof&lt;br /&gt;
 &amp;lt;code&amp;gt;pprofFile, pprofErr := os.Create(&amp;quot;cpu.pprof&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;if pprofErr != nil {&amp;lt;/code&amp;gt;&lt;br /&gt;
   &amp;lt;code&amp;gt;log.Fatal(pprofErr)&amp;lt;/code&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;pprof.StartCPUProfile(pprofFile)&amp;lt;/code&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;defer pprof.StopCPUProfile()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;go tool pprof -http=&amp;quot;:8000&amp;quot; ./cpu.pprof&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
打印编译器转义分析决策&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;go build -gcflags=-m demo.go&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Golang&amp;diff=146</id>
		<title>Golang</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Golang&amp;diff=146"/>
		<updated>2023-01-13T09:31:09Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;pprofFile, pprofErr := os.Create(&amp;quot;cpu.pprof&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;if pprofErr != nil {&amp;lt;/code&amp;gt;&lt;br /&gt;
   &amp;lt;code&amp;gt;log.Fatal(pprofErr)&amp;lt;/code&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;pprof.StartCPUProfile(pprofFile)&amp;lt;/code&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;defer pprof.StopCPUProfile()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;go tool pprof -http=&amp;quot;:8000&amp;quot; ./cpu.pprof&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;go build -gcflags=-m demo.go&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Golang&amp;diff=145</id>
		<title>Golang</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Golang&amp;diff=145"/>
		<updated>2023-01-13T09:30:15Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：创建页面，内容为“&amp;lt;br /&amp;gt;&amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;  &amp;lt;code&amp;gt;pprofFile, pprofErr := os.Create(&amp;quot;cpu.pprof&amp;quot;)&amp;lt;/code&amp;gt;   &amp;lt;code&amp;gt;if pprofErr != nil {&amp;lt;/code&amp;gt;     &amp;lt;code&amp;gt;log.Fatal(pprofErr)&amp;lt;/code&amp;gt;…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br /&amp;gt;&amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;pprofFile, pprofErr := os.Create(&amp;quot;cpu.pprof&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;if pprofErr != nil {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;code&amp;gt;log.Fatal(pprofErr)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;pprof.StartCPUProfile(pprofFile)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;defer pprof.StopCPUProfile()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;go tool pprof -http=&amp;quot;:8000&amp;quot; ./cpu.pprof&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;go build -gcflags=-m demo.go&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E5%8A%9E%E4%BA%8B&amp;diff=144</id>
		<title>办事</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E5%8A%9E%E4%BA%8B&amp;diff=144"/>
		<updated>2020-01-08T09:22:32Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
[http://ggfw.rsj.sh.gov.cn/ 上海市人力资源和社会保障局公共服务平台]&lt;br /&gt;
&lt;br /&gt;
[https://gaj.sh.gov.cn/wa/login.jsp 上海互联网安全综合服务网]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 网站维护 ==&lt;br /&gt;
[https://gaj.sh.gov.cn/wa/ 上海公安备案]&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=143</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=143"/>
		<updated>2020-01-08T09:19:10Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== 菜单 ==&lt;br /&gt;
* [[PHP]]&lt;br /&gt;
* [[Python]]&lt;br /&gt;
* [[Rabbitmq]]&lt;br /&gt;
* [[钉钉]]&lt;br /&gt;
* [[Linux]]&lt;br /&gt;
* [[windows]]&lt;br /&gt;
* [[Laravel]]&lt;br /&gt;
* [[微信X5调试]]&lt;br /&gt;
* [[vim]]&lt;br /&gt;
* [[办事]]&lt;br /&gt;
* [[nas]]&lt;br /&gt;
&lt;br /&gt;
== 工具 ==&lt;br /&gt;
* [http://rufus.ie/ u盘引导盘制作工具]&lt;br /&gt;
* [https://github.com/Genymobile/scrcpy 手机投屏工具]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;seo titlemode =&amp;quot;append&amp;quot; keywords=&amp;quot;php python linux 微信&amp;quot; description =&amp;quot;开发技术笔记&amp;quot;&amp;gt;&amp;lt;/seo&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E5%8A%9E%E4%BA%8B&amp;diff=142</id>
		<title>办事</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E5%8A%9E%E4%BA%8B&amp;diff=142"/>
		<updated>2020-01-04T08:16:46Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
[http://ggfw.rsj.sh.gov.cn/ 上海市人力资源和社会保障局公共服务平台]&lt;br /&gt;
&lt;br /&gt;
[https://gaj.sh.gov.cn/wa/login.jsp 上海互联网安全综合服务网]&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E8%B7%AF%E7%94%B1%E5%99%A8&amp;diff=141</id>
		<title>路由器</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E8%B7%AF%E7%94%B1%E5%99%A8&amp;diff=141"/>
		<updated>2019-12-28T06:11:10Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：创建页面，内容为“小米路由器ss  小米路由器ssh权限   安装misstar工具箱 https://bbs.misstar.com/?thread-6.htm  用不了问题修复 https://bbs.misstar.com/?thread-191…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;小米路由器ss&lt;br /&gt;
&lt;br /&gt;
小米路由器ssh权限&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
安装misstar工具箱&lt;br /&gt;
https://bbs.misstar.com/?thread-6.htm&lt;br /&gt;
&lt;br /&gt;
用不了问题修复&lt;br /&gt;
https://bbs.misstar.com/?thread-191.htm&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=140</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=140"/>
		<updated>2019-12-25T15:06:25Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== 菜单 ==&lt;br /&gt;
* [[PHP]]&lt;br /&gt;
* [[Python]]&lt;br /&gt;
* [[Rabbitmq]]&lt;br /&gt;
* [[钉钉]]&lt;br /&gt;
* [[Linux]]&lt;br /&gt;
* [[windows]]&lt;br /&gt;
* [[Laravel]]&lt;br /&gt;
* [[微信X5调试]]&lt;br /&gt;
* [[vim]]&lt;br /&gt;
* [[办事]]&lt;br /&gt;
* [[nas]]&lt;br /&gt;
&lt;br /&gt;
== 工具 ==&lt;br /&gt;
* [http://rufus.ie/ u盘引导盘制作工具]&lt;br /&gt;
* [https://github.com/Genymobile/scrcpy 手机投屏工具]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;seo title =&amp;quot;首页&amp;quot; titlemode =&amp;quot;append&amp;quot; keywords=&amp;quot;php python linux 微信&amp;quot; description =&amp;quot;开发技术笔记&amp;quot;&amp;gt;&amp;lt;/seo&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Nas&amp;diff=137</id>
		<title>Nas</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Nas&amp;diff=137"/>
		<updated>2019-12-10T14:44:54Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;记录下qnap ts453bmini的装机流程。&lt;br /&gt;
&lt;br /&gt;
* 公网访问&lt;br /&gt;
* 使用自己的域名做ddns&lt;br /&gt;
&lt;br /&gt;
# 购买&lt;br /&gt;
## 京东买的ts453bmini&lt;br /&gt;
## 东芝TR200 480G ssd。机器不带硬盘，买了个ssd放第一个盘位，打算放常用数据，后面再加机械硬盘。&lt;br /&gt;
# 插上电之后，扫码打开网页，按提示一步一步操作就可以了。&lt;br /&gt;
# 安装完成后，在同一个路由器下访问机器的ip，就可以访问了。&lt;br /&gt;
## 这里遇到一个问题，区域设置成中国，应用商店打不开，然后改成全球就可以了。&lt;br /&gt;
# 外网访问&lt;br /&gt;
##  装完之后局域网可以访问了，但是想在不在家的时候访问qnap，就得搞定外网访问了。可以通过设置dmz主机搞定。&lt;br /&gt;
## 我是上海电信的宽带，光猫是悦me网关（F450G），机器上有管理员账号(useradmin)密码可以登录网关，但是里面没有dmz的设置选项。然后这里需要找到电信客服报修，跟负责维修的师傅说明情况，师傅会把超级管理员密码发给你，然后就可以用超级管理员账号(用户名:telecomadmin)登录了。应用-》高级NAT设置-》DMZ设置。[[文件:F450Gdmz设置.png|600px]]&lt;br /&gt;
## 这里有一个坑，设置完之后通过公网ip访问一直没反应，最后突然发现用手机4G网络访问却是正常访问的。不知道是个什么原理，但是原因确实是在自己的网络下访问自己的公网ip请求是到不了自己的网络上的。。。&lt;br /&gt;
## 然后是端口，电信应该是拦截了80和443端口的，所以必需改成其他的端口号才能访问。在qts（qnap的操作系统）系统的控制台-》常规设置-》系统管理-》系统端口 里改成自己想要的端口，我是改成5000。&lt;br /&gt;
## 所有操作完之后，外网应该就可以访问了，不在家也能操作自己的nas了~&lt;br /&gt;
# 家里的ip可能经常会变，然后可以在qts系统的控制台-》myQNAPcloud云服务-》My DDNS 里面，开启ddns服务&lt;br /&gt;
# 如果嫌他的域名不要记的话，可以自己注册一个域名，然后qts系统的控制台-》网络与虚拟交换机 -》 DDNS 里面，新增一个自己的DDNS，动态解析域名到家里的ip~&lt;br /&gt;
## 我用的是阿里云注册的域名&lt;br /&gt;
## 因为我有一台云服务器，所以采用的是nas-》我的服务器-》修改阿里云域名解析的方式。其实可以直接在nas上写个脚本调用阿里云的域名解析接口修改。&lt;br /&gt;
## pip install aliyun-python-sdk-alidns&lt;br /&gt;
## python脚本dns.py:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
#coding=utf-8&lt;br /&gt;
&lt;br /&gt;
from aliyunsdkcore.client import AcsClient&lt;br /&gt;
from aliyunsdkcore.acs_exception.exceptions import ClientException&lt;br /&gt;
from aliyunsdkcore.acs_exception.exceptions import ServerException&lt;br /&gt;
from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest&lt;br /&gt;
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest&lt;br /&gt;
import json;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
client = AcsClient('阿里云accessId', '阿里云secret', 'cn-hangzhou')&lt;br /&gt;
&lt;br /&gt;
if len(sys.argv) != 2:&lt;br /&gt;
    print('参数错误')&lt;br /&gt;
    exit()&lt;br /&gt;
&lt;br /&gt;
def setVal(recordId, rr, strType, ip):&lt;br /&gt;
    request = UpdateDomainRecordRequest()&lt;br /&gt;
    request.set_accept_format('json')&lt;br /&gt;
    &lt;br /&gt;
    request.set_RecordId(recordId)&lt;br /&gt;
    request.set_RR(rr)&lt;br /&gt;
    request.set_Type(strType)&lt;br /&gt;
    request.set_Value(ip)&lt;br /&gt;
    &lt;br /&gt;
    response = client.do_action_with_exception(request)&lt;br /&gt;
    # python2:  print(response) &lt;br /&gt;
    print(str(response, encoding='utf-8'))&lt;br /&gt;
&lt;br /&gt;
ip = sys.argv[1]&lt;br /&gt;
&lt;br /&gt;
request = DescribeDomainRecordsRequest()&lt;br /&gt;
request.set_accept_format('json')&lt;br /&gt;
&lt;br /&gt;
request.set_DomainName(&amp;quot;yaosong.live&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
response = client.do_action_with_exception(request)&lt;br /&gt;
# python2:  print(response) &lt;br /&gt;
# print(str(response, encoding='utf-8'))&lt;br /&gt;
lists = json.loads(str(response, encoding='utf-8'))&lt;br /&gt;
for i in lists['DomainRecords']['Record']:&lt;br /&gt;
    if i['DomainName'] == 'yaosong.live' and i['RR'] == 'nas' and i['Value'] != ip:&lt;br /&gt;
        setVal(i['RecordId'], i['RR'], i['Type'], ip)&lt;br /&gt;
        # setVal(i[''])&lt;br /&gt;
        break;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
## 执行：python3 dns.py IP地址&lt;br /&gt;
## 脚本测试没有问题之后，部署一个http服务，能够接收nas发出的ddns请求，我的是&amp;lt;code&amp;gt;https://xxx.yaosong.live/nasdns?hostname=%HOST%&amp;amp;username=%USER%&amp;amp;password=%PASS%&amp;amp;IP=%IP%&amp;lt;/code&amp;gt;，服务里面执行python脚本就可以了。&lt;br /&gt;
## 我的域名是nas.yaosong.live，然后我就可以通过http://nas.yaosong.live:5000访问我的nas了~&lt;br /&gt;
&lt;br /&gt;
最后，在局域网内就不要访问公网ip或者域名了，访问内网ip吧...&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Nas&amp;diff=136</id>
		<title>Nas</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Nas&amp;diff=136"/>
		<updated>2019-12-10T14:43:22Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;记录下qnap ts453bmini的装机流程。&lt;br /&gt;
&lt;br /&gt;
# 购买&lt;br /&gt;
## 京东买的ts453bmini&lt;br /&gt;
## 东芝TR200 480G ssd。机器不带硬盘，买了个ssd放第一个盘位，打算放常用数据，后面再加机械硬盘。&lt;br /&gt;
# 插上电之后，扫码打开网页，按提示一步一步操作就可以了。&lt;br /&gt;
# 安装完成后，在同一个路由器下访问机器的ip，就可以访问了。&lt;br /&gt;
## 这里遇到一个问题，区域设置成中国，应用商店打不开，然后改成全球就可以了。&lt;br /&gt;
# 外网访问&lt;br /&gt;
##  装完之后局域网可以访问了，但是想在不在家的时候访问qnap，就得搞定外网访问了。可以通过设置dmz主机搞定。&lt;br /&gt;
## 我是上海电信的宽带，光猫是悦me网关（F450G），机器上有管理员账号(useradmin)密码可以登录网关，但是里面没有dmz的设置选项。然后这里需要找到电信客服报修，跟负责维修的师傅说明情况，师傅会把超级管理员密码发给你，然后就可以用超级管理员账号(用户名:telecomadmin)登录了。应用-》高级NAT设置-》DMZ设置。[[文件:F450Gdmz设置.png|600px]]&lt;br /&gt;
## 这里有一个坑，设置完之后通过公网ip访问一直没反应，最后突然发现用手机4G网络访问却是正常访问的。不知道是个什么原理，但是原因确实是在自己的网络下访问自己的公网ip请求是到不了自己的网络上的。。。&lt;br /&gt;
## 然后是端口，电信应该是拦截了80和443端口的，所以必需改成其他的端口号才能访问。在qts（qnap的操作系统）系统的控制台-》常规设置-》系统管理-》系统端口 里改成自己想要的端口，我是改成5000。&lt;br /&gt;
## 所有操作完之后，外网应该就可以访问了，不在家也能操作自己的nas了~&lt;br /&gt;
# 家里的ip可能经常会变，然后可以在qts系统的控制台-》myQNAPcloud云服务-》My DDNS 里面，开启ddns服务&lt;br /&gt;
# 如果嫌他的域名不要记的话，可以自己注册一个域名，然后qts系统的控制台-》网络与虚拟交换机 -》 DDNS 里面，新增一个自己的DDNS，动态解析域名到家里的ip~&lt;br /&gt;
## 我用的是阿里云注册的域名&lt;br /&gt;
## 因为我有一台云服务器，所以采用的是nas-》我的服务器-》修改阿里云域名解析的方式。其实可以直接在nas上写个脚本调用阿里云的域名解析接口修改。&lt;br /&gt;
## pip install aliyun-python-sdk-alidns&lt;br /&gt;
## python脚本dns.py:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
#coding=utf-8&lt;br /&gt;
&lt;br /&gt;
from aliyunsdkcore.client import AcsClient&lt;br /&gt;
from aliyunsdkcore.acs_exception.exceptions import ClientException&lt;br /&gt;
from aliyunsdkcore.acs_exception.exceptions import ServerException&lt;br /&gt;
from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest&lt;br /&gt;
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest&lt;br /&gt;
import json;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
client = AcsClient('阿里云accessId', '阿里云secret', 'cn-hangzhou')&lt;br /&gt;
&lt;br /&gt;
if len(sys.argv) != 2:&lt;br /&gt;
    print('参数错误')&lt;br /&gt;
    exit()&lt;br /&gt;
&lt;br /&gt;
def setVal(recordId, rr, strType, ip):&lt;br /&gt;
    request = UpdateDomainRecordRequest()&lt;br /&gt;
    request.set_accept_format('json')&lt;br /&gt;
    &lt;br /&gt;
    request.set_RecordId(recordId)&lt;br /&gt;
    request.set_RR(rr)&lt;br /&gt;
    request.set_Type(strType)&lt;br /&gt;
    request.set_Value(ip)&lt;br /&gt;
    &lt;br /&gt;
    response = client.do_action_with_exception(request)&lt;br /&gt;
    # python2:  print(response) &lt;br /&gt;
    print(str(response, encoding='utf-8'))&lt;br /&gt;
&lt;br /&gt;
ip = sys.argv[1]&lt;br /&gt;
&lt;br /&gt;
request = DescribeDomainRecordsRequest()&lt;br /&gt;
request.set_accept_format('json')&lt;br /&gt;
&lt;br /&gt;
request.set_DomainName(&amp;quot;yaosong.live&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
response = client.do_action_with_exception(request)&lt;br /&gt;
# python2:  print(response) &lt;br /&gt;
# print(str(response, encoding='utf-8'))&lt;br /&gt;
lists = json.loads(str(response, encoding='utf-8'))&lt;br /&gt;
for i in lists['DomainRecords']['Record']:&lt;br /&gt;
    if i['DomainName'] == 'yaosong.live' and i['RR'] == 'nas' and i['Value'] != ip:&lt;br /&gt;
        setVal(i['RecordId'], i['RR'], i['Type'], ip)&lt;br /&gt;
        # setVal(i[''])&lt;br /&gt;
        break;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
## 执行：python3 dns.py IP地址&lt;br /&gt;
## 脚本测试没有问题之后，部署一个http服务，能够接收nas发出的ddns请求，我的是&amp;lt;code&amp;gt;https://xxx.yaosong.live/nasdns?hostname=%HOST%&amp;amp;username=%USER%&amp;amp;password=%PASS%&amp;amp;IP=%IP%&amp;lt;/code&amp;gt;，服务里面执行python脚本就可以了。&lt;br /&gt;
## 我的域名是nas.yaosong.live，然后我就可以通过http://nas.yaosong.live:5000访问我的nas了~&lt;br /&gt;
&lt;br /&gt;
最后，在局域网内就不要访问公网ip或者域名了，访问内网ip吧...&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Nas&amp;diff=135</id>
		<title>Nas</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Nas&amp;diff=135"/>
		<updated>2019-12-10T14:38:28Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：创建页面，内容为“记录下qnap ts453bmini的装机流程。  # 购买 ## 京东买的ts453bmini ## 东芝TR200 480G ssd。机器不带硬盘，买了个ssd放第一个盘位，打算…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;记录下qnap ts453bmini的装机流程。&lt;br /&gt;
&lt;br /&gt;
# 购买&lt;br /&gt;
## 京东买的ts453bmini&lt;br /&gt;
## 东芝TR200 480G ssd。机器不带硬盘，买了个ssd放第一个盘位，打算放常用数据，后面再加机械硬盘。&lt;br /&gt;
# 插上电之后，扫码打开网页，按提示一步一步操作就可以了。&lt;br /&gt;
# 安装完成后，在同一个路由器下访问机器的ip，就可以访问了。&lt;br /&gt;
## 这里遇到一个问题，区域设置成中国，应用商店打不开，然后改成全球就可以了。&lt;br /&gt;
# 外网访问&lt;br /&gt;
##  装完之后局域网可以访问了，但是想在不在家的时候访问qnap，就得搞定外网访问了。可以通过设置dmz主机搞定。&lt;br /&gt;
## 我是上海电信的宽带，光猫是悦me网关（F450G），机器上有管理员账号(useradmin)密码可以登录网关，但是里面没有dmz的设置选项。然后这里需要找到电信客服报修，跟负责维修的师傅说明情况，师傅会把超级管理员密码发给你，然后就可以用超级管理员账号(用户名:telecomadmin)登录了。应用-》高级NAT设置-》DMZ设置。[[文件:F450Gdmz设置.png|600px]]&lt;br /&gt;
## 这里有一个坑，设置完之后通过公网ip访问一直没反应，最后突然发现用手机4G网络访问却是正常访问的。不知道是个什么原理，但是原因确实是在自己的网络下访问自己的公网ip请求是到不了自己的网络上的。。。&lt;br /&gt;
## 然后是端口，电信应该是拦截了80和443端口的，所以必需改成其他的端口号才能访问。在qts（qnap的操作系统）系统的控制台-》常规设置-》系统管理-》系统端口 里改成自己想要的端口，我是改成5000。&lt;br /&gt;
## 所有操作完之后，外网应该就可以访问了，不在家也能操作自己的nas了~&lt;br /&gt;
# 家里的ip可能经常会变，然后可以在qts系统的控制台-》myQNAPcloud云服务-》My DDNS 里面，开启ddns服务&lt;br /&gt;
# 如果嫌他的域名不要记的话，可以自己注册一个域名，然后qts系统的控制台-》网络与虚拟交换机 -》 DDNS 里面，新增一个自己的DDNS，动态解析域名到家里的ip~&lt;br /&gt;
## 我用的是阿里云注册的域名&lt;br /&gt;
## 因为我有一台云服务器，所以采用的是nas-》我的服务器-》修改阿里云域名解析的方式。其实可以直接在nas上写个脚本调用阿里云的域名解析接口修改。&lt;br /&gt;
## pip install aliyun-python-sdk-alidns&lt;br /&gt;
## python脚本dns.py:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
#coding=utf-8&lt;br /&gt;
&lt;br /&gt;
from aliyunsdkcore.client import AcsClient&lt;br /&gt;
from aliyunsdkcore.acs_exception.exceptions import ClientException&lt;br /&gt;
from aliyunsdkcore.acs_exception.exceptions import ServerException&lt;br /&gt;
from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest&lt;br /&gt;
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest&lt;br /&gt;
import json;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
client = AcsClient('阿里云accessId', '阿里云secret', 'cn-hangzhou')&lt;br /&gt;
&lt;br /&gt;
if len(sys.argv) != 2:&lt;br /&gt;
    print('参数错误')&lt;br /&gt;
    exit()&lt;br /&gt;
&lt;br /&gt;
def setVal(recordId, rr, strType, ip):&lt;br /&gt;
    request = UpdateDomainRecordRequest()&lt;br /&gt;
    request.set_accept_format('json')&lt;br /&gt;
    &lt;br /&gt;
    request.set_RecordId(recordId)&lt;br /&gt;
    request.set_RR(rr)&lt;br /&gt;
    request.set_Type(strType)&lt;br /&gt;
    request.set_Value(ip)&lt;br /&gt;
    &lt;br /&gt;
    response = client.do_action_with_exception(request)&lt;br /&gt;
    # python2:  print(response) &lt;br /&gt;
    print(str(response, encoding='utf-8'))&lt;br /&gt;
&lt;br /&gt;
ip = sys.argv[1]&lt;br /&gt;
&lt;br /&gt;
request = DescribeDomainRecordsRequest()&lt;br /&gt;
request.set_accept_format('json')&lt;br /&gt;
&lt;br /&gt;
request.set_DomainName(&amp;quot;yaosong.live&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
response = client.do_action_with_exception(request)&lt;br /&gt;
# python2:  print(response) &lt;br /&gt;
# print(str(response, encoding='utf-8'))&lt;br /&gt;
lists = json.loads(str(response, encoding='utf-8'))&lt;br /&gt;
for i in lists['DomainRecords']['Record']:&lt;br /&gt;
    if i['DomainName'] == 'yaosong.live' and i['RR'] == 'nas' and i['Value'] != ip:&lt;br /&gt;
        setVal(i['RecordId'], i['RR'], i['Type'], ip)&lt;br /&gt;
        # setVal(i[''])&lt;br /&gt;
        break;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
## 执行：python3 dns.py IP地址&lt;br /&gt;
## 脚本测试没有问题之后，部署一个http服务，能够接收nas发出的ddns请求，我的是&amp;lt;code&amp;gt;https://xxx.yaosong.live/nasdns?hostname=%HOST%&amp;amp;username=%USER%&amp;amp;password=%PASS%&amp;amp;IP=%IP%&amp;lt;/code&amp;gt;，服务里面执行python脚本就可以了。&lt;br /&gt;
## 我的域名是nas.yaosong.live，然后我就可以通过http://nas.yaosong.live:5000访问我的nas了~&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E6%96%87%E4%BB%B6:F450Gdmz%E8%AE%BE%E7%BD%AE.png&amp;diff=134</id>
		<title>文件:F450Gdmz设置.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E6%96%87%E4%BB%B6:F450Gdmz%E8%AE%BE%E7%BD%AE.png&amp;diff=134"/>
		<updated>2019-12-10T14:05:31Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=133</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=133"/>
		<updated>2019-12-10T13:31:02Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* 菜单 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== 菜单 ==&lt;br /&gt;
* [[PHP]]&lt;br /&gt;
* [[Python]]&lt;br /&gt;
* [[Rabbitmq]]&lt;br /&gt;
* [[钉钉]]&lt;br /&gt;
* [[Linux]]&lt;br /&gt;
* [[windows]]&lt;br /&gt;
* [[Laravel]]&lt;br /&gt;
* [[微信X5调试]]&lt;br /&gt;
* [[vim]]&lt;br /&gt;
* [[办事]]&lt;br /&gt;
* [[nas]]&lt;br /&gt;
&lt;br /&gt;
== 工具 ==&lt;br /&gt;
* [http://rufus.ie/ u盘引导盘制作工具]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;seo title =&amp;quot;首页&amp;quot; titlemode =&amp;quot;append&amp;quot; keywords=&amp;quot;php python linux 微信&amp;quot; description =&amp;quot;开发技术笔记&amp;quot;&amp;gt;&amp;lt;/seo&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E7%AE%97%E6%B3%95&amp;diff=131</id>
		<title>算法</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E7%AE%97%E6%B3%95&amp;diff=131"/>
		<updated>2019-11-28T09:37:27Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：创建页面，内容为“== 常用限流算法设计 == * 计数器法 * 漏桶算法 * 令牌桶算法”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 常用限流算法设计 ==&lt;br /&gt;
* 计数器法&lt;br /&gt;
* 漏桶算法&lt;br /&gt;
* 令牌桶算法&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Windows&amp;diff=130</id>
		<title>Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Windows&amp;diff=130"/>
		<updated>2019-11-27T07:57:06Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* PHP-FastCGI on Windows */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 查看80端口占用的程序 ==&lt;br /&gt;
# &amp;lt;code&amp;gt;netstat  -aon|findstr  &amp;quot;80&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
# 拿到上一步返回的pid，&amp;lt;code&amp;gt;tasklist|findstr {PID}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 切换hosts工具 ==&lt;br /&gt;
* SwitchHosts!   切换hosts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== PHP-FastCGI on Windows ==&lt;br /&gt;
在windows环境下使用RunHiddenConsole运行php-cgi。&lt;br /&gt;
[https://www.nginx.com/resources/wiki/start/topics/examples/phpfastcgionwindows/]&lt;br /&gt;
&lt;br /&gt;
# 安装nginx windows版本[https://windows.php.net/]&lt;br /&gt;
# 安装php windows版本[https://windows.php.net/] [https://windows.php.net/downloads/releases/]&lt;br /&gt;
# 安装RunHiddenConsole[https://redmine.lighttpd.net/attachments/download/660/RunHiddenConsole.zip]&lt;br /&gt;
&lt;br /&gt;
start-php-fcgi.bat&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
@ECHO OFF&lt;br /&gt;
ECHO Starting PHP FastCGI...&lt;br /&gt;
taskkill /F /IM php-cgi.exe&lt;br /&gt;
RunHiddenConsole.exe php-cgi.exe -b 127.0.0.1:9000 -c d:\dev\php-5.6.9\php.ini&lt;br /&gt;
RunHiddenConsole.exe php-cgi.exe -b 127.0.0.1:9001 -c d:\dev\php-5.6.9\php.ini&lt;br /&gt;
RunHiddenConsole.exe php-cgi.exe -b 127.0.0.1:9002 -c d:\dev\php-5.6.9\php.ini&lt;br /&gt;
RunHiddenConsole.exe php-cgi.exe -b 127.0.0.1:9003 -c d:\dev\php-5.6.9\php.ini&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
start-nginx.bat&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
:: 关闭回显，即执行本脚本时不显示执行路径和命令，直接显示结果&lt;br /&gt;
@echo off&lt;br /&gt;
rem @author luwuer&lt;br /&gt;
&lt;br /&gt;
color f8&lt;br /&gt;
set NGINX_DIR=D:\dev\nginx\&lt;br /&gt;
&lt;br /&gt;
cd %NGINX_DIR%&lt;br /&gt;
:INFO&lt;br /&gt;
  echo.&lt;br /&gt;
  echo --------------------- 进程列表 ---------------------&lt;br /&gt;
  tasklist|findstr /i &amp;quot;nginx.exe&amp;quot;&lt;br /&gt;
  if errorlevel 1 echo nginx未启动&lt;br /&gt;
  echo --------------------- 进程列表 ---------------------&lt;br /&gt;
&lt;br /&gt;
  echo.&lt;br /&gt;
  echo. 1. 启动Nginx&lt;br /&gt;
  echo. 2. 关闭Nginx&lt;br /&gt;
  echo. 3. 重启Nginx&lt;br /&gt;
  echo. 4. 退出&lt;br /&gt;
  echo.&lt;br /&gt;
  echo 请输入功能序号：&lt;br /&gt;
  set /p id=&lt;br /&gt;
    if &amp;quot;%id%&amp;quot;==&amp;quot;1&amp;quot; goto START&lt;br /&gt;
    if &amp;quot;%id%&amp;quot;==&amp;quot;2&amp;quot; goto STOP&lt;br /&gt;
    if &amp;quot;%id%&amp;quot;==&amp;quot;3&amp;quot; goto RESTART&lt;br /&gt;
    if &amp;quot;%id%&amp;quot;==&amp;quot;4&amp;quot; exit&lt;br /&gt;
  pause&lt;br /&gt;
&lt;br /&gt;
:START &lt;br /&gt;
  if exist &amp;quot;%NGINX_DIR%nginx.exe&amp;quot; (&lt;br /&gt;
    cd /d %NGINX_DIR%&lt;br /&gt;
    start &amp;quot;&amp;quot; nginx.exe&lt;br /&gt;
    echo 启动成功&lt;br /&gt;
  ) else (&lt;br /&gt;
    echo &amp;quot;%NGINX_DIR%nginx.exe不存在&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
  goto INFO&lt;br /&gt;
&lt;br /&gt;
:STOP&lt;br /&gt;
  taskkill /F /IM nginx.exe &amp;gt; nul&lt;br /&gt;
  echo 已关闭所有nginx进程&lt;br /&gt;
  goto INFO&lt;br /&gt;
&lt;br /&gt;
:RESTART&lt;br /&gt;
  taskkill /F /IM nginx.exe &amp;gt; nul&lt;br /&gt;
  if exist &amp;quot;%NGINX_DIR%nginx.exe&amp;quot; (&lt;br /&gt;
    cd /d %NGINX_DIR%&lt;br /&gt;
    start &amp;quot;&amp;quot; nginx.exe&lt;br /&gt;
  ) else (&lt;br /&gt;
    echo &amp;quot;%NGINX_DIR%nginx.exe不存在&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
  echo 已重启&lt;br /&gt;
  goto INFO&lt;br /&gt;
&lt;br /&gt;
goto :eof&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E5%8A%9E%E4%BA%8B&amp;diff=126</id>
		<title>办事</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E5%8A%9E%E4%BA%8B&amp;diff=126"/>
		<updated>2019-11-18T10:15:19Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：创建页面，内容为“  [http://ggfw.rsj.sh.gov.cn/ 上海市人力资源和社会保障局公共服务平台]”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
[http://ggfw.rsj.sh.gov.cn/ 上海市人力资源和社会保障局公共服务平台]&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=125</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=125"/>
		<updated>2019-11-18T10:14:32Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== 菜单 ==&lt;br /&gt;
* [[PHP]]&lt;br /&gt;
* [[Python]]&lt;br /&gt;
* [[Rabbitmq]]&lt;br /&gt;
* [[钉钉]]&lt;br /&gt;
* [[Linux]]&lt;br /&gt;
* [[windows]]&lt;br /&gt;
* [[Laravel]]&lt;br /&gt;
* [[微信X5调试]]&lt;br /&gt;
* [[vim]]&lt;br /&gt;
* [[办事]]&lt;br /&gt;
&lt;br /&gt;
== 工具 ==&lt;br /&gt;
* [http://rufus.ie/ u盘引导盘制作工具]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;seo title =&amp;quot;首页&amp;quot; titlemode =&amp;quot;append&amp;quot; keywords=&amp;quot;php python linux 微信&amp;quot; description =&amp;quot;开发技术笔记&amp;quot;&amp;gt;&amp;lt;/seo&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Windows&amp;diff=124</id>
		<title>Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Windows&amp;diff=124"/>
		<updated>2019-11-18T10:04:50Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* 查看80端口占用的程序 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 查看80端口占用的程序 ==&lt;br /&gt;
# &amp;lt;code&amp;gt;netstat  -aon|findstr  &amp;quot;80&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
# 拿到上一步返回的pid，&amp;lt;code&amp;gt;tasklist|findstr {PID}&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Windows&amp;diff=123</id>
		<title>Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Windows&amp;diff=123"/>
		<updated>2019-11-18T10:04:38Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 查看80端口占用的程序 ==&lt;br /&gt;
# netstat  -aon|findstr  &amp;quot;80&amp;quot;&lt;br /&gt;
# 拿到上一步返回的pid，&amp;lt;code&amp;gt;tasklist|findstr {PID}&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Windows&amp;diff=122</id>
		<title>Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Windows&amp;diff=122"/>
		<updated>2019-11-18T10:03:54Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：创建页面，内容为“== 查看80端口占用的程序 == # netstat  -aon|findstr  &amp;quot;80&amp;quot; # 拿到上一步返回的pid，tasklist|findstr {{PID}}”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 查看80端口占用的程序 ==&lt;br /&gt;
# netstat  -aon|findstr  &amp;quot;80&amp;quot;&lt;br /&gt;
# 拿到上一步返回的pid，tasklist|findstr {{PID}}&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=121</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=121"/>
		<updated>2019-11-18T10:01:50Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* 菜单 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== 菜单 ==&lt;br /&gt;
* [[PHP]]&lt;br /&gt;
* [[Python]]&lt;br /&gt;
* [[Rabbitmq]]&lt;br /&gt;
* [[钉钉]]&lt;br /&gt;
* [[Linux]]&lt;br /&gt;
* [[windows]]&lt;br /&gt;
* [[Laravel]]&lt;br /&gt;
* [[微信X5调试]]&lt;br /&gt;
* [[vim]]&lt;br /&gt;
&lt;br /&gt;
== 工具 ==&lt;br /&gt;
* [http://rufus.ie/ u盘引导盘制作工具]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;seo title =&amp;quot;首页&amp;quot; titlemode =&amp;quot;append&amp;quot; keywords=&amp;quot;php python linux 微信&amp;quot; description =&amp;quot;开发技术笔记&amp;quot;&amp;gt;&amp;lt;/seo&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Linux&amp;diff=120</id>
		<title>Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Linux&amp;diff=120"/>
		<updated>2019-11-18T09:58:59Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== 工具 ==&lt;br /&gt;
&lt;br /&gt;
* [[https://stedolan.github.io/jq/ jq]] 一个轻量级且灵活的命令行JSON处理器&lt;br /&gt;
&lt;br /&gt;
* [[https://geoff.greer.fm/ag/ ag]] The Silver Searcher代码搜索工具&lt;br /&gt;
* [[https://github.com/yaosonglive/vim .vimrc]] vim制表符换成控制配置&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
* [[Nginx灰度]] cookie实现灰度&lt;br /&gt;
* 常见错误&lt;br /&gt;
** 413 Request Entity Too Large&lt;br /&gt;
**: &amp;lt;code&amp;gt;client_max_body_size 8m;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 图片压缩 ==&lt;br /&gt;
使用imagemagick进行图片压缩&lt;br /&gt;
首先安装apt install imagemagick&lt;br /&gt;
&lt;br /&gt;
下面是demo，把再当前路径下的public目录中的图片进行压缩:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
arr = [&lt;br /&gt;
    '/upload/images/c0d0d881b2d742165999d91ec6380de2.jpg',&lt;br /&gt;
    '/upload/images/4e16982954bcbe89667ec70f67c02f20.jpg',&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
for i in arr:&lt;br /&gt;
    try:&lt;br /&gt;
        # print i&lt;br /&gt;
        kb = os.path.getsize('./public%s' % i)&lt;br /&gt;
            newNames = os.path.splitext(i)&lt;br /&gt;
            strname = '%s_s%s' % newNames&lt;br /&gt;
            if kb/1024 &amp;gt; 1:&lt;br /&gt;
                shell = &amp;quot;convert -sample 30%%x30%% ./public%s ./public%s&amp;quot; % (i, strname)&lt;br /&gt;
                os.system(shell)&lt;br /&gt;
                # print &amp;quot;update themes set preview='%s' where preview='%s';&amp;quot; % (strname, i)&lt;br /&gt;
    except Exception,e :&lt;br /&gt;
        print e&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
-resize 是缩小，-sample 是压缩&lt;br /&gt;
&lt;br /&gt;
== 其他 ==&lt;br /&gt;
* [[公钥]]&lt;br /&gt;
&lt;br /&gt;
* 终端不能输入中文&lt;br /&gt;
*# 先&amp;lt;code&amp;gt;locale -a&amp;lt;/code&amp;gt;查看，是否有&amp;lt;code&amp;gt;zh_CN.utf8&amp;lt;/code&amp;gt;&lt;br /&gt;
*# 如果没有,安装：&lt;br /&gt;
*#: centos: yum install glibc-common&lt;br /&gt;
*#: ubuntu: apt-get -y install language-pack-zh-hans&lt;br /&gt;
*# 重新进入终端，检查环境变量, 如果还是不行，修改环境变量:&lt;br /&gt;
*#* LANG=zh_CN.UTF-8&lt;br /&gt;
*#* LC_ALL=LC_ALL=zh_CN.UTF-8&lt;br /&gt;
&lt;br /&gt;
== 端口检测 ==&lt;br /&gt;
* telnet&lt;br /&gt;
:在telnet连接成功后，使用&amp;lt;code&amp;gt;Control +]&amp;lt;/code&amp;gt;然后使用&amp;lt;code&amp;gt;Control + D&amp;lt;/code&amp;gt;退出它。&lt;br /&gt;
:列出所有TCP连接套接字&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet localhost 80&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* lsof&lt;br /&gt;
:监听ipv4进程&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo lsof -n -i4TCP:5672 | grep LISTEN&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:IPv6的程序：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo lsof -n -i6TCP:5672 | grep LISTEN&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ss&lt;br /&gt;
:使用ss显示使用IPv4及其操作系统进程的侦听TCP套接字：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo ss --tcp -f inet --listening --numeric --processes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:同样，对于使用IPv6的TCP套接字：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo ss --tcp -f inet6 --listening --numeric --processes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* netstat&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo netstat --all --numeric --tcp --programs&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx fpm connect() to unix:xxx failed. http 502 ==&lt;br /&gt;
https://forum.nginx.org/read.php?11,215606,215606#msg-215606&lt;br /&gt;
&lt;br /&gt;
1）调高nginx和php-fpm中的backlog&lt;br /&gt;
&lt;br /&gt;
2）增加sock文件和php-fpm实例数&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
pm&lt;br /&gt;
&lt;br /&gt;
pm.max_children&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
listen.backlog = 4096&lt;br /&gt;
&lt;br /&gt;
* nginx &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
        listen 80 backlog=1024;&lt;br /&gt;
... ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
开多个fpm&lt;br /&gt;
&lt;br /&gt;
== 终端中文输入 ==&lt;br /&gt;
* ubuntu&lt;br /&gt;
locale-gen zh_CN.UTF-8&lt;br /&gt;
&lt;br /&gt;
dpkg-reconfigure locales&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ubuntu 阿里云源 ==&lt;br /&gt;
ubuntu 18.04 (bionic) 配置 opsx 安装源&lt;br /&gt;
https://opsx.alibaba.com/guide?lang=zh-CN&amp;amp;document=69a2341e-801e-11e8-8b5a-00163e04cdbb&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=114</id>
		<title>常见问题</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=114"/>
		<updated>2019-10-28T05:24:10Z</updated>

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

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

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

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

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

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

		<summary type="html">&lt;p&gt;Yaosong：/* Laravel请求生命周期 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== cookie 和 session 的区别 ==&lt;br /&gt;
* 作用范围不同，Cookie 保存在客户端（浏览器），Session 保存在服务器端。&lt;br /&gt;
* 存取方式的不同，Cookie 只能保存 ASCII，Session 可以存任意数据类型，一般情况下我们可以在 Session 中保持一些常用变量信息，比如说 UserId 等。&lt;br /&gt;
* 有效期不同，Cookie 可设置为长时间保持，比如我们经常使用的默认登录功能，Session 一般失效时间较短，客户端关闭或者 Session 超时都会失效。&lt;br /&gt;
* 隐私策略不同，Cookie 存储在客户端，比较容易遭到不法获取，早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取；Session 存储在服务端，安全性相对 Cookie 要好一些。&lt;br /&gt;
* 存储大小不同， 单个 Cookie 保存的数据不能超过 4K，Session 可存储数据远高于 Cookie。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分布式session&lt;br /&gt;
&lt;br /&gt;
ip_hash &lt;br /&gt;
Session 复制&lt;br /&gt;
缓存中间件&lt;br /&gt;
&lt;br /&gt;
== post 和 get 的区别 ==&lt;br /&gt;
https://www.w3school.com.cn/tags/html_ref_httpmethods.asp&lt;br /&gt;
&lt;br /&gt;
GET 用于获取信息，是无副作用的，是幂等的，且可缓存&lt;br /&gt;
POST 用于修改服务器上的数据，有副作用，非幂等，不可缓存&lt;br /&gt;
* 安全？post请求不会保留在浏览器历史记录中&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|GET&lt;br /&gt;
|POST&lt;br /&gt;
|-&lt;br /&gt;
|后退按钮/刷新&lt;br /&gt;
|	无害	&lt;br /&gt;
|数据会被重新提交（浏览器应该告知用户数据会被重新提交）。&lt;br /&gt;
|-&lt;br /&gt;
|书签	&lt;br /&gt;
|可收藏为书签	&lt;br /&gt;
|不可收藏为书签&lt;br /&gt;
|-&lt;br /&gt;
|缓存	&lt;br /&gt;
|能被缓存	&lt;br /&gt;
|不能缓存&lt;br /&gt;
|-&lt;br /&gt;
|编码类型&lt;br /&gt;
|	application/x-www-form-urlencoded	&lt;br /&gt;
|application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。&lt;br /&gt;
|-&lt;br /&gt;
|历史	&lt;br /&gt;
|参数保留在浏览器历史中。	&lt;br /&gt;
|参数不会保存在浏览器历史中。&lt;br /&gt;
|-&lt;br /&gt;
|对数据长度的限制	&lt;br /&gt;
|是的。当发送数据时，GET 方法向 URL 添加数据；URL 的长度是受限制的（URL 的最大长度是 2048 个字符）。	&lt;br /&gt;
|无限制。&lt;br /&gt;
|-&lt;br /&gt;
|对数据类型的限制	&lt;br /&gt;
|只允许 ASCII 字符。	&lt;br /&gt;
|没有限制。也允许二进制数据。&lt;br /&gt;
|-&lt;br /&gt;
|安全性	&lt;br /&gt;
|与 POST 相比，GET 的安全性较差，因为所发送的数据是 URL 的一部分。&lt;br /&gt;
在发送密码或其他敏感信息时绝不要使用 GET ！&lt;br /&gt;
|POST 比 GET 更安全，因为参数不会被保存在浏览器历史或 web 服务器日志中。&lt;br /&gt;
|-&lt;br /&gt;
|可见性	&lt;br /&gt;
|数据在 URL 中对所有人都是可见的。	&lt;br /&gt;
|数据不会显示在 URL 中。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 转发和重定向的区别 ==&lt;br /&gt;
转发&lt;br /&gt;
&lt;br /&gt;
1. 是服务器内部的重定向，服务器直接访问目标地址的 url网址，把里面的东西读取出来，但是客户端并不知道，因此用forward的话，客户端浏览器的网址是不会发生变化的。&lt;br /&gt;
 &lt;br /&gt;
2. 关于request: 由于在整个定向的过程中用的是同一个request，因此forward会将request的信息带到被重定向的地址中。&lt;br /&gt;
&lt;br /&gt;
重定向&lt;br /&gt;
&lt;br /&gt;
1.是客户端的重定向，是完全的跳转。即服务器返回的一个url给客户端浏览器，然后客户端浏览器会重新发送一次请求，到新的url里面，因此浏览器中显示的url网址会发生变化。 &lt;br /&gt;
&lt;br /&gt;
2.因为这种方式比forward多了一次网络请求，因此效率会低于forward。&lt;br /&gt;
&lt;br /&gt;
== 堆栈区别  ==&lt;br /&gt;
== 并发和并行的区别 ==&lt;br /&gt;
行是指两个或者多个事件在同一时刻发生；而并发是指两个或多个事件在同一时间间隔发生。&lt;br /&gt;
&lt;br /&gt;
== 索引 ==&lt;br /&gt;
=== 不走索引 ===&lt;br /&gt;
=== 行级锁和表级锁 ===&lt;br /&gt;
&lt;br /&gt;
行级锁定的优点：&lt;br /&gt;
&lt;br /&gt;
·         当在许多线程中访问不同的行时只存在少量锁定冲突。&lt;br /&gt;
&lt;br /&gt;
·         回滚时只有少量的更改。&lt;br /&gt;
&lt;br /&gt;
·         可以长时间锁定单一的行。&lt;br /&gt;
&lt;br /&gt;
行级锁定的缺点：&lt;br /&gt;
&lt;br /&gt;
·         比页级或表级锁定占用更多的内存。&lt;br /&gt;
&lt;br /&gt;
·         当在表的大部分中使用时，比页级或表级锁定速度慢，因为你必须获取更多的锁。&lt;br /&gt;
&lt;br /&gt;
·         如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表，比其它锁定明显慢很多。&lt;br /&gt;
&lt;br /&gt;
·         用高级别锁定，通过支持不同的类型锁定，你也可以很容易地调节应用程序，因为其锁成本小于行级锁定。&lt;br /&gt;
&lt;br /&gt;
== 存储引擎 ==&lt;br /&gt;
* InnoDB&lt;br /&gt;
== 数据库，事务，隔离级别，存储引擎  ==&lt;br /&gt;
* 数据库，三大范式&lt;br /&gt;
== redis，有什么优势 -memcache对比 ==&lt;br /&gt;
数据存储位置&lt;br /&gt;
* redis： 内存、磁盘(数据持久化)&lt;br /&gt;
* memcache: 内存&lt;br /&gt;
&lt;br /&gt;
存储数据的类型（都是键值对的形式）值的类型：&lt;br /&gt;
* redis：list、set、hash、string、zset等&lt;br /&gt;
* memcache：string&lt;br /&gt;
&lt;br /&gt;
== http\https ==&lt;br /&gt;
* 默认端口不同80：443&lt;br /&gt;
* https需要颁发证书&lt;br /&gt;
* HTTPS协议的安全性更高&lt;br /&gt;
* https缺点&lt;br /&gt;
** 速度慢&lt;br /&gt;
** 服务器成本&lt;br /&gt;
&lt;br /&gt;
== 数据库的存储引擎应用场景，索引结构  ==&lt;br /&gt;
&lt;br /&gt;
MyISAM表使用B型树索引。 读取场景下性能好，表锁，不能事务&lt;br /&gt;
&lt;br /&gt;
InnoDB是为处理巨大数据量时的最大性能设计。B树。由于是行锁，写入、更新速度可能会快。&lt;br /&gt;
&lt;br /&gt;
MEMORY表被存储在内存中，且默认使用哈希索引&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为什么索引结构默认使用B-Tree，而不是hash，二叉树，红黑树？&lt;br /&gt;
* hash：虽然可以快速定位，但是没有顺序，IO复杂度高。&lt;br /&gt;
* 二叉树：树的高度不均匀，不能自平衡，查找效率跟数据有关（树的高度），并且IO代价高。&lt;br /&gt;
* 红黑树：树的高度随着数据量增加而增加，IO代价高。&lt;br /&gt;
&lt;br /&gt;
为什么建议使用自增长主键作为索引。&lt;br /&gt;
&lt;br /&gt;
结合B+Tree的特点，自增主键是连续的，在插入过程中尽量减少页分裂，即使要进行页分裂，也只会分裂很少一部分。并且能减少数据的移动，每次插入都是插入到最后。总之就是减少分裂和移动的频率。&lt;br /&gt;
&lt;br /&gt;
== 大数据量的优化 ==&lt;br /&gt;
* 分区、分表、分库&lt;br /&gt;
&lt;br /&gt;
== 设计一个权限系统  ==&lt;br /&gt;
== 算法题 ==&lt;br /&gt;
== 红黑树  ==&lt;br /&gt;
== 多线程，sleep，wait，yield  ==&lt;br /&gt;
== restful ==&lt;br /&gt;
== 设计模式，单例模式，适配器模式  ==&lt;br /&gt;
== 操作系统，死锁  ==&lt;br /&gt;
== 快排时间复杂度  ==&lt;br /&gt;
== nginx可承受的压力  ==&lt;br /&gt;
== 项目 ==&lt;br /&gt;
* 项目难点 &lt;br /&gt;
* 架构优化&lt;br /&gt;
* 难点&lt;br /&gt;
* 主要业务&lt;br /&gt;
== 服务调用超时可能由什么造成  ==&lt;br /&gt;
&lt;br /&gt;
* 网络问题，是否繁忙？&lt;br /&gt;
* cpu、内存排查，cpu消耗高，处理不过来&lt;br /&gt;
* 服务端有没有收到请求，看请求响应时间&lt;br /&gt;
* 客服端网络、cpu等有问题&lt;br /&gt;
&lt;br /&gt;
== 进程间的通信方式  ==&lt;br /&gt;
== fpm ==&lt;br /&gt;
* 合适的超时时间request_terminate_timeout、max_execution_time&lt;br /&gt;
* 看服务器性能，设置进程数量max_children&lt;br /&gt;
* fpm进程处理最大请求数max_requests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx ==&lt;br /&gt;
&lt;br /&gt;
* worker_processes 8; #nginx进程数，建议按照cpu数目来指定，一般为它的倍数,平时设置为2倍。&lt;br /&gt;
&lt;br /&gt;
* 静态资源缓存&lt;br /&gt;
&lt;br /&gt;
* nginx打开文件的最大个数&lt;br /&gt;
&lt;br /&gt;
* buffer： 如果buffer太小，Nginx会不停的写一些临时文件，这样会导致磁盘不停的去读写&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== php array 结构 ==&lt;br /&gt;
&lt;br /&gt;
hashtable+映射表的方式&lt;br /&gt;
&lt;br /&gt;
hash=&amp;gt;映射表=&amp;gt;bucket&lt;br /&gt;
&lt;br /&gt;
映射表与bucket长度相同&lt;br /&gt;
&lt;br /&gt;
hash冲突的情况：链地址法。next设置为相同hash的索引，然后在映射表里的值替换成当前元素在bucket中的位置。&lt;br /&gt;
&lt;br /&gt;
== 处理负载，高并发？==&lt;br /&gt;
&lt;br /&gt;
# HTML静态化&lt;br /&gt;
  效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的 网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。&lt;br /&gt;
# 图片服务器分离&lt;br /&gt;
  把图片单独存储，尽量减少图片等大流量的开销，可以放在一些相关的平台上，如七牛等&lt;br /&gt;
# 数据库集群和库表散列及缓存&lt;br /&gt;
  数据库的并发连接为100，一台数据库远远不够，可以从读写分离、主从复制，数据库集群方面来着手。另外尽量减少数据库的访问，可以使用缓存数据库如memcache、redis。&lt;br /&gt;
# 镜像：&lt;br /&gt;
  尽量减少下载，可以把不同的请求分发到多个镜像端。&lt;br /&gt;
# 负载均衡：&lt;br /&gt;
  Apache的最大并发连接为1500，只能增加服务器，可以从硬件上着手，如F5服务器。当然硬件的成本比较高，我们往往从软件方面着手。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Laravel请求生命周期 ==&lt;br /&gt;
&lt;br /&gt;
#、Laravel 采用了单一入口模式，应用的所有请求入口都是 public/index.php 文件。&lt;br /&gt;
#、注册类文件自动加载器 : Laravel通过 composer 进行依赖管理，无需开发者手动导入各种类文件，而由自动加载器自行导入。&lt;br /&gt;
#、创建服务容器：从 bootstrap/app.php 文件中取得 Laravel 应用实例 $app (服务容器)。&lt;br /&gt;
#、创建 HTTP / Console 内核：传入的请求会被发送给 HTTP 内核或者 console 内核进行处理&lt;br /&gt;
#、载入服务提供者至容器：在内核引导启动的过程中最重要的动作之一就是载入服务提供者到你的应用，服务提供者负责引导启动框架的全部各种组件，例如数据库、队列、验证器以及路由组件。&lt;br /&gt;
#、分发请求：一旦应用完成引导和所有服务提供者都注册完成，Request 将会移交给路由进行分发。路由将分发请求给一个路由或控制器，同时运行路由指定的中间件&lt;br /&gt;
&lt;br /&gt;
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/80637277&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=106</id>
		<title>常见问题</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=106"/>
		<updated>2019-10-22T06:54:27Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* Laravel请求生命周期 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== cookie 和 session 的区别 ==&lt;br /&gt;
* 作用范围不同，Cookie 保存在客户端（浏览器），Session 保存在服务器端。&lt;br /&gt;
* 存取方式的不同，Cookie 只能保存 ASCII，Session 可以存任意数据类型，一般情况下我们可以在 Session 中保持一些常用变量信息，比如说 UserId 等。&lt;br /&gt;
* 有效期不同，Cookie 可设置为长时间保持，比如我们经常使用的默认登录功能，Session 一般失效时间较短，客户端关闭或者 Session 超时都会失效。&lt;br /&gt;
* 隐私策略不同，Cookie 存储在客户端，比较容易遭到不法获取，早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取；Session 存储在服务端，安全性相对 Cookie 要好一些。&lt;br /&gt;
* 存储大小不同， 单个 Cookie 保存的数据不能超过 4K，Session 可存储数据远高于 Cookie。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分布式session&lt;br /&gt;
&lt;br /&gt;
ip_hash &lt;br /&gt;
Session 复制&lt;br /&gt;
缓存中间件&lt;br /&gt;
&lt;br /&gt;
== post 和 get 的区别 ==&lt;br /&gt;
https://www.w3school.com.cn/tags/html_ref_httpmethods.asp&lt;br /&gt;
&lt;br /&gt;
GET 用于获取信息，是无副作用的，是幂等的，且可缓存&lt;br /&gt;
POST 用于修改服务器上的数据，有副作用，非幂等，不可缓存&lt;br /&gt;
* 安全？post请求不会保留在浏览器历史记录中&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|GET&lt;br /&gt;
|POST&lt;br /&gt;
|-&lt;br /&gt;
|后退按钮/刷新&lt;br /&gt;
|	无害	&lt;br /&gt;
|数据会被重新提交（浏览器应该告知用户数据会被重新提交）。&lt;br /&gt;
|-&lt;br /&gt;
|书签	&lt;br /&gt;
|可收藏为书签	&lt;br /&gt;
|不可收藏为书签&lt;br /&gt;
|-&lt;br /&gt;
|缓存	&lt;br /&gt;
|能被缓存	&lt;br /&gt;
|不能缓存&lt;br /&gt;
|-&lt;br /&gt;
|编码类型&lt;br /&gt;
|	application/x-www-form-urlencoded	&lt;br /&gt;
|application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。&lt;br /&gt;
|-&lt;br /&gt;
|历史	&lt;br /&gt;
|参数保留在浏览器历史中。	&lt;br /&gt;
|参数不会保存在浏览器历史中。&lt;br /&gt;
|-&lt;br /&gt;
|对数据长度的限制	&lt;br /&gt;
|是的。当发送数据时，GET 方法向 URL 添加数据；URL 的长度是受限制的（URL 的最大长度是 2048 个字符）。	&lt;br /&gt;
|无限制。&lt;br /&gt;
|-&lt;br /&gt;
|对数据类型的限制	&lt;br /&gt;
|只允许 ASCII 字符。	&lt;br /&gt;
|没有限制。也允许二进制数据。&lt;br /&gt;
|-&lt;br /&gt;
|安全性	&lt;br /&gt;
|与 POST 相比，GET 的安全性较差，因为所发送的数据是 URL 的一部分。&lt;br /&gt;
在发送密码或其他敏感信息时绝不要使用 GET ！&lt;br /&gt;
|POST 比 GET 更安全，因为参数不会被保存在浏览器历史或 web 服务器日志中。&lt;br /&gt;
|-&lt;br /&gt;
|可见性	&lt;br /&gt;
|数据在 URL 中对所有人都是可见的。	&lt;br /&gt;
|数据不会显示在 URL 中。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 转发和重定向的区别 ==&lt;br /&gt;
转发&lt;br /&gt;
&lt;br /&gt;
1. 是服务器内部的重定向，服务器直接访问目标地址的 url网址，把里面的东西读取出来，但是客户端并不知道，因此用forward的话，客户端浏览器的网址是不会发生变化的。&lt;br /&gt;
 &lt;br /&gt;
2. 关于request: 由于在整个定向的过程中用的是同一个request，因此forward会将request的信息带到被重定向的地址中。&lt;br /&gt;
&lt;br /&gt;
重定向&lt;br /&gt;
&lt;br /&gt;
1.是客户端的重定向，是完全的跳转。即服务器返回的一个url给客户端浏览器，然后客户端浏览器会重新发送一次请求，到新的url里面，因此浏览器中显示的url网址会发生变化。 &lt;br /&gt;
&lt;br /&gt;
2.因为这种方式比forward多了一次网络请求，因此效率会低于forward。&lt;br /&gt;
&lt;br /&gt;
== 堆栈区别  ==&lt;br /&gt;
== 并发和并行的区别 ==&lt;br /&gt;
行是指两个或者多个事件在同一时刻发生；而并发是指两个或多个事件在同一时间间隔发生。&lt;br /&gt;
&lt;br /&gt;
== 索引 ==&lt;br /&gt;
=== 不走索引 ===&lt;br /&gt;
=== 行级锁和表级锁 ===&lt;br /&gt;
&lt;br /&gt;
行级锁定的优点：&lt;br /&gt;
&lt;br /&gt;
·         当在许多线程中访问不同的行时只存在少量锁定冲突。&lt;br /&gt;
&lt;br /&gt;
·         回滚时只有少量的更改。&lt;br /&gt;
&lt;br /&gt;
·         可以长时间锁定单一的行。&lt;br /&gt;
&lt;br /&gt;
行级锁定的缺点：&lt;br /&gt;
&lt;br /&gt;
·         比页级或表级锁定占用更多的内存。&lt;br /&gt;
&lt;br /&gt;
·         当在表的大部分中使用时，比页级或表级锁定速度慢，因为你必须获取更多的锁。&lt;br /&gt;
&lt;br /&gt;
·         如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表，比其它锁定明显慢很多。&lt;br /&gt;
&lt;br /&gt;
·         用高级别锁定，通过支持不同的类型锁定，你也可以很容易地调节应用程序，因为其锁成本小于行级锁定。&lt;br /&gt;
&lt;br /&gt;
== 存储引擎 ==&lt;br /&gt;
* InnoDB&lt;br /&gt;
== 数据库，事务，隔离级别，存储引擎  ==&lt;br /&gt;
* 数据库，三大范式&lt;br /&gt;
== redis，有什么优势 -memcache对比 ==&lt;br /&gt;
数据存储位置&lt;br /&gt;
* redis： 内存、磁盘(数据持久化)&lt;br /&gt;
* memcache: 内存&lt;br /&gt;
&lt;br /&gt;
存储数据的类型（都是键值对的形式）值的类型：&lt;br /&gt;
* redis：list、set、hash、string、zset等&lt;br /&gt;
* memcache：string&lt;br /&gt;
&lt;br /&gt;
== http\https ==&lt;br /&gt;
* 默认端口不同80：443&lt;br /&gt;
* https需要颁发证书&lt;br /&gt;
* HTTPS协议的安全性更高&lt;br /&gt;
* https缺点&lt;br /&gt;
** 速度慢&lt;br /&gt;
** 服务器成本&lt;br /&gt;
&lt;br /&gt;
== 数据库的存储引擎应用场景，索引结构  ==&lt;br /&gt;
&lt;br /&gt;
MyISAM表使用B型树索引。 读取场景下性能好，表锁，不能事务&lt;br /&gt;
&lt;br /&gt;
InnoDB是为处理巨大数据量时的最大性能设计。B树。由于是行锁，写入、更新速度可能会快。&lt;br /&gt;
&lt;br /&gt;
MEMORY表被存储在内存中，且默认使用哈希索引&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为什么索引结构默认使用B-Tree，而不是hash，二叉树，红黑树？&lt;br /&gt;
* hash：虽然可以快速定位，但是没有顺序，IO复杂度高。&lt;br /&gt;
* 二叉树：树的高度不均匀，不能自平衡，查找效率跟数据有关（树的高度），并且IO代价高。&lt;br /&gt;
* 红黑树：树的高度随着数据量增加而增加，IO代价高。&lt;br /&gt;
&lt;br /&gt;
为什么建议使用自增长主键作为索引。&lt;br /&gt;
&lt;br /&gt;
结合B+Tree的特点，自增主键是连续的，在插入过程中尽量减少页分裂，即使要进行页分裂，也只会分裂很少一部分。并且能减少数据的移动，每次插入都是插入到最后。总之就是减少分裂和移动的频率。&lt;br /&gt;
&lt;br /&gt;
== 大数据量的优化 ==&lt;br /&gt;
* 分区、分表、分库&lt;br /&gt;
&lt;br /&gt;
== 设计一个权限系统  ==&lt;br /&gt;
== 算法题 ==&lt;br /&gt;
== 红黑树  ==&lt;br /&gt;
== 多线程，sleep，wait，yield  ==&lt;br /&gt;
== restful ==&lt;br /&gt;
== 设计模式，单例模式，适配器模式  ==&lt;br /&gt;
== 操作系统，死锁  ==&lt;br /&gt;
== 快排时间复杂度  ==&lt;br /&gt;
== nginx可承受的压力  ==&lt;br /&gt;
== 项目 ==&lt;br /&gt;
* 项目难点 &lt;br /&gt;
* 架构优化&lt;br /&gt;
* 难点&lt;br /&gt;
* 主要业务&lt;br /&gt;
== 服务调用超时可能由什么造成  ==&lt;br /&gt;
&lt;br /&gt;
* 网络问题，是否繁忙？&lt;br /&gt;
* cpu、内存排查，cpu消耗高，处理不过来&lt;br /&gt;
* 服务端有没有收到请求，看请求响应时间&lt;br /&gt;
* 客服端网络、cpu等有问题&lt;br /&gt;
&lt;br /&gt;
== 进程间的通信方式  ==&lt;br /&gt;
== fpm ==&lt;br /&gt;
* 合适的超时时间request_terminate_timeout、max_execution_time&lt;br /&gt;
* 看服务器性能，设置进程数量max_children&lt;br /&gt;
* fpm进程处理最大请求数max_requests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx ==&lt;br /&gt;
&lt;br /&gt;
* worker_processes 8; #nginx进程数，建议按照cpu数目来指定，一般为它的倍数,平时设置为2倍。&lt;br /&gt;
&lt;br /&gt;
* 静态资源缓存&lt;br /&gt;
&lt;br /&gt;
* nginx打开文件的最大个数&lt;br /&gt;
&lt;br /&gt;
* buffer： 如果buffer太小，Nginx会不停的写一些临时文件，这样会导致磁盘不停的去读写&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== php array 结构 ==&lt;br /&gt;
&lt;br /&gt;
hashtable+映射表的方式&lt;br /&gt;
&lt;br /&gt;
hash=&amp;gt;映射表=&amp;gt;bucket&lt;br /&gt;
&lt;br /&gt;
映射表与bucket长度相同&lt;br /&gt;
&lt;br /&gt;
hash冲突的情况：链地址法。next设置为相同hash的索引，然后在映射表里的值替换成当前元素在bucket中的位置。&lt;br /&gt;
&lt;br /&gt;
== 处理负载，高并发？==&lt;br /&gt;
&lt;br /&gt;
# HTML静态化&lt;br /&gt;
  效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的 网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。&lt;br /&gt;
# 图片服务器分离&lt;br /&gt;
  把图片单独存储，尽量减少图片等大流量的开销，可以放在一些相关的平台上，如七牛等&lt;br /&gt;
# 数据库集群和库表散列及缓存&lt;br /&gt;
  数据库的并发连接为100，一台数据库远远不够，可以从读写分离、主从复制，数据库集群方面来着手。另外尽量减少数据库的访问，可以使用缓存数据库如memcache、redis。&lt;br /&gt;
# 镜像：&lt;br /&gt;
  尽量减少下载，可以把不同的请求分发到多个镜像端。&lt;br /&gt;
# 负载均衡：&lt;br /&gt;
  Apache的最大并发连接为1500，只能增加服务器，可以从硬件上着手，如F5服务器。当然硬件的成本比较高，我们往往从软件方面着手。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Laravel请求生命周期 ==&lt;br /&gt;
&lt;br /&gt;
#、Laravel 采用了单一入口模式，应用的所有请求入口都是 public/index.php 文件。&lt;br /&gt;
#、注册类文件自动加载器 : Laravel通过 composer 进行依赖管理，无需开发者手动导入各种类文件，而由自动加载器自行导入。&lt;br /&gt;
#、创建服务容器：从 bootstrap/app.php 文件中取得 Laravel 应用实例 $app (服务容器)。&lt;br /&gt;
#、创建 HTTP / Console 内核：传入的请求会被发送给 HTTP 内核或者 console 内核进行处理&lt;br /&gt;
#、载入服务提供者至容器：在内核引导启动的过程中最重要的动作之一就是载入服务提供者到你的应用，服务提供者负责引导启动框架的全部各种组件，例如数据库、队列、验证器以及路由组件。&lt;br /&gt;
#、分发请求：一旦应用完成引导和所有服务提供者都注册完成，Request 将会移交给路由进行分发。路由将分发请求给一个路由或控制器，同时运行路由指定的中间件&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=105</id>
		<title>常见问题</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=105"/>
		<updated>2019-10-22T06:53:49Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* Laravel请求生命周期 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== cookie 和 session 的区别 ==&lt;br /&gt;
* 作用范围不同，Cookie 保存在客户端（浏览器），Session 保存在服务器端。&lt;br /&gt;
* 存取方式的不同，Cookie 只能保存 ASCII，Session 可以存任意数据类型，一般情况下我们可以在 Session 中保持一些常用变量信息，比如说 UserId 等。&lt;br /&gt;
* 有效期不同，Cookie 可设置为长时间保持，比如我们经常使用的默认登录功能，Session 一般失效时间较短，客户端关闭或者 Session 超时都会失效。&lt;br /&gt;
* 隐私策略不同，Cookie 存储在客户端，比较容易遭到不法获取，早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取；Session 存储在服务端，安全性相对 Cookie 要好一些。&lt;br /&gt;
* 存储大小不同， 单个 Cookie 保存的数据不能超过 4K，Session 可存储数据远高于 Cookie。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分布式session&lt;br /&gt;
&lt;br /&gt;
ip_hash &lt;br /&gt;
Session 复制&lt;br /&gt;
缓存中间件&lt;br /&gt;
&lt;br /&gt;
== post 和 get 的区别 ==&lt;br /&gt;
https://www.w3school.com.cn/tags/html_ref_httpmethods.asp&lt;br /&gt;
&lt;br /&gt;
GET 用于获取信息，是无副作用的，是幂等的，且可缓存&lt;br /&gt;
POST 用于修改服务器上的数据，有副作用，非幂等，不可缓存&lt;br /&gt;
* 安全？post请求不会保留在浏览器历史记录中&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|GET&lt;br /&gt;
|POST&lt;br /&gt;
|-&lt;br /&gt;
|后退按钮/刷新&lt;br /&gt;
|	无害	&lt;br /&gt;
|数据会被重新提交（浏览器应该告知用户数据会被重新提交）。&lt;br /&gt;
|-&lt;br /&gt;
|书签	&lt;br /&gt;
|可收藏为书签	&lt;br /&gt;
|不可收藏为书签&lt;br /&gt;
|-&lt;br /&gt;
|缓存	&lt;br /&gt;
|能被缓存	&lt;br /&gt;
|不能缓存&lt;br /&gt;
|-&lt;br /&gt;
|编码类型&lt;br /&gt;
|	application/x-www-form-urlencoded	&lt;br /&gt;
|application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。&lt;br /&gt;
|-&lt;br /&gt;
|历史	&lt;br /&gt;
|参数保留在浏览器历史中。	&lt;br /&gt;
|参数不会保存在浏览器历史中。&lt;br /&gt;
|-&lt;br /&gt;
|对数据长度的限制	&lt;br /&gt;
|是的。当发送数据时，GET 方法向 URL 添加数据；URL 的长度是受限制的（URL 的最大长度是 2048 个字符）。	&lt;br /&gt;
|无限制。&lt;br /&gt;
|-&lt;br /&gt;
|对数据类型的限制	&lt;br /&gt;
|只允许 ASCII 字符。	&lt;br /&gt;
|没有限制。也允许二进制数据。&lt;br /&gt;
|-&lt;br /&gt;
|安全性	&lt;br /&gt;
|与 POST 相比，GET 的安全性较差，因为所发送的数据是 URL 的一部分。&lt;br /&gt;
在发送密码或其他敏感信息时绝不要使用 GET ！&lt;br /&gt;
|POST 比 GET 更安全，因为参数不会被保存在浏览器历史或 web 服务器日志中。&lt;br /&gt;
|-&lt;br /&gt;
|可见性	&lt;br /&gt;
|数据在 URL 中对所有人都是可见的。	&lt;br /&gt;
|数据不会显示在 URL 中。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 转发和重定向的区别 ==&lt;br /&gt;
转发&lt;br /&gt;
&lt;br /&gt;
1. 是服务器内部的重定向，服务器直接访问目标地址的 url网址，把里面的东西读取出来，但是客户端并不知道，因此用forward的话，客户端浏览器的网址是不会发生变化的。&lt;br /&gt;
 &lt;br /&gt;
2. 关于request: 由于在整个定向的过程中用的是同一个request，因此forward会将request的信息带到被重定向的地址中。&lt;br /&gt;
&lt;br /&gt;
重定向&lt;br /&gt;
&lt;br /&gt;
1.是客户端的重定向，是完全的跳转。即服务器返回的一个url给客户端浏览器，然后客户端浏览器会重新发送一次请求，到新的url里面，因此浏览器中显示的url网址会发生变化。 &lt;br /&gt;
&lt;br /&gt;
2.因为这种方式比forward多了一次网络请求，因此效率会低于forward。&lt;br /&gt;
&lt;br /&gt;
== 堆栈区别  ==&lt;br /&gt;
== 并发和并行的区别 ==&lt;br /&gt;
行是指两个或者多个事件在同一时刻发生；而并发是指两个或多个事件在同一时间间隔发生。&lt;br /&gt;
&lt;br /&gt;
== 索引 ==&lt;br /&gt;
=== 不走索引 ===&lt;br /&gt;
=== 行级锁和表级锁 ===&lt;br /&gt;
&lt;br /&gt;
行级锁定的优点：&lt;br /&gt;
&lt;br /&gt;
·         当在许多线程中访问不同的行时只存在少量锁定冲突。&lt;br /&gt;
&lt;br /&gt;
·         回滚时只有少量的更改。&lt;br /&gt;
&lt;br /&gt;
·         可以长时间锁定单一的行。&lt;br /&gt;
&lt;br /&gt;
行级锁定的缺点：&lt;br /&gt;
&lt;br /&gt;
·         比页级或表级锁定占用更多的内存。&lt;br /&gt;
&lt;br /&gt;
·         当在表的大部分中使用时，比页级或表级锁定速度慢，因为你必须获取更多的锁。&lt;br /&gt;
&lt;br /&gt;
·         如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表，比其它锁定明显慢很多。&lt;br /&gt;
&lt;br /&gt;
·         用高级别锁定，通过支持不同的类型锁定，你也可以很容易地调节应用程序，因为其锁成本小于行级锁定。&lt;br /&gt;
&lt;br /&gt;
== 存储引擎 ==&lt;br /&gt;
* InnoDB&lt;br /&gt;
== 数据库，事务，隔离级别，存储引擎  ==&lt;br /&gt;
* 数据库，三大范式&lt;br /&gt;
== redis，有什么优势 -memcache对比 ==&lt;br /&gt;
数据存储位置&lt;br /&gt;
* redis： 内存、磁盘(数据持久化)&lt;br /&gt;
* memcache: 内存&lt;br /&gt;
&lt;br /&gt;
存储数据的类型（都是键值对的形式）值的类型：&lt;br /&gt;
* redis：list、set、hash、string、zset等&lt;br /&gt;
* memcache：string&lt;br /&gt;
&lt;br /&gt;
== http\https ==&lt;br /&gt;
* 默认端口不同80：443&lt;br /&gt;
* https需要颁发证书&lt;br /&gt;
* HTTPS协议的安全性更高&lt;br /&gt;
* https缺点&lt;br /&gt;
** 速度慢&lt;br /&gt;
** 服务器成本&lt;br /&gt;
&lt;br /&gt;
== 数据库的存储引擎应用场景，索引结构  ==&lt;br /&gt;
&lt;br /&gt;
MyISAM表使用B型树索引。 读取场景下性能好，表锁，不能事务&lt;br /&gt;
&lt;br /&gt;
InnoDB是为处理巨大数据量时的最大性能设计。B树。由于是行锁，写入、更新速度可能会快。&lt;br /&gt;
&lt;br /&gt;
MEMORY表被存储在内存中，且默认使用哈希索引&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为什么索引结构默认使用B-Tree，而不是hash，二叉树，红黑树？&lt;br /&gt;
* hash：虽然可以快速定位，但是没有顺序，IO复杂度高。&lt;br /&gt;
* 二叉树：树的高度不均匀，不能自平衡，查找效率跟数据有关（树的高度），并且IO代价高。&lt;br /&gt;
* 红黑树：树的高度随着数据量增加而增加，IO代价高。&lt;br /&gt;
&lt;br /&gt;
为什么建议使用自增长主键作为索引。&lt;br /&gt;
&lt;br /&gt;
结合B+Tree的特点，自增主键是连续的，在插入过程中尽量减少页分裂，即使要进行页分裂，也只会分裂很少一部分。并且能减少数据的移动，每次插入都是插入到最后。总之就是减少分裂和移动的频率。&lt;br /&gt;
&lt;br /&gt;
== 大数据量的优化 ==&lt;br /&gt;
* 分区、分表、分库&lt;br /&gt;
&lt;br /&gt;
== 设计一个权限系统  ==&lt;br /&gt;
== 算法题 ==&lt;br /&gt;
== 红黑树  ==&lt;br /&gt;
== 多线程，sleep，wait，yield  ==&lt;br /&gt;
== restful ==&lt;br /&gt;
== 设计模式，单例模式，适配器模式  ==&lt;br /&gt;
== 操作系统，死锁  ==&lt;br /&gt;
== 快排时间复杂度  ==&lt;br /&gt;
== nginx可承受的压力  ==&lt;br /&gt;
== 项目 ==&lt;br /&gt;
* 项目难点 &lt;br /&gt;
* 架构优化&lt;br /&gt;
* 难点&lt;br /&gt;
* 主要业务&lt;br /&gt;
== 服务调用超时可能由什么造成  ==&lt;br /&gt;
&lt;br /&gt;
* 网络问题，是否繁忙？&lt;br /&gt;
* cpu、内存排查，cpu消耗高，处理不过来&lt;br /&gt;
* 服务端有没有收到请求，看请求响应时间&lt;br /&gt;
* 客服端网络、cpu等有问题&lt;br /&gt;
&lt;br /&gt;
== 进程间的通信方式  ==&lt;br /&gt;
== fpm ==&lt;br /&gt;
* 合适的超时时间request_terminate_timeout、max_execution_time&lt;br /&gt;
* 看服务器性能，设置进程数量max_children&lt;br /&gt;
* fpm进程处理最大请求数max_requests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx ==&lt;br /&gt;
&lt;br /&gt;
* worker_processes 8; #nginx进程数，建议按照cpu数目来指定，一般为它的倍数,平时设置为2倍。&lt;br /&gt;
&lt;br /&gt;
* 静态资源缓存&lt;br /&gt;
&lt;br /&gt;
* nginx打开文件的最大个数&lt;br /&gt;
&lt;br /&gt;
* buffer： 如果buffer太小，Nginx会不停的写一些临时文件，这样会导致磁盘不停的去读写&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== php array 结构 ==&lt;br /&gt;
&lt;br /&gt;
hashtable+映射表的方式&lt;br /&gt;
&lt;br /&gt;
hash=&amp;gt;映射表=&amp;gt;bucket&lt;br /&gt;
&lt;br /&gt;
映射表与bucket长度相同&lt;br /&gt;
&lt;br /&gt;
hash冲突的情况：链地址法。next设置为相同hash的索引，然后在映射表里的值替换成当前元素在bucket中的位置。&lt;br /&gt;
&lt;br /&gt;
== 处理负载，高并发？==&lt;br /&gt;
&lt;br /&gt;
# HTML静态化&lt;br /&gt;
  效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的 网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。&lt;br /&gt;
# 图片服务器分离&lt;br /&gt;
  把图片单独存储，尽量减少图片等大流量的开销，可以放在一些相关的平台上，如七牛等&lt;br /&gt;
# 数据库集群和库表散列及缓存&lt;br /&gt;
  数据库的并发连接为100，一台数据库远远不够，可以从读写分离、主从复制，数据库集群方面来着手。另外尽量减少数据库的访问，可以使用缓存数据库如memcache、redis。&lt;br /&gt;
# 镜像：&lt;br /&gt;
  尽量减少下载，可以把不同的请求分发到多个镜像端。&lt;br /&gt;
# 负载均衡：&lt;br /&gt;
  Apache的最大并发连接为1500，只能增加服务器，可以从硬件上着手，如F5服务器。当然硬件的成本比较高，我们往往从软件方面着手。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Laravel请求生命周期 ==&lt;br /&gt;
&lt;br /&gt;
#、Laravel 采用了单一入口模式，应用的所有请求入口都是 public/index.php 文件。&lt;br /&gt;
#、注册类文件自动加载器 : Laravel通过 composer 进行依赖管理，无需开发者手动导入各种类文件，而由自动加载器自行导入。&lt;br /&gt;
#、创建服务容器：从 bootstrap/app.php 文件中取得 Laravel 应用实例 $app (服务容器)&lt;br /&gt;
创建 HTTP / Console 内核：传入的请求会被发送给 HTTP 内核或者 console 内核进行处理&lt;br /&gt;
#、载入服务提供者至容器：在内核引导启动的过程中最重要的动作之一就是载入服务提供者到你的应用，服务提供者负责引导启动框架的全部各种组件，例如数据库、队列、验证器以及路由组件。&lt;br /&gt;
#、分发请求：一旦应用完成引导和所有服务提供者都注册完成，Request 将会移交给路由进行分发。路由将分发请求给一个路由或控制器，同时运行路由指定的中间件&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=104</id>
		<title>常见问题</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=104"/>
		<updated>2019-10-22T06:53:35Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* Laravel请求生命周期 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== cookie 和 session 的区别 ==&lt;br /&gt;
* 作用范围不同，Cookie 保存在客户端（浏览器），Session 保存在服务器端。&lt;br /&gt;
* 存取方式的不同，Cookie 只能保存 ASCII，Session 可以存任意数据类型，一般情况下我们可以在 Session 中保持一些常用变量信息，比如说 UserId 等。&lt;br /&gt;
* 有效期不同，Cookie 可设置为长时间保持，比如我们经常使用的默认登录功能，Session 一般失效时间较短，客户端关闭或者 Session 超时都会失效。&lt;br /&gt;
* 隐私策略不同，Cookie 存储在客户端，比较容易遭到不法获取，早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取；Session 存储在服务端，安全性相对 Cookie 要好一些。&lt;br /&gt;
* 存储大小不同， 单个 Cookie 保存的数据不能超过 4K，Session 可存储数据远高于 Cookie。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分布式session&lt;br /&gt;
&lt;br /&gt;
ip_hash &lt;br /&gt;
Session 复制&lt;br /&gt;
缓存中间件&lt;br /&gt;
&lt;br /&gt;
== post 和 get 的区别 ==&lt;br /&gt;
https://www.w3school.com.cn/tags/html_ref_httpmethods.asp&lt;br /&gt;
&lt;br /&gt;
GET 用于获取信息，是无副作用的，是幂等的，且可缓存&lt;br /&gt;
POST 用于修改服务器上的数据，有副作用，非幂等，不可缓存&lt;br /&gt;
* 安全？post请求不会保留在浏览器历史记录中&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|GET&lt;br /&gt;
|POST&lt;br /&gt;
|-&lt;br /&gt;
|后退按钮/刷新&lt;br /&gt;
|	无害	&lt;br /&gt;
|数据会被重新提交（浏览器应该告知用户数据会被重新提交）。&lt;br /&gt;
|-&lt;br /&gt;
|书签	&lt;br /&gt;
|可收藏为书签	&lt;br /&gt;
|不可收藏为书签&lt;br /&gt;
|-&lt;br /&gt;
|缓存	&lt;br /&gt;
|能被缓存	&lt;br /&gt;
|不能缓存&lt;br /&gt;
|-&lt;br /&gt;
|编码类型&lt;br /&gt;
|	application/x-www-form-urlencoded	&lt;br /&gt;
|application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。&lt;br /&gt;
|-&lt;br /&gt;
|历史	&lt;br /&gt;
|参数保留在浏览器历史中。	&lt;br /&gt;
|参数不会保存在浏览器历史中。&lt;br /&gt;
|-&lt;br /&gt;
|对数据长度的限制	&lt;br /&gt;
|是的。当发送数据时，GET 方法向 URL 添加数据；URL 的长度是受限制的（URL 的最大长度是 2048 个字符）。	&lt;br /&gt;
|无限制。&lt;br /&gt;
|-&lt;br /&gt;
|对数据类型的限制	&lt;br /&gt;
|只允许 ASCII 字符。	&lt;br /&gt;
|没有限制。也允许二进制数据。&lt;br /&gt;
|-&lt;br /&gt;
|安全性	&lt;br /&gt;
|与 POST 相比，GET 的安全性较差，因为所发送的数据是 URL 的一部分。&lt;br /&gt;
在发送密码或其他敏感信息时绝不要使用 GET ！&lt;br /&gt;
|POST 比 GET 更安全，因为参数不会被保存在浏览器历史或 web 服务器日志中。&lt;br /&gt;
|-&lt;br /&gt;
|可见性	&lt;br /&gt;
|数据在 URL 中对所有人都是可见的。	&lt;br /&gt;
|数据不会显示在 URL 中。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 转发和重定向的区别 ==&lt;br /&gt;
转发&lt;br /&gt;
&lt;br /&gt;
1. 是服务器内部的重定向，服务器直接访问目标地址的 url网址，把里面的东西读取出来，但是客户端并不知道，因此用forward的话，客户端浏览器的网址是不会发生变化的。&lt;br /&gt;
 &lt;br /&gt;
2. 关于request: 由于在整个定向的过程中用的是同一个request，因此forward会将request的信息带到被重定向的地址中。&lt;br /&gt;
&lt;br /&gt;
重定向&lt;br /&gt;
&lt;br /&gt;
1.是客户端的重定向，是完全的跳转。即服务器返回的一个url给客户端浏览器，然后客户端浏览器会重新发送一次请求，到新的url里面，因此浏览器中显示的url网址会发生变化。 &lt;br /&gt;
&lt;br /&gt;
2.因为这种方式比forward多了一次网络请求，因此效率会低于forward。&lt;br /&gt;
&lt;br /&gt;
== 堆栈区别  ==&lt;br /&gt;
== 并发和并行的区别 ==&lt;br /&gt;
行是指两个或者多个事件在同一时刻发生；而并发是指两个或多个事件在同一时间间隔发生。&lt;br /&gt;
&lt;br /&gt;
== 索引 ==&lt;br /&gt;
=== 不走索引 ===&lt;br /&gt;
=== 行级锁和表级锁 ===&lt;br /&gt;
&lt;br /&gt;
行级锁定的优点：&lt;br /&gt;
&lt;br /&gt;
·         当在许多线程中访问不同的行时只存在少量锁定冲突。&lt;br /&gt;
&lt;br /&gt;
·         回滚时只有少量的更改。&lt;br /&gt;
&lt;br /&gt;
·         可以长时间锁定单一的行。&lt;br /&gt;
&lt;br /&gt;
行级锁定的缺点：&lt;br /&gt;
&lt;br /&gt;
·         比页级或表级锁定占用更多的内存。&lt;br /&gt;
&lt;br /&gt;
·         当在表的大部分中使用时，比页级或表级锁定速度慢，因为你必须获取更多的锁。&lt;br /&gt;
&lt;br /&gt;
·         如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表，比其它锁定明显慢很多。&lt;br /&gt;
&lt;br /&gt;
·         用高级别锁定，通过支持不同的类型锁定，你也可以很容易地调节应用程序，因为其锁成本小于行级锁定。&lt;br /&gt;
&lt;br /&gt;
== 存储引擎 ==&lt;br /&gt;
* InnoDB&lt;br /&gt;
== 数据库，事务，隔离级别，存储引擎  ==&lt;br /&gt;
* 数据库，三大范式&lt;br /&gt;
== redis，有什么优势 -memcache对比 ==&lt;br /&gt;
数据存储位置&lt;br /&gt;
* redis： 内存、磁盘(数据持久化)&lt;br /&gt;
* memcache: 内存&lt;br /&gt;
&lt;br /&gt;
存储数据的类型（都是键值对的形式）值的类型：&lt;br /&gt;
* redis：list、set、hash、string、zset等&lt;br /&gt;
* memcache：string&lt;br /&gt;
&lt;br /&gt;
== http\https ==&lt;br /&gt;
* 默认端口不同80：443&lt;br /&gt;
* https需要颁发证书&lt;br /&gt;
* HTTPS协议的安全性更高&lt;br /&gt;
* https缺点&lt;br /&gt;
** 速度慢&lt;br /&gt;
** 服务器成本&lt;br /&gt;
&lt;br /&gt;
== 数据库的存储引擎应用场景，索引结构  ==&lt;br /&gt;
&lt;br /&gt;
MyISAM表使用B型树索引。 读取场景下性能好，表锁，不能事务&lt;br /&gt;
&lt;br /&gt;
InnoDB是为处理巨大数据量时的最大性能设计。B树。由于是行锁，写入、更新速度可能会快。&lt;br /&gt;
&lt;br /&gt;
MEMORY表被存储在内存中，且默认使用哈希索引&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为什么索引结构默认使用B-Tree，而不是hash，二叉树，红黑树？&lt;br /&gt;
* hash：虽然可以快速定位，但是没有顺序，IO复杂度高。&lt;br /&gt;
* 二叉树：树的高度不均匀，不能自平衡，查找效率跟数据有关（树的高度），并且IO代价高。&lt;br /&gt;
* 红黑树：树的高度随着数据量增加而增加，IO代价高。&lt;br /&gt;
&lt;br /&gt;
为什么建议使用自增长主键作为索引。&lt;br /&gt;
&lt;br /&gt;
结合B+Tree的特点，自增主键是连续的，在插入过程中尽量减少页分裂，即使要进行页分裂，也只会分裂很少一部分。并且能减少数据的移动，每次插入都是插入到最后。总之就是减少分裂和移动的频率。&lt;br /&gt;
&lt;br /&gt;
== 大数据量的优化 ==&lt;br /&gt;
* 分区、分表、分库&lt;br /&gt;
&lt;br /&gt;
== 设计一个权限系统  ==&lt;br /&gt;
== 算法题 ==&lt;br /&gt;
== 红黑树  ==&lt;br /&gt;
== 多线程，sleep，wait，yield  ==&lt;br /&gt;
== restful ==&lt;br /&gt;
== 设计模式，单例模式，适配器模式  ==&lt;br /&gt;
== 操作系统，死锁  ==&lt;br /&gt;
== 快排时间复杂度  ==&lt;br /&gt;
== nginx可承受的压力  ==&lt;br /&gt;
== 项目 ==&lt;br /&gt;
* 项目难点 &lt;br /&gt;
* 架构优化&lt;br /&gt;
* 难点&lt;br /&gt;
* 主要业务&lt;br /&gt;
== 服务调用超时可能由什么造成  ==&lt;br /&gt;
&lt;br /&gt;
* 网络问题，是否繁忙？&lt;br /&gt;
* cpu、内存排查，cpu消耗高，处理不过来&lt;br /&gt;
* 服务端有没有收到请求，看请求响应时间&lt;br /&gt;
* 客服端网络、cpu等有问题&lt;br /&gt;
&lt;br /&gt;
== 进程间的通信方式  ==&lt;br /&gt;
== fpm ==&lt;br /&gt;
* 合适的超时时间request_terminate_timeout、max_execution_time&lt;br /&gt;
* 看服务器性能，设置进程数量max_children&lt;br /&gt;
* fpm进程处理最大请求数max_requests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx ==&lt;br /&gt;
&lt;br /&gt;
* worker_processes 8; #nginx进程数，建议按照cpu数目来指定，一般为它的倍数,平时设置为2倍。&lt;br /&gt;
&lt;br /&gt;
* 静态资源缓存&lt;br /&gt;
&lt;br /&gt;
* nginx打开文件的最大个数&lt;br /&gt;
&lt;br /&gt;
* buffer： 如果buffer太小，Nginx会不停的写一些临时文件，这样会导致磁盘不停的去读写&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== php array 结构 ==&lt;br /&gt;
&lt;br /&gt;
hashtable+映射表的方式&lt;br /&gt;
&lt;br /&gt;
hash=&amp;gt;映射表=&amp;gt;bucket&lt;br /&gt;
&lt;br /&gt;
映射表与bucket长度相同&lt;br /&gt;
&lt;br /&gt;
hash冲突的情况：链地址法。next设置为相同hash的索引，然后在映射表里的值替换成当前元素在bucket中的位置。&lt;br /&gt;
&lt;br /&gt;
== 处理负载，高并发？==&lt;br /&gt;
&lt;br /&gt;
# HTML静态化&lt;br /&gt;
  效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的 网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。&lt;br /&gt;
# 图片服务器分离&lt;br /&gt;
  把图片单独存储，尽量减少图片等大流量的开销，可以放在一些相关的平台上，如七牛等&lt;br /&gt;
# 数据库集群和库表散列及缓存&lt;br /&gt;
  数据库的并发连接为100，一台数据库远远不够，可以从读写分离、主从复制，数据库集群方面来着手。另外尽量减少数据库的访问，可以使用缓存数据库如memcache、redis。&lt;br /&gt;
# 镜像：&lt;br /&gt;
  尽量减少下载，可以把不同的请求分发到多个镜像端。&lt;br /&gt;
# 负载均衡：&lt;br /&gt;
  Apache的最大并发连接为1500，只能增加服务器，可以从硬件上着手，如F5服务器。当然硬件的成本比较高，我们往往从软件方面着手。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Laravel请求生命周期 ==&lt;br /&gt;
&lt;br /&gt;
1、Laravel 采用了单一入口模式，应用的所有请求入口都是 public/index.php 文件。&lt;br /&gt;
2、注册类文件自动加载器 : Laravel通过 composer 进行依赖管理，无需开发者手动导入各种类文件，而由自动加载器自行导入。&lt;br /&gt;
3、创建服务容器：从 bootstrap/app.php 文件中取得 Laravel 应用实例 $app (服务容器)&lt;br /&gt;
创建 HTTP / Console 内核：传入的请求会被发送给 HTTP 内核或者 console 内核进行处理&lt;br /&gt;
4、载入服务提供者至容器：在内核引导启动的过程中最重要的动作之一就是载入服务提供者到你的应用，服务提供者负责引导启动框架的全部各种组件，例如数据库、队列、验证器以及路由组件。&lt;br /&gt;
5、分发请求：一旦应用完成引导和所有服务提供者都注册完成，Request 将会移交给路由进行分发。路由将分发请求给一个路由或控制器，同时运行路由指定的中间件&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=103</id>
		<title>常见问题</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=103"/>
		<updated>2019-10-22T06:36:03Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* Laravel请求生命周期 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== cookie 和 session 的区别 ==&lt;br /&gt;
* 作用范围不同，Cookie 保存在客户端（浏览器），Session 保存在服务器端。&lt;br /&gt;
* 存取方式的不同，Cookie 只能保存 ASCII，Session 可以存任意数据类型，一般情况下我们可以在 Session 中保持一些常用变量信息，比如说 UserId 等。&lt;br /&gt;
* 有效期不同，Cookie 可设置为长时间保持，比如我们经常使用的默认登录功能，Session 一般失效时间较短，客户端关闭或者 Session 超时都会失效。&lt;br /&gt;
* 隐私策略不同，Cookie 存储在客户端，比较容易遭到不法获取，早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取；Session 存储在服务端，安全性相对 Cookie 要好一些。&lt;br /&gt;
* 存储大小不同， 单个 Cookie 保存的数据不能超过 4K，Session 可存储数据远高于 Cookie。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分布式session&lt;br /&gt;
&lt;br /&gt;
ip_hash &lt;br /&gt;
Session 复制&lt;br /&gt;
缓存中间件&lt;br /&gt;
&lt;br /&gt;
== post 和 get 的区别 ==&lt;br /&gt;
https://www.w3school.com.cn/tags/html_ref_httpmethods.asp&lt;br /&gt;
&lt;br /&gt;
GET 用于获取信息，是无副作用的，是幂等的，且可缓存&lt;br /&gt;
POST 用于修改服务器上的数据，有副作用，非幂等，不可缓存&lt;br /&gt;
* 安全？post请求不会保留在浏览器历史记录中&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|GET&lt;br /&gt;
|POST&lt;br /&gt;
|-&lt;br /&gt;
|后退按钮/刷新&lt;br /&gt;
|	无害	&lt;br /&gt;
|数据会被重新提交（浏览器应该告知用户数据会被重新提交）。&lt;br /&gt;
|-&lt;br /&gt;
|书签	&lt;br /&gt;
|可收藏为书签	&lt;br /&gt;
|不可收藏为书签&lt;br /&gt;
|-&lt;br /&gt;
|缓存	&lt;br /&gt;
|能被缓存	&lt;br /&gt;
|不能缓存&lt;br /&gt;
|-&lt;br /&gt;
|编码类型&lt;br /&gt;
|	application/x-www-form-urlencoded	&lt;br /&gt;
|application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。&lt;br /&gt;
|-&lt;br /&gt;
|历史	&lt;br /&gt;
|参数保留在浏览器历史中。	&lt;br /&gt;
|参数不会保存在浏览器历史中。&lt;br /&gt;
|-&lt;br /&gt;
|对数据长度的限制	&lt;br /&gt;
|是的。当发送数据时，GET 方法向 URL 添加数据；URL 的长度是受限制的（URL 的最大长度是 2048 个字符）。	&lt;br /&gt;
|无限制。&lt;br /&gt;
|-&lt;br /&gt;
|对数据类型的限制	&lt;br /&gt;
|只允许 ASCII 字符。	&lt;br /&gt;
|没有限制。也允许二进制数据。&lt;br /&gt;
|-&lt;br /&gt;
|安全性	&lt;br /&gt;
|与 POST 相比，GET 的安全性较差，因为所发送的数据是 URL 的一部分。&lt;br /&gt;
在发送密码或其他敏感信息时绝不要使用 GET ！&lt;br /&gt;
|POST 比 GET 更安全，因为参数不会被保存在浏览器历史或 web 服务器日志中。&lt;br /&gt;
|-&lt;br /&gt;
|可见性	&lt;br /&gt;
|数据在 URL 中对所有人都是可见的。	&lt;br /&gt;
|数据不会显示在 URL 中。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 转发和重定向的区别 ==&lt;br /&gt;
转发&lt;br /&gt;
&lt;br /&gt;
1. 是服务器内部的重定向，服务器直接访问目标地址的 url网址，把里面的东西读取出来，但是客户端并不知道，因此用forward的话，客户端浏览器的网址是不会发生变化的。&lt;br /&gt;
 &lt;br /&gt;
2. 关于request: 由于在整个定向的过程中用的是同一个request，因此forward会将request的信息带到被重定向的地址中。&lt;br /&gt;
&lt;br /&gt;
重定向&lt;br /&gt;
&lt;br /&gt;
1.是客户端的重定向，是完全的跳转。即服务器返回的一个url给客户端浏览器，然后客户端浏览器会重新发送一次请求，到新的url里面，因此浏览器中显示的url网址会发生变化。 &lt;br /&gt;
&lt;br /&gt;
2.因为这种方式比forward多了一次网络请求，因此效率会低于forward。&lt;br /&gt;
&lt;br /&gt;
== 堆栈区别  ==&lt;br /&gt;
== 并发和并行的区别 ==&lt;br /&gt;
行是指两个或者多个事件在同一时刻发生；而并发是指两个或多个事件在同一时间间隔发生。&lt;br /&gt;
&lt;br /&gt;
== 索引 ==&lt;br /&gt;
=== 不走索引 ===&lt;br /&gt;
=== 行级锁和表级锁 ===&lt;br /&gt;
&lt;br /&gt;
行级锁定的优点：&lt;br /&gt;
&lt;br /&gt;
·         当在许多线程中访问不同的行时只存在少量锁定冲突。&lt;br /&gt;
&lt;br /&gt;
·         回滚时只有少量的更改。&lt;br /&gt;
&lt;br /&gt;
·         可以长时间锁定单一的行。&lt;br /&gt;
&lt;br /&gt;
行级锁定的缺点：&lt;br /&gt;
&lt;br /&gt;
·         比页级或表级锁定占用更多的内存。&lt;br /&gt;
&lt;br /&gt;
·         当在表的大部分中使用时，比页级或表级锁定速度慢，因为你必须获取更多的锁。&lt;br /&gt;
&lt;br /&gt;
·         如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表，比其它锁定明显慢很多。&lt;br /&gt;
&lt;br /&gt;
·         用高级别锁定，通过支持不同的类型锁定，你也可以很容易地调节应用程序，因为其锁成本小于行级锁定。&lt;br /&gt;
&lt;br /&gt;
== 存储引擎 ==&lt;br /&gt;
* InnoDB&lt;br /&gt;
== 数据库，事务，隔离级别，存储引擎  ==&lt;br /&gt;
* 数据库，三大范式&lt;br /&gt;
== redis，有什么优势 -memcache对比 ==&lt;br /&gt;
数据存储位置&lt;br /&gt;
* redis： 内存、磁盘(数据持久化)&lt;br /&gt;
* memcache: 内存&lt;br /&gt;
&lt;br /&gt;
存储数据的类型（都是键值对的形式）值的类型：&lt;br /&gt;
* redis：list、set、hash、string、zset等&lt;br /&gt;
* memcache：string&lt;br /&gt;
&lt;br /&gt;
== http\https ==&lt;br /&gt;
* 默认端口不同80：443&lt;br /&gt;
* https需要颁发证书&lt;br /&gt;
* HTTPS协议的安全性更高&lt;br /&gt;
* https缺点&lt;br /&gt;
** 速度慢&lt;br /&gt;
** 服务器成本&lt;br /&gt;
&lt;br /&gt;
== 数据库的存储引擎应用场景，索引结构  ==&lt;br /&gt;
&lt;br /&gt;
MyISAM表使用B型树索引。 读取场景下性能好，表锁，不能事务&lt;br /&gt;
&lt;br /&gt;
InnoDB是为处理巨大数据量时的最大性能设计。B树。由于是行锁，写入、更新速度可能会快。&lt;br /&gt;
&lt;br /&gt;
MEMORY表被存储在内存中，且默认使用哈希索引&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为什么索引结构默认使用B-Tree，而不是hash，二叉树，红黑树？&lt;br /&gt;
* hash：虽然可以快速定位，但是没有顺序，IO复杂度高。&lt;br /&gt;
* 二叉树：树的高度不均匀，不能自平衡，查找效率跟数据有关（树的高度），并且IO代价高。&lt;br /&gt;
* 红黑树：树的高度随着数据量增加而增加，IO代价高。&lt;br /&gt;
&lt;br /&gt;
为什么建议使用自增长主键作为索引。&lt;br /&gt;
&lt;br /&gt;
结合B+Tree的特点，自增主键是连续的，在插入过程中尽量减少页分裂，即使要进行页分裂，也只会分裂很少一部分。并且能减少数据的移动，每次插入都是插入到最后。总之就是减少分裂和移动的频率。&lt;br /&gt;
&lt;br /&gt;
== 大数据量的优化 ==&lt;br /&gt;
* 分区、分表、分库&lt;br /&gt;
&lt;br /&gt;
== 设计一个权限系统  ==&lt;br /&gt;
== 算法题 ==&lt;br /&gt;
== 红黑树  ==&lt;br /&gt;
== 多线程，sleep，wait，yield  ==&lt;br /&gt;
== restful ==&lt;br /&gt;
== 设计模式，单例模式，适配器模式  ==&lt;br /&gt;
== 操作系统，死锁  ==&lt;br /&gt;
== 快排时间复杂度  ==&lt;br /&gt;
== nginx可承受的压力  ==&lt;br /&gt;
== 项目 ==&lt;br /&gt;
* 项目难点 &lt;br /&gt;
* 架构优化&lt;br /&gt;
* 难点&lt;br /&gt;
* 主要业务&lt;br /&gt;
== 服务调用超时可能由什么造成  ==&lt;br /&gt;
&lt;br /&gt;
* 网络问题，是否繁忙？&lt;br /&gt;
* cpu、内存排查，cpu消耗高，处理不过来&lt;br /&gt;
* 服务端有没有收到请求，看请求响应时间&lt;br /&gt;
* 客服端网络、cpu等有问题&lt;br /&gt;
&lt;br /&gt;
== 进程间的通信方式  ==&lt;br /&gt;
== fpm ==&lt;br /&gt;
* 合适的超时时间request_terminate_timeout、max_execution_time&lt;br /&gt;
* 看服务器性能，设置进程数量max_children&lt;br /&gt;
* fpm进程处理最大请求数max_requests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx ==&lt;br /&gt;
&lt;br /&gt;
* worker_processes 8; #nginx进程数，建议按照cpu数目来指定，一般为它的倍数,平时设置为2倍。&lt;br /&gt;
&lt;br /&gt;
* 静态资源缓存&lt;br /&gt;
&lt;br /&gt;
* nginx打开文件的最大个数&lt;br /&gt;
&lt;br /&gt;
* buffer： 如果buffer太小，Nginx会不停的写一些临时文件，这样会导致磁盘不停的去读写&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== php array 结构 ==&lt;br /&gt;
&lt;br /&gt;
hashtable+映射表的方式&lt;br /&gt;
&lt;br /&gt;
hash=&amp;gt;映射表=&amp;gt;bucket&lt;br /&gt;
&lt;br /&gt;
映射表与bucket长度相同&lt;br /&gt;
&lt;br /&gt;
hash冲突的情况：链地址法。next设置为相同hash的索引，然后在映射表里的值替换成当前元素在bucket中的位置。&lt;br /&gt;
&lt;br /&gt;
== 处理负载，高并发？==&lt;br /&gt;
&lt;br /&gt;
# HTML静态化&lt;br /&gt;
  效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的 网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。&lt;br /&gt;
# 图片服务器分离&lt;br /&gt;
  把图片单独存储，尽量减少图片等大流量的开销，可以放在一些相关的平台上，如七牛等&lt;br /&gt;
# 数据库集群和库表散列及缓存&lt;br /&gt;
  数据库的并发连接为100，一台数据库远远不够，可以从读写分离、主从复制，数据库集群方面来着手。另外尽量减少数据库的访问，可以使用缓存数据库如memcache、redis。&lt;br /&gt;
# 镜像：&lt;br /&gt;
  尽量减少下载，可以把不同的请求分发到多个镜像端。&lt;br /&gt;
# 负载均衡：&lt;br /&gt;
  Apache的最大并发连接为1500，只能增加服务器，可以从硬件上着手，如F5服务器。当然硬件的成本比较高，我们往往从软件方面着手。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Laravel请求生命周期 ==&lt;br /&gt;
&lt;br /&gt;
# index.php&lt;br /&gt;
# app.php 获取app实例&lt;br /&gt;
# http kernel 或者 console kernel&lt;br /&gt;
## bootstrappers，执行请求之前运行的数组，配置错误处理、配置日志记录、检测应用程序环境 以及执行其他需要完成的任务&lt;br /&gt;
## 中间件列表&lt;br /&gt;
## handle处理请求，Request，返回Response&lt;br /&gt;
# 服务提供器，负责引导所有框架的各种组件&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=102</id>
		<title>常见问题</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=102"/>
		<updated>2019-10-22T06:35:44Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* 处理负载，高并发？ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== cookie 和 session 的区别 ==&lt;br /&gt;
* 作用范围不同，Cookie 保存在客户端（浏览器），Session 保存在服务器端。&lt;br /&gt;
* 存取方式的不同，Cookie 只能保存 ASCII，Session 可以存任意数据类型，一般情况下我们可以在 Session 中保持一些常用变量信息，比如说 UserId 等。&lt;br /&gt;
* 有效期不同，Cookie 可设置为长时间保持，比如我们经常使用的默认登录功能，Session 一般失效时间较短，客户端关闭或者 Session 超时都会失效。&lt;br /&gt;
* 隐私策略不同，Cookie 存储在客户端，比较容易遭到不法获取，早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取；Session 存储在服务端，安全性相对 Cookie 要好一些。&lt;br /&gt;
* 存储大小不同， 单个 Cookie 保存的数据不能超过 4K，Session 可存储数据远高于 Cookie。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分布式session&lt;br /&gt;
&lt;br /&gt;
ip_hash &lt;br /&gt;
Session 复制&lt;br /&gt;
缓存中间件&lt;br /&gt;
&lt;br /&gt;
== post 和 get 的区别 ==&lt;br /&gt;
https://www.w3school.com.cn/tags/html_ref_httpmethods.asp&lt;br /&gt;
&lt;br /&gt;
GET 用于获取信息，是无副作用的，是幂等的，且可缓存&lt;br /&gt;
POST 用于修改服务器上的数据，有副作用，非幂等，不可缓存&lt;br /&gt;
* 安全？post请求不会保留在浏览器历史记录中&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|GET&lt;br /&gt;
|POST&lt;br /&gt;
|-&lt;br /&gt;
|后退按钮/刷新&lt;br /&gt;
|	无害	&lt;br /&gt;
|数据会被重新提交（浏览器应该告知用户数据会被重新提交）。&lt;br /&gt;
|-&lt;br /&gt;
|书签	&lt;br /&gt;
|可收藏为书签	&lt;br /&gt;
|不可收藏为书签&lt;br /&gt;
|-&lt;br /&gt;
|缓存	&lt;br /&gt;
|能被缓存	&lt;br /&gt;
|不能缓存&lt;br /&gt;
|-&lt;br /&gt;
|编码类型&lt;br /&gt;
|	application/x-www-form-urlencoded	&lt;br /&gt;
|application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。&lt;br /&gt;
|-&lt;br /&gt;
|历史	&lt;br /&gt;
|参数保留在浏览器历史中。	&lt;br /&gt;
|参数不会保存在浏览器历史中。&lt;br /&gt;
|-&lt;br /&gt;
|对数据长度的限制	&lt;br /&gt;
|是的。当发送数据时，GET 方法向 URL 添加数据；URL 的长度是受限制的（URL 的最大长度是 2048 个字符）。	&lt;br /&gt;
|无限制。&lt;br /&gt;
|-&lt;br /&gt;
|对数据类型的限制	&lt;br /&gt;
|只允许 ASCII 字符。	&lt;br /&gt;
|没有限制。也允许二进制数据。&lt;br /&gt;
|-&lt;br /&gt;
|安全性	&lt;br /&gt;
|与 POST 相比，GET 的安全性较差，因为所发送的数据是 URL 的一部分。&lt;br /&gt;
在发送密码或其他敏感信息时绝不要使用 GET ！&lt;br /&gt;
|POST 比 GET 更安全，因为参数不会被保存在浏览器历史或 web 服务器日志中。&lt;br /&gt;
|-&lt;br /&gt;
|可见性	&lt;br /&gt;
|数据在 URL 中对所有人都是可见的。	&lt;br /&gt;
|数据不会显示在 URL 中。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 转发和重定向的区别 ==&lt;br /&gt;
转发&lt;br /&gt;
&lt;br /&gt;
1. 是服务器内部的重定向，服务器直接访问目标地址的 url网址，把里面的东西读取出来，但是客户端并不知道，因此用forward的话，客户端浏览器的网址是不会发生变化的。&lt;br /&gt;
 &lt;br /&gt;
2. 关于request: 由于在整个定向的过程中用的是同一个request，因此forward会将request的信息带到被重定向的地址中。&lt;br /&gt;
&lt;br /&gt;
重定向&lt;br /&gt;
&lt;br /&gt;
1.是客户端的重定向，是完全的跳转。即服务器返回的一个url给客户端浏览器，然后客户端浏览器会重新发送一次请求，到新的url里面，因此浏览器中显示的url网址会发生变化。 &lt;br /&gt;
&lt;br /&gt;
2.因为这种方式比forward多了一次网络请求，因此效率会低于forward。&lt;br /&gt;
&lt;br /&gt;
== 堆栈区别  ==&lt;br /&gt;
== 并发和并行的区别 ==&lt;br /&gt;
行是指两个或者多个事件在同一时刻发生；而并发是指两个或多个事件在同一时间间隔发生。&lt;br /&gt;
&lt;br /&gt;
== 索引 ==&lt;br /&gt;
=== 不走索引 ===&lt;br /&gt;
=== 行级锁和表级锁 ===&lt;br /&gt;
&lt;br /&gt;
行级锁定的优点：&lt;br /&gt;
&lt;br /&gt;
·         当在许多线程中访问不同的行时只存在少量锁定冲突。&lt;br /&gt;
&lt;br /&gt;
·         回滚时只有少量的更改。&lt;br /&gt;
&lt;br /&gt;
·         可以长时间锁定单一的行。&lt;br /&gt;
&lt;br /&gt;
行级锁定的缺点：&lt;br /&gt;
&lt;br /&gt;
·         比页级或表级锁定占用更多的内存。&lt;br /&gt;
&lt;br /&gt;
·         当在表的大部分中使用时，比页级或表级锁定速度慢，因为你必须获取更多的锁。&lt;br /&gt;
&lt;br /&gt;
·         如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表，比其它锁定明显慢很多。&lt;br /&gt;
&lt;br /&gt;
·         用高级别锁定，通过支持不同的类型锁定，你也可以很容易地调节应用程序，因为其锁成本小于行级锁定。&lt;br /&gt;
&lt;br /&gt;
== 存储引擎 ==&lt;br /&gt;
* InnoDB&lt;br /&gt;
== 数据库，事务，隔离级别，存储引擎  ==&lt;br /&gt;
* 数据库，三大范式&lt;br /&gt;
== redis，有什么优势 -memcache对比 ==&lt;br /&gt;
数据存储位置&lt;br /&gt;
* redis： 内存、磁盘(数据持久化)&lt;br /&gt;
* memcache: 内存&lt;br /&gt;
&lt;br /&gt;
存储数据的类型（都是键值对的形式）值的类型：&lt;br /&gt;
* redis：list、set、hash、string、zset等&lt;br /&gt;
* memcache：string&lt;br /&gt;
&lt;br /&gt;
== http\https ==&lt;br /&gt;
* 默认端口不同80：443&lt;br /&gt;
* https需要颁发证书&lt;br /&gt;
* HTTPS协议的安全性更高&lt;br /&gt;
* https缺点&lt;br /&gt;
** 速度慢&lt;br /&gt;
** 服务器成本&lt;br /&gt;
&lt;br /&gt;
== 数据库的存储引擎应用场景，索引结构  ==&lt;br /&gt;
&lt;br /&gt;
MyISAM表使用B型树索引。 读取场景下性能好，表锁，不能事务&lt;br /&gt;
&lt;br /&gt;
InnoDB是为处理巨大数据量时的最大性能设计。B树。由于是行锁，写入、更新速度可能会快。&lt;br /&gt;
&lt;br /&gt;
MEMORY表被存储在内存中，且默认使用哈希索引&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为什么索引结构默认使用B-Tree，而不是hash，二叉树，红黑树？&lt;br /&gt;
* hash：虽然可以快速定位，但是没有顺序，IO复杂度高。&lt;br /&gt;
* 二叉树：树的高度不均匀，不能自平衡，查找效率跟数据有关（树的高度），并且IO代价高。&lt;br /&gt;
* 红黑树：树的高度随着数据量增加而增加，IO代价高。&lt;br /&gt;
&lt;br /&gt;
为什么建议使用自增长主键作为索引。&lt;br /&gt;
&lt;br /&gt;
结合B+Tree的特点，自增主键是连续的，在插入过程中尽量减少页分裂，即使要进行页分裂，也只会分裂很少一部分。并且能减少数据的移动，每次插入都是插入到最后。总之就是减少分裂和移动的频率。&lt;br /&gt;
&lt;br /&gt;
== 大数据量的优化 ==&lt;br /&gt;
* 分区、分表、分库&lt;br /&gt;
&lt;br /&gt;
== 设计一个权限系统  ==&lt;br /&gt;
== 算法题 ==&lt;br /&gt;
== 红黑树  ==&lt;br /&gt;
== 多线程，sleep，wait，yield  ==&lt;br /&gt;
== restful ==&lt;br /&gt;
== 设计模式，单例模式，适配器模式  ==&lt;br /&gt;
== 操作系统，死锁  ==&lt;br /&gt;
== 快排时间复杂度  ==&lt;br /&gt;
== nginx可承受的压力  ==&lt;br /&gt;
== 项目 ==&lt;br /&gt;
* 项目难点 &lt;br /&gt;
* 架构优化&lt;br /&gt;
* 难点&lt;br /&gt;
* 主要业务&lt;br /&gt;
== 服务调用超时可能由什么造成  ==&lt;br /&gt;
&lt;br /&gt;
* 网络问题，是否繁忙？&lt;br /&gt;
* cpu、内存排查，cpu消耗高，处理不过来&lt;br /&gt;
* 服务端有没有收到请求，看请求响应时间&lt;br /&gt;
* 客服端网络、cpu等有问题&lt;br /&gt;
&lt;br /&gt;
== 进程间的通信方式  ==&lt;br /&gt;
== fpm ==&lt;br /&gt;
* 合适的超时时间request_terminate_timeout、max_execution_time&lt;br /&gt;
* 看服务器性能，设置进程数量max_children&lt;br /&gt;
* fpm进程处理最大请求数max_requests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx ==&lt;br /&gt;
&lt;br /&gt;
* worker_processes 8; #nginx进程数，建议按照cpu数目来指定，一般为它的倍数,平时设置为2倍。&lt;br /&gt;
&lt;br /&gt;
* 静态资源缓存&lt;br /&gt;
&lt;br /&gt;
* nginx打开文件的最大个数&lt;br /&gt;
&lt;br /&gt;
* buffer： 如果buffer太小，Nginx会不停的写一些临时文件，这样会导致磁盘不停的去读写&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== php array 结构 ==&lt;br /&gt;
&lt;br /&gt;
hashtable+映射表的方式&lt;br /&gt;
&lt;br /&gt;
hash=&amp;gt;映射表=&amp;gt;bucket&lt;br /&gt;
&lt;br /&gt;
映射表与bucket长度相同&lt;br /&gt;
&lt;br /&gt;
hash冲突的情况：链地址法。next设置为相同hash的索引，然后在映射表里的值替换成当前元素在bucket中的位置。&lt;br /&gt;
&lt;br /&gt;
== 处理负载，高并发？==&lt;br /&gt;
&lt;br /&gt;
# HTML静态化&lt;br /&gt;
  效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的 网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。&lt;br /&gt;
# 图片服务器分离&lt;br /&gt;
  把图片单独存储，尽量减少图片等大流量的开销，可以放在一些相关的平台上，如七牛等&lt;br /&gt;
# 数据库集群和库表散列及缓存&lt;br /&gt;
  数据库的并发连接为100，一台数据库远远不够，可以从读写分离、主从复制，数据库集群方面来着手。另外尽量减少数据库的访问，可以使用缓存数据库如memcache、redis。&lt;br /&gt;
# 镜像：&lt;br /&gt;
  尽量减少下载，可以把不同的请求分发到多个镜像端。&lt;br /&gt;
# 负载均衡：&lt;br /&gt;
  Apache的最大并发连接为1500，只能增加服务器，可以从硬件上着手，如F5服务器。当然硬件的成本比较高，我们往往从软件方面着手。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Laravel请求生命周期 ==&lt;br /&gt;
&lt;br /&gt;
# index.php&lt;br /&gt;
# app.php 获取app实例&lt;br /&gt;
# http kernel 或者 console kernel&lt;br /&gt;
    # bootstrappers，执行请求之前运行的数组，配置错误处理、配置日志记录、检测应用程序环境 以及执行其他需要完成的任务&lt;br /&gt;
    # 中间件列表&lt;br /&gt;
    # handle处理请求，Request，返回Response&lt;br /&gt;
&lt;br /&gt;
# 服务提供器，负责引导所有框架的各种组件&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Linux&amp;diff=101</id>
		<title>Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Linux&amp;diff=101"/>
		<updated>2019-09-21T08:15:04Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== 工具 ==&lt;br /&gt;
&lt;br /&gt;
* [[https://stedolan.github.io/jq/ jq]] 一个轻量级且灵活的命令行JSON处理器&lt;br /&gt;
&lt;br /&gt;
* [[https://geoff.greer.fm/ag/ ag]] The Silver Searcher代码搜索工具&lt;br /&gt;
* [[https://github.com/yaosonglive/vim .vimrc]] vim制表符换成控制配置&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
* [[Nginx灰度]] cookie实现灰度&lt;br /&gt;
* 常见错误&lt;br /&gt;
** 413 Request Entity Too Large&lt;br /&gt;
**: &amp;lt;code&amp;gt;client_max_body_size 8m;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 图片压缩 ==&lt;br /&gt;
使用imagemagick进行图片压缩&lt;br /&gt;
首先安装apt install imagemagick&lt;br /&gt;
&lt;br /&gt;
下面是demo，把再当前路径下的public目录中的图片进行压缩:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
arr = [&lt;br /&gt;
    '/upload/images/c0d0d881b2d742165999d91ec6380de2.jpg',&lt;br /&gt;
    '/upload/images/4e16982954bcbe89667ec70f67c02f20.jpg',&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
for i in arr:&lt;br /&gt;
    try:&lt;br /&gt;
        # print i&lt;br /&gt;
        kb = os.path.getsize('./public%s' % i)&lt;br /&gt;
            newNames = os.path.splitext(i)&lt;br /&gt;
            strname = '%s_s%s' % newNames&lt;br /&gt;
            if kb/1024 &amp;gt; 1:&lt;br /&gt;
                shell = &amp;quot;convert -sample 30%%x30%% ./public%s ./public%s&amp;quot; % (i, strname)&lt;br /&gt;
                os.system(shell)&lt;br /&gt;
                # print &amp;quot;update themes set preview='%s' where preview='%s';&amp;quot; % (strname, i)&lt;br /&gt;
    except Exception,e :&lt;br /&gt;
        print e&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
-resize 是缩小，-sample 是压缩&lt;br /&gt;
&lt;br /&gt;
== 其他 ==&lt;br /&gt;
* [[公钥]]&lt;br /&gt;
&lt;br /&gt;
* 终端不能输入中文&lt;br /&gt;
*# 先&amp;lt;code&amp;gt;locale -a&amp;lt;/code&amp;gt;查看，是否有&amp;lt;code&amp;gt;zh_CN.utf8&amp;lt;/code&amp;gt;&lt;br /&gt;
*# 如果没有,安装：&lt;br /&gt;
*#: centos: yum install glibc-common&lt;br /&gt;
*#: ubuntu: apt-get -y install language-pack-zh-hans&lt;br /&gt;
*# 重新进入终端，检查环境变量, 如果还是不行，修改环境变量:&lt;br /&gt;
*#* LANG=zh_CN.UTF-8&lt;br /&gt;
*#* LC_ALL=LC_ALL=zh_CN.UTF-8&lt;br /&gt;
&lt;br /&gt;
== 端口检测 ==&lt;br /&gt;
* telnet&lt;br /&gt;
:在telnet连接成功后，使用&amp;lt;code&amp;gt;Control +]&amp;lt;/code&amp;gt;然后使用&amp;lt;code&amp;gt;Control + D&amp;lt;/code&amp;gt;退出它。&lt;br /&gt;
:列出所有TCP连接套接字&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet localhost 80&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* lsof&lt;br /&gt;
:监听ipv4进程&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo lsof -n -i4TCP:5672 | grep LISTEN&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:IPv6的程序：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo lsof -n -i6TCP:5672 | grep LISTEN&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ss&lt;br /&gt;
:使用ss显示使用IPv4及其操作系统进程的侦听TCP套接字：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo ss --tcp -f inet --listening --numeric --processes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:同样，对于使用IPv6的TCP套接字：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo ss --tcp -f inet6 --listening --numeric --processes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* netstat&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo netstat --all --numeric --tcp --programs&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx fpm connect() to unix:xxx failed. http 502 ==&lt;br /&gt;
https://forum.nginx.org/read.php?11,215606,215606#msg-215606&lt;br /&gt;
&lt;br /&gt;
1）调高nginx和php-fpm中的backlog&lt;br /&gt;
&lt;br /&gt;
2）增加sock文件和php-fpm实例数&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
pm&lt;br /&gt;
&lt;br /&gt;
pm.max_children&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
listen.backlog = 4096&lt;br /&gt;
&lt;br /&gt;
* nginx &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
        listen 80 backlog=1024;&lt;br /&gt;
... ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
开多个fpm&lt;br /&gt;
&lt;br /&gt;
== 终端中文输入 ==&lt;br /&gt;
* ubuntu&lt;br /&gt;
locale-gen zh_CN.UTF-8&lt;br /&gt;
&lt;br /&gt;
dpkg-reconfigure locales&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Linux&amp;diff=100</id>
		<title>Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Linux&amp;diff=100"/>
		<updated>2019-09-06T02:03:00Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* nginx fpm connect() to unix:xxx failed. http 502 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== 工具 ==&lt;br /&gt;
&lt;br /&gt;
* [[https://stedolan.github.io/jq/ jq]] 一个轻量级且灵活的命令行JSON处理器&lt;br /&gt;
&lt;br /&gt;
* [[https://geoff.greer.fm/ag/ ag]] The Silver Searcher代码搜索工具&lt;br /&gt;
* [[https://github.com/yaosonglive/vim .vimrc]] vim制表符换成控制配置&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
* [[Nginx灰度]] cookie实现灰度&lt;br /&gt;
* 常见错误&lt;br /&gt;
** 413 Request Entity Too Large&lt;br /&gt;
**: &amp;lt;code&amp;gt;client_max_body_size 8m;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 图片压缩 ==&lt;br /&gt;
使用imagemagick进行图片压缩&lt;br /&gt;
首先安装apt install imagemagick&lt;br /&gt;
&lt;br /&gt;
下面是demo，把再当前路径下的public目录中的图片进行压缩:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
arr = [&lt;br /&gt;
    '/upload/images/c0d0d881b2d742165999d91ec6380de2.jpg',&lt;br /&gt;
    '/upload/images/4e16982954bcbe89667ec70f67c02f20.jpg',&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
for i in arr:&lt;br /&gt;
    try:&lt;br /&gt;
        # print i&lt;br /&gt;
        kb = os.path.getsize('./public%s' % i)&lt;br /&gt;
            newNames = os.path.splitext(i)&lt;br /&gt;
            strname = '%s_s%s' % newNames&lt;br /&gt;
            if kb/1024 &amp;gt; 1:&lt;br /&gt;
                shell = &amp;quot;convert -sample 30%%x30%% ./public%s ./public%s&amp;quot; % (i, strname)&lt;br /&gt;
                os.system(shell)&lt;br /&gt;
                # print &amp;quot;update themes set preview='%s' where preview='%s';&amp;quot; % (strname, i)&lt;br /&gt;
    except Exception,e :&lt;br /&gt;
        print e&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
-resize 是缩小，-sample 是压缩&lt;br /&gt;
&lt;br /&gt;
== 其他 ==&lt;br /&gt;
* [[公钥]]&lt;br /&gt;
&lt;br /&gt;
* 终端不能输入中文&lt;br /&gt;
*# 先&amp;lt;code&amp;gt;locale -a&amp;lt;/code&amp;gt;查看，是否有&amp;lt;code&amp;gt;zh_CN.utf8&amp;lt;/code&amp;gt;&lt;br /&gt;
*# 如果没有,安装：&lt;br /&gt;
*#: centos: yum install glibc-common&lt;br /&gt;
*#: ubuntu: apt-get -y install language-pack-zh-hans&lt;br /&gt;
*# 重新进入终端，检查环境变量, 如果还是不行，修改环境变量:&lt;br /&gt;
*#* LANG=zh_CN.UTF-8&lt;br /&gt;
*#* LC_ALL=LC_ALL=zh_CN.UTF-8&lt;br /&gt;
&lt;br /&gt;
== 端口检测 ==&lt;br /&gt;
* telnet&lt;br /&gt;
:在telnet连接成功后，使用&amp;lt;code&amp;gt;Control +]&amp;lt;/code&amp;gt;然后使用&amp;lt;code&amp;gt;Control + D&amp;lt;/code&amp;gt;退出它。&lt;br /&gt;
:列出所有TCP连接套接字&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet localhost 80&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* lsof&lt;br /&gt;
:监听ipv4进程&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo lsof -n -i4TCP:5672 | grep LISTEN&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:IPv6的程序：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo lsof -n -i6TCP:5672 | grep LISTEN&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ss&lt;br /&gt;
:使用ss显示使用IPv4及其操作系统进程的侦听TCP套接字：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo ss --tcp -f inet --listening --numeric --processes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:同样，对于使用IPv6的TCP套接字：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo ss --tcp -f inet6 --listening --numeric --processes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* netstat&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo netstat --all --numeric --tcp --programs&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx fpm connect() to unix:xxx failed. http 502 ==&lt;br /&gt;
https://forum.nginx.org/read.php?11,215606,215606#msg-215606&lt;br /&gt;
&lt;br /&gt;
1）调高nginx和php-fpm中的backlog&lt;br /&gt;
&lt;br /&gt;
2）增加sock文件和php-fpm实例数&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
pm&lt;br /&gt;
&lt;br /&gt;
pm.max_children&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
listen.backlog = 4096&lt;br /&gt;
&lt;br /&gt;
* nginx &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
        listen 80 backlog=1024;&lt;br /&gt;
... ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
开多个fpm&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Linux&amp;diff=99</id>
		<title>Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Linux&amp;diff=99"/>
		<updated>2019-09-05T09:30:29Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* nginx fpm connect() to unix:xxx failed. http 502 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== 工具 ==&lt;br /&gt;
&lt;br /&gt;
* [[https://stedolan.github.io/jq/ jq]] 一个轻量级且灵活的命令行JSON处理器&lt;br /&gt;
&lt;br /&gt;
* [[https://geoff.greer.fm/ag/ ag]] The Silver Searcher代码搜索工具&lt;br /&gt;
* [[https://github.com/yaosonglive/vim .vimrc]] vim制表符换成控制配置&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
* [[Nginx灰度]] cookie实现灰度&lt;br /&gt;
* 常见错误&lt;br /&gt;
** 413 Request Entity Too Large&lt;br /&gt;
**: &amp;lt;code&amp;gt;client_max_body_size 8m;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 图片压缩 ==&lt;br /&gt;
使用imagemagick进行图片压缩&lt;br /&gt;
首先安装apt install imagemagick&lt;br /&gt;
&lt;br /&gt;
下面是demo，把再当前路径下的public目录中的图片进行压缩:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
arr = [&lt;br /&gt;
    '/upload/images/c0d0d881b2d742165999d91ec6380de2.jpg',&lt;br /&gt;
    '/upload/images/4e16982954bcbe89667ec70f67c02f20.jpg',&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
for i in arr:&lt;br /&gt;
    try:&lt;br /&gt;
        # print i&lt;br /&gt;
        kb = os.path.getsize('./public%s' % i)&lt;br /&gt;
            newNames = os.path.splitext(i)&lt;br /&gt;
            strname = '%s_s%s' % newNames&lt;br /&gt;
            if kb/1024 &amp;gt; 1:&lt;br /&gt;
                shell = &amp;quot;convert -sample 30%%x30%% ./public%s ./public%s&amp;quot; % (i, strname)&lt;br /&gt;
                os.system(shell)&lt;br /&gt;
                # print &amp;quot;update themes set preview='%s' where preview='%s';&amp;quot; % (strname, i)&lt;br /&gt;
    except Exception,e :&lt;br /&gt;
        print e&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
-resize 是缩小，-sample 是压缩&lt;br /&gt;
&lt;br /&gt;
== 其他 ==&lt;br /&gt;
* [[公钥]]&lt;br /&gt;
&lt;br /&gt;
* 终端不能输入中文&lt;br /&gt;
*# 先&amp;lt;code&amp;gt;locale -a&amp;lt;/code&amp;gt;查看，是否有&amp;lt;code&amp;gt;zh_CN.utf8&amp;lt;/code&amp;gt;&lt;br /&gt;
*# 如果没有,安装：&lt;br /&gt;
*#: centos: yum install glibc-common&lt;br /&gt;
*#: ubuntu: apt-get -y install language-pack-zh-hans&lt;br /&gt;
*# 重新进入终端，检查环境变量, 如果还是不行，修改环境变量:&lt;br /&gt;
*#* LANG=zh_CN.UTF-8&lt;br /&gt;
*#* LC_ALL=LC_ALL=zh_CN.UTF-8&lt;br /&gt;
&lt;br /&gt;
== 端口检测 ==&lt;br /&gt;
* telnet&lt;br /&gt;
:在telnet连接成功后，使用&amp;lt;code&amp;gt;Control +]&amp;lt;/code&amp;gt;然后使用&amp;lt;code&amp;gt;Control + D&amp;lt;/code&amp;gt;退出它。&lt;br /&gt;
:列出所有TCP连接套接字&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet localhost 80&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* lsof&lt;br /&gt;
:监听ipv4进程&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo lsof -n -i4TCP:5672 | grep LISTEN&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:IPv6的程序：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo lsof -n -i6TCP:5672 | grep LISTEN&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ss&lt;br /&gt;
:使用ss显示使用IPv4及其操作系统进程的侦听TCP套接字：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo ss --tcp -f inet --listening --numeric --processes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:同样，对于使用IPv6的TCP套接字：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo ss --tcp -f inet6 --listening --numeric --processes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* netstat&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo netstat --all --numeric --tcp --programs&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx fpm connect() to unix:xxx failed. http 502 ==&lt;br /&gt;
https://forum.nginx.org/read.php?11,215606,215606#msg-215606&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
pm&lt;br /&gt;
&lt;br /&gt;
pm.max_children&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
listen.backlog = 4096&lt;br /&gt;
&lt;br /&gt;
* nginx &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
        listen 80 backlog=1024;&lt;br /&gt;
... ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
开多个fpm&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Linux&amp;diff=98</id>
		<title>Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Linux&amp;diff=98"/>
		<updated>2019-09-05T09:28:50Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* nginx fpm connect() to unix:xxx failed. http 502 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== 工具 ==&lt;br /&gt;
&lt;br /&gt;
* [[https://stedolan.github.io/jq/ jq]] 一个轻量级且灵活的命令行JSON处理器&lt;br /&gt;
&lt;br /&gt;
* [[https://geoff.greer.fm/ag/ ag]] The Silver Searcher代码搜索工具&lt;br /&gt;
* [[https://github.com/yaosonglive/vim .vimrc]] vim制表符换成控制配置&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
* [[Nginx灰度]] cookie实现灰度&lt;br /&gt;
* 常见错误&lt;br /&gt;
** 413 Request Entity Too Large&lt;br /&gt;
**: &amp;lt;code&amp;gt;client_max_body_size 8m;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 图片压缩 ==&lt;br /&gt;
使用imagemagick进行图片压缩&lt;br /&gt;
首先安装apt install imagemagick&lt;br /&gt;
&lt;br /&gt;
下面是demo，把再当前路径下的public目录中的图片进行压缩:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
arr = [&lt;br /&gt;
    '/upload/images/c0d0d881b2d742165999d91ec6380de2.jpg',&lt;br /&gt;
    '/upload/images/4e16982954bcbe89667ec70f67c02f20.jpg',&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
for i in arr:&lt;br /&gt;
    try:&lt;br /&gt;
        # print i&lt;br /&gt;
        kb = os.path.getsize('./public%s' % i)&lt;br /&gt;
            newNames = os.path.splitext(i)&lt;br /&gt;
            strname = '%s_s%s' % newNames&lt;br /&gt;
            if kb/1024 &amp;gt; 1:&lt;br /&gt;
                shell = &amp;quot;convert -sample 30%%x30%% ./public%s ./public%s&amp;quot; % (i, strname)&lt;br /&gt;
                os.system(shell)&lt;br /&gt;
                # print &amp;quot;update themes set preview='%s' where preview='%s';&amp;quot; % (strname, i)&lt;br /&gt;
    except Exception,e :&lt;br /&gt;
        print e&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
-resize 是缩小，-sample 是压缩&lt;br /&gt;
&lt;br /&gt;
== 其他 ==&lt;br /&gt;
* [[公钥]]&lt;br /&gt;
&lt;br /&gt;
* 终端不能输入中文&lt;br /&gt;
*# 先&amp;lt;code&amp;gt;locale -a&amp;lt;/code&amp;gt;查看，是否有&amp;lt;code&amp;gt;zh_CN.utf8&amp;lt;/code&amp;gt;&lt;br /&gt;
*# 如果没有,安装：&lt;br /&gt;
*#: centos: yum install glibc-common&lt;br /&gt;
*#: ubuntu: apt-get -y install language-pack-zh-hans&lt;br /&gt;
*# 重新进入终端，检查环境变量, 如果还是不行，修改环境变量:&lt;br /&gt;
*#* LANG=zh_CN.UTF-8&lt;br /&gt;
*#* LC_ALL=LC_ALL=zh_CN.UTF-8&lt;br /&gt;
&lt;br /&gt;
== 端口检测 ==&lt;br /&gt;
* telnet&lt;br /&gt;
:在telnet连接成功后，使用&amp;lt;code&amp;gt;Control +]&amp;lt;/code&amp;gt;然后使用&amp;lt;code&amp;gt;Control + D&amp;lt;/code&amp;gt;退出它。&lt;br /&gt;
:列出所有TCP连接套接字&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet localhost 80&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* lsof&lt;br /&gt;
:监听ipv4进程&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo lsof -n -i4TCP:5672 | grep LISTEN&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:IPv6的程序：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo lsof -n -i6TCP:5672 | grep LISTEN&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ss&lt;br /&gt;
:使用ss显示使用IPv4及其操作系统进程的侦听TCP套接字：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo ss --tcp -f inet --listening --numeric --processes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:同样，对于使用IPv6的TCP套接字：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo ss --tcp -f inet6 --listening --numeric --processes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* netstat&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo netstat --all --numeric --tcp --programs&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx fpm connect() to unix:xxx failed. http 502 ==&lt;br /&gt;
https://forum.nginx.org/read.php?11,215606,215606#msg-215606&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
pm&lt;br /&gt;
&lt;br /&gt;
pm.max_children&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
listen.backlog = 4096&lt;br /&gt;
&lt;br /&gt;
* nginx &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
        listen 80 backlog=1024;&lt;br /&gt;
... ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=Linux&amp;diff=97</id>
		<title>Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=Linux&amp;diff=97"/>
		<updated>2019-09-05T09:01:30Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== 工具 ==&lt;br /&gt;
&lt;br /&gt;
* [[https://stedolan.github.io/jq/ jq]] 一个轻量级且灵活的命令行JSON处理器&lt;br /&gt;
&lt;br /&gt;
* [[https://geoff.greer.fm/ag/ ag]] The Silver Searcher代码搜索工具&lt;br /&gt;
* [[https://github.com/yaosonglive/vim .vimrc]] vim制表符换成控制配置&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nginx ==&lt;br /&gt;
* [[Nginx灰度]] cookie实现灰度&lt;br /&gt;
* 常见错误&lt;br /&gt;
** 413 Request Entity Too Large&lt;br /&gt;
**: &amp;lt;code&amp;gt;client_max_body_size 8m;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 图片压缩 ==&lt;br /&gt;
使用imagemagick进行图片压缩&lt;br /&gt;
首先安装apt install imagemagick&lt;br /&gt;
&lt;br /&gt;
下面是demo，把再当前路径下的public目录中的图片进行压缩:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
arr = [&lt;br /&gt;
    '/upload/images/c0d0d881b2d742165999d91ec6380de2.jpg',&lt;br /&gt;
    '/upload/images/4e16982954bcbe89667ec70f67c02f20.jpg',&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
for i in arr:&lt;br /&gt;
    try:&lt;br /&gt;
        # print i&lt;br /&gt;
        kb = os.path.getsize('./public%s' % i)&lt;br /&gt;
            newNames = os.path.splitext(i)&lt;br /&gt;
            strname = '%s_s%s' % newNames&lt;br /&gt;
            if kb/1024 &amp;gt; 1:&lt;br /&gt;
                shell = &amp;quot;convert -sample 30%%x30%% ./public%s ./public%s&amp;quot; % (i, strname)&lt;br /&gt;
                os.system(shell)&lt;br /&gt;
                # print &amp;quot;update themes set preview='%s' where preview='%s';&amp;quot; % (strname, i)&lt;br /&gt;
    except Exception,e :&lt;br /&gt;
        print e&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
-resize 是缩小，-sample 是压缩&lt;br /&gt;
&lt;br /&gt;
== 其他 ==&lt;br /&gt;
* [[公钥]]&lt;br /&gt;
&lt;br /&gt;
* 终端不能输入中文&lt;br /&gt;
*# 先&amp;lt;code&amp;gt;locale -a&amp;lt;/code&amp;gt;查看，是否有&amp;lt;code&amp;gt;zh_CN.utf8&amp;lt;/code&amp;gt;&lt;br /&gt;
*# 如果没有,安装：&lt;br /&gt;
*#: centos: yum install glibc-common&lt;br /&gt;
*#: ubuntu: apt-get -y install language-pack-zh-hans&lt;br /&gt;
*# 重新进入终端，检查环境变量, 如果还是不行，修改环境变量:&lt;br /&gt;
*#* LANG=zh_CN.UTF-8&lt;br /&gt;
*#* LC_ALL=LC_ALL=zh_CN.UTF-8&lt;br /&gt;
&lt;br /&gt;
== 端口检测 ==&lt;br /&gt;
* telnet&lt;br /&gt;
:在telnet连接成功后，使用&amp;lt;code&amp;gt;Control +]&amp;lt;/code&amp;gt;然后使用&amp;lt;code&amp;gt;Control + D&amp;lt;/code&amp;gt;退出它。&lt;br /&gt;
:列出所有TCP连接套接字&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
telnet localhost 80&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* lsof&lt;br /&gt;
:监听ipv4进程&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo lsof -n -i4TCP:5672 | grep LISTEN&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:IPv6的程序：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo lsof -n -i6TCP:5672 | grep LISTEN&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ss&lt;br /&gt;
:使用ss显示使用IPv4及其操作系统进程的侦听TCP套接字：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo ss --tcp -f inet --listening --numeric --processes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
:同样，对于使用IPv6的TCP套接字：&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo ss --tcp -f inet6 --listening --numeric --processes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* netstat&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo netstat --all --numeric --tcp --programs&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx fpm connect() to unix:xxx failed. http 502 ==&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=96</id>
		<title>常见问题</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=96"/>
		<updated>2019-09-04T15:26:04Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* 处理负载，高并发？ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== cookie 和 session 的区别 ==&lt;br /&gt;
* 作用范围不同，Cookie 保存在客户端（浏览器），Session 保存在服务器端。&lt;br /&gt;
* 存取方式的不同，Cookie 只能保存 ASCII，Session 可以存任意数据类型，一般情况下我们可以在 Session 中保持一些常用变量信息，比如说 UserId 等。&lt;br /&gt;
* 有效期不同，Cookie 可设置为长时间保持，比如我们经常使用的默认登录功能，Session 一般失效时间较短，客户端关闭或者 Session 超时都会失效。&lt;br /&gt;
* 隐私策略不同，Cookie 存储在客户端，比较容易遭到不法获取，早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取；Session 存储在服务端，安全性相对 Cookie 要好一些。&lt;br /&gt;
* 存储大小不同， 单个 Cookie 保存的数据不能超过 4K，Session 可存储数据远高于 Cookie。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分布式session&lt;br /&gt;
&lt;br /&gt;
ip_hash &lt;br /&gt;
Session 复制&lt;br /&gt;
缓存中间件&lt;br /&gt;
&lt;br /&gt;
== post 和 get 的区别 ==&lt;br /&gt;
https://www.w3school.com.cn/tags/html_ref_httpmethods.asp&lt;br /&gt;
&lt;br /&gt;
GET 用于获取信息，是无副作用的，是幂等的，且可缓存&lt;br /&gt;
POST 用于修改服务器上的数据，有副作用，非幂等，不可缓存&lt;br /&gt;
* 安全？post请求不会保留在浏览器历史记录中&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|GET&lt;br /&gt;
|POST&lt;br /&gt;
|-&lt;br /&gt;
|后退按钮/刷新&lt;br /&gt;
|	无害	&lt;br /&gt;
|数据会被重新提交（浏览器应该告知用户数据会被重新提交）。&lt;br /&gt;
|-&lt;br /&gt;
|书签	&lt;br /&gt;
|可收藏为书签	&lt;br /&gt;
|不可收藏为书签&lt;br /&gt;
|-&lt;br /&gt;
|缓存	&lt;br /&gt;
|能被缓存	&lt;br /&gt;
|不能缓存&lt;br /&gt;
|-&lt;br /&gt;
|编码类型&lt;br /&gt;
|	application/x-www-form-urlencoded	&lt;br /&gt;
|application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。&lt;br /&gt;
|-&lt;br /&gt;
|历史	&lt;br /&gt;
|参数保留在浏览器历史中。	&lt;br /&gt;
|参数不会保存在浏览器历史中。&lt;br /&gt;
|-&lt;br /&gt;
|对数据长度的限制	&lt;br /&gt;
|是的。当发送数据时，GET 方法向 URL 添加数据；URL 的长度是受限制的（URL 的最大长度是 2048 个字符）。	&lt;br /&gt;
|无限制。&lt;br /&gt;
|-&lt;br /&gt;
|对数据类型的限制	&lt;br /&gt;
|只允许 ASCII 字符。	&lt;br /&gt;
|没有限制。也允许二进制数据。&lt;br /&gt;
|-&lt;br /&gt;
|安全性	&lt;br /&gt;
|与 POST 相比，GET 的安全性较差，因为所发送的数据是 URL 的一部分。&lt;br /&gt;
在发送密码或其他敏感信息时绝不要使用 GET ！&lt;br /&gt;
|POST 比 GET 更安全，因为参数不会被保存在浏览器历史或 web 服务器日志中。&lt;br /&gt;
|-&lt;br /&gt;
|可见性	&lt;br /&gt;
|数据在 URL 中对所有人都是可见的。	&lt;br /&gt;
|数据不会显示在 URL 中。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 转发和重定向的区别 ==&lt;br /&gt;
转发&lt;br /&gt;
&lt;br /&gt;
1. 是服务器内部的重定向，服务器直接访问目标地址的 url网址，把里面的东西读取出来，但是客户端并不知道，因此用forward的话，客户端浏览器的网址是不会发生变化的。&lt;br /&gt;
 &lt;br /&gt;
2. 关于request: 由于在整个定向的过程中用的是同一个request，因此forward会将request的信息带到被重定向的地址中。&lt;br /&gt;
&lt;br /&gt;
重定向&lt;br /&gt;
&lt;br /&gt;
1.是客户端的重定向，是完全的跳转。即服务器返回的一个url给客户端浏览器，然后客户端浏览器会重新发送一次请求，到新的url里面，因此浏览器中显示的url网址会发生变化。 &lt;br /&gt;
&lt;br /&gt;
2.因为这种方式比forward多了一次网络请求，因此效率会低于forward。&lt;br /&gt;
&lt;br /&gt;
== 堆栈区别  ==&lt;br /&gt;
== 并发和并行的区别 ==&lt;br /&gt;
行是指两个或者多个事件在同一时刻发生；而并发是指两个或多个事件在同一时间间隔发生。&lt;br /&gt;
&lt;br /&gt;
== 索引 ==&lt;br /&gt;
=== 不走索引 ===&lt;br /&gt;
=== 行级锁和表级锁 ===&lt;br /&gt;
&lt;br /&gt;
行级锁定的优点：&lt;br /&gt;
&lt;br /&gt;
·         当在许多线程中访问不同的行时只存在少量锁定冲突。&lt;br /&gt;
&lt;br /&gt;
·         回滚时只有少量的更改。&lt;br /&gt;
&lt;br /&gt;
·         可以长时间锁定单一的行。&lt;br /&gt;
&lt;br /&gt;
行级锁定的缺点：&lt;br /&gt;
&lt;br /&gt;
·         比页级或表级锁定占用更多的内存。&lt;br /&gt;
&lt;br /&gt;
·         当在表的大部分中使用时，比页级或表级锁定速度慢，因为你必须获取更多的锁。&lt;br /&gt;
&lt;br /&gt;
·         如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表，比其它锁定明显慢很多。&lt;br /&gt;
&lt;br /&gt;
·         用高级别锁定，通过支持不同的类型锁定，你也可以很容易地调节应用程序，因为其锁成本小于行级锁定。&lt;br /&gt;
&lt;br /&gt;
== 存储引擎 ==&lt;br /&gt;
* InnoDB&lt;br /&gt;
== 数据库，事务，隔离级别，存储引擎  ==&lt;br /&gt;
* 数据库，三大范式&lt;br /&gt;
== redis，有什么优势 -memcache对比 ==&lt;br /&gt;
数据存储位置&lt;br /&gt;
* redis： 内存、磁盘(数据持久化)&lt;br /&gt;
* memcache: 内存&lt;br /&gt;
&lt;br /&gt;
存储数据的类型（都是键值对的形式）值的类型：&lt;br /&gt;
* redis：list、set、hash、string、zset等&lt;br /&gt;
* memcache：string&lt;br /&gt;
&lt;br /&gt;
== http\https ==&lt;br /&gt;
* 默认端口不同80：443&lt;br /&gt;
* https需要颁发证书&lt;br /&gt;
* HTTPS协议的安全性更高&lt;br /&gt;
* https缺点&lt;br /&gt;
** 速度慢&lt;br /&gt;
** 服务器成本&lt;br /&gt;
&lt;br /&gt;
== 数据库的存储引擎应用场景，索引结构  ==&lt;br /&gt;
&lt;br /&gt;
MyISAM表使用B型树索引。 读取场景下性能好，表锁，不能事务&lt;br /&gt;
&lt;br /&gt;
InnoDB是为处理巨大数据量时的最大性能设计。B树。由于是行锁，写入、更新速度可能会快。&lt;br /&gt;
&lt;br /&gt;
MEMORY表被存储在内存中，且默认使用哈希索引&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为什么索引结构默认使用B-Tree，而不是hash，二叉树，红黑树？&lt;br /&gt;
* hash：虽然可以快速定位，但是没有顺序，IO复杂度高。&lt;br /&gt;
* 二叉树：树的高度不均匀，不能自平衡，查找效率跟数据有关（树的高度），并且IO代价高。&lt;br /&gt;
* 红黑树：树的高度随着数据量增加而增加，IO代价高。&lt;br /&gt;
&lt;br /&gt;
为什么建议使用自增长主键作为索引。&lt;br /&gt;
&lt;br /&gt;
结合B+Tree的特点，自增主键是连续的，在插入过程中尽量减少页分裂，即使要进行页分裂，也只会分裂很少一部分。并且能减少数据的移动，每次插入都是插入到最后。总之就是减少分裂和移动的频率。&lt;br /&gt;
&lt;br /&gt;
== 大数据量的优化 ==&lt;br /&gt;
* 分区、分表、分库&lt;br /&gt;
&lt;br /&gt;
== 设计一个权限系统  ==&lt;br /&gt;
== 算法题 ==&lt;br /&gt;
== 红黑树  ==&lt;br /&gt;
== 多线程，sleep，wait，yield  ==&lt;br /&gt;
== restful ==&lt;br /&gt;
== 设计模式，单例模式，适配器模式  ==&lt;br /&gt;
== 操作系统，死锁  ==&lt;br /&gt;
== 快排时间复杂度  ==&lt;br /&gt;
== nginx可承受的压力  ==&lt;br /&gt;
== 项目 ==&lt;br /&gt;
* 项目难点 &lt;br /&gt;
* 架构优化&lt;br /&gt;
* 难点&lt;br /&gt;
* 主要业务&lt;br /&gt;
== 服务调用超时可能由什么造成  ==&lt;br /&gt;
&lt;br /&gt;
* 网络问题，是否繁忙？&lt;br /&gt;
* cpu、内存排查，cpu消耗高，处理不过来&lt;br /&gt;
* 服务端有没有收到请求，看请求响应时间&lt;br /&gt;
* 客服端网络、cpu等有问题&lt;br /&gt;
&lt;br /&gt;
== 进程间的通信方式  ==&lt;br /&gt;
== fpm ==&lt;br /&gt;
* 合适的超时时间request_terminate_timeout、max_execution_time&lt;br /&gt;
* 看服务器性能，设置进程数量max_children&lt;br /&gt;
* fpm进程处理最大请求数max_requests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx ==&lt;br /&gt;
&lt;br /&gt;
* worker_processes 8; #nginx进程数，建议按照cpu数目来指定，一般为它的倍数,平时设置为2倍。&lt;br /&gt;
&lt;br /&gt;
* 静态资源缓存&lt;br /&gt;
&lt;br /&gt;
* nginx打开文件的最大个数&lt;br /&gt;
&lt;br /&gt;
* buffer： 如果buffer太小，Nginx会不停的写一些临时文件，这样会导致磁盘不停的去读写&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== php array 结构 ==&lt;br /&gt;
&lt;br /&gt;
hashtable+映射表的方式&lt;br /&gt;
&lt;br /&gt;
hash=&amp;gt;映射表=&amp;gt;bucket&lt;br /&gt;
&lt;br /&gt;
映射表与bucket长度相同&lt;br /&gt;
&lt;br /&gt;
hash冲突的情况：链地址法。next设置为相同hash的索引，然后在映射表里的值替换成当前元素在bucket中的位置。&lt;br /&gt;
&lt;br /&gt;
== 处理负载，高并发？==&lt;br /&gt;
&lt;br /&gt;
# HTML静态化&lt;br /&gt;
  效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的 网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。&lt;br /&gt;
# 图片服务器分离&lt;br /&gt;
  把图片单独存储，尽量减少图片等大流量的开销，可以放在一些相关的平台上，如七牛等&lt;br /&gt;
# 数据库集群和库表散列及缓存&lt;br /&gt;
  数据库的并发连接为100，一台数据库远远不够，可以从读写分离、主从复制，数据库集群方面来着手。另外尽量减少数据库的访问，可以使用缓存数据库如memcache、redis。&lt;br /&gt;
# 镜像：&lt;br /&gt;
  尽量减少下载，可以把不同的请求分发到多个镜像端。&lt;br /&gt;
# 负载均衡：&lt;br /&gt;
  Apache的最大并发连接为1500，只能增加服务器，可以从硬件上着手，如F5服务器。当然硬件的成本比较高，我们往往从软件方面着手。&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=95</id>
		<title>常见问题</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=95"/>
		<updated>2019-09-04T15:25:08Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== cookie 和 session 的区别 ==&lt;br /&gt;
* 作用范围不同，Cookie 保存在客户端（浏览器），Session 保存在服务器端。&lt;br /&gt;
* 存取方式的不同，Cookie 只能保存 ASCII，Session 可以存任意数据类型，一般情况下我们可以在 Session 中保持一些常用变量信息，比如说 UserId 等。&lt;br /&gt;
* 有效期不同，Cookie 可设置为长时间保持，比如我们经常使用的默认登录功能，Session 一般失效时间较短，客户端关闭或者 Session 超时都会失效。&lt;br /&gt;
* 隐私策略不同，Cookie 存储在客户端，比较容易遭到不法获取，早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取；Session 存储在服务端，安全性相对 Cookie 要好一些。&lt;br /&gt;
* 存储大小不同， 单个 Cookie 保存的数据不能超过 4K，Session 可存储数据远高于 Cookie。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分布式session&lt;br /&gt;
&lt;br /&gt;
ip_hash &lt;br /&gt;
Session 复制&lt;br /&gt;
缓存中间件&lt;br /&gt;
&lt;br /&gt;
== post 和 get 的区别 ==&lt;br /&gt;
https://www.w3school.com.cn/tags/html_ref_httpmethods.asp&lt;br /&gt;
&lt;br /&gt;
GET 用于获取信息，是无副作用的，是幂等的，且可缓存&lt;br /&gt;
POST 用于修改服务器上的数据，有副作用，非幂等，不可缓存&lt;br /&gt;
* 安全？post请求不会保留在浏览器历史记录中&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|GET&lt;br /&gt;
|POST&lt;br /&gt;
|-&lt;br /&gt;
|后退按钮/刷新&lt;br /&gt;
|	无害	&lt;br /&gt;
|数据会被重新提交（浏览器应该告知用户数据会被重新提交）。&lt;br /&gt;
|-&lt;br /&gt;
|书签	&lt;br /&gt;
|可收藏为书签	&lt;br /&gt;
|不可收藏为书签&lt;br /&gt;
|-&lt;br /&gt;
|缓存	&lt;br /&gt;
|能被缓存	&lt;br /&gt;
|不能缓存&lt;br /&gt;
|-&lt;br /&gt;
|编码类型&lt;br /&gt;
|	application/x-www-form-urlencoded	&lt;br /&gt;
|application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。&lt;br /&gt;
|-&lt;br /&gt;
|历史	&lt;br /&gt;
|参数保留在浏览器历史中。	&lt;br /&gt;
|参数不会保存在浏览器历史中。&lt;br /&gt;
|-&lt;br /&gt;
|对数据长度的限制	&lt;br /&gt;
|是的。当发送数据时，GET 方法向 URL 添加数据；URL 的长度是受限制的（URL 的最大长度是 2048 个字符）。	&lt;br /&gt;
|无限制。&lt;br /&gt;
|-&lt;br /&gt;
|对数据类型的限制	&lt;br /&gt;
|只允许 ASCII 字符。	&lt;br /&gt;
|没有限制。也允许二进制数据。&lt;br /&gt;
|-&lt;br /&gt;
|安全性	&lt;br /&gt;
|与 POST 相比，GET 的安全性较差，因为所发送的数据是 URL 的一部分。&lt;br /&gt;
在发送密码或其他敏感信息时绝不要使用 GET ！&lt;br /&gt;
|POST 比 GET 更安全，因为参数不会被保存在浏览器历史或 web 服务器日志中。&lt;br /&gt;
|-&lt;br /&gt;
|可见性	&lt;br /&gt;
|数据在 URL 中对所有人都是可见的。	&lt;br /&gt;
|数据不会显示在 URL 中。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 转发和重定向的区别 ==&lt;br /&gt;
转发&lt;br /&gt;
&lt;br /&gt;
1. 是服务器内部的重定向，服务器直接访问目标地址的 url网址，把里面的东西读取出来，但是客户端并不知道，因此用forward的话，客户端浏览器的网址是不会发生变化的。&lt;br /&gt;
 &lt;br /&gt;
2. 关于request: 由于在整个定向的过程中用的是同一个request，因此forward会将request的信息带到被重定向的地址中。&lt;br /&gt;
&lt;br /&gt;
重定向&lt;br /&gt;
&lt;br /&gt;
1.是客户端的重定向，是完全的跳转。即服务器返回的一个url给客户端浏览器，然后客户端浏览器会重新发送一次请求，到新的url里面，因此浏览器中显示的url网址会发生变化。 &lt;br /&gt;
&lt;br /&gt;
2.因为这种方式比forward多了一次网络请求，因此效率会低于forward。&lt;br /&gt;
&lt;br /&gt;
== 堆栈区别  ==&lt;br /&gt;
== 并发和并行的区别 ==&lt;br /&gt;
行是指两个或者多个事件在同一时刻发生；而并发是指两个或多个事件在同一时间间隔发生。&lt;br /&gt;
&lt;br /&gt;
== 索引 ==&lt;br /&gt;
=== 不走索引 ===&lt;br /&gt;
=== 行级锁和表级锁 ===&lt;br /&gt;
&lt;br /&gt;
行级锁定的优点：&lt;br /&gt;
&lt;br /&gt;
·         当在许多线程中访问不同的行时只存在少量锁定冲突。&lt;br /&gt;
&lt;br /&gt;
·         回滚时只有少量的更改。&lt;br /&gt;
&lt;br /&gt;
·         可以长时间锁定单一的行。&lt;br /&gt;
&lt;br /&gt;
行级锁定的缺点：&lt;br /&gt;
&lt;br /&gt;
·         比页级或表级锁定占用更多的内存。&lt;br /&gt;
&lt;br /&gt;
·         当在表的大部分中使用时，比页级或表级锁定速度慢，因为你必须获取更多的锁。&lt;br /&gt;
&lt;br /&gt;
·         如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表，比其它锁定明显慢很多。&lt;br /&gt;
&lt;br /&gt;
·         用高级别锁定，通过支持不同的类型锁定，你也可以很容易地调节应用程序，因为其锁成本小于行级锁定。&lt;br /&gt;
&lt;br /&gt;
== 存储引擎 ==&lt;br /&gt;
* InnoDB&lt;br /&gt;
== 数据库，事务，隔离级别，存储引擎  ==&lt;br /&gt;
* 数据库，三大范式&lt;br /&gt;
== redis，有什么优势 -memcache对比 ==&lt;br /&gt;
数据存储位置&lt;br /&gt;
* redis： 内存、磁盘(数据持久化)&lt;br /&gt;
* memcache: 内存&lt;br /&gt;
&lt;br /&gt;
存储数据的类型（都是键值对的形式）值的类型：&lt;br /&gt;
* redis：list、set、hash、string、zset等&lt;br /&gt;
* memcache：string&lt;br /&gt;
&lt;br /&gt;
== http\https ==&lt;br /&gt;
* 默认端口不同80：443&lt;br /&gt;
* https需要颁发证书&lt;br /&gt;
* HTTPS协议的安全性更高&lt;br /&gt;
* https缺点&lt;br /&gt;
** 速度慢&lt;br /&gt;
** 服务器成本&lt;br /&gt;
&lt;br /&gt;
== 数据库的存储引擎应用场景，索引结构  ==&lt;br /&gt;
&lt;br /&gt;
MyISAM表使用B型树索引。 读取场景下性能好，表锁，不能事务&lt;br /&gt;
&lt;br /&gt;
InnoDB是为处理巨大数据量时的最大性能设计。B树。由于是行锁，写入、更新速度可能会快。&lt;br /&gt;
&lt;br /&gt;
MEMORY表被存储在内存中，且默认使用哈希索引&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为什么索引结构默认使用B-Tree，而不是hash，二叉树，红黑树？&lt;br /&gt;
* hash：虽然可以快速定位，但是没有顺序，IO复杂度高。&lt;br /&gt;
* 二叉树：树的高度不均匀，不能自平衡，查找效率跟数据有关（树的高度），并且IO代价高。&lt;br /&gt;
* 红黑树：树的高度随着数据量增加而增加，IO代价高。&lt;br /&gt;
&lt;br /&gt;
为什么建议使用自增长主键作为索引。&lt;br /&gt;
&lt;br /&gt;
结合B+Tree的特点，自增主键是连续的，在插入过程中尽量减少页分裂，即使要进行页分裂，也只会分裂很少一部分。并且能减少数据的移动，每次插入都是插入到最后。总之就是减少分裂和移动的频率。&lt;br /&gt;
&lt;br /&gt;
== 大数据量的优化 ==&lt;br /&gt;
* 分区、分表、分库&lt;br /&gt;
&lt;br /&gt;
== 设计一个权限系统  ==&lt;br /&gt;
== 算法题 ==&lt;br /&gt;
== 红黑树  ==&lt;br /&gt;
== 多线程，sleep，wait，yield  ==&lt;br /&gt;
== restful ==&lt;br /&gt;
== 设计模式，单例模式，适配器模式  ==&lt;br /&gt;
== 操作系统，死锁  ==&lt;br /&gt;
== 快排时间复杂度  ==&lt;br /&gt;
== nginx可承受的压力  ==&lt;br /&gt;
== 项目 ==&lt;br /&gt;
* 项目难点 &lt;br /&gt;
* 架构优化&lt;br /&gt;
* 难点&lt;br /&gt;
* 主要业务&lt;br /&gt;
== 服务调用超时可能由什么造成  ==&lt;br /&gt;
&lt;br /&gt;
* 网络问题，是否繁忙？&lt;br /&gt;
* cpu、内存排查，cpu消耗高，处理不过来&lt;br /&gt;
* 服务端有没有收到请求，看请求响应时间&lt;br /&gt;
* 客服端网络、cpu等有问题&lt;br /&gt;
&lt;br /&gt;
== 进程间的通信方式  ==&lt;br /&gt;
== fpm ==&lt;br /&gt;
* 合适的超时时间request_terminate_timeout、max_execution_time&lt;br /&gt;
* 看服务器性能，设置进程数量max_children&lt;br /&gt;
* fpm进程处理最大请求数max_requests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx ==&lt;br /&gt;
&lt;br /&gt;
* worker_processes 8; #nginx进程数，建议按照cpu数目来指定，一般为它的倍数,平时设置为2倍。&lt;br /&gt;
&lt;br /&gt;
* 静态资源缓存&lt;br /&gt;
&lt;br /&gt;
* nginx打开文件的最大个数&lt;br /&gt;
&lt;br /&gt;
* buffer： 如果buffer太小，Nginx会不停的写一些临时文件，这样会导致磁盘不停的去读写&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== php array 结构 ==&lt;br /&gt;
&lt;br /&gt;
hashtable+映射表的方式&lt;br /&gt;
&lt;br /&gt;
hash=&amp;gt;映射表=&amp;gt;bucket&lt;br /&gt;
&lt;br /&gt;
映射表与bucket长度相同&lt;br /&gt;
&lt;br /&gt;
hash冲突的情况：链地址法。next设置为相同hash的索引，然后在映射表里的值替换成当前元素在bucket中的位置。&lt;br /&gt;
&lt;br /&gt;
== 处理负载，高并发？==&lt;br /&gt;
&lt;br /&gt;
1、HTML静态化&lt;br /&gt;
效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的 网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。&lt;br /&gt;
2、图片服务器分离&lt;br /&gt;
把图片单独存储，尽量减少图片等大流量的开销，可以放在一些相关的平台上，如七牛等&lt;br /&gt;
3、数据库集群和库表散列及缓存&lt;br /&gt;
数据库的并发连接为100，一台数据库远远不够，可以从读写分离、主从复制，数据库集群方面来着手。另外尽量减少数据库的访问，可以使用缓存数据库如memcache、redis。&lt;br /&gt;
4、镜像：&lt;br /&gt;
尽量减少下载，可以把不同的请求分发到多个镜像端。&lt;br /&gt;
5、负载均衡：&lt;br /&gt;
Apache的最大并发连接为1500，只能增加服务器，可以从硬件上着手，如F5服务器。当然硬件的成本比较高，我们往往从软件方面着手。&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=94</id>
		<title>常见问题</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=94"/>
		<updated>2019-09-04T15:19:32Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* redis，有什么优势 -memcache对比 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== cookie 和 session 的区别 ==&lt;br /&gt;
* 作用范围不同，Cookie 保存在客户端（浏览器），Session 保存在服务器端。&lt;br /&gt;
* 存取方式的不同，Cookie 只能保存 ASCII，Session 可以存任意数据类型，一般情况下我们可以在 Session 中保持一些常用变量信息，比如说 UserId 等。&lt;br /&gt;
* 有效期不同，Cookie 可设置为长时间保持，比如我们经常使用的默认登录功能，Session 一般失效时间较短，客户端关闭或者 Session 超时都会失效。&lt;br /&gt;
* 隐私策略不同，Cookie 存储在客户端，比较容易遭到不法获取，早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取；Session 存储在服务端，安全性相对 Cookie 要好一些。&lt;br /&gt;
* 存储大小不同， 单个 Cookie 保存的数据不能超过 4K，Session 可存储数据远高于 Cookie。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分布式session&lt;br /&gt;
&lt;br /&gt;
ip_hash &lt;br /&gt;
Session 复制&lt;br /&gt;
缓存中间件&lt;br /&gt;
&lt;br /&gt;
== post 和 get 的区别 ==&lt;br /&gt;
https://www.w3school.com.cn/tags/html_ref_httpmethods.asp&lt;br /&gt;
&lt;br /&gt;
GET 用于获取信息，是无副作用的，是幂等的，且可缓存&lt;br /&gt;
POST 用于修改服务器上的数据，有副作用，非幂等，不可缓存&lt;br /&gt;
* 安全？post请求不会保留在浏览器历史记录中&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|GET&lt;br /&gt;
|POST&lt;br /&gt;
|-&lt;br /&gt;
|后退按钮/刷新&lt;br /&gt;
|	无害	&lt;br /&gt;
|数据会被重新提交（浏览器应该告知用户数据会被重新提交）。&lt;br /&gt;
|-&lt;br /&gt;
|书签	&lt;br /&gt;
|可收藏为书签	&lt;br /&gt;
|不可收藏为书签&lt;br /&gt;
|-&lt;br /&gt;
|缓存	&lt;br /&gt;
|能被缓存	&lt;br /&gt;
|不能缓存&lt;br /&gt;
|-&lt;br /&gt;
|编码类型&lt;br /&gt;
|	application/x-www-form-urlencoded	&lt;br /&gt;
|application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。&lt;br /&gt;
|-&lt;br /&gt;
|历史	&lt;br /&gt;
|参数保留在浏览器历史中。	&lt;br /&gt;
|参数不会保存在浏览器历史中。&lt;br /&gt;
|-&lt;br /&gt;
|对数据长度的限制	&lt;br /&gt;
|是的。当发送数据时，GET 方法向 URL 添加数据；URL 的长度是受限制的（URL 的最大长度是 2048 个字符）。	&lt;br /&gt;
|无限制。&lt;br /&gt;
|-&lt;br /&gt;
|对数据类型的限制	&lt;br /&gt;
|只允许 ASCII 字符。	&lt;br /&gt;
|没有限制。也允许二进制数据。&lt;br /&gt;
|-&lt;br /&gt;
|安全性	&lt;br /&gt;
|与 POST 相比，GET 的安全性较差，因为所发送的数据是 URL 的一部分。&lt;br /&gt;
在发送密码或其他敏感信息时绝不要使用 GET ！&lt;br /&gt;
|POST 比 GET 更安全，因为参数不会被保存在浏览器历史或 web 服务器日志中。&lt;br /&gt;
|-&lt;br /&gt;
|可见性	&lt;br /&gt;
|数据在 URL 中对所有人都是可见的。	&lt;br /&gt;
|数据不会显示在 URL 中。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 转发和重定向的区别 ==&lt;br /&gt;
转发&lt;br /&gt;
&lt;br /&gt;
1. 是服务器内部的重定向，服务器直接访问目标地址的 url网址，把里面的东西读取出来，但是客户端并不知道，因此用forward的话，客户端浏览器的网址是不会发生变化的。&lt;br /&gt;
 &lt;br /&gt;
2. 关于request: 由于在整个定向的过程中用的是同一个request，因此forward会将request的信息带到被重定向的地址中。&lt;br /&gt;
&lt;br /&gt;
重定向&lt;br /&gt;
&lt;br /&gt;
1.是客户端的重定向，是完全的跳转。即服务器返回的一个url给客户端浏览器，然后客户端浏览器会重新发送一次请求，到新的url里面，因此浏览器中显示的url网址会发生变化。 &lt;br /&gt;
&lt;br /&gt;
2.因为这种方式比forward多了一次网络请求，因此效率会低于forward。&lt;br /&gt;
&lt;br /&gt;
== 堆栈区别  ==&lt;br /&gt;
== 并发和并行的区别 ==&lt;br /&gt;
行是指两个或者多个事件在同一时刻发生；而并发是指两个或多个事件在同一时间间隔发生。&lt;br /&gt;
&lt;br /&gt;
== 索引 ==&lt;br /&gt;
=== 不走索引 ===&lt;br /&gt;
=== 行级锁和表级锁 ===&lt;br /&gt;
&lt;br /&gt;
行级锁定的优点：&lt;br /&gt;
&lt;br /&gt;
·         当在许多线程中访问不同的行时只存在少量锁定冲突。&lt;br /&gt;
&lt;br /&gt;
·         回滚时只有少量的更改。&lt;br /&gt;
&lt;br /&gt;
·         可以长时间锁定单一的行。&lt;br /&gt;
&lt;br /&gt;
行级锁定的缺点：&lt;br /&gt;
&lt;br /&gt;
·         比页级或表级锁定占用更多的内存。&lt;br /&gt;
&lt;br /&gt;
·         当在表的大部分中使用时，比页级或表级锁定速度慢，因为你必须获取更多的锁。&lt;br /&gt;
&lt;br /&gt;
·         如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表，比其它锁定明显慢很多。&lt;br /&gt;
&lt;br /&gt;
·         用高级别锁定，通过支持不同的类型锁定，你也可以很容易地调节应用程序，因为其锁成本小于行级锁定。&lt;br /&gt;
&lt;br /&gt;
== 存储引擎 ==&lt;br /&gt;
* InnoDB&lt;br /&gt;
== 数据库，事务，隔离级别，存储引擎  ==&lt;br /&gt;
* 数据库，三大范式&lt;br /&gt;
== redis，有什么优势 -memcache对比 ==&lt;br /&gt;
数据存储位置&lt;br /&gt;
* redis： 内存、磁盘(数据持久化)&lt;br /&gt;
* memcache: 内存&lt;br /&gt;
&lt;br /&gt;
存储数据的类型（都是键值对的形式）值的类型：&lt;br /&gt;
* redis：list、set、hash、string、zset等&lt;br /&gt;
* memcache：string&lt;br /&gt;
&lt;br /&gt;
== http\https ==&lt;br /&gt;
* 默认端口不同80：443&lt;br /&gt;
* https需要颁发证书&lt;br /&gt;
* HTTPS协议的安全性更高&lt;br /&gt;
* https缺点&lt;br /&gt;
** 速度慢&lt;br /&gt;
** 服务器成本&lt;br /&gt;
&lt;br /&gt;
== 数据库的存储引擎应用场景，索引结构  ==&lt;br /&gt;
&lt;br /&gt;
MyISAM表使用B型树索引。 读取场景下性能好，表锁，不能事务&lt;br /&gt;
&lt;br /&gt;
InnoDB是为处理巨大数据量时的最大性能设计。B树。由于是行锁，写入、更新速度可能会快。&lt;br /&gt;
&lt;br /&gt;
MEMORY表被存储在内存中，且默认使用哈希索引&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为什么索引结构默认使用B-Tree，而不是hash，二叉树，红黑树？&lt;br /&gt;
* hash：虽然可以快速定位，但是没有顺序，IO复杂度高。&lt;br /&gt;
* 二叉树：树的高度不均匀，不能自平衡，查找效率跟数据有关（树的高度），并且IO代价高。&lt;br /&gt;
* 红黑树：树的高度随着数据量增加而增加，IO代价高。&lt;br /&gt;
&lt;br /&gt;
为什么建议使用自增长主键作为索引。&lt;br /&gt;
&lt;br /&gt;
结合B+Tree的特点，自增主键是连续的，在插入过程中尽量减少页分裂，即使要进行页分裂，也只会分裂很少一部分。并且能减少数据的移动，每次插入都是插入到最后。总之就是减少分裂和移动的频率。&lt;br /&gt;
&lt;br /&gt;
== 大数据量的优化 ==&lt;br /&gt;
* 分区、分表、分库&lt;br /&gt;
&lt;br /&gt;
== 设计一个权限系统  ==&lt;br /&gt;
== 算法题 ==&lt;br /&gt;
== 红黑树  ==&lt;br /&gt;
== 多线程，sleep，wait，yield  ==&lt;br /&gt;
== restful ==&lt;br /&gt;
== 设计模式，单例模式，适配器模式  ==&lt;br /&gt;
== 操作系统，死锁  ==&lt;br /&gt;
== 快排时间复杂度  ==&lt;br /&gt;
== nginx可承受的压力  ==&lt;br /&gt;
== 项目 ==&lt;br /&gt;
* 项目难点 &lt;br /&gt;
* 架构优化&lt;br /&gt;
* 难点&lt;br /&gt;
* 主要业务&lt;br /&gt;
== 服务调用超时可能由什么造成  ==&lt;br /&gt;
&lt;br /&gt;
* 网络问题，是否繁忙？&lt;br /&gt;
* cpu、内存排查，cpu消耗高，处理不过来&lt;br /&gt;
* 服务端有没有收到请求，看请求响应时间&lt;br /&gt;
* 客服端网络、cpu等有问题&lt;br /&gt;
&lt;br /&gt;
== 进程间的通信方式  ==&lt;br /&gt;
== fpm ==&lt;br /&gt;
* 合适的超时时间request_terminate_timeout、max_execution_time&lt;br /&gt;
* 看服务器性能，设置进程数量max_children&lt;br /&gt;
* fpm进程处理最大请求数max_requests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx ==&lt;br /&gt;
&lt;br /&gt;
* worker_processes 8; #nginx进程数，建议按照cpu数目来指定，一般为它的倍数,平时设置为2倍。&lt;br /&gt;
&lt;br /&gt;
* 静态资源缓存&lt;br /&gt;
&lt;br /&gt;
* nginx打开文件的最大个数&lt;br /&gt;
&lt;br /&gt;
* buffer： 如果buffer太小，Nginx会不停的写一些临时文件，这样会导致磁盘不停的去读写&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== php array 结构 ==&lt;br /&gt;
&lt;br /&gt;
hashtable+映射表的方式&lt;br /&gt;
&lt;br /&gt;
hash=&amp;gt;映射表=&amp;gt;bucket&lt;br /&gt;
&lt;br /&gt;
映射表与bucket长度相同&lt;br /&gt;
&lt;br /&gt;
hash冲突的情况：链地址法。next设置为相同hash的索引，然后在映射表里的值替换成当前元素在bucket中的位置。&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=93</id>
		<title>常见问题</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=93"/>
		<updated>2019-09-04T15:10:36Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：/* php array */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== cookie 和 session 的区别 ==&lt;br /&gt;
* 作用范围不同，Cookie 保存在客户端（浏览器），Session 保存在服务器端。&lt;br /&gt;
* 存取方式的不同，Cookie 只能保存 ASCII，Session 可以存任意数据类型，一般情况下我们可以在 Session 中保持一些常用变量信息，比如说 UserId 等。&lt;br /&gt;
* 有效期不同，Cookie 可设置为长时间保持，比如我们经常使用的默认登录功能，Session 一般失效时间较短，客户端关闭或者 Session 超时都会失效。&lt;br /&gt;
* 隐私策略不同，Cookie 存储在客户端，比较容易遭到不法获取，早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取；Session 存储在服务端，安全性相对 Cookie 要好一些。&lt;br /&gt;
* 存储大小不同， 单个 Cookie 保存的数据不能超过 4K，Session 可存储数据远高于 Cookie。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分布式session&lt;br /&gt;
&lt;br /&gt;
ip_hash &lt;br /&gt;
Session 复制&lt;br /&gt;
缓存中间件&lt;br /&gt;
&lt;br /&gt;
== post 和 get 的区别 ==&lt;br /&gt;
https://www.w3school.com.cn/tags/html_ref_httpmethods.asp&lt;br /&gt;
&lt;br /&gt;
GET 用于获取信息，是无副作用的，是幂等的，且可缓存&lt;br /&gt;
POST 用于修改服务器上的数据，有副作用，非幂等，不可缓存&lt;br /&gt;
* 安全？post请求不会保留在浏览器历史记录中&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|GET&lt;br /&gt;
|POST&lt;br /&gt;
|-&lt;br /&gt;
|后退按钮/刷新&lt;br /&gt;
|	无害	&lt;br /&gt;
|数据会被重新提交（浏览器应该告知用户数据会被重新提交）。&lt;br /&gt;
|-&lt;br /&gt;
|书签	&lt;br /&gt;
|可收藏为书签	&lt;br /&gt;
|不可收藏为书签&lt;br /&gt;
|-&lt;br /&gt;
|缓存	&lt;br /&gt;
|能被缓存	&lt;br /&gt;
|不能缓存&lt;br /&gt;
|-&lt;br /&gt;
|编码类型&lt;br /&gt;
|	application/x-www-form-urlencoded	&lt;br /&gt;
|application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。&lt;br /&gt;
|-&lt;br /&gt;
|历史	&lt;br /&gt;
|参数保留在浏览器历史中。	&lt;br /&gt;
|参数不会保存在浏览器历史中。&lt;br /&gt;
|-&lt;br /&gt;
|对数据长度的限制	&lt;br /&gt;
|是的。当发送数据时，GET 方法向 URL 添加数据；URL 的长度是受限制的（URL 的最大长度是 2048 个字符）。	&lt;br /&gt;
|无限制。&lt;br /&gt;
|-&lt;br /&gt;
|对数据类型的限制	&lt;br /&gt;
|只允许 ASCII 字符。	&lt;br /&gt;
|没有限制。也允许二进制数据。&lt;br /&gt;
|-&lt;br /&gt;
|安全性	&lt;br /&gt;
|与 POST 相比，GET 的安全性较差，因为所发送的数据是 URL 的一部分。&lt;br /&gt;
在发送密码或其他敏感信息时绝不要使用 GET ！&lt;br /&gt;
|POST 比 GET 更安全，因为参数不会被保存在浏览器历史或 web 服务器日志中。&lt;br /&gt;
|-&lt;br /&gt;
|可见性	&lt;br /&gt;
|数据在 URL 中对所有人都是可见的。	&lt;br /&gt;
|数据不会显示在 URL 中。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 转发和重定向的区别 ==&lt;br /&gt;
转发&lt;br /&gt;
&lt;br /&gt;
1. 是服务器内部的重定向，服务器直接访问目标地址的 url网址，把里面的东西读取出来，但是客户端并不知道，因此用forward的话，客户端浏览器的网址是不会发生变化的。&lt;br /&gt;
 &lt;br /&gt;
2. 关于request: 由于在整个定向的过程中用的是同一个request，因此forward会将request的信息带到被重定向的地址中。&lt;br /&gt;
&lt;br /&gt;
重定向&lt;br /&gt;
&lt;br /&gt;
1.是客户端的重定向，是完全的跳转。即服务器返回的一个url给客户端浏览器，然后客户端浏览器会重新发送一次请求，到新的url里面，因此浏览器中显示的url网址会发生变化。 &lt;br /&gt;
&lt;br /&gt;
2.因为这种方式比forward多了一次网络请求，因此效率会低于forward。&lt;br /&gt;
&lt;br /&gt;
== 堆栈区别  ==&lt;br /&gt;
== 并发和并行的区别 ==&lt;br /&gt;
行是指两个或者多个事件在同一时刻发生；而并发是指两个或多个事件在同一时间间隔发生。&lt;br /&gt;
&lt;br /&gt;
== 索引 ==&lt;br /&gt;
=== 不走索引 ===&lt;br /&gt;
=== 行级锁和表级锁 ===&lt;br /&gt;
&lt;br /&gt;
行级锁定的优点：&lt;br /&gt;
&lt;br /&gt;
·         当在许多线程中访问不同的行时只存在少量锁定冲突。&lt;br /&gt;
&lt;br /&gt;
·         回滚时只有少量的更改。&lt;br /&gt;
&lt;br /&gt;
·         可以长时间锁定单一的行。&lt;br /&gt;
&lt;br /&gt;
行级锁定的缺点：&lt;br /&gt;
&lt;br /&gt;
·         比页级或表级锁定占用更多的内存。&lt;br /&gt;
&lt;br /&gt;
·         当在表的大部分中使用时，比页级或表级锁定速度慢，因为你必须获取更多的锁。&lt;br /&gt;
&lt;br /&gt;
·         如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表，比其它锁定明显慢很多。&lt;br /&gt;
&lt;br /&gt;
·         用高级别锁定，通过支持不同的类型锁定，你也可以很容易地调节应用程序，因为其锁成本小于行级锁定。&lt;br /&gt;
&lt;br /&gt;
== 存储引擎 ==&lt;br /&gt;
* InnoDB&lt;br /&gt;
== 数据库，事务，隔离级别，存储引擎  ==&lt;br /&gt;
* 数据库，三大范式&lt;br /&gt;
== redis，有什么优势 -memcache对比 ==&lt;br /&gt;
* 丰富的数据类型&lt;br /&gt;
* 支持数据持久化&lt;br /&gt;
&lt;br /&gt;
== http\https ==&lt;br /&gt;
* 默认端口不同80：443&lt;br /&gt;
* https需要颁发证书&lt;br /&gt;
* HTTPS协议的安全性更高&lt;br /&gt;
* https缺点&lt;br /&gt;
** 速度慢&lt;br /&gt;
** 服务器成本&lt;br /&gt;
&lt;br /&gt;
== 数据库的存储引擎应用场景，索引结构  ==&lt;br /&gt;
&lt;br /&gt;
MyISAM表使用B型树索引。 读取场景下性能好，表锁，不能事务&lt;br /&gt;
&lt;br /&gt;
InnoDB是为处理巨大数据量时的最大性能设计。B树。由于是行锁，写入、更新速度可能会快。&lt;br /&gt;
&lt;br /&gt;
MEMORY表被存储在内存中，且默认使用哈希索引&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为什么索引结构默认使用B-Tree，而不是hash，二叉树，红黑树？&lt;br /&gt;
* hash：虽然可以快速定位，但是没有顺序，IO复杂度高。&lt;br /&gt;
* 二叉树：树的高度不均匀，不能自平衡，查找效率跟数据有关（树的高度），并且IO代价高。&lt;br /&gt;
* 红黑树：树的高度随着数据量增加而增加，IO代价高。&lt;br /&gt;
&lt;br /&gt;
为什么建议使用自增长主键作为索引。&lt;br /&gt;
&lt;br /&gt;
结合B+Tree的特点，自增主键是连续的，在插入过程中尽量减少页分裂，即使要进行页分裂，也只会分裂很少一部分。并且能减少数据的移动，每次插入都是插入到最后。总之就是减少分裂和移动的频率。&lt;br /&gt;
&lt;br /&gt;
== 大数据量的优化 ==&lt;br /&gt;
* 分区、分表、分库&lt;br /&gt;
&lt;br /&gt;
== 设计一个权限系统  ==&lt;br /&gt;
== 算法题 ==&lt;br /&gt;
== 红黑树  ==&lt;br /&gt;
== 多线程，sleep，wait，yield  ==&lt;br /&gt;
== restful ==&lt;br /&gt;
== 设计模式，单例模式，适配器模式  ==&lt;br /&gt;
== 操作系统，死锁  ==&lt;br /&gt;
== 快排时间复杂度  ==&lt;br /&gt;
== nginx可承受的压力  ==&lt;br /&gt;
== 项目 ==&lt;br /&gt;
* 项目难点 &lt;br /&gt;
* 架构优化&lt;br /&gt;
* 难点&lt;br /&gt;
* 主要业务&lt;br /&gt;
== 服务调用超时可能由什么造成  ==&lt;br /&gt;
&lt;br /&gt;
* 网络问题，是否繁忙？&lt;br /&gt;
* cpu、内存排查，cpu消耗高，处理不过来&lt;br /&gt;
* 服务端有没有收到请求，看请求响应时间&lt;br /&gt;
* 客服端网络、cpu等有问题&lt;br /&gt;
&lt;br /&gt;
== 进程间的通信方式  ==&lt;br /&gt;
== fpm ==&lt;br /&gt;
* 合适的超时时间request_terminate_timeout、max_execution_time&lt;br /&gt;
* 看服务器性能，设置进程数量max_children&lt;br /&gt;
* fpm进程处理最大请求数max_requests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx ==&lt;br /&gt;
&lt;br /&gt;
* worker_processes 8; #nginx进程数，建议按照cpu数目来指定，一般为它的倍数,平时设置为2倍。&lt;br /&gt;
&lt;br /&gt;
* 静态资源缓存&lt;br /&gt;
&lt;br /&gt;
* nginx打开文件的最大个数&lt;br /&gt;
&lt;br /&gt;
* buffer： 如果buffer太小，Nginx会不停的写一些临时文件，这样会导致磁盘不停的去读写&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== php array 结构 ==&lt;br /&gt;
&lt;br /&gt;
hashtable+映射表的方式&lt;br /&gt;
&lt;br /&gt;
hash=&amp;gt;映射表=&amp;gt;bucket&lt;br /&gt;
&lt;br /&gt;
映射表与bucket长度相同&lt;br /&gt;
&lt;br /&gt;
hash冲突的情况：链地址法。next设置为相同hash的索引，然后在映射表里的值替换成当前元素在bucket中的位置。&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=92</id>
		<title>常见问题</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=92"/>
		<updated>2019-09-04T15:06:18Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== cookie 和 session 的区别 ==&lt;br /&gt;
* 作用范围不同，Cookie 保存在客户端（浏览器），Session 保存在服务器端。&lt;br /&gt;
* 存取方式的不同，Cookie 只能保存 ASCII，Session 可以存任意数据类型，一般情况下我们可以在 Session 中保持一些常用变量信息，比如说 UserId 等。&lt;br /&gt;
* 有效期不同，Cookie 可设置为长时间保持，比如我们经常使用的默认登录功能，Session 一般失效时间较短，客户端关闭或者 Session 超时都会失效。&lt;br /&gt;
* 隐私策略不同，Cookie 存储在客户端，比较容易遭到不法获取，早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取；Session 存储在服务端，安全性相对 Cookie 要好一些。&lt;br /&gt;
* 存储大小不同， 单个 Cookie 保存的数据不能超过 4K，Session 可存储数据远高于 Cookie。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分布式session&lt;br /&gt;
&lt;br /&gt;
ip_hash &lt;br /&gt;
Session 复制&lt;br /&gt;
缓存中间件&lt;br /&gt;
&lt;br /&gt;
== post 和 get 的区别 ==&lt;br /&gt;
https://www.w3school.com.cn/tags/html_ref_httpmethods.asp&lt;br /&gt;
&lt;br /&gt;
GET 用于获取信息，是无副作用的，是幂等的，且可缓存&lt;br /&gt;
POST 用于修改服务器上的数据，有副作用，非幂等，不可缓存&lt;br /&gt;
* 安全？post请求不会保留在浏览器历史记录中&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|GET&lt;br /&gt;
|POST&lt;br /&gt;
|-&lt;br /&gt;
|后退按钮/刷新&lt;br /&gt;
|	无害	&lt;br /&gt;
|数据会被重新提交（浏览器应该告知用户数据会被重新提交）。&lt;br /&gt;
|-&lt;br /&gt;
|书签	&lt;br /&gt;
|可收藏为书签	&lt;br /&gt;
|不可收藏为书签&lt;br /&gt;
|-&lt;br /&gt;
|缓存	&lt;br /&gt;
|能被缓存	&lt;br /&gt;
|不能缓存&lt;br /&gt;
|-&lt;br /&gt;
|编码类型&lt;br /&gt;
|	application/x-www-form-urlencoded	&lt;br /&gt;
|application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。&lt;br /&gt;
|-&lt;br /&gt;
|历史	&lt;br /&gt;
|参数保留在浏览器历史中。	&lt;br /&gt;
|参数不会保存在浏览器历史中。&lt;br /&gt;
|-&lt;br /&gt;
|对数据长度的限制	&lt;br /&gt;
|是的。当发送数据时，GET 方法向 URL 添加数据；URL 的长度是受限制的（URL 的最大长度是 2048 个字符）。	&lt;br /&gt;
|无限制。&lt;br /&gt;
|-&lt;br /&gt;
|对数据类型的限制	&lt;br /&gt;
|只允许 ASCII 字符。	&lt;br /&gt;
|没有限制。也允许二进制数据。&lt;br /&gt;
|-&lt;br /&gt;
|安全性	&lt;br /&gt;
|与 POST 相比，GET 的安全性较差，因为所发送的数据是 URL 的一部分。&lt;br /&gt;
在发送密码或其他敏感信息时绝不要使用 GET ！&lt;br /&gt;
|POST 比 GET 更安全，因为参数不会被保存在浏览器历史或 web 服务器日志中。&lt;br /&gt;
|-&lt;br /&gt;
|可见性	&lt;br /&gt;
|数据在 URL 中对所有人都是可见的。	&lt;br /&gt;
|数据不会显示在 URL 中。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 转发和重定向的区别 ==&lt;br /&gt;
转发&lt;br /&gt;
&lt;br /&gt;
1. 是服务器内部的重定向，服务器直接访问目标地址的 url网址，把里面的东西读取出来，但是客户端并不知道，因此用forward的话，客户端浏览器的网址是不会发生变化的。&lt;br /&gt;
 &lt;br /&gt;
2. 关于request: 由于在整个定向的过程中用的是同一个request，因此forward会将request的信息带到被重定向的地址中。&lt;br /&gt;
&lt;br /&gt;
重定向&lt;br /&gt;
&lt;br /&gt;
1.是客户端的重定向，是完全的跳转。即服务器返回的一个url给客户端浏览器，然后客户端浏览器会重新发送一次请求，到新的url里面，因此浏览器中显示的url网址会发生变化。 &lt;br /&gt;
&lt;br /&gt;
2.因为这种方式比forward多了一次网络请求，因此效率会低于forward。&lt;br /&gt;
&lt;br /&gt;
== 堆栈区别  ==&lt;br /&gt;
== 并发和并行的区别 ==&lt;br /&gt;
行是指两个或者多个事件在同一时刻发生；而并发是指两个或多个事件在同一时间间隔发生。&lt;br /&gt;
&lt;br /&gt;
== 索引 ==&lt;br /&gt;
=== 不走索引 ===&lt;br /&gt;
=== 行级锁和表级锁 ===&lt;br /&gt;
&lt;br /&gt;
行级锁定的优点：&lt;br /&gt;
&lt;br /&gt;
·         当在许多线程中访问不同的行时只存在少量锁定冲突。&lt;br /&gt;
&lt;br /&gt;
·         回滚时只有少量的更改。&lt;br /&gt;
&lt;br /&gt;
·         可以长时间锁定单一的行。&lt;br /&gt;
&lt;br /&gt;
行级锁定的缺点：&lt;br /&gt;
&lt;br /&gt;
·         比页级或表级锁定占用更多的内存。&lt;br /&gt;
&lt;br /&gt;
·         当在表的大部分中使用时，比页级或表级锁定速度慢，因为你必须获取更多的锁。&lt;br /&gt;
&lt;br /&gt;
·         如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表，比其它锁定明显慢很多。&lt;br /&gt;
&lt;br /&gt;
·         用高级别锁定，通过支持不同的类型锁定，你也可以很容易地调节应用程序，因为其锁成本小于行级锁定。&lt;br /&gt;
&lt;br /&gt;
== 存储引擎 ==&lt;br /&gt;
* InnoDB&lt;br /&gt;
== 数据库，事务，隔离级别，存储引擎  ==&lt;br /&gt;
* 数据库，三大范式&lt;br /&gt;
== redis，有什么优势 -memcache对比 ==&lt;br /&gt;
* 丰富的数据类型&lt;br /&gt;
* 支持数据持久化&lt;br /&gt;
&lt;br /&gt;
== http\https ==&lt;br /&gt;
* 默认端口不同80：443&lt;br /&gt;
* https需要颁发证书&lt;br /&gt;
* HTTPS协议的安全性更高&lt;br /&gt;
* https缺点&lt;br /&gt;
** 速度慢&lt;br /&gt;
** 服务器成本&lt;br /&gt;
&lt;br /&gt;
== 数据库的存储引擎应用场景，索引结构  ==&lt;br /&gt;
&lt;br /&gt;
MyISAM表使用B型树索引。 读取场景下性能好，表锁，不能事务&lt;br /&gt;
&lt;br /&gt;
InnoDB是为处理巨大数据量时的最大性能设计。B树。由于是行锁，写入、更新速度可能会快。&lt;br /&gt;
&lt;br /&gt;
MEMORY表被存储在内存中，且默认使用哈希索引&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为什么索引结构默认使用B-Tree，而不是hash，二叉树，红黑树？&lt;br /&gt;
* hash：虽然可以快速定位，但是没有顺序，IO复杂度高。&lt;br /&gt;
* 二叉树：树的高度不均匀，不能自平衡，查找效率跟数据有关（树的高度），并且IO代价高。&lt;br /&gt;
* 红黑树：树的高度随着数据量增加而增加，IO代价高。&lt;br /&gt;
&lt;br /&gt;
为什么建议使用自增长主键作为索引。&lt;br /&gt;
&lt;br /&gt;
结合B+Tree的特点，自增主键是连续的，在插入过程中尽量减少页分裂，即使要进行页分裂，也只会分裂很少一部分。并且能减少数据的移动，每次插入都是插入到最后。总之就是减少分裂和移动的频率。&lt;br /&gt;
&lt;br /&gt;
== 大数据量的优化 ==&lt;br /&gt;
* 分区、分表、分库&lt;br /&gt;
&lt;br /&gt;
== 设计一个权限系统  ==&lt;br /&gt;
== 算法题 ==&lt;br /&gt;
== 红黑树  ==&lt;br /&gt;
== 多线程，sleep，wait，yield  ==&lt;br /&gt;
== restful ==&lt;br /&gt;
== 设计模式，单例模式，适配器模式  ==&lt;br /&gt;
== 操作系统，死锁  ==&lt;br /&gt;
== 快排时间复杂度  ==&lt;br /&gt;
== nginx可承受的压力  ==&lt;br /&gt;
== 项目 ==&lt;br /&gt;
* 项目难点 &lt;br /&gt;
* 架构优化&lt;br /&gt;
* 难点&lt;br /&gt;
* 主要业务&lt;br /&gt;
== 服务调用超时可能由什么造成  ==&lt;br /&gt;
&lt;br /&gt;
* 网络问题，是否繁忙？&lt;br /&gt;
* cpu、内存排查，cpu消耗高，处理不过来&lt;br /&gt;
* 服务端有没有收到请求，看请求响应时间&lt;br /&gt;
* 客服端网络、cpu等有问题&lt;br /&gt;
&lt;br /&gt;
== 进程间的通信方式  ==&lt;br /&gt;
== fpm ==&lt;br /&gt;
* 合适的超时时间request_terminate_timeout、max_execution_time&lt;br /&gt;
* 看服务器性能，设置进程数量max_children&lt;br /&gt;
* fpm进程处理最大请求数max_requests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx ==&lt;br /&gt;
&lt;br /&gt;
* worker_processes 8; #nginx进程数，建议按照cpu数目来指定，一般为它的倍数,平时设置为2倍。&lt;br /&gt;
&lt;br /&gt;
* 静态资源缓存&lt;br /&gt;
&lt;br /&gt;
* nginx打开文件的最大个数&lt;br /&gt;
&lt;br /&gt;
* buffer： 如果buffer太小，Nginx会不停的写一些临时文件，这样会导致磁盘不停的去读写&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== php array ==&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E9%9D%A2%E8%AF%95&amp;diff=91</id>
		<title>面试</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E9%9D%A2%E8%AF%95&amp;diff=91"/>
		<updated>2019-09-02T09:59:54Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：清空页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=89</id>
		<title>常见问题</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&amp;diff=89"/>
		<updated>2019-09-02T09:59:19Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：Yaosong移动页面面试至常见问题&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== cookie 和 session 的区别 ==&lt;br /&gt;
* 作用范围不同，Cookie 保存在客户端（浏览器），Session 保存在服务器端。&lt;br /&gt;
* 存取方式的不同，Cookie 只能保存 ASCII，Session 可以存任意数据类型，一般情况下我们可以在 Session 中保持一些常用变量信息，比如说 UserId 等。&lt;br /&gt;
* 有效期不同，Cookie 可设置为长时间保持，比如我们经常使用的默认登录功能，Session 一般失效时间较短，客户端关闭或者 Session 超时都会失效。&lt;br /&gt;
* 隐私策略不同，Cookie 存储在客户端，比较容易遭到不法获取，早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取；Session 存储在服务端，安全性相对 Cookie 要好一些。&lt;br /&gt;
* 存储大小不同， 单个 Cookie 保存的数据不能超过 4K，Session 可存储数据远高于 Cookie。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分布式session&lt;br /&gt;
&lt;br /&gt;
ip_hash &lt;br /&gt;
Session 复制&lt;br /&gt;
缓存中间件&lt;br /&gt;
&lt;br /&gt;
== post 和 get 的区别 ==&lt;br /&gt;
https://www.w3school.com.cn/tags/html_ref_httpmethods.asp&lt;br /&gt;
&lt;br /&gt;
GET 用于获取信息，是无副作用的，是幂等的，且可缓存&lt;br /&gt;
POST 用于修改服务器上的数据，有副作用，非幂等，不可缓存&lt;br /&gt;
* 安全？post请求不会保留在浏览器历史记录中&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|GET&lt;br /&gt;
|POST&lt;br /&gt;
|-&lt;br /&gt;
|后退按钮/刷新&lt;br /&gt;
|	无害	&lt;br /&gt;
|数据会被重新提交（浏览器应该告知用户数据会被重新提交）。&lt;br /&gt;
|-&lt;br /&gt;
|书签	&lt;br /&gt;
|可收藏为书签	&lt;br /&gt;
|不可收藏为书签&lt;br /&gt;
|-&lt;br /&gt;
|缓存	&lt;br /&gt;
|能被缓存	&lt;br /&gt;
|不能缓存&lt;br /&gt;
|-&lt;br /&gt;
|编码类型&lt;br /&gt;
|	application/x-www-form-urlencoded	&lt;br /&gt;
|application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。&lt;br /&gt;
|-&lt;br /&gt;
|历史	&lt;br /&gt;
|参数保留在浏览器历史中。	&lt;br /&gt;
|参数不会保存在浏览器历史中。&lt;br /&gt;
|-&lt;br /&gt;
|对数据长度的限制	&lt;br /&gt;
|是的。当发送数据时，GET 方法向 URL 添加数据；URL 的长度是受限制的（URL 的最大长度是 2048 个字符）。	&lt;br /&gt;
|无限制。&lt;br /&gt;
|-&lt;br /&gt;
|对数据类型的限制	&lt;br /&gt;
|只允许 ASCII 字符。	&lt;br /&gt;
|没有限制。也允许二进制数据。&lt;br /&gt;
|-&lt;br /&gt;
|安全性	&lt;br /&gt;
|与 POST 相比，GET 的安全性较差，因为所发送的数据是 URL 的一部分。&lt;br /&gt;
在发送密码或其他敏感信息时绝不要使用 GET ！&lt;br /&gt;
|POST 比 GET 更安全，因为参数不会被保存在浏览器历史或 web 服务器日志中。&lt;br /&gt;
|-&lt;br /&gt;
|可见性	&lt;br /&gt;
|数据在 URL 中对所有人都是可见的。	&lt;br /&gt;
|数据不会显示在 URL 中。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 转发和重定向的区别 ==&lt;br /&gt;
转发&lt;br /&gt;
&lt;br /&gt;
1. 是服务器内部的重定向，服务器直接访问目标地址的 url网址，把里面的东西读取出来，但是客户端并不知道，因此用forward的话，客户端浏览器的网址是不会发生变化的。&lt;br /&gt;
 &lt;br /&gt;
2. 关于request: 由于在整个定向的过程中用的是同一个request，因此forward会将request的信息带到被重定向的地址中。&lt;br /&gt;
&lt;br /&gt;
重定向&lt;br /&gt;
&lt;br /&gt;
1.是客户端的重定向，是完全的跳转。即服务器返回的一个url给客户端浏览器，然后客户端浏览器会重新发送一次请求，到新的url里面，因此浏览器中显示的url网址会发生变化。 &lt;br /&gt;
&lt;br /&gt;
2.因为这种方式比forward多了一次网络请求，因此效率会低于forward。&lt;br /&gt;
&lt;br /&gt;
== 堆栈区别  ==&lt;br /&gt;
== 并发和并行的区别 ==&lt;br /&gt;
行是指两个或者多个事件在同一时刻发生；而并发是指两个或多个事件在同一时间间隔发生。&lt;br /&gt;
&lt;br /&gt;
== 索引 ==&lt;br /&gt;
=== 不走索引 ===&lt;br /&gt;
=== 行级锁和表级锁 ===&lt;br /&gt;
&lt;br /&gt;
行级锁定的优点：&lt;br /&gt;
&lt;br /&gt;
·         当在许多线程中访问不同的行时只存在少量锁定冲突。&lt;br /&gt;
&lt;br /&gt;
·         回滚时只有少量的更改。&lt;br /&gt;
&lt;br /&gt;
·         可以长时间锁定单一的行。&lt;br /&gt;
&lt;br /&gt;
行级锁定的缺点：&lt;br /&gt;
&lt;br /&gt;
·         比页级或表级锁定占用更多的内存。&lt;br /&gt;
&lt;br /&gt;
·         当在表的大部分中使用时，比页级或表级锁定速度慢，因为你必须获取更多的锁。&lt;br /&gt;
&lt;br /&gt;
·         如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表，比其它锁定明显慢很多。&lt;br /&gt;
&lt;br /&gt;
·         用高级别锁定，通过支持不同的类型锁定，你也可以很容易地调节应用程序，因为其锁成本小于行级锁定。&lt;br /&gt;
&lt;br /&gt;
== 存储引擎 ==&lt;br /&gt;
* InnoDB&lt;br /&gt;
== 数据库，事务，隔离级别，存储引擎  ==&lt;br /&gt;
* 数据库，三大范式&lt;br /&gt;
== redis，有什么优势 -memcache对比 ==&lt;br /&gt;
* 丰富的数据类型&lt;br /&gt;
* 支持数据持久化&lt;br /&gt;
&lt;br /&gt;
== http\https ==&lt;br /&gt;
* 默认端口不同80：443&lt;br /&gt;
* https需要颁发证书&lt;br /&gt;
* HTTPS协议的安全性更高&lt;br /&gt;
* https缺点&lt;br /&gt;
** 速度慢&lt;br /&gt;
** 服务器成本&lt;br /&gt;
&lt;br /&gt;
== 数据库的存储引擎应用场景，索引结构  ==&lt;br /&gt;
&lt;br /&gt;
MyISAM表使用B型树索引。 读取场景下性能好，表锁，不能事务&lt;br /&gt;
&lt;br /&gt;
InnoDB是为处理巨大数据量时的最大性能设计。B树。由于是行锁，写入、更新速度可能会快。&lt;br /&gt;
&lt;br /&gt;
MEMORY表被存储在内存中，且默认使用哈希索引&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为什么索引结构默认使用B-Tree，而不是hash，二叉树，红黑树？&lt;br /&gt;
* hash：虽然可以快速定位，但是没有顺序，IO复杂度高。&lt;br /&gt;
* 二叉树：树的高度不均匀，不能自平衡，查找效率跟数据有关（树的高度），并且IO代价高。&lt;br /&gt;
* 红黑树：树的高度随着数据量增加而增加，IO代价高。&lt;br /&gt;
&lt;br /&gt;
为什么建议使用自增长主键作为索引。&lt;br /&gt;
&lt;br /&gt;
结合B+Tree的特点，自增主键是连续的，在插入过程中尽量减少页分裂，即使要进行页分裂，也只会分裂很少一部分。并且能减少数据的移动，每次插入都是插入到最后。总之就是减少分裂和移动的频率。&lt;br /&gt;
&lt;br /&gt;
== 大数据量的优化 ==&lt;br /&gt;
* 分区、分表、分库&lt;br /&gt;
&lt;br /&gt;
== 设计一个权限系统  ==&lt;br /&gt;
== 算法题 ==&lt;br /&gt;
== 红黑树  ==&lt;br /&gt;
== 多线程，sleep，wait，yield  ==&lt;br /&gt;
== restful ==&lt;br /&gt;
== 设计模式，单例模式，适配器模式  ==&lt;br /&gt;
== 操作系统，死锁  ==&lt;br /&gt;
== 快排时间复杂度  ==&lt;br /&gt;
== nginx可承受的压力  ==&lt;br /&gt;
== 项目 ==&lt;br /&gt;
* 项目难点 &lt;br /&gt;
* 架构优化&lt;br /&gt;
* 难点&lt;br /&gt;
* 主要业务&lt;br /&gt;
== 服务调用超时可能由什么造成  ==&lt;br /&gt;
&lt;br /&gt;
* 网络问题，是否繁忙？&lt;br /&gt;
* cpu、内存排查，cpu消耗高，处理不过来&lt;br /&gt;
* 服务端有没有收到请求，看请求响应时间&lt;br /&gt;
* 客服端网络、cpu等有问题&lt;br /&gt;
&lt;br /&gt;
== 进程间的通信方式  ==&lt;br /&gt;
== fpm ==&lt;br /&gt;
* 合适的超时时间request_terminate_timeout、max_execution_time&lt;br /&gt;
* 看服务器性能，设置进程数量max_children&lt;br /&gt;
* fpm进程处理最大请求数max_requests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== nginx ==&lt;br /&gt;
&lt;br /&gt;
* worker_processes 8; #nginx进程数，建议按照cpu数目来指定，一般为它的倍数,平时设置为2倍。&lt;br /&gt;
&lt;br /&gt;
* 静态资源缓存&lt;br /&gt;
&lt;br /&gt;
* nginx打开文件的最大个数&lt;br /&gt;
&lt;br /&gt;
* buffer： 如果buffer太小，Nginx会不停的写一些临时文件，这样会导致磁盘不停的去读写&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.yaosong.live/index.php?title=%E9%9D%A2%E8%AF%95&amp;diff=90</id>
		<title>面试</title>
		<link rel="alternate" type="text/html" href="https://wiki.yaosong.live/index.php?title=%E9%9D%A2%E8%AF%95&amp;diff=90"/>
		<updated>2019-09-02T09:59:19Z</updated>

		<summary type="html">&lt;p&gt;Yaosong：Yaosong移动页面面试至常见问题&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#重定向 [[常见问题]]&lt;/div&gt;</summary>
		<author><name>Yaosong</name></author>
		
	</entry>
</feed>