文章目录
- 综合知识部分:
- 网络协议基础
- Mysql:
- Mysql索引和优势劣势:
- 那些情况需要建索引?
- 那些情况不需要建索引?
- ##Mysql中主键和唯一索引的区别?
- ##MyISAM与InnoDB的基本区别?索引结构如何实现?
- ##数据库中的事务是什么?
- #Mysql 的索引有哪些
- MySQL数据库中的字段类型varchar和char的区别?
- 优化mysql数据的方法
- 什么是索引
- 索引的底层数据结构了解过嘛 ?
- 索引什么时候失效?
- 主键索引和非主键索引有什么区别?
- 最左匹配原则((a),(a,b),(a,b,c)都能用到索引,(a,c)
- 索引优化
- 索引的类型有哪些?
- 事务的四大特性
- 什么是数据库的锁?
- 数据库锁的类型有哪些?
- 什么是死锁?如何避免?
- 分库分表
- 什么是主从复制
- 事务的隔离级别
- MySQL数据库的常用存储引擎以及它们的区别? --Innodb和myisam的区别
- SQL语句执行很慢
- Redis:
- php做题:
- 写一个函数,从一个标准url里取出文件的扩展名,需要取出php或.php
- 请选择以下代码运行的结果:
- 请选出以下代码运行的结果:
- 写出一下程序的输出结果:
- 写出一下程序的输出结果:
- 以下表达式的结果是:
- #求$a的值
- #求$b的值
- #写出一个函数实现 删除指定目录包括其下的所有子目录以及文件
- #写一个函数,算出两个文件的相对路径,如://计算出 c.php相对于e.php的相对路径应该是../../c/d/e/f/g/h/
- #php一维数组去重
- #php二维数组去重
- #PHP递归创建多级目录
- #------------------------------
- #------------------------------
- #------------------------------
- #------------------------------
- //随机输入一个数字能查询到对应的数据区间,如array('1','50','100','150','200','250','300');
- ##请写一段 PHP 代码 ,确保多个进程同时写入同一个文件成功
- ###获取本周的周一日期【星期一】和周未日期【星期日】
- ###PHP写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。
- 代码 引用
- 代码 echo count("abc"); 输出什么?
- php基础:
- php的性能瓶颈:
- PHP的运行模式:
- PHP PSR 标准规范:
- PHP php-fpm(FastCGI 进程管理器):
- 语句include和require的区别是什么?require和require_once()的效率那个高?
- 用PHP写出显示客户端的IP和服务端的IP
- PHP7 新特性有哪些
- PHP中_autoload()加载机制?
- 请说明 PHP 中传值与传引用的区别,什么时候传值什么时候传引用?
- buffer缓冲
- php中有几种加密方式?请列举
- php8的新特性
- error_reporting(2047) 什么作用
- echo, print(), print_r()有什么区别
- isset(), empty() 有什么区别
- 魔术方法
- PHP如何实现静态化
- php框架:
综合知识部分:
###1. 谈谈你对Cookie 与 Session 的理解,它们的适用场景是什么,如有可能可阐述下在多种应用下Session如何共享的思路
cookie适用场景:判断用户是否登录过网站,实现自动登陆,记住密码,保存上次登陆的时间等信息
session适用场景:防止用户非法登录,保存每个用户的专用信息,
session共享的思路:
1,让客户端访问同一个sessionid
2,让所有域名对应的服务器访问的session的数据的位置必须一致
- 谈谈你对单点登录的理解,比如原理与实现,以及实现过程中有哪些问题需要注意
- 谈谈你对MVC的理解,MVC的缺点是什么,如果让你实现一个MVC框架,你想怎样实现?
- 谈谈你平常工作中使用过的权限管理部分,你是如何理解与实现的?
对缓存技术的了解
1:将数据缓存在文件中,在一定的时间内访问数据时直接调用缓存数据,不需要重新访问数据库。
2:使用memcache可以做缓存
什么是ORM? 什么是n+1? 怎么处理?
orm:对象关系映射。是一种程序技术,用于面向对象编程与不同类型的数据库之间的转换。
n+1:执行一次查询N条主数据,又执行n次查询从数据,带来不必要的查询开销。
处理:可以通过orm自带的with去解决。
什么事面向对象?主要特征是什么?
面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。
主要特征:封装、继承、多态。
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中获取数据
##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()函数
网络协议基础
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是隐式的,传输的数据量较大,安全性较高;
Mysql:
Mysql索引和优势劣势:
索引:普通索引;唯一索引;主键索引;组合索引;
优势:提高数据的检索速度,减低排污的成本;
劣势:占用存储空间,降低更新数据的速度;
那些情况需要建索引?
经常用到查询条件的字段,经常需要排序,分组,统计的字段;
与其他表关联的字段
那些情况不需要建索引?
经常增删改的表不要建立索引;
频繁更新的字段;
表的记录太少;
##Mysql中主键和唯一索引的区别?
主键是约束,唯一索引是一种索引;
主键不可以null,唯一索引可以null;
一张表中只有一个主键,但可以有多个索引;
主键可以做外键,唯一索引不可以;
##MyISAM与InnoDB的基本区别?索引结构如何实现?
MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
索引结构实现: create index indexname on table_name (column_name)
##数据库中的事务是什么?
事务是可以将逻辑相关的一组操作绑定在一起;
事务的特性:原子性:要么全做,要么全部做;一致性;持续性/永久性:事务一旦提交对数据库的数据的改变是永久性的;隔离性:一个事务的执行不会被其他事务干扰;
#Mysql 的索引有哪些
:主键索引,唯一索引,普通索引,全文索引,组合索引
MySQL数据库中的字段类型varchar和char的区别?
char和varchar最大不同时,char时固定长度,varchar时可变长度,存储数据时varchar会比char多步骤
优化mysql数据的方法
1,数据类型优化,
2,索引优化·
3,SQL语句优化 : 查询数据多使用limit , 返回列是不用 * , 优化语句:count() ,关联查询,子查询
4,存储引擎的优化:尽量使用InnoDB存储引擎,因为她支持事务,外键,使用独立表空间、使用行级锁
5,数据表结构设计优化:分库分表,水平拆分,垂直拆分
6,数据架构的优化:主从复制,读写分离,双主热备,负载均衡–通过mycat数据库中间件实现
什么是索引
主要是用来提高数据检索效率,降低数据库的io成本,通过索引列对数据进行排序,降低数据排序的成本
也能降低CPU的消耗
索引的底层数据结构了解过嘛 ?
mysql的默认的存储引擎InnoDB采用B+树的数据结构来存储索引
索引什么时候失效?
1.在索引列上做运算和使用函数
select * from table_name where a + 1 = 2
select * from table_name where abs(a) = 1
2.使用like通配符匹配后缀%xxx的时候 如果要让 like %abc 也走索引,可以使用 REVERSE() 函数来创建一个函数索引,查询脚本
3.使用or连接查询的时候 注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
select * from table_name where a = 1 or b = 3
4.<>、not、in、not exists
select * from table_name where a != 1
5.is null、is not null可能会导致索引失效
select * from table_name where a is null
6.在索引的类型上进行数据类型的隐形转换,会导致索引失效,例如字符串一定要加引号,假设
select * from table_name where a = '1'会使用到索引,
如果写成select * from table_name where a = 1则会导致索引失效
主键索引和非主键索引有什么区别?
如果查询语句是 select * from table where ID = 100,即主键查询的方式,则只需要搜索 ID 这棵 B+树
如果查询语句是 select * from table where k = 1,即非主键的查询方式,则先搜索k索引树,得到ID=100,再到ID索引树搜索一次,这个过程也被称为回表
最左匹配原则((a),(a,b),(a,b,c)都能用到索引,(a,c)
select * from table where a=1 and b=2 and c=3; true
a=1 and b=2 true
a=1 and c=3 false
b=2 and c=3 false
索引优化
1.尽量少使用select*
2.将区分度最高的索引放在前面
3.条件搜索加索引
索引的类型有哪些?
1.HASH 哈希索引
2.BTREE B+树
事务的四大特性
原子性(Atomicity):不可拆分,全部成功或全部失败
一致性(Consistent):完整性约束不能被破坏(自定义完整性、数据库自身完整性)
隔离性(Isolation):并发情况下,行和表的操作,相互不影响,相互隔离开
持久性(Durable):提交成功,就是永久性的。不能服务一重启后就变回原来的
什么是数据库的锁?
当数据库有并发事务的时候,保证数据访问顺序的机制称为锁机制。
数据库锁的类型有哪些?
表级锁,行级锁,页面锁 MyISAM默认采用表级锁,InnoDB默认采用行级锁
类别
共享锁:共享锁又称读锁,简写为S锁,一个事务对一个数据对象加了S锁,可以对这个数据对象进行读取操作,但不能进行更新操作。并且在加锁期间其他事务只能对这个数据对象加S锁,不能加X锁。
排他锁:排他锁又称为写锁,简写为X锁,一个事务对一个数据对象加了X锁,可以对这个对象进行读取和更新操作,加锁期间,其他事务不能对该数据对象进行加X锁或S锁。
什么是死锁?如何避免?
死锁是指两个或者两个以上进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。在MySQL中,MyISAM是一次获得所需的全部锁,要么全部满足,要么等待,所以不会出现死锁。在InnoDB存储引擎中,除了单个SQL组成的事务外,锁都是逐步获得的,所以存在死锁问题。
如何避免MySQL发生死锁或锁冲突:
如果不同的程序并发存取多个表,尽量以相同的顺序访问表。
在程序以批量方式处理数据的时候,如果已经对数据排序,尽量保证每个线程按照固定的顺序来处理记录。
在事务中,如果需要更新记录,应直接申请足够级别的排他锁,而不应该先申请共享锁,更新时在申请排他锁,因为在当前用户申请排他锁时,其他事务可能已经获得了相同记录的共享锁,从而造成锁冲突或者死锁。
尽量使用较低的隔离级别
尽量使用索引访问数据,使加锁更加准确,从而减少锁冲突的机会
合理选择事务的大小,小事务发生锁冲突的概率更低
尽量用相等的条件访问数据,可以避免Next-Key锁对并发插入的影响。
不要申请超过实际需要的锁级别,查询时尽量不要显示加锁
对于一些特定的事务,可以表锁来提高处理速度或减少死锁的概率。
分库分表
1. 单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表
大的数据的表拆分为多个相对较小的表,
水平分表-按照时间进行划分,比如按照年份、月份、日等进行分表
垂直分表-按照字段进行划分
什么是主从复制
通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持一致。
事务的隔离级别
1.读未提交
会有脏读:事务读取其他事务未提交的数据
2.读已提交
事务中的修改操作在提交之前对其他事务是不可见的,只有已提交的修改才能被其他事务读取。解决了脏读问题
3.可重复读
保证在同一事务内多次读取同一数据时,得到的结果始终一致。
4.串行化
对于同一行事务,写会加写锁 ,读会加读锁。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
MySQL数据库的常用存储引擎以及它们的区别? --Innodb和myisam的区别
myisam:不支持事务,表锁,易产生碎片,要经常优化,读写速度较快,支持全文索引
innodb: 支持事务,行锁,有崩溃恢复能力,读写速度比myisam慢
SQL语句执行很慢
自带的分析工具 explain
Redis:
redis的落地:
redis的落地是持久化;
有两种策略:
1:RDB:定时快照方式;
2:AOF:基于语句追加文件的方式;
redis的基本数据类型:
字符串类型:string k-v结构
队列:list
散列:hash (k,k,v)结构
集合:set
有序集合:zset
redis的一致性,原子性,类似事务操作
使用lua脚本
原子性。整个lua脚本和普通的单个redis命令一样,具有原子性。如果你的逻辑比较复杂,需要使用多条redis命令完成,而且又需要保证整个逻辑的原子性。lua脚本是不二选择。(与数据库事务的原子性不同,lua脚本不会回滚出错之前的写入)
Redis是单线程的,如何提高CPU的利用率?
可以在一个服务器上部署多个Redis实例,把他们当作不同的服务器使用。
php做题:
写一个函数,从一个标准url里取出文件的扩展名,需要取出php或.php
getstr($str){
$arr = parse_url($str);
$dir = basename($arr['path']);
$ext = explode('.',$dir);
return $ext[1];
}
请选择以下代码运行的结果:
<?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; D、1; E、0; 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,
***/
#求$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;
}
#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;
}
代码 引用
//unset 只会取消引用 不会销毁内存空间
$a = 1;
$b = &$a; //$b引用$a
unset($b); //取消引用
echo $a; // 结果 1
//定义一个变量
$a = 10;
$b = $a;
$a = 11;
$b = &$a;
$a = 12;
//改变原空间值 $b随$a改变而改变
echo $a.'--'.$b; 12--12
代码 echo count(“abc”); 输出什么?
输出 1 并且会报警告,count(array);
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中有几种加密方式?请列举
不可逆的加密函数:
md5(string str)
crypt(string str,string [salt]);
可逆转的加密函数:
base64_encode(string data) -- base64_decode(string encode_data);
urlencode(string str) -- urldecode(string str);
php8的新特性
1.JIT 编译器
error_reporting(2047) 什么作用
PHP显示所有错误 E_ALL
echo, print(), print_r()有什么区别
echo 输出字符串,没有返回值
print() 是个函数,只能打印(int, string) 返回int类型的值
print_r() 是个函数,打印(数组,对象等) 返回bool类型的值
isset(), empty() 有什么区别
$a = 0; // '0', false, null, '', '0.0'
empty($a); true
empty('aaa'); true
empty($b); true
isset($a); true
isset($b); false
魔术方法
构造函数 在创建对象时自动调用
析构函数 在销毁对象前自动调用
__get 在读取不可访问或者未定义的属性自动调用
__set 在设置不可访问或者未定义的属性自动调用
__isset 在使用 isset() 时 自动调动
__unset 在使用 unset() 时 自动调用
__clone 使用 clone关键字 自动调用
__tostring 使用 echo 输出语句 会调用
__call 调用类中 未定义方法时,自动调用
__autoload 实例化不存在的类时 自动调用
PHP如何实现静态化
PHP的静态化分为:纯静态和伪静态。其中纯静态又分为:局部纯静态和全部纯静态。
PHP伪静态:利用Apache mod_rewrite实现URL重写的方法;
PHP纯静态,就是生成HTML文件的方式,我们须要开启PHP自带的缓存机制,即ob_start来开启缓存。
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.开启字段类型验证。
thinkphp如何防止sql注入,请编写代码举例
查询条件尽量使用数组
$model->where("id=%d",array($id))->select();
$model->query("select * from user where id=%d",$id);
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 生成的自动加载启动核心文件-
内核启动(服务提供者启动框架的各种组件)-
交给路由分发到到(控制器,中间件等)-
逻辑处理-
返回结果