PHP面试题

找工作一个月没找到工作,面临人生的挑战感到迷茫与无力感,开始质疑自己的能力开始想换行?生活并有没给你压力,而是你自己给自己压力,其实并不是你能力不行,而是因为你没有充分准备,即使机会在你面前也抓不住,下面的面试题希望能帮到自己,也能帮到你们:

1、基础方面

1、什么是composer?以及composer是干什么用的?
Composer 是 PHP 的一个依赖管理工具。

2、PHP如何实现静态化
PHP伪静态:是利用Apache mod_rewite实现url重写的方法。
局部静态化:在完全静态化的基础上,通过ajax处理局部页面
完全静态化:
就是将整个页面进行静态化,可以使用php缓冲区函数,将缓冲区内容输入到静态文件中。并设置过期时间,若静态文件超出过期时间,则重新进行静态化。
 10) {
        //已过期,删除原有文件,并生成新的静态页
        unlink($filePath);
        ob_start();
        include ("./view2.html"); //加载信息页
        $content = ob_get_contents();
        file_put_contents($filePath, $content); //将缓冲区内容输出到静态页
        ob_end_flush(); //刷出缓冲区内容并结束缓冲
    } else {
        include($filePath);
    }
} else {
    ob_start();
    include ("./view2.html"); //加载信息页
    $content = ob_get_contents();
    file_put_contents($filePath, $content); //将缓冲区内容输出到静态页
    ob_end_flush(); //刷出缓冲区内容并结束缓冲
}

3、说下你最常用的设计模式
策略模式:策略模式是对象的行为模式,用意是对一组算法的封装。动态的选择需要的算法并使用。
比如说购物车系统,在给商品计算总价的时候,普通会员肯定是商品单价乘以数量,但是对中级会员提供8者折扣,对高级会员提供7折折扣,这种场景就可以使用策略模式实现。
strategyInstance = $instance;
  }
  public function compute($price)
  {
    return $this->strategyInstance->computePrice($price);
  }
}
//客户端使用
$p = new Price(new HignMember());
$totalPrice = $p->compute(100);
echo $totalPrice; //70
?>

单例模式:又称为职责模式,它用来在程序中创建一个单一功能的访问点,通俗地说就是实例化出来的对象是唯一的。
所有的单例模式至少拥有以下三种公共元素:
1. 它们必须拥有一个构造函数,并且必须被标记为private
2. 它们拥有一个保存类的实例的静态成员变量
3. 它们拥有一个访问这个实例的公共的静态方法
单例类不能再其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
class Single {
    private $name;//声明一个私有的实例变量
    private function __construct(){//声明私有构造方法为了防止外部代码使用new来创建对象。
    
    }
    static public $instance;//声明一个静态变量(保存在类中唯一的一个实例)
    static public function getinstance(){//声明一个getinstance()静态方法,用于检测是否有实例对象
        if(!self::$instance) self::$instance = new self();
        return self::$instance;
    }
    public function setname($n){ $this->name = $n; }
    public function getname(){ return $this->name; }
}
$oa = Single::getinstance();
$ob = Single::getinstance();
$oa->setname('hello world');
$ob->setname('good morning');
echo $oa->getname();//good morning
echo $ob->getname();//good morning

工厂模式:使用工厂模式的好处是,如果你想要更改所实例化的类名等,则只需更改该工厂方法内容即可,不需逐一寻找代码中具体实例化的地方(new处)修改了。为系统结构提供灵活的动态扩展机制,减少了耦合。
class Factory {//创建一个基本的工厂类
    static public function fac($id){//创建一个返回对象实例的静态方法
        if(1 == $id) return new A();
        elseif(2==$id) return new B();
        elseif(3==$id) return new C();
        return new D();
    }
}
interface FetchName {//创建一个接口
    public function getname();//
}
class A implements FetchName{
    private $name = "AAAAA";
    public function getname(){ return $this->name; }
}
class C implements FetchName{
    private $name = "CCCCC";
    public function getname(){ return $this->name; }
}
class B implements FetchName{
    private $name = "BBBBB";
    public function getname(){ return $this->name; }
}
class D implements FetchName{
    private $name = "DDDDD";
    public function getname(){ return $this->name; }
}
$o = Factory::fac(6);//调用工厂类中的方法
if($o instanceof FetchName){
  echo  $o->getname();//DDDDD
}
$p=Factory::fac(3);
echo $p->getname();//CCCCC

注册模式:注册模式,解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。
class Register{
    protected static $objects;
    public static function set($alias,$object){
        self::$objects[$alias]=$object;
    }
    public static function get($alias){
        return self::$objects[$alias];
    }
    public static function _unset($alias){
        unset(self::$objects[$alias]);
    }
}

适配器模式:将各种截然不同的函数接口封装成统一的API。PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不同的数据库操作,统一成一样的API。类似的场景还有cache适配器,可以将memcache,redis,file,apc等不同的缓存函数,统一成一致。

观察者模式(Observer):当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。

