🚀 个人主页 极客小俊
✍🏻 作者简介:web开发者、设计师、技术分享博主
🐋 希望大家多多支持一下, 我们一起进步!😄
🏅 如果文章对你有帮助的话,欢迎评论 💬点赞👍🏻 收藏 📂加关注
21.isset (),empty () 的区别
isset():
若变量不存在则返回 FALSE
若变量存在且其值为NULL,也返回 FALSE
若变量存在且值不为NULL,则返回 TURE
同时检查多个变量时,每个单项都符合上一条要求时才返回 TRUE,否则结果为 FALSE
empty():
若变量不存在则返回 TRUE
若变量存在且其值为""、0、"0"、NULL、、FALSE、array()、var $var; 以及没有任何属性的对象,则返回 TURE\
若变量存在且值不为""、0、"0"、NULL、、FALSE、array()、var $var; 以及没有任何属性的对象,则返回 FALSE
22.六大设计原则(接 14 点设计模式)
.单一职责原则:一个类只负责一个职责。
.开闭原则:一个软件实体比如类-模块-函数,应该对扩展开放,对修改关闭。
.里氏替换原则:所有引用基类的地方必须透明地使用其子类的对象,
子类必须完全实现父类的方法,可以拓展自己的方法和属性,
即子类可以扩展父类的功能,但是不能改变父类的原有功能。
.迪米特法则:一个对象应该对其他对象保持最少的了解。
.接口隔离原则:类间的依赖应该建立在最小的接口上。
.依赖倒置原则:高层模块不应该依赖底层模块,二者应该依赖其抽象;
抽象不应该依赖细节;细节应该依赖抽象;
23.开发中应该注意哪些安全机制
1.PHP配置
2.Sql注入,
3.Xss攻击(cross site script 跨站脚本),
4.盗链,
5.CSRF(跨站请求伪造cross site request forgery),
6.CC(是利用不断对网站发送连接请求致使形成拒绝服务的目的)
24.memcache 和 Redis 的区别
数据结构:memcache仅支持简单的key-value形式,Redis支持的数据更多(string字符串,set集合,list列表,hash散列,zset有序集合);
多线程:memcache支持多线程,Redis支持单线程
持久化:Redis支持持久化,memcache不支持持久化
分布式:Redis做主从结构,memcache服务器需要通过hash一致化来支撑主从结构
1. Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcache相比一个最大的区别。
2. Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcache只是简单的K/V缓存。
3. 他们的扩展都需要做集群;实现方式:master-slave、Hash。
4. 在100k以上的数据中,Memcache性能要高于Redis。
5. 如果要说内存使用效率,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcache。当然,这和你的应用场景和数据特性有关。
6. 如果你对数据持久化和数据同步有所要求,那么推荐你选择Redis,因为这两个特性Memcache都不具备。即使你只是希望在升级或者重启系统后缓存数据不会丢失,选择Redis也是明智的。
7. Redis和Memcache在写入性能上面差别不大,读取性能上面尤其是批量读取性能上面Memcache更强
25.PHP常用的数组函数
数组的键名和值:
array_values($arr); 获得数组的值
array_keys($arr); 获得数组的键名
array_flip($arr); 数组中的值与键名互换(如果有重复前面的会被后面的覆盖)
in_array("apple",$arr); 在数组中检索apple
array_search("apple",$arr); 在数组中检索apple ,如果存在返回键名
array_key_exists("apple",$arr); 检索给定的键名是否存在数组中
isset($arr[apple]): 检索给定的键名是否存在数组中
数组的内部指针:
current($arr); 返回数组中的当前单元\
pos($arr); 返回数组中的当前单元\
key($arr); 返回数组中当前单元的键名\
prev($arr); 将数组中的内部指针倒回一位\
next($arr); 将数组中的内部指针向前移动一位\
end($arr); 将数组中的内部指针指向最后一个单元\
reset($arr; 将数组中的内部指针指向第一个单元\
each($arr); 将返回数组当前元素的一个键名/值的构造数组,并使数组指针向前移动一位\
list({
mathJaxContainer[0]}value)=each($arr); 获得数组当前元素的键名和值
数组的排序:
1.通过元素值对数组排序:
sort($arr); 由小到大的顺序排序(第二个参数为按什么方式排序)忽略键名的数组排序\
rsort($arr); 由大到小的顺序排序(第二个参数为按什么方式排序)忽略键名的数组排序\
usort($arr,"function"); 使用用户自定义的比较函数对数组中的值进行排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)忽略键名的数组排序\
asort($arr); 由小到大的顺序排序(第二个参数为按什么方式排序)保留键名的数组排序\
arsort($arr); 由大到小的顺序排序(第二个参数为按什么方式排序)保留键名的数组排序\
uasort($arr,"function"); 使用用户自定义的比较函数对数组中的值进行排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)保留键名的数组排序
2.通过键名对数组排序
ksort($arr); 按照键名正序排序\
krsort($arr); 按照键名逆序排序\
uksort($arr,"function"); 使用用户自定义的比较函数对数组中的键名进行排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)
数组的合并:
array_merge({
mathJaxContainer[1]}arr2); 合并两个或多个数组(相同的字符串键名,后面的覆盖前面的,相同的数字键名,后面的不会做覆盖操作,而是附加到后面)
array_merge_recursive({
mathJaxContainer[2]}arr2); 递归合并操作,如果数组中有相同的字符串键名,这些值将被合并到一个数组中去。如果一个值本身是一个数组,将按照相应的键名把它合并为另一个数组。当数组 具有相同的数组键名时,后一个值将不会覆盖原来的值,而是附加到后面
数组的差集
array_diff({
mathJaxContainer[3]}arr2); 返回差集结果数组\
array_diff_assoc({
mathJaxContainer[4]}arr2,$arr3); 返回差集结果数组,键名也做比较
数组的交集
array_intersect({
mathJaxContainer[5]}arr2); 返回交集结果数组\
array_intersect_assoc({
mathJaxContainer[6]}arr2); 返回交集结果数组,键名也做比较
其他:
extract($arr);用于把数组中的元素转换成变量导入到当前文件中,键名当作变量名,值作为变量值
compact(var1,var2,var3);compact() 函数创建包含变量名和它们的值的数组。
array_slice($arr,0,3); 可以将数组中的一段取出,此函数忽略键名
array_push($arr,"apple","pear"); 将一个或多个元素压入数组栈的末尾(入栈),返回入栈元素的个数\
array_pop($arr); 将数组栈的最后一个元素弹出(出栈)
26. 大致说出浏览器通过 URL 访问的原理流程
1.键盘或触屏输入URL并回车确认
2.URL解析/DNS解析查找域名IP地址
3.网络连接发起HTTP请求
4.HTTP报文传输过程
5.服务器接收数据
6.服务器响应请求/MVC
7.服务器返回数据
8.客户端接收数据
9.浏览器加载/渲染页面
10.打印绘制输出
27. 常见的负载均衡方案
1.基于DNS的负载均衡
2.基于四层交换技术的负载均衡
3.基于七层交换技术的负载均衡
4.四层+七层负载结合方案
28. mysql_fetch_row () 和 mysql_fetch_array () 的区别
mysql_fetch_row() 从和结果标识 data 关联的结果集中取得一行数据并作为数组返回。每个结果的列储存在一个数组的单元中,偏移量从 0 开始。依次调用 mysql_fetch_row() 将返回结果集中的下一行,如果没有更多行则返回 FALSE。
mysql_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有。
解释:
(1)如果你的表里面有字段a,b,c那么你用mysql_fetch_row() 就返回array(1=>a的值,2=>b的值,3=>c的值)这个时候你读数组的话,只能这样写{
mathJaxContainer[7]}array[2]才能得到a的值;
(2)要是用mysql_fetch_array() 就返回array(a=>a的值,b=>b的值,c=>c的值)和 array(1=>a的值,2=>b的值,3=>c的值)这个时候你读数组的话{
mathJaxContainer[8]}array[a]都能得到a的值
29.如何保障代码在多个 PHP 版本中可以正常运行解决方案
通过修改nginx配置文件的fastCGI,监听不同端口,从而选择不一样的版本。
30.分析 MySQL 查询慢的原因
.查看慢查询日志
.通过pt-query-digest工具分析
.设置set profiling = 1;开启服务,执行show profile。查看所有语句会监测消耗时间存到临时表
.找到消耗时间大的ID,执行show profile for query 临时表ID
.使用show status,show processlist 等命令查看
.使用explain分析单条SQL语句