记录php-面试

8 篇文章 0 订阅
5 篇文章 0 订阅

文章目录

##什么事面向对象?主要特征是什么?

面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。
主要特征:封装、继承、多态。

##SESSION与COOKIE的区别是什么,请从协议,产生的原因与作用说明?

//1
HTTP协议是无状态的,数据交换完毕,客户端和服务端的连接就会关闭,使用session和cookie就可以解决,不同是session保存在服务端,cookie保存在客户端。session依赖cookie传递,禁用cookie,不影响session使用,在session的存储文件生成sessionid,通过url传递到session的页面,读取sessionid可以获取session数据。

//2
客户端访问php页面,执行session_start,生成session_id,一般我们是把session_id存储到cookie上,session内容保存在服务端,客户端访问访问不同的页面都会把session_id传到服务端,通过session_id来获取session内容。

产生的背景和原理:
HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。于是需要引入一种机制,COOKIE于是就顺应而生。
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。
区别:(位置,大小,安全)
1、Cookie以文本文件格式存储在浏览器中,而session存储在服务端。
2、cookie的存储限制了数据量,只允许4KB,而session是无限制的。
3、cookie和session都可以设置过期时间
4、cookie包含在每一个客户端请求报文中,因此容易被人捕获。

//另一个回答
session存储在服务器端,cookie保存在客户端,session比较安全,
cookie用某些手段修改,不安全。
Session依赖cookie进行传递。禁用cookie后,session还可以使用,在存储session的文件中,生成sessionID,通过get传参的方式将sessionID传到要实现session共享的页面,读取sessionID,从而从session中获取数据

##Mysql中主键和唯一索引的区别?

主键是约束,唯一索引是一种索引;
主键不可以null,唯一索引可以null;
一张表中只有一个主键,但可以有多个索引;
主键可以做外键,唯一索引不可以;

##MyISAM与InnoDB的基本区别?索引结构如何实现?

​ MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
​ MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
​ 索引结构实现: create index indexname on table_name (column_name)

##数据库中的事务是什么?

事务是可以将逻辑相关的一组操作绑定在一起;
事务的特性:原子性:要么全做,要么全部做;一致性;持续性/永久性:事务一旦提交对数据库的数据的改变是永久性的;隔离性:一个事务的执行不会被其他事务干扰;

##PHP session扩展默认将session数据储存在哪里?

​ 答案: Session Server

##1:什么是抽象类?2:什么是接口?

  • 定义为抽象的类不能被实例化,任何一个类,如果它里面有个方法被声明为抽象的,那么这个类就必须被声明为抽象的。
  • 继承一个抽象类的时候,非抽象子类必须定义父类中的所有抽象方法

  • 接口中定义的所有方法都必须是公有,这是接口的特性,protected和private会报错
  • 非抽象类中必须实现接口中定义的所有方法,否则会报一个致命错误。

##2:mysql统计每个人分数总和 大于150的数据

select sum(mark) as num from te group by name having MIN(num)>=150;

##3:oop的三大特性

  • 封装 多态 继承

##10:composer自动加载原理

###在配置文件composer.json加入你需要的包,执行composer require ,composer会找到符合PR4规范的第三方库的源,将其加载到vendor目录下,初始化顶级域名的映射并写入到指定的文件里,写好一个autoload函数,并且注册到spl_autoload_register()里。

##11:如何防止sql注入

  • 避免使用字符串拼接sql语句,mysql关键字替换,预处理
  • 使用 mysql_real_escape_string(stirng) :转义SQL语句中使用的字符串的特殊字符,并考虑到连接的字符集
  • php.ini中magic_quotes_gpc = On:对sql的查询进行转义,如果是Off则使用addslashes()函数

#php一维数组去重

//使用array_unique(array);

$arr = [12,1,12,1,456,789];
var_dump(array_unique($arr));

//使用array_flip(array);


$arr = [12,1,12,1,456,789];
$a   = array_flip($arr);
$b   = array_flip($a);
var_dump($b);

//键值互换使用

$result_01 = array_flip($input);
$result= array_key($result_01);
var_dump($result);

#php二维数组去重

