面试题整理连接
面试题一
面试题二
Linux相关:
Linux命令:
进程相关
top:命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器
free:命令用于显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer
ps:命令显示运行的进程,还会显示进程的一些信息如pid, cpu和内存使用情况等
df:显示目前在Linux系统上的文件系统的磁盘使用情况统计
kill:命令用于终止进程
文件相关:
cd:进入目录
pwd:显示目录路径
ls:展示文件夹内内容
cp:复制
mv:重命名以及移动文件;
rm:删除
mkdir:创建目录
rmdir:删除目录
cat:查看文件全部内容
more:可以分页文件内容
less:查看文件内容,less -N profile
head:显示文件前几行
tail 显示文件后几行
cat、more、less、tail、head命令的区别可参考
https://my.oschina.net/junn/blog/304868
tar:用于压缩解压
压缩:tar -jcv -f filename.tar.bz2 要被处理的文件或目录名称
查询:tar -jtv -f filename.tar.bz2
解压:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
gzip:压缩文件或文件夹为 .gz文件
find:查找文件
grep:用于查找文件里符合条件的字符串
wc:计算字数
crontab:定时执行:分时日月周
awk:文本分析工具
权限相关:
chmod:修改文件权限
chgrp:变更文件或目录的所属群组
Linux端口
ftp:File Transfer Protocol,文件传输协议,是应用层的协议,它基于传输层,为用户服务,它们负责进行文件的传输,其默认端口是21。
ssh:Secure Shell,安全外壳协议,建立在应用层和传输层基础上的安全协议。SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议,其默端口是22。
http:hypertext transport protocol,超文本传送协议,是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议,其默认端口是80。
telnet:Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力,其默认端口是23。
https:Hypertext Transfer Protocol over Secure Socket Layer,是以安全为目标的HTTP通道,用于安全的HTTP数据传输,它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性,其默认端口是443。
Nginx:
Nginx与Apache的优缺点比较:
1 最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程 (nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的)
2 在高并发下nginx 能保持低资源低消耗高性能。
3 apache 相对于nginx 的优点: rewrite ,比nginx 的rewrite 强大 模块超多,基本想到的都可以找到 少bug 。
PHP相关:
PHP内置函数:
PHP数组相关:
http://www.w3school.com.cn/php/php_ref_array.asp
array_column():获取某一列
array_multisort():对数组进行排序
array_search():查找值对应的首个key
in_array():判断某个值是否存在于某个数组中
array_unique:去除数组中重复的元素
array_merge():合并数组
array_combine():合并两个数组来创建一个新数组,其中的一个数组元素为键名,另一个数组元素为键值
PHP 其他常用函数:
implode():将数组连接成字符串
strtotime():
parse_url():
框架底层实现
PHP7的新特性主要有:标量类型声明、返回值类型声明、null合并运算符、太空船操作符、通过define()定义常量数组、匿名类等
三次握手:
- 第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
- 第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
- 第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了
四次挥手
- 第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
- 第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
- 第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
- 第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手
HTTP状态码
2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误
301 Moved Permanently永久移动
302 Found 临时移动
304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
400 Bad Request客户端请求的语法错误,服务器无法理解
401 Unauthorized请求要求用户的身份认证
403 Forbidden服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
500 Internal Server Error服务器内部错误,无法完成请求
502 Bad Gateway作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
504Gateway Time-out充当网关或代理的服务器,未及时从远端服务器获取请求
PHP的垃圾收集机制是怎样的
PHP可以自动进行内存管理,清除不再需要的对象。
PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。
php魔幻(术)方法;
- __construct() 实例化类时自动调用。
- __destruct() 类对象使用结束时自动调用。
- __set() 在给未定义的属性赋值的时候调用。
- __get() 调用未定义的属性时候调用。
- __isset() 使用isset()或empty()函数时候会调用。
- __unset() 使用unset()时候会调用。
- __sleep() 使用serialize序列化时候调用。
- __wakeup() 使用unserialize反序列化的时候调用。
- __call() 调用一个不存在的方法的时候调用。
- __callStatic()调用一个不存在的静态方法是调用。
- __toString() 把对象转换成字符串的时候会调用。比如 echo。
- __invoke() 当尝试把对象当方法调用时调用。
- __set_state() 当使用var_export()函数时候调用。接受一个数组参数。
- __clone() 当使用clone复制一个对象时候调
递归遍历实现无线分类
<?php
function tree($arr,$pid=0,$level=0){
static $list = array();
foreach ($arr as $v) {
//如果是顶级分类,则将其存到$list中,并以此节点为根节点,遍历其子节点
if ($v['parent_id'] == $pid) {
$v['level'] = $level;
$list[] = $v;
tree($arr,$v['cat_id'],$level+1);
}
}
return $list;
}
?>
mysql_fetch_row()和mysql_fetch_array()有什么分别?
mysql_fetch_row()把数据库的一列储存在一个以零为基数的数组中,第一栏在数组的索引0,第二栏在索引1,依此类推。
mysql_fetch_assoc()把数据库的一列储存在一个关联数组中,数组的索引就是字段名称,
mysql_fetch_array()可以同时送回mysql_fetch_row()和mysql_fetch_assoc()的值。
PHP常用框架的对比:TP YII Laravel
Memcache和Redis区别
- Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。
- Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存。
- 他们的扩展都需要做集群;实现方式:master-slave、Hash。
- 在100k以上的数据中,Memcached性能要高于Redis。
- 如果要说内存使用效率,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。当然,这和你的应用场景和数据特性有关。
- 如果你对数据持久化和数据同步有所要求,那么推荐你选择Redis,因为这两个特性Memcached都不具备。即使你只是希望在升级或者重启系统后缓存数据不会丢失,选择Redis也是明智的。
- Redis和Memcache在写入性能上面差别不大, 读取性能上面尤其是批量读取性能上面Memcache更强
PHP算法面试相关参考:
https://blog.csdn.net/why444216978/article/details/80468236
https://www.jianshu.com/p/a8cd6cbf733d