面试题总结

1、TP框架的特性:

  1. 融合了smarty模板引擎,使前后端分离
  2. 多表查询比较方便,通过join可以完成对多表的关联操作
  3. 支持应用扩展,类库扩展和驱动扩展
  4. 支持多种url模式
  5. 内置了ajax返回方法,包括xml,json,html
  6. 支持多种缓存技术,尤其对memcache缓存非常支持
  7. 命名规范,模型视图控制器严格遵循命名规范,提供命名一一对应

 

2、MVC模式,及其之间的联系:

M(model)模型,负责操作数据,V(view)视图,负责前后端的显示,也就是我们所看到的东西,C(controller)控制器,负责项目的业务逻辑处理。客户端请求项目的控制器,然后控制器进行业务逻辑的处理,如果执行中需要用到数据的操作,控制器就会到模型中获取数据,再将获取到的数据通过视图显示出来。

 

3、语句include和require的区别是什么?

  两者都用于包含文件,require如果包含文件出错会报致命错误并且停止运行,而include会报Notice错误,程序继续运行。require_once会检查是否重复包含,如果已经包含则不再执行,include同理。

 

4、cookie和session的区别

  1. cookie存储在客户端,不会浪费服务器资源,不建议将敏感重要信息保存在cookie,而且用户可以禁止cookie。
  2. session存储在服务器上,信息比较安全,但比较占用服务器资源,session是基于cookie的,sessionID存储在cookie中。
  3. 如果客户端cookie被禁用掉可以将sessionID添加到url链接中进行传递

 

5、客户端ip地址和服务端ip地址

$_SERVER['REMOTE_ADDR']  //客户端
$_SERVER['SERVER_ADDR']  //服务器端

6、PHP 遍历一个文件夹下所有文件和子文件夹的方法

function my_dir($dir) {
    $files = [];
    if(@$handle = opendir($dir)) {
        //目录/文件/子目录/子文件名称为0或者空这种情况不全等于false不跳出循环,目录里指针全读取完则为false,跳出循环
        while(($file = readdir($handle)) !== false) {
            if($file != ".." && $file != ".") {
                if(is_dir($dir . "/" . $file)) { //如果是子文件夹,进行递归
                    $files[$file] = my_dir($dir . "/" . $file);
                } else {
                    $files[] = $file;
                }
            }
        }
        closedir($handle);
    }
    return $files;
}

7、PHP垃圾回收机制

        php中的变量存储在变量容器zval中,zval中除了存储变量类型和值外,还有is_ref和refcount字段。refcount表示指向变量的元素个数,is_ref表示变量表示是否是引用变量。如果refcount为0时,就回收该变量容器。xdebug_debug_zval()方法可以查看

 

8、数据库事务及其特性

事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。

事务特性:

