PHP面试题(遇到的)

1,开源框架的区别和优缺点:

Laravel 设计,优缺点
优点
   1,集合了php新的特性,以及各种各样的设计模式,loc容器,依赖注入,门面,契约
   2,需要composer 安装,内置大量的方法供开发者使用,具有强大的社区化扩展(composer 扩展自动加载)
   3,使用blade模板引擎,很强大
   4,内置了哈希加密单向加密方法,更安全
   5,laravel框架使用return view(); 来渲染模板
   6,是一个重路由的框架,所有的功能由路由发起的
   7,中间件,可以实现访问前后的处理。例如请求和返回,权限认证
   8,判断语句在view视图页面需要加@符号

缺点
   1,基于组件式的框架,所以比较臃肿

ThinkPHP设计,优缺点
优点
   1,借鉴JAVA思想,基于PHP5,部署简单只需要一个入口文件,就可以完成,
   2,自带模板引擎,独特验证和自动填充
   3,使用$this->display(); 方式渲染模板
   4,Thinkphp3.2必须要有控制器方法才能正常访问
   5,轻量级的中型框架
   6,易于上手,有丰富的中文文档
   7,框架的兼容性较强,PHP4和PHP5完全兼容,支持UTF-8
   8,适合用于中小型项目的开发
   9,国内用的人很多,遇到问题都可以查到文档或者有人解答

缺点:
   1,对ajax 的支持不是很好
   2,目录结构混乱,需要花时间整理
   3,上手容易,但是深入学习较难 

YII设计,优缺点
是一个基于组件的高性能的php框架,用于开发Web应用,严格OOP编写,完善的库引用以及全面的教程
优点
  1,纯OOP思想
  2,用于大规模的Web应用
  3,模型使用方便
  4,开发速度快,运行速度也快。性能优异且功能丰富
  5,使用命令行工具
  6,支持composer包管理工具

缺点:
  1,对Model层的指导和考虑较少
  2,文档实例较少
  3,英文太多

2,PHP5与PHP7 区别

1,性能提升,PHP7比PHP5性能提升了两倍
2,以前的许多致命错误,现在改成抛出异常
3,PHP7 比PHP5 移除了一些老的不在支持的sapi(服务器端应用编程端口)和扩展
4,新增了空接合操作符
5,新增了结合比较运算符
6,新增加了函数的返回类型声明
7,新增了标量类型声明
8,新增了匿名类

3,为什么PHP7比PHP5性能提升了

1,变量存储字节减小,减少内存占用,提升变量操作速度
2,改善数组结构,数组元素和hash映射表被分配在同一块内存里,降低了内存占用,提升了cpu缓存命中率
3,改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率

4,计算题

1)

num = 200;
$objD = clone $objB;
echo $objB->num;   // 200
echo "
"; echo $objC->num; // 100 echo "
"; echo $objD->num; // 200

2)

 'abc',
    1.5  => 'abc',
    true => 'abc',
);
echo count($array);  // 1

3)

 2, 1 => 4, 2 => array(0 => 9, 1 => 10));
print_r($value);  // array(0 => 9, 1 => 10);

4) PHP输出Js代码


       alert("hello php编程世界");
   
mark;

echo $sting_js;

5,缓存穿透,缓存击穿,缓存雪崩

1,缓存穿透
   描述:指缓存和数据库中都没有的数据,而用户不断发起请求。
   解决方案:接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截,
            从缓存取不到的数据,在数据库中也没有取到,也可以将key-value对 写为key-null,
       缓存有效时间可以设置短点,如30秒。这样可以防止攻击用户反复用同一个id攻击。
2,缓存击穿
   描述:指缓存中没有但数据库中有的数据,这时由于并发用户特别多,同时读缓存没读到数据,
      又同时去数据库取数据,引起数据库压力瞬间增大,造成过大压力。
   解决方案:设置热点数据永远不过期。
3,缓存雪崩
   描述:指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机。
     和缓存穿透不同的是,缓存击穿指并发查询同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
   解决方案:缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
       如果缓存数据库是分布式部署,将热点数据均匀分布在不同缓存数据库中。
       设置热点数据永远不过期。

6,Mysql 数据题

PHP面试题(遇到的)_第1张图片PHP面试题(遇到的)_第2张图片PHP面试题(遇到的)_第3张图片

1) 添加一条张三的数学为75
insert into stu_sub(id,Suid,Subid,score) values(null,1,2,75);
2) 查询每位同学的平均分大于等于80
SELECT
 	s. NAME AS NAME,
 	avg(st.score) AS score
 FROM
 	student s
 LEFT JOIN stu_sub st ON s.id = st.Suid
 WHERE
 	score >= 80
 GROUP BY
 	st.suid;
3) 学科总分排名为第二的学生
SELECT
	s. NAME AS NAME,
	sum(st.score) AS score
