PHP面试心得

直接开始主题 PHP 面试 

PHP面试的会比较多一些,首先就是PHP的编程语言。

1.PHP自带函数 对 字符串的操作。

(1)PHP 判断是否包含某字符串

strstr 、stristr 和 strpos

strstr 和 stristr 的用法 (strstr 和 stristr)使用方法完全一样 ,返回一个从判断字符串开始到结束字符串,如果没有返回值,则不包含。唯一的区别就是stristr不区分大小写。

strpos  strpos 有一个参数是判断指定位置,但是 默认为空,缺点是对中文的支持不太友好 。返回的boolean值, 而且strpos在执行速度上比 strstr 和 stristr 都快 。

(2)PHP 字符串的替换 、字符串的长度

str_replace(search,replace,$str): 从$str 中查找 search 用replace 来替换。

strlen($str) :  str 字符串的长度是 多少 返回的 是 int 类型 。)

2. PHP 对数组操作的函数 

(1)返回数组的 key 键 、返回数组的 value 值、 判断数组中是否指定的键值

array_keys()  返回数组的所有key键   

array_values() 返回所有的value 值  

 array_key_exists($key,$array)  判断$key 是否存在这个数组里   isset($array[$key]) 判断是否有指定的key 存在就返回 true

3.include和require 的区别

require()语句的性能与include()相似, 都是包括并允许指定文件。

1.不同之处在于;

对include()语句来说,在执行文件是每次都要进行读取和评估; 对于require(),来说,文件只处理一次。如果可能执行多次的代码,使用require()效率更高,另外一方面,每次执行代码时是读取不同的文件,或者有通过一组文件迭代的循环,就使用include() 语句。

2. include在用到是加载,require在一开始就加载。require()和include()语句是语言结构,不是真正的函数,

3.include引用文件时候,如果碰到错误,会给出提示,并且继续运行下边的代码;require引入文件的时候,如果碰到错误,会给出提示,并且停止运行 下边的代码。

4. include() 和 require() 的功能相同,用法上却有一些不同,include()是有条件包含函数。而require()则是无条件包含函数。


2.然后进入到了ajax

(1) ajax  异步提交 和 不异步提交的区别  

ajax 异步请求和 不异步请求的区别就是 异步请求.async 配置 是  true/  同步请求是false

同步请求 (false)

 同步请求就是当前请求后,浏览器什么都不能做,必须等到请求完成之后,才会执行后续的代码,相当于是排队,前面一个人办理完自己的事物,下一个人才能接着办理。当JS代码加载到当前AJAX的时候就会把页面里所以的代码停止加载,页面处于一个假死状态,当这个AJAX 执行完毕时候才会继续运行其他页面解除假死状态。

同步请求 (true)

 异步请求就是当发出请求的同时,浏览器可继续做任何事情,ajax 发送请求并不会影响页面的加载与用户的操作,相当于是在两条线上走,不互相影响。

有人说:既然异步这么好,那全部都用异步好了,同步存在还有什么意义?
       那么,同步适用于一些什么情况呢?

       我们可以想一下,同步是一步一步来操作,等待请求返回的数据,再执行下一步,那么一定会有一些情况,只有这一步执行完,拿到数据,通过获取到这一步的数据来执行下一步的操作。这是异步没有办法实现的,因此同步的存在一定有他存在的道理。

其实对 ajax 最大的批评就是 破坏了浏览器的 退后按钮 ,在动态更新页面的情况下,用户无法回到 前一个页面状态,这个是因为浏览器仅能几下历史记录中的静态页面。一个被完整读入的页面一个以已经被动态修改过的页面之间差别非常微妙;

不过可以解决这个问题,当中大多数都是在用户点击后退按钮访问历史记录时,通过建立一个隐藏的 IFRAME(隐藏帧技术) 来重现页面上的变更。(例如,当用户在Google Maps 中点击后退时),它在一个隐藏的IFRAME(隐藏帧技术)中进行搜索然后将搜结果反映到ajax元素上,将程序状态恢复到当时的状态)。

(2)Session 和 Cookie

1.Session  其实指的就是访问者从到达某个特定主页到离开为止的那段时间。 Session其实是利用Cookie进行信息处理的,当用户首先进行了请求后,服务端就在用户浏览器上创建了一个Cookie,当这个Session结束时,其实就是意味着这个Cookie就过期了。

注: 为这个用户创建的Cookie的名称是ASP SessionID。这个Cookie的唯一目的就是为每一个用户提供不同的身份认证。

2.Cookie 是一种发送到客户浏览器的文本串句柄,并且保存在客户机硬盘上,可以用来某个WEB站点会话间持久的保持数据。

3. cookie 和 Session 的共同之处在于: cookie 和 Session 都是来跟踪浏览器用户身份的会话方式。

