面试题(自己)

  1. 配置nginx使它支持pathinfo

 

对于ThinkPHP的URL访问路劲如:http://域名/index.php/Index/BlogTest/read,原先的Nginx的是不支持的pathinfo路劲的,导致你在thinkPHP5上面测试的时候,输入相应的URL也不会提示模块名,控制器名或者方法名错误,而是出现一个404找不到的错误,那是因为Nginx无法解析这样的链接 所以要修改一下nginx配置使它支持pathinfo

配置如下:(TP5.0)

  1. location ~ \.php {    #去掉$  
  2.      root          H:/PHPServer/WWW;  笔者这里默认是 html;  
  3.      fastcgi_pass   127.0.0.1:9000;  
  4.      fastcgi_index  index.php;  
  5.      fastcgi_split_path_info ^(.+\.php)(.*)$;     #增加这一句  
  6.      fastcgi_param PATH_INFO $fastcgi_path_info;    #增加这一句  
  7.      fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;  
  8.      include        fastcgi_params;  
  9. }  

 

详细文件请参考:

TP5.0 https://blog.csdn.net/woshihaiyong168/article/details/54973353

TP3.2

http://document.thinkphp.cn/manual_3_2.html#url_rewrite

 

2、为什么要用事物?

事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有数据修改均被清除。
事务使用,可以提供一个机制,防止在执行过程中出错而之前正确的sql有影响了数据库的情况出现.

扫描二维码关注公众号,回复: 2570203 查看本文章

3、事物的特性?

一、原子性:  事物是数据库的逻辑工作单位,事物中包括的操作要么都做,要么都不做。

二、一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。

三、隔离性:一个事务的执行不能被其它事物干扰。即一个事物内部的操作及使用的数据对其它并发事物是隔离的,并发执行的各个事物之间不能互相烦扰。

四、持续性:也称永久性,只一个事物一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

2. 不考虑隔离性可能产生的问题

现在重点说明下事务的隔离性,当多个线程(或多个客户端)都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性。

如果不考虑事务的隔离性,会发生的几种问题:

2.1 脏读

脏读是指在一个事务处理过程中读取了另一个未提交的事务中的数据。

2.2 不可重复读

不可重复读是指对于数据库中的某个数据,一个事务内多次查询却返回了不同的数据值,这是由于在事务执行过程中,数据被另一个事务修改并提交了。

2.3 幻读

幻读是事务非独立执行时发生的一种现象。例如,事务T1对一个表中所有的行的某个字段做了从“1”修改为“2”的操作,这时事务T2又插入了一条新的记录,而该字段的值为“1”并且提交给数据库。这时,操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是产生了幻读。

幻读和不可重复读都是读取了另一条已经提交的事务,所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据(比如数据的个数)。

3. 隔离级别

关于事务的隔离性,MySQL提供了四种隔离级别:

Serializable(串行化):可避免脏读、不可重复读、幻读的发生。(级别最高) 
Repeatable-read(可重复读):可避免脏读、不可重复读的发生。 
Read-committed(读已提交):可避免脏读的发生。 
Read-uncommitted(读未提交):最低级别,任何情况都无法保证。(级别最低)

以上四种隔离级别最高的是Serializable,最低的是Read uncommitted级别。当然,隔离级别越高,执行效率就越低。

MySQL数据库中默认的隔离级别为Repeatable read。

像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,选用哪一种隔离级别应该根据实际情况而定。

查看当前事务的隔离级别:

select @@tx_isolation;

临时设置事务的隔离级别:

set transaction isolation level 隔离级别名称;
或
set tx_isolation=’隔离级别名称’;

注意:?设置数据库的隔离级别必须在开启事务之前!隔离级别的设置只对当前链接有效。

4、面向对象的三大特性及五大原则?

(1)面向对象的三大特性:

一、封装:封装机制将数据和代码捆绑到一起,避免了外界的干扰和不确定性。它同样允许创建对象。简单的说,一个对象就是一个封装了数据和操作这些数据的代码的逻辑实体。

二、继承:继承是可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。

三、多态:多态是OOP的另一个重要概念。多态的意思是事物具有不同形式的能力

2五大设计原则:

一、单一职责原则一个类,最好只做一件事,只有一个引起它的变化。

二、开放封闭原则软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。

三、依赖倒置原则依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。

四、接口隔离原则使用多个小的专门的接口,而不要使用一个大的总接口。分离的手段主要有以下两种:

1、委托分离,通过增加一个新的类型来委托客户的请求,隔离客户和接口的直接依赖,但是会增加系统的开销。

2、多重继承分离,通过接口多继承来实现客户的需求,这种方式是较好的。

 

五、Liskov替换原则子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。在父类和子类的具体行为中,必须严格把握继承层次中的关系和特征,将基类替换为子类,程序的行为不会发生任何变化。同时,这一约束反过来则是不成立的,子类可以替换基类,但是基类不一定能替换子类。

5、PHP如何引入文件:includerequireinclude_oncerequire_once

6、单例模式?

单例模式:单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。

7、页面静态化?

一、纯静态化:是把PHP生成的动态页面保存成静态的html文件,用户访问该静态页面,而不是用户每一次访问都重新生成一张相同的网页

优点就是减小服务器开销纯静态化又分为:局部静态化 和 完全静态化

1局部静态化:是生成的静态文件中,有局部的数据还是通过ajax技术动态获取的;

2完全静态化:即不存在动态获取数据的情况,所以内容都来自静态的html页面.

二、伪静态化:其实还是动态访问,其实质是动态生成数据你访问的网址实际上是已经经过服务器解析后的,所以称之为伪静态化

伪静态的优点:美观;便于搜索引擎收录 

 

8、php状态码:

403 (禁止) 服务器拒绝请求。

404 (未找到) 服务器找不到请求的网页。

500 (服务器内部错误) 服务器遇到错误,无法完成请求。

参考文件:https://blog.csdn.net/kirsten_z/article/details/52515496

9、Memcached雪崩和穿透

一、缓存穿透

1什么是缓存穿透?

一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。

 

2如何避免?

1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。

2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。

二、缓存雪崩

1什么是缓存雪崩?

当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。

2如何避免?

1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

2:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

 

猜你喜欢

转载自blog.csdn.net/PHPArchitect/article/details/81182473