您的位置:首页 > 职场人生

面试问题汇总

2018-01-05 11:56 197 查看
以后面试的问题都放这了

先占坑,再填

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)) . ' '; //输出大写字母
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: