面试问题总结

  1. 1. php魔术方法(14项)
  2. 2. HTTP协议中几个状态码的含义.
  3. 3. 语句include和require的区别
  4. 4. 事务的特征(ACID)
  5. 5. TCP传输的三次握手
  6. 6. 断开一个TCP连接则需要”四次握手”
  7. 7. TCP和UDP的区别
  8. 8. redis支持的数据类型
  9. 9. asp,php,jsp的优缺点
    1. 9.1. 这个题
  10. 10. php之multicurl
  11. 11. php优化
  12. 12. php版本的差异
  13. 13. 教训
  14. 14. get vs post
  15. 15. echo(),print(),print_r()的区别
  16. 16. 跳转
  17. 17. 遍历目录
  18. 18. 限制上传文件大小
  19. 19. sql
  20. 20. fopen打开文件
  21. 21. char vs varchar
  22. 22. 这些这些协议的全称和中文解释(都是工作在应用层)
  23. 23. OSI七层网络模型的名称,由下到上
  24. 24. find命令和grep命令的区别

php魔术方法(14项)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
__construct() 实例化类时自动调用.
__destruct() 类对象使用结束时自动调用.
__set() 在给未定义的属性赋值的时候调用.
__get() 调用未定义的属性时候调用.
__isset() 使用isset()或empty()函数时候会调用.
__unset() 使用unset()时候会调用.
__sleep() 使用serialize序列化时候调用.
__wakeup() 使用unserialize反序列化的时候调用.
__call() 调用一个不存在的方法的时候调用.
__callStatic()调用一个不存在的静态方法是调用.
__toString() 把对象转换成字符串的时候会调用.比如 echo.
__invoke() 当尝试把对象当方法调用时调用.
__set_state() 当使用var_export()函数时候调用.接受一个数组参数.
__clone() 当使用clone复制一个对象时候调用.

HTTP协议中几个状态码的含义.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
100 Continue 继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息
200 OK 正常返回信息
201 Created 请求成功并且服务器创建了新的资源
202 Accepted 服务器已接受请求,但尚未处理
301 Moved Permanently 请求的网页已永久移动到新位置.
302 Found 临时性重定向.
303 See Other 临时性重定向,且总是使用 GET 请求新的 URI.
304 Not Modified 自从上次请求后,请求的网页未修改过.
400 Bad Request 服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求.
401 Unauthorized 请求未授权.
403 Forbidden 禁止访问.
404 Not Found 找不到如何与 URI 相匹配的资源.
500 Internal Server Error 最常见的服务器端错误.
503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护).
100 Continue
101 Switching Protocols
200 OK
201 Created
202 Accepted
203 Non-Authoritative Information
204 No Content
205 Reset Content
206 Partial Content
300 Multiple Choices
301 Moved Permanently
302 Found
303 See Other
304 Not Modified
305 Use Proxy
307 Temporary Redirect
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Time-out
409 Conflict
410 Gone
411 Length Required
412 Precondition Failed
413 Request Entity Too Large
414 Request-URI Too Large
415 Unsupported Media Type
416 Requested range not satisfiable
417 Expectation Failed
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Time-out
505 HTTP Version not supported

语句include和require的区别

在失败的时候:
include 产生一个 warning ,而 require 直接产生错误中断;

require 在运行前载入;
include 在运行时载入;

require_onceinclude_once 可以避免重复包含同一文件.

如果网站框架的设计能避免重复引用的话,推荐用include/require,
因为他们比_once速度稍快.

事务的特征(ACID)

  • 原子性(Atomicity) 构成事务的所有事件要么都完成要么都当什么也没发生过
  • 一致性(Consistency) 事务的结果应该符合预期,不应当超出预期之外导致不合理的结果
  • 隔离性(Isolation) 未完成的事务应当对其它事务不构成影响
  • 持久性(Durability) 事务的结果应当被永久保存下来

TCP传输的三次握手

发送端首先发送一个带SYN标志的数据包给对方。接收端收到后,回传一个带有SYN/ACK标志的数据包以示确认。
最后,发送端再回传一个带ACK标志的数据包,代表“握手”结束。
若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。

