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 数据题
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格式的支持和脚本语法的支持: <% 和