面试题随记

=》1
TCP/IP UDP IMCP
应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。
=》2
SESSION 与COOKIE 的区别是什么,请从协议,产生的
原因与作用说明?
1、http 无状态协议,不能区分用户是否是从同一
个网站上来的,同一个用户请求不同的页面不能看做是
同一个用户。
2、SESSION 存储在服务器端,COOKIE 保存在客户
端。Session 比较安全,cookie 用某些手段可以修改,
不安全。Session 依赖于cookie 进行传递。
禁用cookie 后,session 不能正常使用。Session 的缺
点:保存在服务器端,每次读取都从服务器进行读取,
对服务器有资源消耗。Session 保存在服务器端的文件
或数据库中,默认保存在文件中,文件路径由php 配置
文件的session.save_path 指定。Session 文件是公有
的。
=》3
从一段html中正则匹配出来图片的url。
答案:
$img = '<img src="http://img.yes.com/20160620094921829.jpg" />';
$pattern = '/src="([w:/.]*)"/';
preg_match_all($pattern, $img, $matches);
array_shift($matches);
return current($matches);
=》4
memcache和redis的区别写三条
区别:
1.Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。
2.Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
3.Redis支持数据的备份,即master-slave模式的数据备份。
4.如果你对数据持久化和数据同步有所要求,那么推荐你选择Redis,因为这两个特性Memcached都不具备。即使你只是希望在升级或者重启系统后缓存数据不会丢失,选择Redis也是明智的。
5.如果要说内存使用效率,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。当然,这和你的应用场景和数据特性有关。
6.redis可以做cache,但redis更多是作为内存数据库的角色存在,且一致性哈希的实现还不成熟
7.redis具备binlog功能,可以将所有操作写入日志,当redis出现故障,可依照binlog进行数据恢复。
8.在100k以上的数据中,Memcached性能要高于Redis。

=》5
有200个长度为100的数组,这些数组已经是按顺序排的,从大到小。求top20,要求有代码和时间复杂度。
合并两个有序数组
function getSortArr($arrOne, $arrTwo)
{
$oneLength = count($arrOne);
$twoLength = count($arrTwo);

$res = [];
$oneIndex = 0;
$twoIndex = 0;
// 1 循环两个数组
while ( ($oneIndex < $oneLength) && ($twoIndex < $twoLength) ) {
$res[] = $arrOne[$oneIndex] > $arrTwo[$twoIndex] ? $arrTwo[$twoIndex++] : $arrOne[$oneIndex++];
}
// 2 将剩余的oneArr中 添加到res数组
while ($oneIndex < $oneLength) {
$res[] = $arrOne[$oneIndex++];
}
// 3 将剩余的twoArr中 添加到res数组
while ($twoIndex < $twoLength) {
$res[] = $arrTwo[$twoIndex++];
}

return $res;
}