4、PHP的优化方案
      1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
      2、$row[’id’] 的速度是$row[id]的7倍。
      3、注销那些不用的变量尤其是大数组,以便释放内存。
      4、尽量避免使用__get,__set,__autoload。
      5、require_once()代价昂贵。
      6、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。
      7、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()
      8、函数代替正则表达式完成相同功能。
      9、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。
      10、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。
      11、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。
      12、用@屏蔽错误消息的做法非常低效,极其低效。
      13、打开apache的mod_deflate模块,可以提高网页的浏览速度。
      14、数据库连接当使用完毕时应关掉,不要用长连接。
      15、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。递增一个全局变量要比递增一个局部变量慢2倍。递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。
      16、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。
      17、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。
      18、派生类中的方法运行起来要快于在基类中定义的同样的方法。
      19、调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。
      20、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。
      21、除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。
      22、尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。
      23、当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。
      24、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。
      25、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。
      26、并非要用类实现所有的数据结构,数组也很有用。
      27、尽量采用大量的PHP内置函数。
      28、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。
      29、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。
      30、mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。
      31、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;
      32、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;
      33、优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);
      34、循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);
      35、多维数组尽量不要循环嵌套赋值;
      36、在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;
      37、foreach效率更高,尽量用foreach代替while和for循环;
      38、用单引号替代双引号引用字符串;
      39、“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;
      40、对global变量,应该用完就unset()掉;

5、说下你了解的session和cookie
cookie数据存放在客户的浏览器上,不是很安全。session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。

6、如何实现不基于session和cookie的用户认证。
将用户信息加密放到http 的header部分,每次拿到http的时候,,验证获取header的信息

7、什么是CSRF攻击,XSS攻击,SQL注入攻击?如何防范
CSRF攻击:跨站请求伪造
解决方法:向表单添加字段标记

XSS攻击:原则是将一段JavaScript代码注入网页。然后当其他用户访问该页面时,他们将运行黑客编写的JS代码来实现一些帐户控制。
解决方案:关键字判断当有一个关键字如脚本、src来代替损坏;返回内容时进行转码,转码尖括号采用Unicode编码格式。

SQL注入攻击:在提交表单时输入sql语句
解决方案:在业务逻辑层中执行关键字检查。如果包含SQL的关键字,例如 *、or、select、delete等等关键字就进行替换;最有效的仍然是使用SQL变量进行查询,避免使用字符串来拼接SQL字符串。

8、设计的原则

单一职责原则:类的职责要单一,不能将太多的职责放在一个类中
开闭原则:软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础上去扩展其功能
里氏替换原则:在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象
依赖倒转原则:要针对抽象层编程,而不要针对具体类编程
接口隔离原则:使用多个专门的接口来取代一个统一的接口
组合/聚合复用原则:在系统中应该尽量使用组合和聚合关联关系,尽量少使用甚至不使用继承关系
迪米特法则:一个软件实体对其他实体的引用越少越好,或者说如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,而是通过引入一个第三者发生间接交互

9、什么是mvc?相互间有什么关系
MVC是一种开发模式,主要分为三部分:M(模型),也就是模型,负责数据的操作; V(视图),也就是视图,负责前后台的显示; C(控制器),也就是控制器,负责业务逻辑;  
客户端请求项目的控制器,如果执行过程中需要用到数据,控制器就会到模型中获取数据,再将获取到的数据通过视图显示出来;


2、数据库方面

1、你知道nosql吗?你用的nosql都有哪些?

2、mysql索引优化

3、mysql的优化方案

4、mysql的事务

5、mysql的读写分离

6、消息队列如何实现

7、查询优化

8、msyql的存储引擎,以及各自的区别

9、redis和memcache有什么区别

10、索引有哪些,你是如何做索引的?

11、如何分表

12、简述一下数据库的优化?        
数据库的优化可以从四个方面来优化:            
1.从结构层: web服务器采用负载均衡服务器,mysql服务器采用主从复制,读写分离            
2.从储存层: 采用合适的存储引擎,采用三范式            
3.从设计层: 采用分区分表,索引,表的字段采用合适的字段属性,适当的采用逆范式,开启mysql缓存            
4.sql语句层:结果一样的情况下,采用效率高,速度快节省资源的sql语句执行

3、服务器方面

1、说下一些你常用的linux命令

2、Linux如何搭建LAMP环境

3、你们平常工作的系统环境是在哪里?

4、你了解Docker吗?

5、你说下常用的服务端口号

4、前端知识

1、说下都有哪些跨域。

2、事件冒泡

3、DOM事件流

4、JS是如何实现继承的

5、前端知识

1、最常用的排序算法

2、做一个微信抢红包的功能

3、如何防止高并发

4、你们用哪种版本控制?如何避免代码冲突

5、在浏览中输入网址后都发生了什么

6、你了解socket吗?

7、如果打开网页的时候白屏10秒才显示出页面,如果进行排查。

6、其它,必问知识

1、说下你在项目中碰到的问题
2、你是如何解决的问题的
3、你未来的规划是什么?
4、你为什么离职
5、你觉得你的领导会如何评价你
6、说下你做得你公司最不错的项目,都用了哪些技术,对你带来了哪些成长
7、说下TCP的三次握手,为什么三次,两次不行吗?为什么挥手又是四次

最后祝大家找到一份诚心如意的工作

你可能感兴趣的:(PHP面试题)