高并发架构相关概念
高并发:并发访问,在某个时间点有多少请求同时访问。
通常如果一个系统的日PV在千万以上,有可能是一个高并发的系统
QPS:每秒钟请求或者查询的数量,在互联网领域,指每秒响应请求数(HTTP请求)
吞吐量:单位时间内处理的请求数量(通常由QPS和并发数决定)
响应时间:从请求发出到收到响应花费的时间。如果系统处理一个HTTP请求需要100ms,这个100ms就是系统的响应时间
菩提树下改bug的博客
此前曾写过一篇文章,《一键部署hexo博客到腾讯云COS对象存储》,基于HEXO官方提供的部署方式,实现一个hexo的部署插件,不过官方的部署方式还是需要执行hexo -d g
命令,对于已经折腾好hexo站点的笔者而言,更希望的时专注于内容的生产,笔者曾经基于docker在在一台服务器上安装了hexo的环境,并将hexo站点和文章拆分为两个githuab项目,在不同的设备上编写文章后,推送到github, 然后再到服务器上执行一键脚本即可实现博客部署,但这种方式还是需要手动到服务器执行命令,虽然可以通过web hook 进行触发,但整个流程链路还是比较冗长,不仅需要编写web hook, 分布式写作还需要依赖服务器,我们需要更便捷的方式,更少的依赖!
问题:什么时引用变量?在PHP中,用什么符号定义引用变量?
概念:引用变量的定义和引用方式
延申:PHP引用变量的原理
定义:在PHP中意味着用不同的名字访问同一个变量内容
定义方式: 使用&符号
1 | $a = 100; |
工作原理:
第一步定义$a
时需要开辟一块内存空间用于保存$a
,常规赋值时,在被赋值变量改变时,根据COW特性,会进行copy操作,引用变量时,相当于给当前开辟的内存空间一个别名,对a变量的修改也会提现在b变量上
PHP COW 特性 Copy On Write
示例代码:
1 | <?php |
输出:
1 | int(6687584) |
注意:
unset只会取消引用,不会销毁内存空间
对象赋值是引用传值,如果想不使用引用,需要克隆对象
定义方式:
单引号
双引号
heredoc
和newdoc
区别:
8大数据类型
复合
特殊
NULL
变量直接赋值为NULL,未定义的变量,unset销毁的变量 都为NULL
常量
定义:
const 和 define
1 | const ADF = "asd"; |
预定义常量:
1 | __FILE__; //所在文件路径+文件名 |
foo()和@foo()之间的区别
延申 :PHP运算符知识点
运算符优先级
结合方向 | 运算符 | 附加信息 |
---|---|---|
无 | clone new | clone 和 new |
左 | *[* | array() |
右 | ** |
算术运算符 |
右 | ++ – ~ (int) (float) (string) (array) (object) (bool) @ | 类型和递增/递减 |
无 | instanceof | 类型 |
右 | ! | 逻辑运算符 |
左 | ** */ % | 算术运算符 |
左 | + - . | 算术运算符和字符串运算符 |
左 | *<<* >> | 位运算符 |
无 | *<* *<=* > >= | 比较运算符 |
无 | == != === !== *<>* *<=>* | 比较运算符 |
左 | & | 位运算符和引用 |
左 | ^ | 位运算符 |
左 | | | 位运算符 |
左 | && | 逻辑运算符 |
左 | || | 逻辑运算符 |
左 | ?? | 比较运算符 |
左 | ? : | ternary |
右 | = += -= =* *=* /= .= %= &= |= ^= *<<=* >>= | 赋值运算符 |
左 | and | 逻辑运算符 |
左 | xor | 逻辑运算符 |
左 | or | 逻辑运算符 |
递增递减 > ! > 算术运算符 > 大小比较 > 不等 > 引用 > 位运算符^ > 位运算符( | ) > 逻辑与(&&) > 逻辑或(||) > 三目 > 赋值 > and > xor > or
比较运算符
== 和 === 的区别
== 判断值是否相等
=== 判断之和类型是否相等
等值判断 FALSE的其中情况是等值的
递增/递减运算符
递增递减不影响布尔值
递减对NULL没有效果
递增NULL值为1
递增和递减在前先运算后反回,反之就先返回后运算
逻辑运算符
短路作用:
|| && 与or和and的优先级的不同
错误控制符:
PHP支持一个错误运算符:@ 当将其放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略
问题:请列出3中PHP数组循环操作的语法,并注明各种循环的区别
知识点:
PHP遍历数组的三种方式及各自区别
使用for 循环
for循环只能遍历索引数组
1 | $arr = range(1,20); |
使用foreach 循环
foreach既可以遍历索引,也可以遍历关联
foreach遍历会对数组进行reset()操作
1 | $arr = range(1,20); |
while , list() , each() 组合循环
组合循环同样可以遍历索引和关联数组
组合循环不会进行reset()操作,即将数组的指针移动到开头
1 | while(list($k,$v) = each($arr)){ |
延伸:分支结构
if ... elseif
在elseif语句中只能有一个表达式而true,即在elseif语句中,只能有一个语句块被执行,多个elseif从句是排斥关系。
使用elseif语句有一个基本原则,总优先把范围小的条件放在前面处理。
1 | if(exp1){ |
switch...case...
和if不同的是,switch后面的控制表达式的数据类型只能是整型、浮点型、或者字符串
continue语句作用到switch的作用类似于break,跳出switch外的循环,可以使用continue2
switch…case会生成跳转表 , 直接跳转到对应的case
效率:如果条件比一个简单的比较要复杂的多,或者在一个很多次的循环中,那么使用switch可能会更快
1 |
|
思考 : PHP中如何优化多个if…elseif…语句等情况?
答:将可能性较大的条件放到前面
如果判断的内容是比较复杂的内容,且值是整型、浮点、或者字符串,可以使用switch…case…
问题:写出如下程序的输出结果 51
1 | <?php |
涉及知识点:
变量的作用域
变量的作用域也称做变量的范围,变量的范围即它定义的上下文背景(也是它生效的范围)。大部分的php变量只有一个单独的范围。这个单独的范围跨度同样包含include和require引入的文件。
global
引用全局作用域中的变量
静态变量
静态变量仅在局部函数域中存在,但当程序执行离开次作用域时,其值并不会消失。
static 关键字
函数的参数和参数的引用传递
函数的返回值和和引用返回
引用返回 必须在函数声明和指派返回值给一个变量时都使用引用运算符&
1 | function &get_count(){ |
外部文件导入
include
和require
语句包含并运行指定文件
如果给出路径名按照路径来查找,否则从include_path中查找,如果include_path中也没有,则从调用脚本文件所在目录和当前工作目录下寻找
当一个文件被包含是,其中所包含的代码继承了include所在行的变量范围
加载过程中如果没有找到include发出景观 ,require会发出致命错误
_one 会检查文件是否已经被包含过
系统内置的函数
时间日期函数
1 | //时间戳格式化为更易读的日期和时间 |
IP处理函数
ip2long
long2ip
打印处理
1 | print(); |
序列化和反序列化
serialize()
和 unserialize()
字符串处理函数
1 | implode(); |
数组处理函数
1 | array_keys(); |
写出一个验证139手机号的正则表达式
1 | /^139\d{8}$/ |
正则表达式的作用 : 分割、查找、匹配、替换、字符串
分割符 : 正斜线(/),hash符号(#),取反符号 (~)
通用原子: \d \D \w \W \s \S
元字符: . * ? ^ $ + {n} {n,} {n,m} [] () [^] | [-]
模式修正符 : i m e s U x A D u
1 | $str = '<b>abc</b>'; |
1 | $str = '<b>abc</b><b>abc</b>'; |
UTF-8
汉字编码范围为0x4e00-0x9fa5
,在ANSI(gb2312)
环境下,0xb0-0xf7
,0xa1-0xfe
UTF-8
要使用u模式修正符使模式字符串被当成UTF-8,在ANSI(gb2312)环境下,要使用chr将Ascii码转换为字符
1 | list_key = ["a","b","c","d"] |
思路 将使用set函数将列表转为集合后进行运算
1 | b1 = [1,2,3] |
增加元素
删除元素
1 | dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'} |