php面试题技术点大全

  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有影响了数据库的情况出现.

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雪崩和穿透

一、缓存穿透

        缓存应用:

使用缓存时首先判断缓存中是否存在数据,如果存在数据就直接从缓存取出,返回,

没有数据的话需要查询数据库,数据库中查询到就存入缓存并将数据库中查询到的结果返回,

查询不到返回null

(1)什么是缓存穿透?

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

(2)如何避免?

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

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

就是说将不存在的key进行过滤,过滤出来一个大数组,将下次查询不到的key值与大数组拼装。在我们下一次去查询缓存的时

候,判断是否在这个大数组中存在这个key,如果存在就说明数据库中的value也是空的,就直接返回null就可以了,但是存在一

定缺陷,当没有key值的用户达到巅峰的时候,数组一定不小了,也给服务器造成了一部分的压力

二、缓存雪崩

(1)什么是缓存雪崩?

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

(2)如何避免?

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

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

部分关于微信公众号开发:

1、微信公众号开发流程
    1、去微信公众平台申请
    2、填写认证信息
    3、等待审核
    4、审核完成之后拿到appid和appsecret
    5、配置服务器信息,填写一个外网能够访问的url
    6、输出微信给出的echo $_GET['echostr'];
    7、保存服务器信息

2、linux下压缩文件和解压文件的命令
    压缩 : gzip        tar -zcvf
    解压 : gunzip      tar -zxvf


3、755权限代表什么

    _ rwx r_x r_x

    第一个代表 _ 代表的是 当前的这个是一个文件 d表示是一个目录
    rwx 每三个一组  第一组代表  所属主  用户自己的权限为 读写执行
                  第二组     所属组   组内容的权限为   读和执行
                  第三组     其他人   读执行
    去掉执行权限:
        chmod -x 文件名


4、如何将账号和微信账号绑定
        微信的网页授权接口去获取用户的opneid
        在我们的系统添加绑定流程
        讲openid和我们协同的账号绑定   (id和openid进行关联)
        用户在通过微信进入公众号的时候,可以获取到用户的openid
        根据openid找到对应的账号,记录session信息,这样用户就显示为登录状态了

5、微信公众号群发消息可以通过几种形式群发。
        1、群发   is_to_all : true 给所有用户发送 是有限制的
        2、根据openid列表进行群发
        3、根据标签进行群发

6、接口安全如何保证
        1、加密(对称加密,非对称加密)
        2、签名
        3、鉴权

7、对称加密和非对称加密的区别
        1、对称加密效率高,但是安全性没有非对称加密高
        2、非对称加密安全性搞,但是效率比对称加密低
        3、非对称加密长度有限制,密钥长度1024的时候只能加密117个字符,需要分段加密解密

8、修改文件权限使用那个命令
        chmod  修改权限
        chown  修改文件的所有者和所属组
        chgrp  修改文件所属组


9、php实现字符串反转。【不使用strlen之外其他函数】

方法1

        $len = strlen($str);

        $new = '';
        while( $len ){

            $new .= $str[$len-1];
            $len --;
        }
        echo $new;

方法2:

function text($str){
    $newArrOne = [];//初始化一个新的数组
    $newStrOne = '';//初始化一个新的字符串
    $newArrOne = str_split($str);
    $arrCount = count($newArrOne);
    for ($i=$arrCount-1; $i>=0; $i--) {
        $newStrOne.=$newArrOne[$i];
    }
    return $newStrOne;
}
echo text(123);

方法3:

function getRev($str,$encoding='utf-8'){
    $result = '';
    $len = mb_strlen($str);
    for($i=$len-1; $i>=0; $i--){
        $result .= mb_substr($str,$i,1,$encoding);
    }

    return $result;
}
$string = '123';
echo getRev($string);

方法4:

print strrev('This is not a palindrome.');

方法5:

function text($str){
    $newStrTwo = '';//初始化一个新的字符串
    $arrCountTwo = strlen($str);
    for ($i=1; $i <= $arrCountTwo; $i++) {
        $newStrTwo.=substr($str, -$i, 1);
    }
    return $newStrTwo;
}
echo text(123);

10、写出至少三种取出文件后缀名的方法
       

$file = ‘需要进行获取扩展名的文件.php’;

//第一种,根据.拆分,获取最后一个元素的值
function getExt1{
return end(explode(".",$file);)
}
//第二种,获取最后一个点的位置,截取
function getExt2{
return substr($file,strrpos($file,'.')+1);
}
//第三种,根据.拆分,获取最后一个元素的值
function getExt3($file) {
return array_pop(explode(‘.’,$file)); 
}

//第四种,pathinfo 
function getExt5($file) {
$arr = pathinfo($file);
return $arr['extension'];
//或者这样return pathinfo($file,PATHINFO_EXTENSION);
}

//第五种,正则,子模式
function getExt6$file){
preg_match("/(gif | jpg | png)$/",$file,$match);
$match=$match[0];

//第六种,正则反向引用
function getExt7($file){
$match=preg_replace("/.*\.(\w+)/" , "\\1" ,$file );
echo $match;
}

11、linux下如何给php添加新的扩展。
        1、wget php的redis扩展下载下来
        2、tar -zxvf 文件名
        3、cd 目录 /
        4、 /usr/local/php/bin/phpize
        5、./configure --prefix=/usr/local/php/bin/php-config
        6、make  make install
        7、修改php.ini  extension=redis.io
        8、重启php-fpm
        9、打印phpinfo


12、tp5 如何读取配置文件配置项 RSA。php 的配置项
        1、
        use  Think\Config;
        config::get('RSA.配置项');

        2、
        config() -> get('RSA.配置项');

13,判断是否是回文:

<?php

 function ishuiwen($str){

  $len=strlen($str);

  $l=1;

  $k=intval($len/2)+1;

   for($j=0;$j<$k;$j++){

    if (substr($str,$j,1)!=substr($str,$len-$j-1,1))

     {

  $l=0;

  break;

   }

 }

 if ($l==1)

 {

 return 1;

 }

 else

 {

 return -1;

  }

 }

 $str=12321;

 echo ishuiwen($str);

?>

猜你喜欢

转载自blog.csdn.net/li_lening/article/details/81187426