这是我整理的一套面试题,老铁们看看就当复习了哦。
感觉现在发面试题有些冷门,就跟昨天德国那场似的,不过看看当提前复习了。提前备战。这2个月出门面试的童鞋可注意不要中暑哦。
保证一个类仅有一个实例,并提供一个访问他的全局访问点,例如框架中的数据库连接——类似DB类。
针对一组算法,将每一个算法封装到具有共同接口的独立的类中,例如进入个人主页时,根据浏览者的不同,给予不同的显示与操作——类似不同用户呈现不同效果。
提供了在程序中有条理的存放并管理一组全局对象 (object)——类似服务提供者的注入。
将不同接口适配成统一的API接口,例如数据操作有mysql、mysqli、pdo等,可利用适配器模式统一接口。
一个对象通过添加一个方法使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。例如实现实现消息推送——将所有类的实例化注册到一个数组,通过循环批量执行类。
不修改原类代码和继承的情况下动态扩展类的功能,例如框架的每个Controller文件会提供before和after方法——在某个方法或输出之前执行或之后执行,用于修饰。
提供一个方法顺序访问一个聚合对象中各个元素,在PHP中将继承 Iterator 类——yield。
指作为一个单元的一组有序的数据库操作,如果组中的所有操作都成功,则认为事务成功,即使有一个操作失败。事务也不成功,如果所有操作完成,事务提交,其修改将作用于所有其他数据库进程,如果有一个操作失败,则事务回滚,该事务影响到的操作都会取消。
按值传递:函数内对值的内容改变对函数外部无影响。
引用传递:函数内对值的内容改变在函数外部也会做出相应修改。
生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。
CGI 是通用网关接口,用户WEB服务器和应用程序间的交互,定义输入输出规范,用户的请求通过WEB服务器转发给FastCGI进程,FastCGI进程再调用应用程式进行处理,如PHP解析器,应用程序的处理结果如HTML返回给FastCGI,FastCGI返回给Nginx进行输出,假设WEB服务器是NGINX,应用程序是PHP,而 php-fpm 是管理FastCGI的,这就是php-fpm,fastCGI与NGINX的关系。
FastCGI 用来提高cgi程序性能,启动一个master,再启动多个worker,不需要每次解析php.ini 而php-fpm实现了fastcgi协议,是fastcgi的进程管理器,支持平滑重启可以启动的时候预先生成多个进程。
CSRF,跨站请求伪造,攻击方伪装用户身份发送请求从而窃取信息或者破坏系统。防范:
XSS,跨站脚本攻击。防范:不相信任何输入,过滤输入。
function search($arr,$k){
$n = count($arr);
$arr[$n]= $k;
for($i=0; $i<$n; $i++){
if($arr[$i]==$k){
break;
}
}
if
($i<$n){
return $i;
}else{
return
-1;
}
}
function binaryRecursive($arr,$low,$top,$target){
if($low<=$top){
$mid = floor(($low+$top)/2);
if($arr[$mid]==$target){
return $arr[$mid];
}elseif($arr[$mid]<$target){
return binaryRecursive($arr,$mid+1,$top,$target);
}else{
return binaryRecursive($arr,$low,$top-1,$target);
}
}else{
return
-1;
}
}
function _sort($arr)
{
$count = count ($arr)
-
1;
$temp =
0;
for
($i =
0; $i < $count; $i++)
{
for
($j =
0; $j < $count - $i; $j++)
{
if
($arr[$j]
< $arr[$j +
1])
{
$temp = $arr[$j];
$arr[$j]
= $arr[$j +
1];
$arr[$j +
1]
= $temp;
}
}
}
return $arr;
}
function quick_sort($arr)
{
//判断参数是否是一个数组
if(!is_array($arr))
{
return
false;
}else{
//递归出口:数组长度为1,直接返回数组
$length = count($arr);
if($length<=1)
return $arr;
//数组元素有多个,则定义两个空数组
$left = $right = array();
//使用for循环进行遍历,把第一个元素当做比较的对象
for($i=1; $i<$length; $i++)
{
//判断当前元素的大小
if($arr[$i]<$arr[0]){
$left[]=$arr[$i];
}else{
$right[]=$arr[$i];
}
}
//递归调用
$left=quick_sort($left);
$right=quick_sort($right);
//将所有的结果合并
return array_merge($left,array($arr[0]),$right);
}
}
RDB 持久化
将 redis 在内存中的的状态保存到硬盘中,相当于备份数据库状态。
AOF 持久化(Append-Only-File)
AOF 持久化是通过保存 Redis 服务器锁执行的写状态来记录数据库的。相当于备份数据库接收到的命令,所有被写入 AOF 的命令都是以 redis 的协议格式来保存的。
服务提供者是所有Laravel应用程序引导启动的中心,Laravel的核心服务器、注册服务、绑定服务、监听器、中间件、路由注册以及我们应用程序都是由服务提供者引导启动的。
IOC就是控制反转,也被叫做依赖注入(DI),对象A可以依赖对象B,但是控制权在对象A中,所以叫做控制反转,依赖注入则是在IOC容器运行时动态将某种依赖关系注入到对象中。
作用:解决代码难易度,实现低耦合、高扩展。
提供了一个"static"(静态)接口去访问注册到 IoC 容器中的类。提供了简单、易记的语法,而无需记住必须手动注入或配置的长长的类名。此外,由于对 PHP 动态方法的独特用法,也使测试起来非常容易。
Contract(契约)是 Laravel 定义框架提供的核心服务的接口。Contract 和 Facades 并没有本质意义上的区别,其作用就是使接口低耦合、更简单。
通过使用RPC通信协议,实现多语言开发场景下无感知的互相调用。
优点:
三次握手就是客户端与服务器端建立TCP连接时需要发送3个包进行连接的确认,在三次握手完成后即可建立连接。第一次握手
客户端发送请求报文,标志位SYN设置为1,随机产生seq值为x,客户端进入SYN_SENT状态,等待服务器端的回应。
第二次握手
服务器端接收到请求报文,将SYN和ACK都设置为1,ack为x+1,随机产生seq值为y,然后将数据包发送给客户端进行确认,服务器端进入SYN_RCVD状态。
第三次握手
客户端收到回应的数据包后,确认ack是否为x+1,以及ACK是否为1,若正确,则将ACK设置为1,ack为y+1,然后将数据发送给服务器端。服务器端在接受到数据后检查ack是否为y+1,ACK是否为1,若正确则正确建立连接,双方均进入ESTAB-LISHED状态,完成三次握手。
除了TCP之外,我们还常听到的是UDP,那么他俩有啥区别呢?
TCP对应的是可靠性要求高的应用,从上面的解释可以看出来,在真正通信之前要三次握手,是面向连接的;并且TCP利用序列号保证消息的有序性。而UDP对应的则是可靠性要求低,但是流量大、速度快的应用;和TCP相比,UDP是无连接的并且可能是无序的。
TCP更重量,UDP更轻量,没有高低之分,只是应用的场景不同。
非技术问题没有正确答案。
邀你加入IT派 { 技术交流群 }