=》6
给一个url(http://www.xxx.com/abc/4.html)要求返回
{"url":{"domain":"www.xxx.com","extension":"html"}}
答案:
$content = 'http://www.xxx.com/abc/4.html';
$host = parse_url($content);
$ext = pathinfo($content);
echo '{"url":{"domain":"'.$host['host'].'","extension":"'.$ext['extension'].'"}}';

=>7
HTTP 协议中GET、POST 和HEAD 的区别?
HEAD: 只请求页面的首部。
GET: 请求指定的页面信息,并返回实体主体。
POST: 请求服务器接受所指定的文档作为对所标识的
URI 的新的从属实体。
(1)HTTP 定义了与服务器交互的不同方法,最基本的
方法是GET 和POST。事实上GET 适用于多数请求,而
保留POST 仅用于更新站点。
(2)在FORM 提交的时候,如果不指定Method,则默认
为GET 请求,Form 中提交的数据将会附加在url 之后,
以?分开与url 分开。字母数字字符原样发送,但空格转
换为“+“号,其它符号转换为%XX,其中XX 为该符号以
16进制表示的ASCII(或ISO Latin-1)值。GET 请求请
提交的数据放置在HTTP 请求协议头中,而POST 提交的
数据则放在实体数据中;
GET 方式提交的数据最多只能有1024字节,而POST 则没
有此限制。
(3)GET 这个是浏览器用语向服务器请求最常用的方
法。POST 这个方法也是用来传送数据的,但是与GET 不
同的是,使用POST 的时候,数据不是附在URI 后面传递
的,而是要做为独立的行来传递,此时还必须要发送一
个Content_length 标题,以标明数据长度,随后一个空
白行,然后就是实际传送的数据。网页的表单通常是用
POST 来传送的。

=>8
mysql的存储引擎和区别?
1.Myisam MySQL的默认存储引擎来创建创建一个新表,新表的存储引擎不指定,则默认使用MyISAM。每个MyISAM分成三个文件存储在磁盘上。相同的文件名和表名的扩展。的FRM(存储表定义),MYD(MYDATA存储数据)。 MYI(MyIndex的,存储索引)。数据文件和索引文件可以被放置在不同的目录中,均匀地分布IO,获得更快的。
2.InnoDB的存储引擎,提供了交易的安全性具有提交,回滚和崩溃恢复能力。不过对比在MyISAM,InnoDB的写处理效率和存储引擎会占用更多的磁盘空间来保存数据和索引。
=》9
如何截取http://www.xxx.com/abc/4.html扩展名.html?
$file = "http://www.xxx.com/abc/4.html";
$info = pathinfo($file);
echo $info['extension'];

=>10
创建表文章分类和文章表?
一、文章表:post,字段如下:
id【唯一标识】,aid【作者id】,title【标题】,content【内容】,cid【分类id】
二、分类表,category,字段如下
id【唯一标识,与post表的cid关联】,name【分类名】

=》11
sql注入?
SQL 注入漏洞产生的原因? 如何防止?
SQL 注入产生的原因:程序开发过程中不注意规范书写
sql 语句和对特殊字符进行过滤,导致客户端可以通过
全局变量POST 和GET 提交一些sql 语句正常执行。
防止SQL 注入:
1、开启配置文件中的magic_quotes_gpc 和
magic_quotes_runtime 设置
2、执行sql 语句时使用addslashes 进行sql 语句转换
3、Sql 语句书写尽量不要省略小引号和单引号
4、过滤掉sql 语句中的一些关键字:update、insert、
delete、select、*
5、提高数据库表和字段的命名技巧,对一些重要的字段
根据程序的特点命名,取不易被猜到的。
6、Php 配置文件中设置register_globals 为off,关闭
全局变量注册
7、控制错误信息,不要再浏览器上输出错误信息,将错
误信息写到日志文件中。

=》12
写一个类,实现一个简单的拦截器功能?
// 若访问一个未定义的属性,则将调用get{$property}对应的方法
function __get($property){
$method = "get{$property}";
if (method_exists($this, $method)){
return $this->$method();
}
}

// 若给一个未定义的属性设置值,则将调用set{$property}对应的方法
function __set($property, $value){
$method = "set{$property}";
if (method_exists($this, $method)){
return $this->$method($value);
}
}

// 若用户对未定义的属性调用isset方法,
function __isset($property){
$method = "isset{$property}";
if (method_exists($this, $method)){
return $this->$method();
}
}

// 若用户对未定义的属性调用unset方法,
// 则认为调用对应的unset{$property}方法
function __unset($property){
$method = "unset{$property}";
if (method_exists($this, $method)){
return $this->$method();
}
}

function __call($method, $arg_array){
if (substr($method,0,3)=="get"){
$property = substr($method,3);
$property = strtolower(substr($property,0,1)).substr($property,1);
return $this->$property;
}
}

=》13
写出10个 Linux命令,附带意思。
1、ls:命令是列出目录内容
2、lsblk:就是列出块设备
3、md5sum:就是计算和检验MD5信息签名。
4、dd:命令代表了转换和复制文件
5、uname显示内核类别, uname -a显示详细信息。
6、history:命令就是历史记录
7、udo:(super user do)命令允许授权用户执行超级用户或者其它用户的命令
8、mkdir:(Make directory)命令在命名路径下创建新的目录。
9、touch:命令代表了将文件的访问和修改时间更新为当前时间
10、chmod”命令就是改变文件的模式位。
11、chown”命令就是改变文件拥有者和所在用户组。
12、tar”命令是磁带归档(Tape Archive),对创建一些文件的的归档和它们的解压很有用。
13、cal”(Calender),它用来显示当前月份或者未来或者过去任何年份中的月份。
14、date”命令使用标准的输出打印当前的日期和时间,也可以深入设置。
15、cat”代表了连结(Concatenation),连接两个或者更多文本文件或者以标准输出形式打印文件的内容。
16、cp 命令“copy”就是复制。它会从一个地方复制一个文件到另外一个地方。
17、mv 命令“mv”命令将一个地方的文件移动到另外一个地方去。
18、pwd”(print working directory),在终端中显示当前工作目录的全路径。
19、cd”命令代表了改变目录。
20、Debian系列以“apt”命令为基础,“apt”代表了Advanced Package Tool。APT是一个为Debian系列系统(Ubuntu,Kubuntu等等)开发的高级包管理器,在Gnu/Linux系统上,它会为包自动地,智能地搜索,安装,升级以及解决依赖。

原文地址:https://www.cnblogs.com/hejianrong/p/6385498.html