面试问题汇总
2018-01-05 11:56
197 查看
以后面试的问题都放这了
先占坑,再填
1.影响数据库性能的因素
http://blog.csdn.net/huangyuxin_/article/details/79006089
2.Web攻击,举例说明(待深入)
3.MySQL优化
4.如何查看索引是否命中
5.SQL防注入方法
6.jquery如何获取某个元素是否存在
7.什么场景下使用redis(待深入)
8.无法使用索引的情况
9.假设有一个博客系统,数据库存储采用MySQL,用户数量为1000万,预计文章总数为10亿,每天有至少10万的更新量,每天访问量为5000万,对数据库的读写操作的比例超过10:1,你如何设计该系统以确保系统高效、稳定的运行?
10.索引的设置原则
摘自:http://blog.csdn.net/csdnones/article/details/50412603
11.try catch finally 关键字的含义
12.echo print print_r 和var_dump区别
13.题目是一个1~1000的数组。每6个元素一相加。并且加在当前数组的末尾。相加的六个元素删掉。直到数组不超过六个为止。
方法一:递归
方法二:循环
14.LAMP和LNMP的区别
转自:http://blog.sina.com.cn/s/blog_626998030102wofn.html
15.memcache和redis的区别
16.如何获取客户端真实ip,要求是int类型。
这题有坑,涉及到代理
17.遍历一个文件夹下的所有文件
18.array(1,2,3,4,5)用五个新变量取出数组的每一个值
19.写一个函数,判断字符串是否包含test字符串
20.打印出1000天之前的天数,格式【日/月/年】
21.写一个函数同时支持打印字符串和数组
22.把‘你叫什么名字啊’,截取为‘名字啊’
23.实现文件下载
24.对以下数组进行正向排序
25.php中有哪些方式可以干预程序错误的输出
26.
27.打印26个大小写字母
先占坑,再填
1.影响数据库性能的因素
http://blog.csdn.net/huangyuxin_/article/details/79006089
2.Web攻击,举例说明(待深入)
<1>sql注入 <2>xss攻击 <3>CSRF攻击 <4>DOS攻击 <5>ARP欺骗
3.MySQL优化
<1>避免使用select * 进行全表查询 特别是单表数据比较大的 会严重导致慢查询 建议结合distinct去重 查询必要的字段也可以使用聚合函数max,sum等 性能会更好 <2>类型大小够用就行,不要慷慨,大字段浪费内容,影响速度,以年龄为例子,tinyint unsigned not null 可以存储255岁,已经足够,用int浪费三个字节 <3>where条件需要使用在索引字段上性能会更好 like只能使用在file%的查询中 in无法使用在非主键索引上 如file_name 复合索引有左依赖原则 <4>为常用的字段建立索引 <5>查询指定的数据使用limit <6>也可以开启sql缓存 如果是pdo可以使用预处理进行查询 <7>常用字段和不常用字段分离 <8>添加冗余字段,例如论坛,通过分组啦时间啦查询当天某话题下发帖数量,这样查询很消耗系统资源,添加一个冗余字段,今日发帖数 比如:MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。 InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。
4.如何查看索引是否命中
例子:explain select * from test where name='hyx' \G;
5.SQL防注入方法
<1>永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。 <2>永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。 <3>永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。 <4>不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。 <5>使用预编译(Prepare)绑定变量的SQL语句。
6.jquery如何获取某个元素是否存在
if($("#tt").length > 0) { //元素存在时执行的代码 } //如果长度等于0,证明此元素不存在,如果为1,则证明存在
7.什么场景下使用redis(待深入)
<1>短信注册码 <2>阅读量 <3>会话缓存 <4>排行榜
8.无法使用索引的情况
<1>like只能使用在file%的查询中 <2>in只能使用在主键索引上 <3>查询全表字段的时候是无法使 <4>group by是无法使用到索引的 <5>条件中使用or的情况下 <6>如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
9.假设有一个博客系统,数据库存储采用MySQL,用户数量为1000万,预计文章总数为10亿,每天有至少10万的更新量,每天访问量为5000万,对数据库的读写操作的比例超过10:1,你如何设计该系统以确保系统高效、稳定的运行?
<1>考虑缓冲使用 将每日的热点数据 定时缓冲到memcache 减少数据库读取的压力 <2>mysql读写分离 主服务器负责数据库的更新 从服务器专注于数据的读取 <3>负载均衡的使用 解决服务器并发问题 同时访问服务器 无法响应的问题 <4>表引擎的选择 增删改适用于读写比较频繁的数据表 考虑设计为innodb 需要读写的数据表考虑myisam的使用 读写速度会更快
10.索引的设置原则
摘自:http://blog.csdn.net/csdnones/article/details/50412603
1.选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。 2.为经常需要排序、分组和联合操作的字段建立索引 经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。如果为其建立索引,可以有效地避免排序操作。 3.为常作为查询条件的字段建立索引 如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。 4.限制索引的数目 索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索 1053c 引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。 5.尽量使用数据量少的索引 如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR(100)类型的字段进行全文检索需要的时间肯定要比对CHAR(10)类型的字段需要的时间要多。 6.尽量使用前缀来索引 如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。 7.删除不再使用或者很少使用的索引 表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。 注意:选择索引的最终目的是为了使查询的速度变快。上面给出的原则是最基本的准则,但不能拘泥于上面的准则。读者要在以后的学习和工作中进行不断的实践。根据应用的实际情况进行分析和判断,选择最合适的索引方式。
11.try catch finally 关键字的含义
<?php echo '我叫huangyuxin'; echo '<br>'; try { echo '今年21岁'; throw new Exception('至今未婚'); echo '高大帅气'; echo '<br>'; } catch (Exception $e) { echo '风流倜傥'; echo $e->getMessage(); //获得try抛出的异常 echo '<br>'; } finally { echo '最终会执行的finally'; echo '<br>'; } echo '英俊'; //try尝试运行代码,抛出异常后,catch 处理异常 ,finally 不管异常还是不异常都会执行
12.echo print print_r 和var_dump区别
1.echo 和 print 的区别 共同点:首先echo 和 print 都不是严格意义上的函数,他们都是 语言结构;他们都只能输出 字符串,整型跟int型浮点型数据。不能打印复合型和资源型数据; 而区别是:echo 可以连续输出多个变量,而print只能一次输出一个变量。print打印的值能直接复制给一个变量,如 $a = print “123”; 而echo 不可以,它没有像函数的行为,所以不能用于函数的上下文。在使用时,echo() 函数比 print()速度稍快。 2.var_dump()和print_r()的区别 共同点:两者都可以打印数组,对象之类的复合型变量。 区别:print_r() 只能打印一些易于理解的信息,且print_r()在打印数组时,会将把数组的指针移到最后边,使用 reset() 可让指针回到开始处。 而var_dump()不但能打印复合类型的数据,还能打印资源类型的变量。且var_dump()输出的信息则比较详细,一般调试时用得多。
13.题目是一个1~1000的数组。每6个元素一相加。并且加在当前数组的末尾。相加的六个元素删掉。直到数组不超过六个为止。
方法一:递归
<?php $arr = range(1, 1000); function getArr($arr) { //截取前六个数组 $array = array_slice($arr, 0, 6); //数组求和 $sum = array_sum($array); //数组删除 $remove = array_splice($arr, 0, 6); //加入数组后面 array_push($arr, $sum); if (count($arr) > 6) { $return = getArr($arr); } else { return ($arr); } return $return; } var_dump(getArr($arr));
方法二:循环
<?php $arr=range(1,1000); function getArr($arr) { while(count($arr)>6) { $sum=0; $tmp=[]; $tmp=array_splice($arr,0,6); $sum=array_sum($tmp); array_push($arr,$sum); } return $arr; } var_dump(getArr($arr));
14.LAMP和LNMP的区别
转自:http://blog.sina.com.cn/s/blog_626998030102wofn.html
LAMP==Linux+Apache+Mysql+PHP LNMP==Linux+Nginx+Mysql+PHP 以上两只架构是目前网站的主流架构 LAMP和LNMP最主要的区别在于: 一个使用的是Apache,一个使用的是Nginx。 我们就来说说Apache Apache是世界是用排名第一的Web服务器软件,其几乎可以在所有广泛使用的计算机平台上运营,由于其跨平台和安全性被广泛使用,是最流行的Web服务端软件之一。 相比于nginx,apache有些臃肿,内存和CPU开销较大,性能上有损耗,nginx对于静态文件的响应能力远高apache。 Apache是负载PHP的最佳选择,如果流量很大的话,可以使用nginx来负载非PHP的Web请求。在整个IT界而言,70%的流量访问均来源于Apache。 下面说说Nginx Nginx是一款高性能额Http和反向代理服务器,也是一个AMAP/POP3/SMTP服务器,Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日,2011年6月1日,nginx 1.0.4发布。 相比于Apache,nginx使用资源更少,支持更多并发连接,效率更高,作为负载均衡服务器。nginx即可对内进行支持,也可对外进行服务。其还是一款非常优秀的邮件代理服务器,安装简单,配置简介。 LNMP是Linux+Nginx+Mysql+PHP的组合方式,其特点是利用Nginx的快速与轻量级,替代以前的LAMP(Linux+Apache+Mysql+PHP)的方式。由于安装方便,并且安装脚本也随时更新。 LNMP方式的优点:占用VPS资源较少,Nginx配置起来也比较简单,利用fast-cgi的方式动态解析PHP脚本。 LNMP方式的缺点:php-fpm组件的负载能力有限,在访问量巨大的时候,php-fpm进程容易僵死,容易发生502 bad gateway错误 综上所述: 基于 LAMP 架构设计具有成本低廉、部署灵活、快速开发、安全稳定等特点,是 Web 网络应用和环境的优秀组合。若是服务器配置比较低的个人网站,当然首选 LNMP 架构。 当然,在大流量的时候。把Apache和Nginx结合起来使用,也不失为一个不错选择,如下: LNAMP是Linux+Nginx+Apache+Mysql+PHP的组合方式,其特点是利用Nginx来作为静态脚本的解析,而利用 Nginx的转发特性,将动态脚本的解析转交给Apache来处理,这样,能充分利用两种Web服务器的特点,对于访问量需求较大的站点来说,是一个很不错的选择。 LNAMP方式的优点:由于Apache本身处理PHP的能力比起php-fpm要强,所以不容易出现类似502 bad gateway的错误。适合访问量较大的站点使用。 LNAMP方式的缺点:相比LNMP方式会多占用一些资源,另外,配置虚拟主机需要同时修改Nginx和Apache的配置文件,要稍微麻烦一些。
15.memcache和redis的区别
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。 1.运行 Memcached是多线程,非阻塞IO复用的网络模型 Redis使用单线程的IO复用模型 https://www.zybuluo.com/phper/note/595507 2.持久化 Memcached不可以持久化 Redis支持持久话保存 3.数据类型 Memcached数据类型单一:只有get和set两个命令设置获取值 Redis数据类型:字符串,哈希,列表,集合,有序集合 4.事务 Memcached不支持事务,Redis支持事务
16.如何获取客户端真实ip,要求是int类型。
这题有坑,涉及到代理
<?php function get_real_ip() { $ip = false; if (!empty($_SERVER["HTTP_CLIENT_IP"])) { $ip = $_SERVER["HTTP_CLIENT_IP"]; } if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ips = explode(", ", $_SERVER['HTTP_X_FORWARDED_FOR']); if ($ip) { array_unshift($ips, $ip); $ip = FALSE;} for ($i = 0; $i < count($ips); $i++) { if (!eregi("^(10|172\.16|192\.168)\.", $ips[$i])) { $ip = $ips[$i]; break; } } } return ($ip ? $ip : $_SERVER['REMOTE_ADDR']); } $ip = get_real_ip(); echo ip2long($ip) . PHP_EOL; $ip_long = sprintf('%u', ip2long($ip)); // %u - 不包含正负号的十进制数(大于等于 0) echo $ip_long . PHP_EOL; // PHP_EOL换行符
17.遍历一个文件夹下的所有文件
<?php //首先你得先建一个文件夹 $filed = 'D:/test'; function forFile($sfile) { $op = opendir($sfile); //打开这个目录获得一个资源 readdir($op); readdir($op); //去掉 . .. while ($rd = readdir($op)) { $newfiled = $sfile . '/' . $rd; echo $newfiled . '<br>'; if (is_dir($newfiled)) { forFile($newfiled); } } closedir($op); } forFile($filed);
18.array(1,2,3,4,5)用五个新变量取出数组的每一个值
list($a, $b, $c, $d, $e) = [1, 2, 3, 4, 5]; echo $a, $b, $c, $d, $e;
19.写一个函数,判断字符串是否包含test字符串
function getStr($params) { if (strstr($params, 'test')) { echo '包含'; } else { echo '不包含'; } } getStr('abctestdef');
20.打印出1000天之前的天数,格式【日/月/年】
$a = strtotime(" -1045 day"); $c = date('d/m/Y', $a); var_dump($c);
21.写一个函数同时支持打印字符串和数组
function cdump($params) { if (is_array($params) && !empty($params)) { foreach ($params as $key => $value) { if (is_string($value)) { echo $value; } if (is_array($value)) { cdump($value); } } } elseif (is_string(($params))) { echo $params; } } cdump([['a', 'b', 'c'], 'd', [['e']]]);
22.把‘你叫什么名字啊’,截取为‘名字啊’
$str = substr('你叫什么名字啊', 12); var_dump($str); $str = mb_substr('你叫什么名字啊', 4); var_dump($str);
23.实现文件下载
$file_name = "test.php"; //下载文件名 //检查文件是否存在 if (!file_exists($file_name)) { echo "文件找不到"; exit(); } else { //打开文件 $file = fopen($file_name, "r"); //输入文件标签 Header("Content-type: application/octet-stream");//类型 Header("Accept-Ranges: bytes"); Header("Accept-Length: " . filesize($file_name));//文件大小 Header("Content-Disposition: attachment; filename=" . $file_name);//文件名 //输出文件内容 //读取文件内容并直接输出到浏览器 echo fread($file, filesize($file_name)); fclose($file); exit(); } ?>
24.对以下数组进行正向排序
<?php $data[] = array('test' => 66, 'en' => 2); $data[] = array('test' => 88, 'en' => 1); $data[] = array('test' => 86, 'en' => 1); $data[] = array('test' => 90, 'en' => 1); $data[] = array('test' => 30, 'en' => 3); echo '<pre>'; asort($data);//根据值进行正向排序 var_dump($data);
25.php中有哪些方式可以干预程序错误的输出
error_reporting(0) //设置为0会完全关闭错误 @符号 扩展 error_reporting (E_ALL); //将会向PHP报告发生的每个 error_reporting (E_ALL & ~E_NOTICE); //可以抛出任何非注意的错误报告
26.
$a = 3; echo '$a'.'<br/>'; echo "$a".'<br/>'; echo "\\\$a".'<br/>'; echo "${a}".'<br/>'; 结果: $a 3 \$a 3
27.打印26个大小写字母
for ($i = 65; $i < 91; $i++) { echo strtolower(chr($i)) . ' '; //输出小写字母 echo strtoupper(chr($i)) . ' '; //输出大写字母 }
相关文章推荐
- 面试常见问题知识点汇总(干货)
- 芒果iOS开发人事面试问题及答案汇总一
- 芒果iOS开发人事面试问题及答案汇总三
- 机器学习岗位面试问题汇总 之 线性回归和LR模型
- C/C++面试问题汇总
- 前端面试常见问题汇总
- 机器学习岗位面试问题汇总 之 总体性问题
- .net面试问题汇总(转)
- spark面试问题汇总(持续更新....)
- C++后台开发面试常见问题汇总
- 前端面试问题汇总
- 芒果iOS开发人事面试问题及答案汇总二
- 机器学习岗位面试问题汇总 之 集成学习
- 工作那些事(十六)面试时,面试官喜欢的非技术问题汇总
- 互联网产品经理面试问题汇总(18问)
- iOS面试巅峰之block问题汇总
- 面试技巧汇总:16个经典面试问题回答思路 .
- .net面试问题汇总
- 面试技巧汇总:16个经典面试问题回答思路
- .NET开发碰到的面试问题汇总(一)