PHP 面试踩过的坑(三)

22.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

23. 六大设计原则(接 14 点设计模式)

1.单一职责原则:一个类只负责一个职责。
2.开闭原则:一个软件实体比如类-模块-函数,应该对扩展开放,对修改关闭。
3.里氏替换原则:所有引用基类的地方必须透明地使用其子类的对象,子类必须完全实现父类的方法,可以拓展自己的方法和属性,即子类可以扩展父类的功能,但是不能改变父类的原有功能。
4.迪米特法则:一个对象应该对其他对象保持最少的了解。
5.接口隔离原则:类间的依赖应该建立在最小的接口上。
6.依赖倒置原则:高层模块不应该依赖底层模块,二者应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象;


详细解释:https://blog.csdn.net/bushuwei/article/details/85234393

24.group by 与 distinct 的区别

25. 开发中应该注意哪些安全机制

1.PHP配置
2.Sql注入,
3.Xss攻击(cross site script 跨站脚本),
4.盗链,
5.CSRF(跨站请求伪造cross site request forgery),
6.CC(是利用不断对网站发送连接请求致使形成拒绝服务的目的)


详细可看原文:https://blog.csdn.net/u011781769/article/details/48470773

26.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更强


原文:https://blog.csdn.net/qq_34126805/article/details/81748107
https://blog.csdn.net/hhjianlong/article/details/73928653

27. 常用的数组函数