4. Cookie 和 Session 的区别就是: Cookie 数据保存在客户端,Session数据保存在服务器端。简单的说,当你登录一个网站的时候。

  如果WEB 服务器端使用的是 Session,那么所有的数据都保存在服务器上,客户端每次请求服务器的时候会发送当前会话的sessionid, 服务器可以根据当前的sessionid判断相应的用户数据标志,已确定用户是否登录或具有某种特殊权限。但是SessionId是 服务器和 客户单连接时候随机分配的,一般来说不会有重复。

 如果浏览器使用的是Cookie,那么所有的数据都保存在浏览器端,假如你登录之后,服务器端设置了cookie用户名,那么当你再次请求服务器的时候,浏览器会将用户名一块发给服务器,这些变量一定的特殊标记。服务器解释为cookie变量。所以不关闭浏览器cookie变量是一直都有效的,所以能够保证长时间不掉线。

5. 两个都可以用来存储私密的东西,同样也都有效的说法,区别在于session是放在服务器上的,过期取决于服务器的设定,cookie是存放在客户端的,过去与否可以再cookie生产的时候设置进去。

(1) cookie 数据是存在客户的浏览器上,session数据放在服务器上。

(2) cookie 不是很安全,别人可以分析本地的cookie并进行cookie欺骗,cookie 在客户端的限制是3K。

(3) session 会在一定时间内保存在服务器上,当访问增多,会比较占你的服务器的性能。如果考虑到减轻服务器性能方面,应当使用Cookie

所以将登陆等重要信息存放在SEssion;其他信息需要保留就存放在Cookie中

URL构成简介

URL 的构成模式(或协议),服务器主机地址(IP 地址),端口 ,路径 ,参数 

1.   Protocal 协议:常用的是http协议,https(http+ssH)

HTTPS和HTTP 的区别主要有以下的四点:

(一)、https协议需要ca申请证书,而且免费证书很少

(二)、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议

(三)、http和https使用的是不同的连接方式,用的端口也是不一样的 http 是80,后者是 443

(四)、https的链接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输,身份认证的网络协议,比HTTP安全

2、服务器主机地址:可以是域名,也可以是主机名,或IP地址。像百度就是域名www.baidu.com,DNS服务器会去解析的。
3、端口:服务器设定的端口。像URL地址里一般无端口,那是因为服务器使协议的默认端口了,用户使用url访问服务器时,可以省略的。
4、路径:访问的资源在服务器下的相对路径,不是在服务器的绝对路径,是服务器上的一个目录或者文件地址。https://baike.baidu.com/item/url/110640?fr=aladdin (红色的就是路径)
5、参数:查询搜索的部分,需要向服务器传入参数,就在这输入。通过问号?连接到path后面,有时候也归类到path中。

MySQL

1. 设么是事务?及其特性

事务的特性:

  • 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
  • 一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。
  • 隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
  • 持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。 

2.锁表和锁行的操作

MySQL 中的 Myisam 锁表

表共享读锁( Table Read  Lock) 和表独占写锁(Table Write Lock)

LOCK   TABLES tab_name READ   ;锁表      

解锁 UNLOCK  Tables 

可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:

Innodb的行锁及加锁方法

1. Record lock :  对索引项枷锁; 2.Gap lock:对索引项之间的“间隙”、第一条记录的“间隙”或最后一条记录后的“间隙”枷锁;

3. Next-key lock :前两种的组合,对记录及其前面的间隙枷锁。

间隙”:当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoBD会给符合条件的已有数据记录的索引项加锁,对于键值在条件范围内但并不存在的记录。 InnodbDB也会对这个"间隙"(GAP)枷锁,这种锁机制就是所谓的间隙锁(Next-Key)锁。

InnoDB 行锁是通过给索引上的索引项加锁实现时,如果没有索引,InnoDB将通过隐藏的聚簇索引来记录枷锁。简单地说:如果不通过索引条件s检索数据,那么InnoDB将对表中的所有记录加锁,实际效果跟表锁一样。

什么时候使用表锁:

 第一种情况是:事务需要更新大部分或的全部数据,表又比较大,如果使用默认的行锁,不仅这个事务执行效率低,而且可能造成其他事务长时间锁等待和锁冲突,这个情况下可以考虑使用表锁来提高事务的执行速度。

第二种情况: 事务涉及到多个表,比较复杂,可能引起死锁,造成大量事务回滚。这种情况也可以考虑一次性锁定事务涉及的表,从而避免死锁。减少数据库因事务回滚带来的开销。

使用表锁要注意以下两点:

使用 Lock Tables 加锁时,当 autocommit=0、InnoDB_table_locks=1(默认设置)时,InnoDB层才能知道MySQL加的是表锁,

2、事务结束之前,不要使用 UNLock Tables 释放表锁,因为会隐含地提交事务,Commit 或 ROLLBACK 并不能释放用Lock Tabes 加的表级锁,必须使用UNLock Tables 释放表锁。正确的语法:

set autocommit=0;lock tables t1 write, t2 read; [do something]commit;unlock tables;

大家也可以参考 这位大神的  https://blog.csdn.net/hjw1991324/article/details/51424790 InnoDB的行锁。


猜你喜欢

转载自blog.csdn.net/qq_36341143/article/details/80444973