(1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。

(2)一致性。事务的执行使得数据库从一种正确状态转换成另一种正确状态

(3)隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,

(4) 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

 9、MyISAM与innoDB的区别

  1. InnoDB支持事务,MyISAM不支持
  2. Innodb不支持全文索引,而MyISAM支持全文索引,在涉及全文索引领域的查询效率上MyISAM速度更快高;PS:5.7以后的InnoDB支持全文索引了
  3. InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
  4. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败
  5. 如何选择:1.是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM,2.如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读也有写,请使用InnoDB,3.系统奔溃后,MyISAM恢复起来更困难,能否接受,4.MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差

 

10、mysql数据库优化的方法

  1. 选取最适用的字段属性(例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了)
  2. 使用连接(JOIN)来代替子查询(如果使用连接(JOIN)..来完成这个查询工作,速度将会快很多,尤其是where里的条件建有索引的话,性能将会更好。连接(JOIN)..之所以更有效率一些,是因为MySQL不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作)
  3. 使用联合(UNION)来代替手动创建的临时表
  4. 事务(它的作用是:要么语句块中每条语句都操作成功,要么都失败。换句话说,就是可以保持数据库中数据的一致性和完整性。事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态)
  5. 锁定表
  6. 使用外键(锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。)
  7. 使用索引(索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY这些命令的时候,性能提高更为明显。索引应建立在那些将用于JOIN,WHERE判断和ORDERBY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。对于一个ENUM类型的字段来说,出现大量重复值是很有可能的情况)
  8. 优化的查询语句(1.需要的字段列出来,尽量少用*,2.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描,3.不要在列上进行运算,4.一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引,5.in 和 not in 也要慎用,否则会导致全表扫描,6应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描,7.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库)

 

11.php操作mysql数据库的驱动:PDO与mysqli的区别?

  1. PDO比MySQLi最大的优点就是PDO支持很多种数据库,而MySQLi只支持MySQLi,tp框架用的是pdo
  2. PDO和MySQLi都是通过面向对象的形式提供API,但是同时MySQLi也提供了面向过程的API,这种形式对于新手来说更容易理解。如果你对原生的php mysql 驱动熟悉,你会发现很轻松得就能使用MySQLi的接口来替换原来的数据访问。
  3. 两者都可以防止sql注入
  4. 命名参数支持,PDO是通过命名参数进行值的绑定,而MySQLi的参数绑定是通过点位符“?”并严格按这个问号的顺序来绑定值。
    
    PDO:
    $params = array(':username' => 'test', ':email' => $mail, ':last_login' => time() - 3600);
    $pdo->prepare('
        SELECT * FROM users
        WHERE username = :username
        AND email = :email
        AND last_login > :last_login');
         
    $pdo->execute($params);
    
    mysqli:
    绑定参数需占位符,按顺序绑定值
    $query = $mysqli->prepare('
        SELECT * FROM users
        WHERE username = ?
        AND email = ?
        AND last_login > ?');
         
    $query->bind_param('sss', 'test', $mail, time() - 3600);
    $query->execute();
    
    

       

 

12.抽象类与普通类的区别

  1. 抽象类用abstract关键字来声明,接口类用interface关键字来声明
  2. 抽象类和接口类都是一种不能被实例化的类,只能作为其他类的父类来使用;普通类可以被实例化,就是能用new调出构造方法创建对象
  3. 抽象类中可以有普通方法,也可以有抽象方法,而抽象方法的个数可以是0个,也可以是多个(抽象方法在方法前面有 abstract,而且方法没有方法体,连“{}”也不能有,例如:abstract public function write();)。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的
  4. 任何继承自抽象类的类都必须实现所有的抽象方法,否则它自己就必须被定义为抽象类
  5. 抽象方法只有方法声明,没有方法实现,不能编写方法体。
  6. 子类 继承抽象类使用 extends,子类实现接口使用 implements。

 

13.PHP empty()函数的使用

       作用:  该函数用于检查一个变量是否为空,当一个变量并不存在,或者它的值等同于 FALSE,那么它会被认为不存在。如果变量                  不存在的话,empty()并不会产生警告。

       注意:  empty() 在5.5 版本之后支持表达式了,而不仅仅是变量。

       语法:  bool empty ( mixed $var )

       返回值:  当 var 存在,并且是一个非空非零的值时返回 FALSE 否则返回 TRUE。

       以下的变量会被认为是空的:
       "" (空字符串)
       0 (作为整数的0)
       0.0 (作为浮点数的0)
       "0" (作为字符串的0)
       NULL
       FALSE
       array() (一个空数组)

       空对象
       $var; (一个声明了,但是没有值的变量)

 

14.单例模式

     含义:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会                   创建实例副本,而是会向单例类内部存储的实例返回一个引用。 

    三个要点:

(1). 需要一个保存类的唯一实例的静态成员变量:
       private static $_instance; 
(2). 构造函数和克隆函数必须声明为私有的,防止外部程序new类从而失去单例模式的意义:
       private function __construct() { 
           $this->_db = pg_connect('xxxx');
       } 
       private function __clone(){
       }//覆盖__clone()方法,禁止克隆
(3). 必须提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一实例的一个引用 
       public static function getInstance()  {  
            if(! (self::$_instance instanceof self) ) {  
                self::$_instance = new self();  
            }
            return self::$_instance;  
       } 

      应用场景:1.数据库操作,PHP一个主要应用场合就是应用程序与数据库打交道的场景,在一个应用中会存在大量的数据库操作,针对数据库句柄连接数据库的行为,使用单例模式可以避免大量的new操作。因为每一次new操作都会消耗系统和内存的资源                            2.缓存、日志对象、打印机        3.配置信息。如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现        4.日志。在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo

 

15.Redis的高并发和快速原因

redis高并发和快速的原因
1.redis是基于内存的,内存的读写速度非常快;
2.redis是单线程的,省去了很多上下文切换线程的时间;
3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间


redis高并发和快总结:
1. Redis是纯内存数据库,一般都是简单的存取操作,线程占用的时间很多,时间的花费主要集中在IO上,所以读取速度快。
2. 再说一下IO,Redis使用的是非阻塞IO,IO多路复用,使用了单线程来轮询描述符,将数据库的开、关、读、写都转换成了事件,减少了线程切换时上下文的切换和竞争。
3. Redis采用了单线程的模型,保证了每个操作的原子性,也减少了线程的上下文切换和竞争。
4. 另外,数据结构也帮了不少忙,Redis全程使用hash结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。
5. 还有一点,Redis采用自己实现的事件分离器,效率比较高,内部采用非阻塞的执行方式,吞吐能力比较大。

16.索引的优缺点,什么情况下使用索引

索引的有点:
1.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 
2.可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。 
3.可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 
4.在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 
5.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。


索引的缺点:
1.创建索引和维护索引要耗费时间,这种时间随着数据 量的增加而增加。 
2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 
3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

什么情况下使用索引:
1.在经常需要搜索的列上,可以加快搜索的速度; 
2.在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 
3.在经常用在连接的列上,这 些列主要是一些外键,可以加快连接的速度; 
4.在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; 
5.在经常需要排序的列上创 建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间; 
6.在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

17.php或ajax的同步与异步的区别

     同步的意思是当代码加载到当前php或ajax的时候,会把页面里所有的代码停止加载,页面进入假死状态,当这个php或ajax执行完毕后才会继续运行其他代码,页面假死状态解除。

     异步的意思是这个php或ajax代码运行中的时候,其他代码一样可以运行。

18.HTTP状态码含义

1XX开头表示消息响应系列,100表示继续
2XX开头表示成功响应系列,200请求成功
3XX开头表示重定向系列,301永久重定向,302临时重定向
4XX开头表示客户端错误系列,401未授权,403禁止访问,404资源不存在
5XX开头表示服务器错误系列,500服务器内部错误,503服务不可用

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值