数组的键名和值:
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($key,$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($arr1,$arr2);  合并两个或多个数组(相同的字符串键名,后面的覆盖前面的,相同的数字键名,后面的不会做覆盖操作,而是附加到后面)
array_merge_recursive($arr1,$arr2);   递归合并操作,如果数组中有相同的字符串键名,这些值将被合并到一个数组中去。如果一个值本身是一个数组,将按照相应的键名把它合并为另一个数组。当数组 具有相同的数组键名时,后一个值将不会覆盖原来的值,而是附加到后面


数组的差集
array_diff($arr1,$arr2);  返回差集结果数组\
array_diff_assoc($arr1,$arr2,$arr3);  返回差集结果数组,键名也做比较


数组的交集
array_intersect($arr1,$arr2);  返回交集结果数组\
array_intersect_assoc($arr1,$arr2);  返回交集结果数组,键名也做比较


其他:
extract($arr);用于把数组中的元素转换成变量导入到当前文件中,键名当作变量名,值作为变量值
compact(var1,var2,var3);compact() 函数创建包含变量名和它们的值的数组。
array_slice($arr,0,3);  可以将数组中的一段取出,此函数忽略键名
array_push($arr,"apple","pear");  将一个或多个元素压入数组栈的末尾(入栈),返回入栈元素的个数\
array_pop($arr);  将数组栈的最后一个元素弹出(出栈)
原文:http://www.cnblogs.com/lazb/p/7629294.html

28. 浏览器通过 URL 访问的原理

1.键盘或触屏输入URL并回车确认
2.URL解析/DNS解析查找域名IP地址
3.网络连接发起HTTP请求
4.HTTP报文传输过程
5.服务器接收数据
6.服务器响应请求/MVC
7.服务器返回数据
8.客户端接收数据
9.浏览器加载/渲染页面
10.打印绘制输出
详细查看原文:https://www.jianshu.com/p/d616d887953a

29. 常见的负载均衡方案

1.基于DNS的负载均衡
2.基于四层交换技术的负载均衡
3.基于七层交换技术的负载均衡
4.四层+七层负载结合方案
原文:https://blog.csdn.net/qq_41455420/article/details/79846199

30.mysql_fetch_row () 和 mysql_fetch_array () 的区别

mysql_fetch_row() 从和结果标识 data 关联的结果集中取得一行数据并作为数组返回。每个结果的列储存在一个数组的单元中,偏移量从 0 开始。依次调用 mysql_fetch_row() 将返回结果集中的下一行,如果没有更多行则返回 FALSE。                                                     
mysql_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有。
原文:https://blog.csdn.net/zhangzhangdan/article/details/52311003


解释:
(1)如果你的表里面有字段a,b,c那么你用mysql_fetch_row()  就返回array(1=>a的值,2=>b的值,3=>c的值)这个时候你读数组的话,只能这样写$array[1],$array[2]才能得到a的值;
(2)要是用mysql_fetch_array()  就返回array(a=>a的值,b=>b的值,c=>c的值)和 array(1=>a的值,2=>b的值,3=>c的值)这个时候你读数组的话$array[1]和$array[a]都能得到a的值
原文:https://blog.csdn.net/liuxinhua2013/article/details/39014059

31. 如何保障代码在多个 PHP 版本中可以正常运行

通过修改nginx配置文件的fastCGI,监听不同端口,从而选择不一样的版本。
详细参考:https://blog.csdn.net/wsyh12345678/article/details/87796753

32. 分析 MySQL 查询慢的原因

1.查看慢查询日志
2.通过pt-query-digest工具分析
3.设置set profiling = 1;开启服务,执行show profile。查看所有语句会监测消耗时间存到临时表
4.找到消耗时间大的ID,执行show profile for query 临时表ID
5.使用show status,show processlist 等命令查看
6.使用explain分析单条SQL语句

33. 如何不借助第三变量交换两个变量的值

字符串交换:
1.substr,strlen两个方法实现:
$a="abc";
$b="bcd";
echo '交换前 $a:'.$a.',$b:'.$b.'<br />';
$a.=$b;//将字符串合并为一条
//利用切割字符串的方法交换
$b=substr($a,0,(strlen($a)-strlen($b)));
$a=substr($a, strlen($b));
echo '交换后$a:'.$a.',$b:'.$b.'<br />';


2.使用str_replace方法实现:
$a="abc";\
$b="bcd";\
echo '交换前 $a:'.$a.',$b:'.$b.'<br />';\
$a.=$b;\
$b=str_replace($b, "", $a);\
$a=str_replace($b, "", $a);\
echo '交换后$a:'.$a.',$b:'.$b.'<br />';\


3.结合使用list方法和array实现:
$a="abc";\
$b="bcd";\
echo '交换前 $a:'.$a.',$b:'.$b.'<br />';\
list($b,$a)=array($a,$b);\
echo '交换后$a:'.$a.',$b:'.$b.'<br />';
PS:list()用法:把数组中的值赋给list中的变量中:
    $my_array = array("Dog","Cat","Horse");
    list($a, $b, $c) = $my_array;
    则 $a = "Dog",$b = "Cat" ,  $c = "Horse";


字符串和数字都适用 使用异或运算:
$a="abc";\
$b="bcd";\
echo '交换前 $a:'.$a.',$b:'.$b.'<br />';\
$a=$a^$b;\
$b=$b^$a;\
$a=$a^$b;\
echo '交换后$a:'.$a.',$b:'.$b.'<br />';    
原理:https://blog.csdn.net/github_37767025/article/details/68943789


只适用于数字:
$a=3;\
$b=5;\
echo '交换前 $a:'.$a.',$b:'.$b.'<br />';\
$a=$a+$b;\
$b=$a-$b;\
$a=$a-$b;\
echo '交换后$a:'.$a.',$b:'.$b.'<br />';
原文:https://www.cnblogs.com/laowenBlog/p/6062125.html

34.char 和 varchar 的区别

1.varchar用于存储可变长度,char用于存储定长
2.对于经常变更的数据char比varchar更好,不容易产生碎片
3.对于非常短的列,char比varcahr在存储空间上更有效率
4.char对于未达到长度的数据会自动补空格

35.MySQL 事务的四大特性

一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
原文:https://blog.csdn.net/xiaosuanmiao123/article/details/82661115

36. 线程和进程

进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。
线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。一个程序至少一个进程,一个进程至少一个线程。
**进程线程的区别:**
-   地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
-   资源拥有:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。
一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程
-   执行过程:每个独立的进程程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
-   线程是处理器调度的基本单位,但是进程不是。
-   两者均可并发执行。
**优缺点:**
线程执行开销小,但是不利于资源的管理和保护。线程适合在SMP机器(双CPU系统)上运行。
进程执行开销大,但是能够很好的进行资源管理和保护。进程可以跨机器前移。
  **何时使用多进程,何时使用多线程?**
对资源的管理和保护要求高,不限制开销和效率时,使用多进程。
要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。
链接:https://www.cnblogs.com/zhuzhu2016/p/5804875.html

38.HTTP 状态码

1**
信息,服务器收到请求,需要请求者继续执行操作
2**
成功,操作被成功接收并处理
3**
重定向,需要进一步的操作以完成请求
4**
客户端错误,请求包含语法错误或无法完成请求
5**
服务器错误,服务器在处理请求的过程中发生了错误
详细参照:https://www.runoob.com/http/http-status-codes.html

39.Linux 服务器 CPU 负载过高的排查方法

参考链接:https://blog.csdn.net/u014692324/article/details/80816521

40. 常见的查找算法

参考链接:https://segmentfault.com/a/1190000016582674

41.PHP 中布尔值为 false 的情况

JS:
1、undefined(未定义,找不到值时出现)
2、null(代表空值)
3、false(布尔值的false,字符串"false"布尔值为true)
4、0(数字0,字符串"0"布尔值为true)
5、NaN(无法计算结果时出现,表示"非数值";但是tapeof NaN==="number")
6、""(双引号)或''(单引号) (空字符串,中间有空格时也是true)
原文:https://blog.csdn.net/Lisunlight/article/details/82733939




PHP:
1、null(代表空值)为false
2、false(布尔值的false,字符串"false"布尔值为true)
3、0(数字0,字符串"0"布尔值都为false)
4、""(双引号)或''(单引号)为false (中间有空格时是true)

42.php 实现重定向的三种方式

1.header()函数;header('location:http://www.baidu.com');
2. meta标签echo '<meta http-equiv="refresh" content="1;url=http://www.baidu.com">';
3.script标签;echo '<script>window.location.href="http://www.baidu.com"</script>';

来源:https://learnku.com/articles/28758 

posted @ 2020-03-16 08:00  码农编程进阶笔记  阅读(52)  评论(0编辑  收藏  举报
返回顶部 有事您Q我