断开一个TCP连接则需要”四次握手”

  • 第一次握手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了
    (当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。

  • 第二次握手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。

  • 第三次握手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。

  • 第四次握手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

TCP和UDP的区别

TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来

UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!
UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。

redis支持的数据类型

  • string
  • list
  • set
  • order set
  • hash

asp,php,jsp的优缺点

asp: 闭源且不跨平台
php: 开源且跨平台,简单快速,作为网站初期的首选
jsp:

这个题

如果 uid 值为 10,2,5,6,3 的记录存在,那么 select uid from user where uid in (10,2,5,6,3);
结果顺序为按 uid 升序排列

php之multicurl

multicurl所有的多线程就是异步、网络io支持并发,http请求支持并发
pthread是真正正宗的多线程,也是php唯一的多线程

php优化

  • CPU 密集部分用 C++ 或者 C 写 PHP 的扩展模块。
  • OPcache 通过将PHP脚本预编译的字节码存储到共享内存中来提升PHP的性能,省去了每次加载和解析PHP脚本的开销。

php版本的差异

  • 在 PHP 5.5 之前,empty() 仅支持变量;5.5以后支持表达式了

教训

1
2
3
4
5
6
7
8
错误的写法
select uid from user group by uid where count(*) > 60;
`where` 子句后面不能跟聚合条件
`group by` 应该写在 `where` 子句后面
这种情况应该用 `having`
正确的写法
select uid from user group by uid having count(*) > 60;

get vs post

  • get 数据量长度受限制,这主要是受 url 长度限制
  • 安全
  • get限制表单中数据集的范围为asc2码,而post可以支持整个iso10646字符集

echo(),print(),print_r()的区别

echo是语言结构,没有返回值
print是函数,有返回值
print_r是函数,递归调用,用于输出数组对象

跳转

方法一:php函数跳转,缺点,header头之前不能有输出,跳转后的程序继续执行,可用exit中断执行后面的程序。

1
2
Header("Location: 网址"); //直接跳转
header("refresh:3;url=网址"); //三秒后跳转

方法二:利用meta

1
echo "<meta http-equiv=refresh content='0; url=网址'>";

遍历目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function loaddir1($dirname){
if($handle=opendir($dirname)){
while(false!==($files=readdir($handle))){
if($files!="."&&$files!=".."){
if(is_file($dirname.'/'.$files)){
echo $dirname.'/'.$files.'<br>';
}
if(is_dir($dirname."/".$files)){
loaddir($dirname."/".$files);
}
}
}
}
}
function loaddir2($path)
{
$files = array();
if($handle = opendir($path)){
while(($f = readdir($handle)) !== false){
$p = $path .'/'. $f;
if($f == '..' || $f == '.') continue;
if(is_file($p)){
$files[] = $f;
}elseif(is_dir($p)){
$files[$f] = loaddir2($p);
}
}
closedir($handle);
}
return $files;
}

限制上传文件大小

  • 客户端的隐藏域MAX_FILE_SIZE的数值(可以被绕开)。
  • 服务器端的upload_max_filesize,post_max_size和memory_limit。这几项不能够用脚本来设置。

sql

a.删除没有任何订单客户:DELETE FROM customerinfo WHERE customerid NOT in (SELECT customerid FROM orderinfo)
b.提取所有没有订单客户:SELECT FROM customerinfo WHERE customerid NOT in (SELECT customerid FROM orderinfo)
c.提高b的速度优化:SELECT
FROM customerinfo LEFT JOIN orderid ON customerinfo.customerid=orderinfo.customerid
WHERE orderinfo.customerid IS NULL

fopen打开文件

1
2
3
4
$readcontents = fopen('http://www.phpres.com/index.html', 'rb');
$contents = stream_get_contents($readcontents);
fclose($readcontents);
echo $contents;

char vs varchar

Varchar是变长,节省存储空间,char是固定长度。查找效率要char型快,因为varchar是非定长,必须先查找长度,然后进行数据的提取,比char定长类型多了一个步骤,所以效率低一些

这些这些协议的全称和中文解释(都是工作在应用层)

SMTP (Simple Mail Transfer Protocol) 简单邮件传输协议
POP3 (Post Office Protocol 3) 邮局协议第3版
HTTP (Hypertext Transfer Protocol) 超文本传输协议
FTP (File Transfer Protocol)文件传输协议
DNS (Domain Name System and Domain Name Service protocol) 域名系统(服务)协议

OSI七层网络模型的名称,由下到上

物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

find命令和grep命令的区别

find:按照文件名查找
grep:按照文件内容查找