FROM
	student s
LEFT JOIN stu_sub st ON s.id = st.Suid
GROUP BY
	st.suid
ORDER BY
	score DESC
LIMIT 1,1;

7,Mysql 联合查询内连接,左连接,右连接,全连接区别

内连接(inner join): 显示的数据是两张表的相关的信息。查询结果两张表数据都有数据,并且字段都不为空
左连接(left join): 主表在前,附表在后,查询结果是主表的全部信息和附表与主表相关的信息数据,部分字段可能为空
右连接(right join): 主表在后,附表在前,查询结果是主表的全部信息和附表与主表相关的信息数据,部分字段可能为空
全连接(full join): 显示两张表的全部信息

8,XSS攻击,Sql注入

XSS攻击:
    条件:1)需要向web页面注入恶意代码
          2)恶意代码能被浏览器成功执行
    解决办法:
         过滤用户输入的 检查用户输入的内容中是否有非法内容。
        如<>(尖括号)、”(引号)、 ‘(单引号)、%(百分比符号)、;(分号)、()(括号)、&(& 符号)、+(加号)等。、严格控制输出。
         可以利用下面这些函数对出现xss漏洞的参数进行过滤
         1、htmlspecialchars() 函数,用于转义处理在页面上显示的文本。
         2、htmlentities() 函数,用于转义处理在页面上显示的文本。
         3、strip_tags() 函数,过滤掉输入、输出里面的恶意标签。
         4、header() 函数,使用header("Content-type:application/json"); 用于控制 json 数据的头部,不用于浏览。
         5、urlencode() 函数,用于输出处理字符型参数带入页面链接中。
         6、intval() 函数用于处理数值型参数输出页面中。
         7、自定义函数,在大多情况下,要使用一些常用的 html 标签,以美化页面显示,如留言、小纸条。那么在这样的情况下,要采用白名单的方法使用合法的标签显示,过滤掉非法的字符。

各语言示例:
        PHP的htmlentities()或是htmlspecialchars()。
        Python的cgi.escape()。
        ASP的Server.HTMLEncode()。
        ASP.NET的Server.HtmlEncode()或功能更强的Microsoft Anti-Cross Site Scripting Library
        Java的xssprotect(Open Source Library)。
   Node.js的node-validator。
Sql注入:
    概括:通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击
    原理:
          1)当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。
          2)如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入
    解决办法:
          1) 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度的方式进行处理;然后对单引号和双"-"等敏感符号进行转换等。
          2) 不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
          3) 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
          4) 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
          5) 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

9,PHP7 特性

1,类型的声明
   可以使用字符串(string),整数(int),浮点数(float),布尔值(boot),来声明函数的参数类型与函数返回值
2,set_exception_handler() 不在保证收到的一定是Exception 对象
3,新增操作符 "<=>"
   语法:$c = $a <=> $b
   如果 $a > $b, $c的值为1
   如果 $a == $b, $c的指为0
   如果 $a < $b, $c的值为-1
4,新增操作符 "??"
   如果变量存在且值不为NULL,它就会返回自身的值,否则返回它的第二个操作数
5,define() 定义常量数组
6,AST:Abstract Syntax Tree,抽象语法树
   PHP5: PHP代码 ->Parser语法解析->OPCODE->执行
   PHP7: PHP代码 ->Parser语法解析->AST->OPCODE->执行
7,匿名函数
   $anonymous_func = function(){return 'function';};
   echo $anonymous_func(); // 输出function
8,Unicode 字符格式支持(echo "\u{9999}")
9,Unserialize 提供过滤特性
   防止非法数据进行代码注入,提供了更安全的反序列化数据
10,命名空间引用优化
    // PHP7以前语法的写法 
     use FooLibrary\Bar\Baz\ClassA; 
     use FooLibrary\Bar\Baz\ClassB; 
    // PHP7新语法写法 
     use FooLibrary\Bar\Baz\{ ClassA, ClassB};

   
1,废弃扩展
 Ereg 正则表达式
 Mysql
 Sybase_ct
2,废弃的特性
 不能使用同名的构造函数,实例方法不能用静态方法的方式调用
3,废弃的函数
 方法调用
     call_user_method();
     call_user_method_array();
 改为:
     call_user_func();
     call_user_func_array();
 加密相关函数
    mcrypt_generic_end();
    mcrypt_ecb();
    mcrypt_cbc();
    mcrypt_cfb();
    mcrypt_ofb();
4,废弃的用法
   $HTTP_RAW_POST_DATA 变量被移除,使用php://input 来代替
   ini 文件里面不再支持#开头的注释,使用 ";"
   移除了ASP格式的支持和脚本语法的支持: <% 和 
                    
                    

你可能感兴趣的:(PHP)