常见的PHP问题

php 专栏收录该内容
168 篇文章 1 订阅

* Apache, nginx区别

1.Nginx比Apache更轻量级,使用更少的内存及资源
2.Nginx有更好的抗并发能力,apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程
3.Nginx除了可以提供web服务还可以提供反向代理服务和邮件服务
4.Nginx 静态处理性能比 Apache 高 3倍以上
5.apache适合处理动态请求,所以现在一般前端用nginx作为反向代理抗住压力,apache作为后端处理动态请求。
6.Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端来使用 ,Apache 的组件比 Nginx 多
7.Apache比Nginx运行更加稳定

Linux任务计划如何实现

答:1.一次性任务计划: at

    2.周期性任务计划: crontab  -e

分 时 日 月 星期

* 16 * * * www php /usr/ET/project/zktCrm/artisan approval

* 关系型数据库设计三范式

第一范式(确保每列保持原子性)

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说 明该数据库表满足了第一范式。

第二范式(确保表中的每列都和主键相关,解决部分依赖)

第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言),实际开发中一    般都会创建一个自增长的id字段作为主键,也就不会出现部分依赖的问题了

第三范式(确保每列都和主键列直接相关,而不是间接相关,解决传递依赖)

满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要 求一个数据库表中不包含已在其它表中已包含的非主关键字信息

* 什么是索引,索引的作用,什么时候需要使用索引,什么时候不需要使用索引

答:索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,相 当于图书上的目录,可以加快查询速度,但会使修改、插入、删除操作变慢,同时还会 占用较大的磁盘空间

可以通过explain语句对SQL语句进行分析,来决定哪些字段需要创建索引,一般情 况下,可得出以下结论:

必须创建索引的情况:

  1. where子句、group子句中出现的字段,要创建索引
  2. order by子句的字段,要创建索引
  3. 统计聚合函数中的字段,要创建索引。比如count(字段)  、max(字段)

 

不需要创建索引的情况:

  1. 如果需要取到表中所有记录,则没必要创建索引
  2. 对非唯一有大量重复值的字段,没必要创建索引,如性别
  3. 经常进行修改、删除等操作的字段,没必要创建索引
  4. 记录比较少的表,没必要创建索引

三、MyISAM和InnoDB存储引擎的区别

答: 数据表的类型由存储引擎来决定

     MyIsam类型的数据表不支持事务、不支持外键,访问速度快、支持全文索引

     InnoDB类型的数据表支持事务、支持外键、不支持数据压缩、写入速度慢、会占用更多内存和磁盘空间

四、什么是事务处理

答:事务处理有四个特性:ACID

    A是原子性(Atomic):事务处理中所有的SQL操作都被看一个最小逻辑单元,这个逻辑单元中的操作要么全部执行成功,要么全部不执行

 C是一致性(Consistency):只有合法的数据才能被写入数据库,否则事务将回滚到最初状态

  I是隔离性(Isolation):事务允许多个用户对同一数据进行并发操作。但一个事务的处理结果如果影响到其他事务,则其它事务会回滚。

D是可靠性(Durability): 事务处理完成后,对数据的影响是永久的,即使出现系统故障也不会丢失

五、SQL注入漏洞产生的原因?如何防止?

答:SQL注入的根本原因就是通过拼接SQL语句进行攻击。觉见的预防措施有:

   1.预处理

   2.字符串过滤,对提交的数据进行SQL关键字的过滤 update delete insert .....

   3.通过正则过滤传入的数据进行特殊字符和关键字的过滤

   4.在前端通过js进行过滤 

六、什么是预处理、预处理有哪些好处

答:预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高。

工作原理:

  1. 预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标记 。
  2. 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出。
  3. 执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句。

优点:

  1. 预处理语句大大减少了执行时间,因为只需要了一次编译(虽然语句多次执行)。
  2. 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。
  3. 预处理语句可以有效防止SQL注入攻击

七、MySQ数据库的备份和还原

答::

1.备份 :

mysqldump -h服务器 --port 端口  -u用户名 -p密码 数据库名称 > 备份文件路径

2.还原 :

方法一、

mysql -h服务器 --port 端口  -u用户名 -p密码 数据库名称 < 备份文件路径

方法二、

mysql -h服务器 --port 端口  -u用户名 -p密码

use 数据库名称

source 备份文件路径

九、用一条SQL查询出下列记录中每个用户最近一次登录的记录

建表并插入数据:

CREATE TABLE `login_record` ( 
  `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '自增序号' , 
  `name` VARCHAR(16) NOT NULL DEFAULT '' COMMENT '用户名' ,
  `lastLogin` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '上次登录时间' ,
  PRIMARY KEY (`id`)) ENGINE = MyISAM;
  
insert into `login_record`(`id`,`name`,`lastLogin`) values(100,'test4', '2007-11-25 16:31:26');
insert into `login_record`(`id`,`name`,`lastLogin`) values(13, 'test1', '2007-03-22 16:27:07');
insert into `login_record`(`id`,`name`,`lastLogin`) values(19, 'test1', '2007-10-25 14:13:46');
insert into `login_record`(`id`,`name`,`lastLogin`) values(42, 'test1', '2007-11-20 14:20:10');
insert into `login_record`(`id`,`name`,`lastLogin`) values(45, 'test2', '2007-04-25 14:17:39');
insert into `login_record`(`id`,`name`,`lastLogin`) values(49, 'test2', '2007-05-25 14:22:36');

得到原数据:

这个有错误

select * from (SELECT * FROM `login_record` order by lastLogin desc) as a group by a.name;

用max聚合函数:

SELECT `id`, `name`, MAX(lastLogin) AS `lastLogin` FROM `login_record` GROUP BY `name` ;

id还是对不上

 

select * from (SELECT * FROM `login_record` order by lastLogin desc limit 99999) as a group by a.name;

ok了

 

 

十、一个6亿条记录的表a,一个3亿条记录的表b,通过外键tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。

答:
1、如果A表TID是自增长,并且是连续的,B表的ID为索引
select * from a,b where a.tid = b.id and a.tid>50000 limit 200;
2、如果A表的TID不是连续的,B表ID也需要有索引。
select * from b , (select tid from a limit 50000,200) a where b.id = a .tid;

PHP基础知识方向:

一、写出30个PHP函数

 

二、GET和POST方式的区别

 访问速度、应用

  • HTTP有哪几种请求方式,各有什么作用

答:1、Options   返回服务器针对特定资源所支持的HTTP请求方法。也可以利 用向Web服务器发送'*'的请求来测试服务器的功能性

  1. Get    从指定的资源请求数据
  2. Post   向指定的资源提交要被处理的数据(提交表单、上传文件)

4、Put    向指定资源位置上上传其最新内容

5、Head  与 GET 相同,但只返回 HTTP 报头,不返回文档主体

6、Delete   删除指定资源

7、Trace   回显服务器收到的请求,用于测试和诊断

8、Connect   HTTP/1.1协议中能够将连接改为管道方式的代理服务器

 

HTTP服务器至少能实现get、head、post方法,其他都是可选的

 

  • 什么是HTTP状态码?常见的有哪些

答:HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器超文本传输协议响应状态的3位数字代码,所有状态码的第一个数字代表了响应的五种状态之一

1xx:表示普通消息。代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束

100 Continue

客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分

2xx:表示成功。代表请求已成功被服务器接收、理解、并接受。

200 OK

请求已成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是表示正常状态。

3xx:表示重定向

301 (永久移动) 请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。

302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

4xx:表示客户端错误

400 (错误请求) 服务器不理解请求的语法。

401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。

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

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

405 (方法禁用) 禁用请求中指定的方法。

 

5xx:服务器错误

 

五、什么是递归函数

答:函数直接或间接调用函数本身,则该函数称为递归函数

函数递归调用最大的好处在于可以精简程序中繁杂重复调用程序

递归函数必须具备判断是否执行递归调用的条件

终止函数的递归调用时,需把目前流程的主控权交回上一层函数执行

在PHP中实现目录的遍历、复制、删除操作,无限级分类操作时都会用到递归函数

    

六、已知$a=100,$b=200,如何在不使用第三方变量的情况下交换$a和$b的值

答:

//方法一:

$a=array($a,$b);

$b=$a[0];

$a=$a[1];

echo $a.'-'.$b;

 

// 方法二:

$a = $a . '-' . $b;

$a = explode('-',$a);

$b = $a[0];

$a = $a[1];

echo $a.'-'.$b;

 

// 方法三:

$a = $a.$b;

$b = strlen($b);

$b = substr($a,0,strlen($a)-$b);

$a = substr($a,strlen($b));

echo $a . '-' . $b;

 

// 方法四:

list($a,$b) = array($b,$a);

echo $a.'-'.$b;

 

// 方法五:当两个变量都是数字的时候

$a = $a + $b;

$b = $a-$b;

$a = $a-$b;

echo $a . '-' . $b;

 

七、用PHP打印出上周的时间。格式如:"2019-01-15 14:42:09"

答:echo date("Y-m-d H:i:s",strtotime("-1 week"));

    

八、PHP中包含文件的方式有哪些,区别是什么?

答:include、require、include_once和require_once都可以用来引入文件

    include如果引入文件不存在,则报警告级别的错误,不会影响后面代码的继续执行

    require如果引入文件不存在,则报致命级别的错误,后面程序不再继续执行

    如果要引入的文件对于后码的程序是不可缺少的建议用require,反之用include

    include_once和require_once在引入之前会自动判断该文件是否已被引入,如果已被引入则不再重复引入

 

九、简述session和cookie的工作原理,以及两者之间的关系

答:由于http协议是无状态协议,无法对用户进行会话跟踪,session和cookie都是一种用于会话跟踪的技术

    Cookie工作原理:

    1.浏览器第一次访问服务器时,服务器给浏览器分配一个session_id,然后将session_id以响应给浏览器

    2.浏览器将以session_id作为名称在客户机上创建cookie文件,用来保存会话信息

    3.浏览器以后每次访问服务器都需要携带session_id

    4.服务器根据session_id来判断是哪个用户来访问

    Session工作原理

     1.浏览器第一次访问服务器时,服务器给浏览器分配一个session_id,并以session_id作为名称在服务器上创建session文件,用来保存会话信息

     2.再将session_id以cookie的方式响应给浏览器,浏览器保存session_id

     3.浏览器以后每次访问服务器都需要携带session_id

     4.服务器根据session_id来判断是哪个用户来访问

 

     区别:session信息存在服务器端,安全性高,但是会占用服务器存储空间,主要应用于用户登录、购物车等功能

           cookie信息存在客户端,安全性低,但是不会占用服务器存储空间,主要应于浏览历史记录等功能

     关系 :Session默认是要借助cookie来在浏览器中保存Session_id,但是如果客户端的cookie被禁用,还可以通过url地址来传替session_id

 

 

 

十、PHP7有哪些特性

答:1.PHP7使用新的 Zend Engine 3.0, 比PHP5.6性能提高两倍, 降低了 50% 的内存   消耗。 它可以服务于更多的并发用户,无需任何额外的硬件

2.PHP7减少了内存分配次数,更多的使用栈内存,缓存数组hash值,使用大块连续   内存代替小块碎片内存

3.PHP7新增了如下新特性:

  • 新增加了标量类型声明
  • 新增加了函数的返回类型声明
  • 新增了空接合操作符 ??
  • 新增加了结合比较运算符 <=>
  • 新增加匿名类 new class
  • 致命错误,现在改成抛出异常  Error类
  • 全面一致的64位支持

4.PHP7弃用了如下功能:

      • PHP4风格的构造函数
      • 静态调用非静态方法
      • password_hash() - salt 选项
      • capture_session_meta SSL上下文选项
      • 移除了一些老的不在支持的SAPI(服务器端应用编程端口)和扩展

 

十一、OOP和POP的区别

答:面向过程(POP)以事件为中心,分析出解决问题的步骤,然后用代码将这些代码一步步实现

   优点:性能比较高,执行速度比较快

   缺点:不易维护,不易复用,不易扩展

   应用:主要针对性能要求很高的情况,比如单片机、嵌入式开发、操作系统驱动

 

   面向对象(OOP)以事物为中心,一切都看作对象,由实体引发事件

   优点:易维护、易复用、易扩展

   缺点:性能底,开销大

   应用:软件开发的主流

 

十二、谈谈OOP的三大特征

答:封装:简单来说就是对某一类事物的属性和行为的抽象,并且通过访问控制修饰符对访问进行控制。

    继承:通过继承子类可以获取父类的属性和方法,并且可以进行重写和扩展

    多态:同一个类的同一方法在作用不同的对象时可能表现出不同的形态,比如说人这个类实现化出的对象都会唱歌,但是有的人唱的好听,有的五音不全

 

十三、如何解决PHP单继承的问题

答: 1) 通过接口来解决,一个类可以同时实现多个接口 implements

  1. 通过trait来解决,一个类可以能过use来获取多个trait的属性和方法
  2. 还可以使用__call()魔术方法来解决,但不推荐使用

 将各个父类实例化,然后作为子类的属性。这些父类提供一些公有的方法。当子类拥有某方法时,__call()函数不会被调用。这相当于“覆盖”了父类的方法。当调用了不存在的方法时,通过__call()方法依次从父类中寻找可以调用的方法

 

十四、静态属性和静态方法分别什么特点

答:

静态属性:

  1. 使用static关键字声明的属性为静态属性。
  2. 静态属性保存在内存的静态代码段中
  3. 静态属性是共享的,一般将所有对象都相同的属性设为静态
  4. 静态属性可以通过类直接调用

静态方法:

  1. 使用static关键字声明的方法为静态方法。
  2. 静态方法可以通过类直接调用
  3. 静态方法中不能使用this关键字,也就是不可以使用非静态的属性和方法

 

十五、什么是抽象方法、什么是抽象类

答: 

抽象方法:

  1. 没有方法体,也没有花括号的方法,即为抽象方法。
  2. 抽象方法访问修饰符不能是private

抽象类:

  1. 使用关键字abstract 修饰的类为抽象类
  2. 抽象类不能被实例化
  3. 含有抽象方法的类肯定是抽象类,但是不是所有的抽象类都必须包含抽象方法
  4. 子类继承一个抽象类,则子类必须实现父类中的所有抽象方法

 

十六、简要说明什么是面向对象接口

答:  

  1. 接口就是把不同类的共同行为进行了定义,然后在不同的类里实现不同的功能。
  2. 接口中的成员属性只能是常量,不能够是变量
  3. 接口中的所有方法必须是抽象方法,不能是非抽象的方法
  4. 接口成员的权限只能为public
  5. 接口可以继承其它接口
  6. 接口不能被实例化,通过interface关键来声明
  7. 接口可以被同时继承多个,所以可以用来解决PHP的单继承问题

 

十七、什么是模板引擎,你用过哪些模板引擎

答:模板引擎是为了使用户界面与业务数据分离而产生的

使用模板引擎的好处是可以使用前后端开发各司其职,互不干扰、更有利于开发中的分工、更有利于代码的重用

常见的模板引擎有smarty,在一些框架中也会自己的模板引擎,比如Laravel框架的blade模板引擎

 

十八、谈谈你对MVC的理解

答:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件架构模式,用来将数据、界面、业务逻辑进行分离。

好处是有利用开发分工以及代码重用,现在主流的面向对象的框架基本都是基于MVC设计的。

工作原理:控制器接收用户请求并选择合适的模型进行数据处理,模型模型进行数据处理并将处理结果返回控制器,控制器将数据分配给视图并选择视图进行展示

 

 

十九、什么是设计模式,简要描述单例模式、工厂模式的特点及实现方法

答:设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设 计经验的总结,简而言之,设计模式就是前人总结的特定场景下的特定解决方案,Java

中有23种设计模式,而在php中设计模式用到的较少,比较常见的有单例和工厂

1.单例模式(Singleton Pattern)属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创 建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的 对象。

class single{

private static $instance;

private function  __construct(){}

private function  __clone(){}

public static function getInstance(){

        //如果本类中的$instance还没有数据

         if( !self::$instance ){

           self::$instance = new self;

          }

         return self::$instance;

 }

 

  1. 工厂模式(Factory Pattern)属于创建型模式,它提供了一种创建对象的最佳方 式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一 个共同的接口来指向新创建的对象

  class Factory{

       public static function getInstance($className){

           if(file_exists($className.”.class.php”)){  

$object=new $className();

                return $object;

}

}

 

二十、什么是算法,简要描述冒泡排序,插入排序,选择排序,快速排序算法的特点

答:算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表 着用系统的方法描述解决问题的策略机制,简而言之,算法就是解决问题的步骤,比 较 常见的排序算法有冒泡排序,插入排序,选择排序,快速排序等

  1. 冒泡排序(Bubble Sort)是一种简单的排序算法。它依次比较两个相邻元素,如果    发现大小顺序错误立即进行位置交换,这样最大(或最小)的元素会经由交换慢慢   “浮”出,冒泡之名由此而得
<?php

function bubbleSort(&$a) {
    $n = count($a);
    for ($i = 0; $i < $n; $i++) {
        for ($j = 0; $j <$n - 1 - $i; $j++) {
            if ($a[$j] > $a[$j+1]) {
                $tmp = $a[$j];
                $a[$j] = $a[$j+1];
                $a[$j+1] = $tmp;
            }
        }
    }
}

function myShuffle(&$a) {
    $m = count($a);
    while ($m > 0) {
        $i = floor(rand(0, --$m));
        $t = $a[$m];
        $a[$m] = $a[$i];
        $a[$i] = $t;
    }
}

function arr2String($a) {
    $n = count($a);
    $s = "[" . $a[0];
    for ($i = 1; $i < $n; $i++) {
        $s .= ",".$a[$i];
    }
    $s  .= "]";
    return $s;
}

// $a = [0,1,2,3,4,5,6,7,8,9];
// myShuffle($a);
// echo arr2String($a).PHP_EOL;
$a = [1,6,4,7,8,3,2,9,5,0];
bubbleSort($a);
echo arr2String($a).PHP_EOL;

 

  1. 选择排序(Selection sort)是一种简单直观的排序算法。它在要排序的一组数中,选 出最小的一个数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个 位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。相对于冒泡排 序大大减少了替换的次数
function selectionSort(&$a) {
    for ($i = 0, $n = count($a); $i < $n-1; $i++) {
        // 先假设最小的值位置为$m
        $m = $i;
        // $j 当前都需要和哪些元素比较, $i后面的
        for ($j = $i+1; $j < $n; $j++) {
            // $a[$m]是当前已知的最小值
            if ($a[$j] < $a[$m]) {
                // 比较更小的,记录下最小值。并且在下次比较时,采用一直的最小值进行比较
                $m = $j;
            }
        }
        // 已确定当前的最小值位置保存到$m中。
        // 发现最小值的位置与当前假设的位置$i不同则位置互换
        if ($m != $j) {
            $t = $a[$m];
            $a[$m] = $a[$i];
            $a[$i] = $t;
        }
    }
}

 

  1.  插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法,它从第一个 元素开始,认为该元素已经被排序取出下一个元素,在已经排序的元素数组中从后 向前比较,如果该元素(已排序)大于新元素,将新元素插入到该元素之前,如果 该元素(已排序)小于新元素,将新元素插入到该元素之后,是对于冒泡排序大大 减少了比较次数
function insertionSort(&$a) {
    $left = 0;
    $right = count($a) -1;
    for ($i = $left + 1; $i <= $right; $i++) {
        $tmp = $a[$i];
        for ($j = $i; $j > $left && $tmp < $a[$j-1]; $j--) {
            $a[$j] = $a[$j-1];
        }
        $a[$j] = $tmp;
    }
}

 

  1.  快速排序是由东尼·霍尔所发展的一种排序算法。其原理在于找到当前数组中的任 意一个元素(一般选择第一个元素),作为标准,新建两个空数组,遍历整个数组 元素,如果遍历到的元素比当前的元素要小,那么就放到左边的数组,否则放到右 面的数组,然后再对新数组进行同样的操作。是四种排序算法中速度最快的

不想写了 参照js版本的 https://blog.csdn.net/fareast_mzh/article/details/84076129

 

 

二十一、简单介绍一下swoole

答:

Swoole是运行在PHP下的一个extesion扩展,该扩展不是为了提升网站的性能,是为了提升网站的开发效率,利用Swoole扩展,开发一个复杂的Web功能,可以在很短的时间内完成

Swoole使PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。

Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、智能家居等领域

 

 

二十二、谈谈你对Memcache的理解

答: Memcache是一个高性能的分布式的内存缓存系统,作用是用来减轻数据库访问压力,提高数据的访问速度。

  工作原理:当用户查询数据时首先判断内存中有没有缓存,如果缓存中存在则直接获取,如果缓存中没有则从数据库中读取,并写入缓存中。并且当数据库中的数据发生变化时(比如增加、更新、删除)需要更新缓存

 

二十三、谈谈你对Redis的理解 

答:Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库存储系统,提供有多种语言的API

Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。

Redis支持数据的持久化,可以将内存中的数据保持在磁盘中

Redis支持数据的备份,即master-slave主从同步

 

     

二十四、JSjQuery的关系

答:JS是一种在浏览器端执行的脚本语言,主要用于用户交互行为和实现动态效果

jQuery是一个开源的轻量级JavaScript库

jQuery对JS进行了封装,一定程度解决了JS的浏览器兼容性问题,使用起来也更简单

 

二十五、什么是AjaxAjax的作用?实现Ajax的方式有哪些

答:

AJAX并不是一种语言,而是一种创建交互式网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新部分网页的技术。

作用:①减轻服务器的负担,AJAX一般只从服务器获取需要的数据。

②无刷新页面更新,减少用户等待时间。

③更好的客户体验,可以将一些服务器的工作转移到客户端完成,节约网络资源,提高用户体验

④促进显示与数据相分离

 

常用的使用方式有以下三种:

$.ajax({

url:'服务器url地址',

data:'',

type:'post|get',

dataType:'xml|html|text|json|script',

success:function(res){

},

error:function(xhr){
       },             

  timeout:2000,

  async:true ,

  cache:false

})

 

$.get('服务器url地址',"json格式或字符串格式",function(res){

        //处理返回的数据

}), "xml|html|json|text|script")

 

$.post('服务器url地址',"json格式或字符串格式",function(res){

        //处理返回的数据

}), "xml|html|json|text|script")

这些常用的,一般面试不会问,问的是不常用的jsonp jQuery jsonp用法 CORS

 

PHP项目开发方向:

 

  • 你做过哪些项目,简单描述一下这些项目

关键词: 项目功能概述、项目人数、项目工期、自己所负责模块

 

二、什么是框架?你使用过哪些框架?分别简要介绍

答:框架是开发者定制的应用程序规范,提供了架构模式、设计模式以及丰富的功能库,使用框架开发效率更高、更加稳定、更加规范、有更好的扩展性和重用性。

用过的框架有Laravel、TP3.2、TP5等

ThinkPhp3.2简单、快速,基于MVC和面向对象,易用性较高,是一款简洁实用的轻量级框架,国内相关的文档十分丰富

ThinkPHP5和ThinkPHP3.2相比作了相当大程度的重构,比如废除了所有的单字母方法、增加了think命令行操作、中间件、请求对象和响应对象等,如此大的变化使得TP5相对于TP3功能性和安全性都得到了提升,但也导致了两个版本间的不兼容

Laravel具有富有表达性且简洁的语法,提供了成熟的路由、中间件、artisan控制台等功能,对composer的支持也是最好的,有着十分完善的安全机制,适合于大中型网站的开发

 

三、谈一下你对Laravel框架的理解

答: Laravel是一款简洁、优雅的、单入口的、基于面向对象和MVC软件设计模式的PHP Web开发框架

优点:

  1. 具有富有表达性且简洁的语法,代码比较明白易懂,跟英语句子差不多
  2. 安全机制非常齐全,防SQL注入攻击、防CSRF攻击等方面表现优秀
  3. 提供路由功能,提高了网站的安全性,更有利于url地址的优化
  4. 通过中间件可以对网站进行访问控制及日志记录,过滤非法请求
  5. 提供了大量的第三方开源库(composer收录的超过5500个包),可以快速方便 的实现常见功能
  6. 借助于artisan命令行可以大大提高开发效率
  7. 网上文档非常丰富,社区也是非常活跃,现在全球范围内占有率最高,基本上所有 的问题都可以找到答案

缺点:

  1. 源代码复杂,不太容易上手,对新手稍有难度
  2. 提供强大的开放功能的同时也牺牲了部分执行效率

 

四、什么是composer?

答:Composer是PHP用来管理依赖关系的软件。在项目中只需通过配置文件composer.json中声明你要安装的库文件,则Composer会自动帮你安装所有需要依赖的文件

 

五、你开发时使用过什么版本控制工具,简单介绍一下

答:常见的版本控制工具有SVN、Git

  1. SVN是一款集中式版本控制工具,版本库是集中存放在中央服务器的,团队里每个成员从SVN服务器下载代码,个人编写后再提交给服务器。SVN的优点是好学易用,但是对服务依赖性强,必须要连接服务器。
  2. Git是一款分布式版本控制系统,每一个用户都可以作为服务器。因为每一次Clone就是从服务器上pull到了所有的内容,包括版本信息,相当于是有一个本地仓库。Git的优点是服务器压力和数据量都不会太大,别外Git支持离线工作,连接不到服务器,不会影响本地代码编写

六、如何实现团购功能?

答:

  1. 创建团购表,设置团购结束时间,团购商品,团购价格,团购规则,成团人数等
  2. 创建团购商品表,添加团购商品
  3. 创建团购用户表,保存已参加团购用户信息
  4. 当有新用户参加团购,判断团购用户人数是否达到成团人数,如果达到成团要求则发送成团通知并生成团购订单,并为之前所有用户发送成团通知和生成订单

七、如何实现闪购功能?

答:

  1. 创建闪购表,添加闪购商品id,闪购开始时间,闪购结束时间,闪购价格,闪购商品数量等
  2. 当商品加入抢购列表使用Redis创建一个符合闪购商品数量的队列,每当有人点击闪购时从队列中推出一个元素,并生成订单,当队列内全部推出完毕时,结束抢购
  3. 当抢购时间结束时,关闭抢购渠道

 

八、购物车的实现原理

答:针对未登录用户将购物车信息写入Session,针对已登录用户则写入数据库购物车表,并将session中的购物车数据也转入数据库保存

   针对已购买商品只需要增加购买数量,不需要增新的购物车记录

 

九、简述微信公众号开发流程

答:

  1. 申请微信公众号(订阅号、服务号、企业号),开启开发者模式
  2. 搭建个人的微信公众号服务器
  3. 在公众号管理后台填写服务器配置,并进行微信加密签名验证
  4. 依据接口文档实现相应的业务逻辑
  5. 一些高级功能需要开通过微信认证,一年费用300元

    注意:

  1.  使用CURL发送http请求
  2.  使用simplexml_load_string()将接收到的XML数据转为对象
  3.  使用sprintf()对发送的XML数据进行格式化处理

 

十、简述微信小程序开发流程

答:

  1. 申请微信小程序账号,获取小程序的AppID
  2. 下载安装小程序开发工具,填入刚刚申请到的AppID,创建一个小程序项目
  3. 小程序的代码由.json 后缀的 JSON 配置文件,.wxml 后缀的 WXML 模板文 件,.wxss 后缀的 WXSS 样式文件,.js 后缀的 JS 脚本逻辑文件四个部分组成。
  4. 搭建API服务与小程序进行数据交互
  5. 依据小程序开发文档进行项目开发
  6. 功能测试
  7. 发布上线

 

十一、什么是二次开发,你用过哪些二次开发系统?

答:网站开发一般采用完全自主开发、使用框架开发和二次开发等方式

二次开发,简单的说就是在现有软件代码的基础上进行定制修改,功能的扩展,然后达到自己想要的功能效果

   二次开发的类型:

  1. 基于公司现有产品的二次开发
  2. 基于PHP开源项目的二次开发
      • 电商开源系统:ecshop、ecmall、shopnc
      • 论坛开源系统:discuz、phpwind
      • 博客开源系统:wordpress
  3. 基于PHP开源CMS的二次开发
      • PHPCMS: 面向对象,功能强大,但不适合新手
      • 帝国CMS:面向过程,功能强大,比较容易

 

十二、如何实现微信支付功能?

答:

  1. 登录微信商户平台(https://pay.weixin.qq.com),申请微信支付功能
  2. 调用开发平台中的API进行开发(开发流程如下:)

(1)商户后台系统根据用户选购的商品生成订单。

(2)用户确认支付后调用微信支付统一下单API生成预支付交易;

(3)微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url。

(4)商户后台系统根据返回的code_url生成二维码。

(5)用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。

(6)微信支付系统收到客户端请求,验证链接有效性后发起用户支付,要求用户授权。

(7)用户在微信客户端输入密码,确认支付后,微信客户端提交授权。

(8)微信支付系统根据用户授权完成支付交易。

(9)微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。

  1. 建议下载对应语言的官方SDK进行开发
  2. 也可借助网络上的第三方SDK进行开发

 

十四、如何书写API

答: API(Application Programming Interface)是互联网产品开发中出现的一种软架构模式,可以为很多应用程序提供所需的数据信息,并且诞生了很多专门提供API的公司

   比如:百度的APIStore、聚合数据等。

   开发中我们可以使用API为网站、小程序、公众号、手机APP等软件提供数据

   开发特点:

   1.API开发比web开发更简洁,API开发只需要返回结果,不需要呈现页面

   2.web开发更多的使用get和post请求,API开发还有put、delete、patch请求

   3.API的返回值一般为XML和JSON格式,从跨域的角度考虑建议使用json格式

   4.为了保证接口安全性,建议加入鉴权体系

   5.在线的API务必关闭所有的错误提示,可以把错误重定向到日志中

 

十五、什么是RESTful API?

答:RESTful API 是一套互联网应用程序的 API 设计理论。主要有以下特点:

1.资源通过URL来指定和操作。

2.对资源的操作包括获取、创建、修改和删除,正好对应HTTP协议的GET、POST、PUT 和 DELETE 方法。

3.连接是无状态性的。

4.能够利用Cache机制来提高性能。

传统的URL:

[POST]     http://www.api.com/users/insert   // 新增

[GET]      http://www.api.com/users/get?id=1 // 查询

[POST]     http://www.api.com/users/edit?id=1 // 更新

[POST]     http://www.api.com/users/edit?id=1 // 覆盖,全部更新

[GET]      http://www.api.com/users/delete?id=1 // 删除

 

我们知道 URL 全称为“统一资源定位符(Uniform Resource Locator)”,用于描述 Web 资源所在的位置。RESTful Api 是以 HTTP 协议为强烈依托的,将传统的以功能为主导的URL风格舍弃,它的宗旨就是一个 URL 就应该是一个资源,不能包含任何动作

RESTful风格的URL

[POST]     http://www.api.com/users   // 新增

[GET]      http://www.api.com/users/1 // 查询

[PATCH]    http://www.api.com /users/1 // 更新,部分更新

[PUT]      http://www.api.com/users/1  // 覆盖,全部更新

[DELETE]   http://www.api.com/users/1   // 删除

 

十六、如何提高API接口的安全性

答:1) 接口参数加密(基础加密)

2) 接口参数加密+接口时效性验证(一般达到这个级别已经非常安全了)

3) 接口参数加密+时效性验证+HTTPS(达到这个级别安全性固若金汤)

 

十七、如何实现RBAC

答: 基于角色的权限访问控制(Role-Based Access Control)是一种传统的访问控制机制。

在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。由于角色/权限之间的变化比角色/用户关系之间的变化相对要慢得多,这就极大地减小了授权管理的复杂性,降低了管理开销。

在RBAC中,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。

在RBAC中,一般通过设计五张数据表来实现,如下图:

 

 

十八、伪静态和页面静态化的区别

答 :

1、伪静态化:其实还是动态访问,其实质是动态生成数据,你访问的网址类似于"http://www.test.com/index/goods/12.html",是一个静态地址,该地址多见于博客地址,但伪静态化中,你访问的网址实际上经过服务器解析,还是会解析成类似于"http://www.test.com/?c=index&goods=post&id=12"的地址,所以称之为伪静态化。

伪静态主要可以通过apache、nginx的url重写规则来实现,好处是可以让地址美观、便于搜索引擎收录

2、页面静态化又称之为纯静态化,可分为局部静态化和完全静态化,其实现原理是将动态生成的页面内容从ob中保存为静态html文件,当再有用户访问此页面时直接返回保存过的静态html文件,这样就可以大大减轻数据库服务器的访问压力,对于一些经常被访问,但页面内容更新不频繁的页面非常适合。

(1) 局部静态化:是生成的静态文件中,有局部的数据还是通过ajax技术动态获取的;通过部分接口来调用更新局部动态数据

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

十九、XSS攻击和CSRF攻击

答 :

XSS:Cross Site Scripting,跨站脚本攻击

1)原理  

XSS 其实就是所谓的 HTML 注入,攻击者的输入没有经过后台的过滤直接进入到数据库,最终显示给来访的用户。如果攻击者输入一段 js 脚本,就能窃取来访者的敏感信息(比如 Cookie),实现伪装成来访者对网站发送危险请求。

2)防御

避免 XSS 的方法之一主要是对用户输入的内容进行过滤,比如 PHP 里面的 htmlspecialchars() 函数。

CSRF:Cross Site Request Forgery, 跨站域请求伪造

1)原理:

通过伪装来自受信任用户的请求来利用受信任的网站。
通俗的说就是攻击者利用了你的身份,发送了恶意请求。就好比黑客盗用了你的qq然后假装是你,骗你朋友要钱。


如上图所示,用户先登录网站A,然后访问恶意站点B,用户在恶意站点B中点击了一个链接,这个链接跳转回A网站的同时发送了一个恶意get请求,

2)防御

1.验证Referer 

webB伪造webA的请求时,Referer是webB,webA发现referer非法的时候 就可以拒绝这个请求。

2.token校验

比如用户在访问webA时,会生成一个随机的token,以后每次访问webA时 都带上token,服务端校验token是否合法。因为token具有随机性,所以 webB就不能用普适的方法来伪造webA的请求。

 

二十、高并发大数据网站的优化方案

答:

  • 服务器运维方面优化
  1. 负载均衡集群、故障转移集群
  2. 图片服务器、数据服务器、业务服务器分离
  3. 增加服务器间网络带宽
  4. 使用分布式文件系统(NFS)
  5. 使用RAID磁盘阵列提高硬盘读写速度
  6. 使用CDN(内容分发网络)加速
  7. 搭建监控系统对服务器和网络性能进行实时监控

 

二、数据库方面优化

  1. 选择最合适的存储引擎
  2. 给数据表字段选择合适数据类型
  3. 数据库主从分离、读写分离
  4. 数据库分表、分离活跃数据
  5. 数据库操作使用索引
  6. 数据库使用储存过程

 

三、网站开发方面优化

  1. 使用分布式缓存,比如Memcache、Redis
  2. 采用页面静态化技术
  3. 采用多线程处理方式
  4. 对图片、CSS、JS 等静态资源进行合并以及gzip压缩处理
  5. 对图片较多的页面采用延迟加载技术
  6. 防盗链

 

 

 

  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值