$arr = array(
	    array("name" => "a"),
	    array("name" => "b"),
	    array("name" => "c"),
	    array("name" => "b"),
	    array("name" => "c"),
	    array("name"=> "d"),
	    ["name"=>"c"],
	    ["name"=>"d"]
    );
    $key = "name";
    $result = array_unique_new($arr,$key);
    function array_unique_new($arr,$key){
        $temp_arr = array();
        foreach($arr as $k => $v){
            if(in_array($v[$key],$temp_arr)){
                unset($arr[$k]);
            }else{
                $temp_arr[$k] = $v[$key];
            }
        }
        return $arr;
    }

#PHP递归创建多级目录

function Directory($dir = '/'){
        return is_dir($dir) or Directory(dirname($dir)) and mkdir($dir,0777);
}
Directory("upload");

#------------------------------

​ $a=[0,1,2,3]; $b=[1,2,3,4,5]; a + = a+= a+=b; var_dump($a)等于多少?
​ [0,1,2,3,5]

#------------------------------

t e s t = " a a a " ; test="aaa"; test="aaa";abc = & t e s t ; u n s e t ( test;unset( test;unset(test);echo $abc; //aaa

#------------------------------

a = [ 1 , 2 , 3 ] ; f o r e a c h ( a=[1,2,3];foreach( a=[1,2,3];foreach(a as & v ) ; f o r e a c h ( v){};foreach( v);foreach(a as v ) ; v a r d u m p ( v){};var_dump( v);vardump(a); //[1,2,2]

#------------------------------

//随机输入一个数字能查询到对应的数据区间,如array(‘1’,‘50’,‘100’,‘150’,‘200’,‘250’,‘300’);

​ function rands( a r r , arr, arr,mumber){
​ sort( a r r ) ; ​ f o r e a c h ( arr); ​ foreach ( arr);foreach(arr as $key => KaTeX parse error: Expected '}', got 'EOF' at end of input: … ​ if(!empty(arr[KaTeX parse error: Expected '}', got 'EOF' at end of input: …+1])){ ​ if(mumber >= a r r [ arr[ arr[key] && $mumber <= a r r [ arr[ arr[key+1]){
​ return [ a r r [ arr[ arr[key], a r r [ arr[ arr[key+1]];
​ }
​ }
​ }
​ }
​ var_dump(rands([‘1’,‘50’,‘100’,‘150’,‘200’,‘250’,‘300’],251));

##请写一段 PHP 代码 ,确保多个进程同时写入同一个文件成功

function writeData($filepath, $data){
	$fp = fopen($filepath,'a');
	do{
		usleep(100);
	}while (!flock($fp,LOCK_EX));
	$res = fwrite($fp, $data."\n"); 
    flock($fp, LOCK_UN); 
    fclose($fp);  
    return $res; 
}
writeData("index_txt.txt","sda");

###获取本周的周一日期【星期一】和周未日期【星期日】

​ 本周星期一日期: echo date(“Y-m-d”,strtotime(“previous monday”));
​ 本周末(星期天): echo date(“Y-m-d”,strtotime(“Sunday”));

###PHP写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。

function xf_dir($path){
		$files = [];
		if($h = opendir($path)){		//打开文件
			while( ($file = readdir($h)) !== false ){		//循环读取
				if($file != '.' && $file != '..'){			//除 .  ..
					if(is_dir($path.'/'.$file)){            //如果是文件按文件名保存
						$files[$file] = xf_dir($path.'/'.$file);	//递归保存
					}else{
						$files[] = $path.'/'.$file;
					}
				}
			}
		}
		closedir($h);					//关闭文件
		return $files;
}

#thinkphp如何防止sql注入,请编写代码举例

查询条件尽量使用数组

$model->where("id=%d",array($id))->select();
$model->query("select * from user where id=%d",$id);

#Mysql 的索引有哪些

:主键索引,唯一索引,普通索引,全文索引,组合索引
?

#php中有几种加密方式?请列举

不可逆的加密函数:
md5(string str)
crypt(string str,string [salt]);
可逆转的加密函数:
base64_encode(string data) – base64_decode(string encode_data);

urlencode(string str) – urldecode(string str);

#求$a的值

$a = "hello";
$b = &$a;
unset($b);
$b = "world";
echo $a;		//hello

#求$b的值

$a = 1;
$x = &$a;
$b = $a++;
echo $b;		//1  赋值完$b之后$a才++

#写出一个函数实现 删除指定目录包括其下的所有子目录以及文件

function clear_dir($path){
		if(is_dir($path)){			//是否有文件
			$p = scandir($path);	//查找该文件下的所有文件
			foreach($p as $val){
				if($val != '.' && $val != '..'){	//除. ..
					if(is_dir($path.'/'.$val)){		//判断是不是文件
						clear_dir($path.'/'.$val);	//递归删除这个文件的下的所有目录
						rmdir($path.'/'.$val);	//删除当前文件
					}else{
						unlink($path.'/'.$val);	//删除当前文件
					}
				}
			}
		}
	}

#写一个函数,算出两个文件的相对路径,如://计算出 c.php相对于e.php的相对路径应该是…/…/c/d/e/f/g/h/

		$a = '/a/b/c/d/e/f/g/h/e.php';
	    $b = '/a/b/1/2/c.php';
		function getRelativePath($a, $b){
            $relativePath = "";
            $pathA = explode("/", dirname($a));
            $pathB = explode("/", dirname($b));

            $n = 0;
            $len = count($pathB) > count($pathA) ? count($pathA) : count($pathB);

            do{
                if( $n >= $len || $pathA[$n] != $pathB[$n]){
                    break;
                }
            }while(++$n);
            $relativePath .= str_repeat("../", count($pathB) -$n);
            $relativePath .= implode("/", array_splice($pathA, $n));
            return $relativePath;
		}
  1. 谈谈js实现继承的几种方式,并写出demo

  2. 谈谈你熟悉的js框架,并实现下面DOM元素的获取

要求找到drag=“true” 并且 index=“1” 或 无index属性的div

提示: 如果不能一次写出,请完成下来步骤

  1. 找到drag=“true” 并且 index=“1”

  2. 找到drag=“true” 并且 无index属性的

  3. 将二者联立起来得到

  4. 实现一个遮罩层效果,要求要显示的元素在页面上居中显示

  5. 闭包知识考察

function step(a){
return function(x){
return x+a++;
}
}

var a = step(10);
var b = step(20);
alert(a(10));
alert(b(20));
var a=“123abc”;
alert(typeof(a++));
alert(a);

#MySQL 知识部分

###某内容管理系统中,表message有如下字段 创建上表,写出MySQL语句
id 文章id
title 文章标题
content 文章内容
category_id 文章分类id
hits 点击量

create table message(
	id int AUTO_INCREMENT PRIMARY KEY,
	title char(20) NOT NULL,
	content varchar(255) NOT NULL,
	category_id int NOT NULL,
	hits int
)engine=innoDB default charset=utf8;

###同样上述内容管理系统:表comment记录用户回复内容,字段如下
comment_id 回复id
id 文章id,关联message表中的id
comment_content 回复内容
现通过查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面

文章id 文章标题 点击量 回复数量
用一个SQL语句完成上述查询,如果文章没有回复则回复数量显示为0

:select m.id,m.title,m.hits,(select count(*) from comment c where m.category_id=c.id) as num from message m order by num desc;

###上述内容管理系统,表category保存分类信息,字段如下???

category_id int(4) not null auto_increment;
categroy_name varchar(40) not null;

用户输入文章时,通过选择下拉菜单选定文章分类

写出如何实现这个下拉菜单[可使用PHP,JAVASCRIPT,HTML]

#综合知识部分:

###1. 谈谈你对Cookie 与 Session 的理解,它们的适用场景是什么,如有可能可阐述下在多种应用下Session如何共享的思路

​ cookie适用场景:判断用户是否登录过网站,实现自动登陆,记住密码,保存上次登陆的时间等信息
​ session适用场景:防止用户非法登录,保存每个用户的专用信息,

session共享的思路:
1,让客户端访问同一个sessionid
2,让所有域名对应的服务器访问的session的数据的位置必须一致
  1. 谈谈你对单点登录的理解,比如原理与实现,以及实现过程中有哪些问题需要注意
  2. 谈谈你对MVC的理解,MVC的缺点是什么,如果让你实现一个MVC框架,你想怎样实现?
  3. 谈谈你平常工作中使用过的权限管理部分,你是如何理解与实现的?

请选择以下代码运行的结果:

<?php if ('1e3' == '1000') echo 'LOL'; ?>	//B
A 无任何输出结果     B  LOL       C 不执行且报错
//1e3 是 科学计数法 实数的指数形式 为1乘以10的三次方

请选出以下代码运行的结果:

<?php $a = "aabbzz"; $a++; echo $a; ?>		//C
A b            B aabbzz           C aabcaa
/***
字符串字母相加其实就是在末尾字母加一 如:$a = "a"; $a++;答应结果就是 b,$a=''aa';结果就是ab 故$a = "aabb";打印结果就是 aabc ,如$a = "aabbz";结果就是 aabca,因为Z是末尾字母故加一变为a,向前一位进一,b就变为c,故结果为C;
**/

写出一下程序的输出结果:

<?php

$data = ['a','b','c']; 

foreach($data as $k => $v){
    $v = &$data[$k];
}
var_dump($data);	//['b','c','c']
>
A $data = ['a','b','c']; B $data = ['b','b','c']; C $data = ['b','c','c']; 
/***
这里有个考点要记得 就是&是引用;修改引用变量的值,那么空间的值也会改变,

第一次循环 得到
$v = &$data[0]=>'a',		//此时$v 和 $data[0] 是同一存储空间
第二次循环					
$v = &$data[1]=>'b',		//将b的值给$v($data[0])		//并$v引用的$data[1]同一存储空间, 

可见第一次引用的$data[0]的值已经被改变,所以此时的$data[0]=b,此时$v引用的$data[1],

进入第三次循环 此时$v又变为 
$v = &$data[2]=>'c',		//将c的值给$v($data[1])		//并$v引用的$data[2]同一存储空间, 

所以此时的$data[1]=c,
这样循环结束 
$data[0]=>'b', $data[1]=>'c', $data[2]=>'c',
**/

写出一下程序的输出结果:

<?php 
$a = 0.1; 
$b = 0.7;

if($a+$b == 0.8){		//0.79999999
	echo true; 
}else{
	echo false; 		//PHP不能进行浮点数计算,CPU在计算浮点数时,先转换成二进制,导致值不正确。
};
A;     B true;    C false;    D1;  E0;  F:报错	// A
    
/***
这里的考点有两个:
1,echo false和true的值;
2、浮点类型不能用于精确计算;首先浮点类型的数据不能用于计算,他会将浮点类型转为二进制,所以有一定的损耗,故它无限接近于0.8,也就是0.79999999...,所以echo 应该是个false;echo false;结果是空;echo true;结果是1;
***/
// $a = 9223372036854775807;
// $b = 9223372036854775808;
// var_dump($a === ($b - 1));
>

以下表达式的结果是:

$a= 0;$b= 0;
if($a = 3>0 || $b = 3>0){		//a = true
	$a++;
	$b++;
}
echo $a.','.$b;
/****
A报错;    B:1,1;    (要是真的只有两个选项该多好肯定大家都选B)

解析:此题考查的是运算符的优先级问题,首先在此题中比较运算符>逻辑运算符>赋值,

所以1,先看 3>0为true,
2,因为是||运算所以后面的$b=3>0 形成短路作用,这时的$a=true,$b=0;
  故$a++;为1;$b++;为1这里解释下布尔类型运算不影响布尔类型结果;但是$b=0;$b++;就改变为1, echo true;结果为1,
***/

MySQL数据库中的字段类型varchar和char的区别?

char和varchar最大不同时,char时固定长度,varchar时可变长度,存储数据时varchar会比char多步骤

对缓存技术的了解

1:将数据缓存在文件中,在一定的时间内访问数据时直接调用缓存数据,不需要重新访问数据库。

2:使用memcache可以做缓存

优化mysql数据的方法

1,数据类型优化,

2,索引优化·

3,SQL语句优化 : 查询数据多使用limit , 返回列是不用 * , 优化语句:count() ,关联查询,子查询

4,存储引擎的优化:尽量使用InnoDB存储引擎,因为她支持事务,外键,使用独立表空间、使用行级锁

5,数据表结构设计优化:分库分表,水平拆分,垂直拆分

6,数据架构的优化:主从复制,读写分离,双主热备,负载均衡–通过mycat数据库中间件实现

什么是ORM? 什么是n+1? 怎么处理?

orm:对象关系映射。是一种程序技术,用于面向对象编程与不同类型的数据库之间的转换。
n+1:执行一次查询N条主数据,又执行n次查询从数据,带来不必要的查询开销。
处理:可以通过orm自带的with去解决。

网络协议基础

7层模型

网络协议为计算机网络中进行数据交换而建立的规则,标准或约定的集合,所有的计算机/手机等网络设备通信都得遵循网络协议.
网络协议根据通信的步骤,层级划分为7个层级,从上往下为:
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层

在这里插入图片描述

ip协议(网络层)

WebSocket协议

WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。

产生背景
在没有WebSocket协议之前,在网页中,实现一个聊天室只能使用ajax 不断轮询,请求服务器是否有数据产生,而这样的实现方法会出现一系列的问题:

如果轮询时间间隔太短,会导致客户端和服务端在一个时间段内不断的进行http tcp的握手/挥手动作和http 请求头,响应头的传输,大量消耗服务器资源,如果用户量大的情况,会造成服务器的繁忙以至于宕机
客户端每次只能通过发送http 请求获得服务器是否有数据返回,且数据的及时性无法保证
正因为在这种情况下,所以WebSocket出现了,它只需要一次http握手,就可以保持一个长连接,使得服务器可以主动发送消息给客户端,大大减少了轮询机制的消耗

tcp(传输层)

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议
TCP层是位于IP层之上,在传输时 TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

三次握手
TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK ,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。 TCP三次握手的过程如下:

客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。

udp(传输层)

UDP 是User Datagram Protocol的简称,中文名是用户数据报协议,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务
udp与tcp
udp和tcp都属于传输层的协议,都位于ip协议的顶层,他们不同之处有:

udp是无连接协议,不需要进行tcp的握手
udp每次发送最大长度是65535,而tcp在握手后可以源源不断的发送
udp协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。这与TCP协议是不同的,后者要求必须具有校验值。
udp报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为udp协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。
在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。而tcp会进行确认验证,确保对方接收成功
udp可实现对网关内的所有主机进行广播

phper的udp
在php初级开发者中,是很少接触到udp协议的,常见的有DNS协议,
在我们输入一个域名时,会先请求到一个dns服务器,由dns服务器匹配出一个ip地址,然后通过ip地址去传输数据, 在这个步骤中,请求dns服务器使用的就是udp协议

http协议

超文本传输协议
HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。(我们称这个客户端)叫用户代理(user agent)。应答的服务器上存储着(一些)资源,比如HTML文件和图像。(我们称)这个应答服务器为源服务器(origin server)。

地址栏输入URL地址到页面出现的详细过程?

1.用户在浏览器输入域名
2.dns服务器解析/或者本机hosts,路由器hosts对比 获得ip
3.浏览器访问默认端口80,则访问的tcp地址为 ip:80
4.tcp协议3次握手,建立连接
5.发送一个http request请求头
6.服务器获得http request请求头,表明该次访问为http访问,解析http请求头,获得请求类型,请求格式,以及请求数据(cookie,get,post数据)
7.服务器发送response响应数据,主动断开
8.浏览器接收response响应数据,解析响应文本类型,解析数据,断开连接
---.https协议中,在请求以及响应时多了一层tls,ssl加密解密协议,默认端口从80变为了443

请求Request,和Response响应

requset:用来获取请求信息。 response:用来设置响应消息

##HTTP和HTTPS有什么区别?

HTTP端口是80;HTTPS是443;
HTTPS是要到ca申请证书;
HTTP协议是无状态的,HTTPS是有ssl加密协议http协议构成的,进行的是加密传输,身份认证的协议;

##HTTP状态中302、403、500代码的具体含义?1xx,2xx,3xx,4xx,5xx 即1至5开头的状态分别指什么?

​ 302:临时转移成功,请求的内容已转移到新位置
​ 403:禁止访问
​ 500:服务器内部错误

1XX类状态码信息表示:临时的响应。
2XX类状态码信息表示:服务器已成功接收,理解和接受请求
3XX类状态码信息表示:重定向。
4XX类状态码信息表示:请求错误。
5XX类状态码信息表示:服务器遇到错误

表单中get和post提交方式的区别?

get是显式的传输,数据可以从url看到,有长度限制,传输数据量小,安全性低;

post是隐式的,传输的数据量较大,安全性较高;

Msql:

Mysql索引和优势劣势:

索引:普通索引;唯一索引;主键索引;组合索引;
优势:提高数据的检索速度,减低排污的成本;
劣势:占用存储空间,降低更新数据的速度;

那些情况需要建索引?

经常用到查询条件的字段,经常需要排序,分组,统计的字段;
与其他表关联的字段

那些情况不需要建索引?

经常增删改的表不要建立索引;
频繁更新的字段;
表的记录太少;

Redis:

redis的落地:

redis的落地是持久化;
有两种策略:
1:RDB:定时快照方式;
2:AOF:基于语句追加文件的方式;

redis的基本数据类型:

字符串类型:string
队列:list
散列:hash
集合:set
有序集合:zset

php做题:

写一个函数,从一个标准url里取出文件的扩展名,需要取出php或.php

getstr($str){
    $arr = parse_url($str);
    $dir = basename($arr['path']);
    $ext = explode('.',$dir);
    return $ext[1];
}

php基础:

php的性能瓶颈:

1.弱类型
2.网络
3.cpu

PHP的运行模式:

php有着5种运行模式,常见的有4种:

## cgi 协议模式
cgi模式 通用网关接口(Common Gateway Interface),它允许web服务器通过特定的协议与应用程序通信, 
调用原理大概为:
用户请求->Web服务器接收请求->fork子进程 调用程序/执行程序->程序返回内容/程序调用结束->web服务器接收内容->返回给用户 由于每次用户请求,都得fork创建进程调用一次程序,然后销毁进程,所以性能较低

## fast-cgi 协议模式
fast-cgi是cgi模式的升级版,它像是一个常驻型的cgi,只要开启后,就可一直处理请求,不再需要结束进程, 
调用原理大概为:
web服务器fast-cgi进程管理器初始化->预先fork n个进程
用户请求->web服务器接收请求->交给fast-cgi进程管理器->fast-cgi进程管理区接收,给其中一个空闲fast-cgi进程处理->处理完成,fast-cgi进程变为空闲状态,等待下次请求->web服务器接收内容->返回给用户

## 模块模式
apache+php运行时,默认使用的是模块模式,它把php作为apache的模块随apache启动而启动,接收到用户请求时则直接通过调用mod_php模块进行处理

## php-cli模式
php-cli模式属于命令行模式 ,直接输入php xx.php 就能执行php代码

PHP PSR 标准规范:

https://learnku.com/docs/psr

PHP php-fpm(FastCGI 进程管理器):

它的工作原理大概为:
php-fpm启动->生成n个fast-cgi协议处理进程->监听一个端口等待任务
用户请求->web服务器接收请求->请求转发给php-fpm->php-fpm交给一个空闲进程处理
->进程处理完成->php-fpm返回给web服务器->web服务器接收数据->返回给用户
简要的过程如下:
      1. PHP是随着Apache的启动而运行的;
      2. PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口);
      3. PHP总共有三个模块:内核、Zend引擎、以及扩展层;
      4. PHP内核用来处理请求、文件流、错误处理等相关操作;
      5. Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;
      6. 扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要mysql扩展来连接MySQL数据库;
      7. 当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;
      8. 最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上。

语句include和require的区别是什么?require和require_once()的效率那个高?

在代码中有10句include,php就要解析10次,而require只需1次。include引入文件前需要判断文件存不存在,如果不存在会提示报错,不影响程序运行。require不需要包含文件,不同的是如果不存在文件,提示报错,程序终止。

require比requir_once效率高。*_once是opcode缓存下调用。*_once需要额外的去查看系统有没有调用过这个文件。

用PHP写出显示客户端的IP和服务端的IP

echo $_SERVER['REMOTE_ADDR']; //客户端IP
echo gethostbyname("www.baidu.com");  //服务端IP

PHP7 新特性有哪些

  • 类型声明。

  • 函数返回值类型声明

  • 新增null合并运算符 ??

    a = i s s e t ( a = isset( a=isset(_GET[‘a’]) ? $_GET[‘a’] : 0; //三元运算符

    ​ $a = $_GET[‘a’] ?? 0; null合并运算符

  • 新增组合比较符 <=>

    结果只有 1 0 -1

    $c = $a <=> $b;

    如果 $a > $b, 则 $c 的值为 1。
    如果 $a == $b, 则 $c 的值为 0。
    如果 $a < $b, 则 $c 的值为 -1。

  • 支持通过define()定义常量数组

  • 新增支持匿名类

  • 支持 Unicode codepoint 转译语法。

  • 更好的闭包支持。

  • 为 unserialize() 提供过滤。

  • 新增加 IntlChar 类。

  • 支持 use 语句从同一 namespace 导入类、函数和常量。

  • 新增整除函数 intdiv()。

  • session_start() 支持接收数组参数。

PHP中_autoload()加载机制?

php运行一个类时,当前脚本没有这个类后者没有手动引入这个类文件时,php会自动调用_autoload($class_name)函数,该函数有一个参数,这个参数就是类的名称;

请说明 PHP 中传值与传引用的区别,什么时候传值什么时候传引用?

按值传递:在函数内,对值的任何改变在函数外不受影响

按引用传递:在函数内,对值的任何改变在函数外会手影响

按值传递时,必须复制值。按引用传递测不需要复制值

buffer缓冲

输出语句/函数,默认情况是先进入php缓冲区,等缓冲区到达一定数量,才开始传输给web服务器的
echo,var_dump,phpinfo等输出语句/函数 -> php buffer -> tcp -> 终端(浏览器)
 
php.ini: output_buffering = on 配置开启

output_buffering打开与关闭的区别:
	1.打开了php输出缓存: echo,print -> php output_buffring -> server buffering -> browser buffering -> browser display
	2.未打开php输出缓存: echo,print -> server buffering -> browser buffering -> browser display

php框架:

tp5和tp6的区别:

tp6只能通过composer安装;
类的加载方式:tp5采用的自己一套实现记载方式,tp6采用的是composer类的加载方式
tp6有严格模式,tp5没有;
tp6支持更多的psr规范
组件的独立
中间件改进:tp6使用管道模式来时间中间件,比tp5的更加简洁
引入filesystem组件

tp6的生命周期?

1, 入口文件。
2,加载应用。
3,注册服务。
4,生成事件。
5,加载中间件。
6,解析路由。
7,执行控制器方法。
8,响应输出。

thinkphp如何防止sql注入?

1.查询条件尽量使用数组方式。
2.使用预处理机制。
3.开启字段类型验证。

laravel框架

一、Laravel有哪些特点:
1 强大的rest router:用简单的回调函数就可以调用,快速绑定controller和router
2 artisan:命令行工具,很多手动的工作都自动化
3 可继承的模板,简化view的开发和管理
4 blade模板:渲染速度更快
5 ORM操作数据库
6 migration:管理数据库和版本控制
7 测试功能也很强大
8 composer也是亮点
9 laravel框架引入了门面,依赖注入,Ioc模式,以及各种各样的设计模式等
二、架构模式
laravel框架是使用了服务组件化的开发模式,由多个服务提供者构成了组件,再由多个组件提供不同的服务,然后是多个服务构成了项目
服务提供者是应用配置的核心,是通过 register方法中绑定服务到服务容器的。
三、涉及到的设计模式
laravel框架使用了大量设计模式,使模块之间耦合度很低,服务容器可以方便的扩展框架功能以及编写测试。

1.ORM - 对象关系映射模式
2 依赖注入与IOC容器 - 策略模式
3 监听与触发  -  观察者模式
4 门面模式 - 静态代理
还有其他的,比如注册服务的时候用到单例模式等。
四、服务方面
能快速开发出功能,自带各种方便的服务,比如数据验证、队列、缓存、数据迁移、测试、artisan 命令行等等,还有强大的 ORM,artisan强大的命令行工具,实现自动化。

Laravel安全功能有效地利用了盐散列和加密码机制,Bcrypt哈希算法”来创建加密密码。
五、框架的其他知识点
服务容器:是一个用于管理类依赖和执行依赖注入的强大工具。其实质是通过构造函数或者某些情况下通过「setter」方法将类依赖注入到类中。 

门面:为应用服务容器中的绑定类提供了一个「静态」接口 ,优点:在维护时能够提供更加易于测试、更加灵活、简明优雅的语法。

契约:用来规划服务提供者的格式、方法、参数等,给服务提供者规范了一定约束。

反射:主要用来动态地获取系统中类、实例对象、方法等语言构件的信息,通过发射API函数可以实现对这些语言构件信息的动态获取和动态操作等。

后期静态绑定:用于在继承范围内引用静态调用的类,即在类的继承过程中,使用的类不再是当前类,而是调用的类。
六、生命周期
入口文件-
请求web服务器导入这个文件-
载入 Composer 生成的自动加载启动核心文件-
内核启动(服务提供者启动框架的各种组件)-
交给路由分发到到(控制器,中间件等)-
逻辑处理-
返回结果
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值