沈阳–》北京–》沈阳
面试了这么多,总结一下吧。
不是为了别的,只是为了证明我的青春岁月真是存在过;我奋斗过,我努力过,哪怕失败了,我也能告诉我自己曾经我TMD是个战士。
1、 http协议:
超文本传输协议,服务器端与用户端(/浏览器端)传输协议,也可以说是请求应答协议(面向对象的协议 ),能传输文本、页面(主要),它本身是不安全的。推荐用https(在http协议的基础上加ssl加密),但是baidu这方面做得没有google好。baidu的https爬的时候有问题。
http的报文(应答与请求)。
响应状态码:
1xx:信息响应类,表示接收到请求并且继续处理
2xx:处理成功响应类,表示动作被成功接收、理解和接受
3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理
4xx:客户端错误,客户请求包含语法错误或者是不能正确执行
5xx:服务端错误,服务器不能正确执行一个正确的请求
2、 TCP与UDP协议:
TCP协议是面向连接的协议—传输控制协议:3次握手和4次挥手。
作为可靠的协议,TCP协议保证可靠传输,保证传输(信息的完整和安全)。
传输单位是包。
UDP协议是无连接的协议—-用户数据报协议。
作为不可靠的协议,不保证传输只负责传输而已。
速度快和资源消耗小但是不可靠。
3、 事务***
事务的应用场景:几个操作需要实时和原子性。需要把多个操作集合为一个集合去实现。这个集合要求有:ACID等特性。
事务:
原子性 每一个事务是一个工作单元。它不能被分割成更小的部分。这个属性意味着在事务中定义的一切数据更改要么都完成,要么都不完成。
一致性 一个事务不能违背定义在数据库中的任何完整性检查。为了维护一致性,所有的规则、约束、检查和触发都会应用在事务中。由于所有的数据更改在事务期间内进行,这些数据在事务开始和事务结束前会被确保为一致的。
隔离性 事务必须与其他事务进行的数据更改相隔离。这意味着没有其他操作可以改变中间态(没有提交的)的数据。为了避免中间态数据被更改,事务必须要么等待来自其他事务的更改被提交,要么只能查看到处于上一个提交状态的数据。
持久性 在一个事务完成,并且客户端应用程序已经被提示这个事务已经成功完成后,无论发生任何系统错误,这些更改的数据将永久存在。
隐式事务和显式事务。
基本的事务语句。
隐式事务:
INSERT INTO table VALUES( );
显式事务:
BEGIN TRY
BEGIN TRAN
INSERT INTO table1 (i,col1,col2)
VALUES (1,'First row','First row');
INSERT INTO table1 (i,col1,col2)
VALUES (2,NULL,'Second row');
INSERT INTO table1 (i,col1,col2)
VALUES (3,'Third row','Third row');
COMMIT TRAN;
END TRY
4、 数据库缓存:
这玩意几句话能说清楚?逗我?
缓存的应用场景:
- 查询缓存能够加速已经存在缓存的查询语句的速度,可以不用重新解析和执行而获得正确得记录集;
- 查询缓存中涉及的表,每一个表对象都有一个属于自己的全局性质的锁;
- 表若是做DDL、FLUSH TABLES 等类似操作,触发相关表的查询缓存信息清空;
- 表对象的DML操作,必须优先判断是否需要清理相关查询缓存的记录信息,将不可避免地出现锁等待事件;
- 查询缓存的内存分配问题,不可避免地产生一些内存碎片;
查询缓存对是否是一样的查询语句,要求非常苛刻,而且还不智能;
综上:整个系统以读为主的业务,比如门户型、新闻类、报表型、论坛等网站;
查询语句操作的表对象,非频繁地进行DML操作,可以使用query_cache_type=2模式,然后SQL语句加SQL_CACHE参数指定;
5、 字符串翻转功能函数的实现:第一种: a="abcdefg";=> a=”gfedcba”;
$a = "abcdef";
function getStr( $str )
{
if( is_string( $str ) )
{
//如果sh如果是如果是字符串如果是字符串字符串
$length = mb_strlen( $str ) ;
$reStr = '';
for( $i =$length-1 ; $i>=0 ; $i-- )
{
$reStr .= $str[$i] ;
}
return $reStr ;
}
else
{
return false;
}
}
$out = getStr( $a ) ;
print_r( $out );
//求(索引)数组长度的函数
function getLength ( $arr = array() )
{
if( is_array( $arr ) )
{
$length = 0;
while( $arr[$length] )//可以换为isset(),但是可能不允许使用函数
{
$length ++;
}
return $length ;
}
else
{
return false;
}
}
$out = getLength( [1,2,3,4,5,6,6,7,8,9,10] ) ;
print_r( $out );//11
//获取字符串长度
function getLengthS ( $str )
{
if( is_string( $str ) )
{
$length = 0;
while( isset($str[$length]) )
//while( $str[$length] )
{
$length ++;
}
return $length ;
}
else
{
return false;
}
}
$out = getLengthS( $str = "张张abcdefgabchzhangasd" ) ;//1个中文占3个长度
print_r( $out );//25
第二种: a="abcabe2afg!";=> a = ” cba abe2 afg! “;//包含特殊字符的单词不翻转
function getStrR ( $str )
{
if( is_string( $str ) )
{
$arr = array();
$arr = explode( ' ' , $str ) ;
foreach ($arr as $k => $value)
{
// code...
if( preg_match( '/^[a-zA-Z]*$/',$value ) )
{
//翻转fanzhaun
$va = '';
$length = strlen( $value ) ;
for( $i = $length-1 ; $i>=0 ; $i-- )
{
$va .= $value[$i] ;
}
$arr[$k] = $va ;
}
}
return implode(' ',$arr ) ;
}
else
{
return false;
}
}
$out = getStrR( $str = "abc def gabc1 h zhang asd!" ) ;
print_r( $out );//cba fed gabc1 h gnahz asd!
6、 数据库表的优化:
7、 数据库优化方法:
8、 排序的种类,对应的时间复杂度、空间复杂度:
9、 ajax的理解:
10、 数据结构的种类:
11、 php实现队列:
12、 php实现栈:
13、 tp的子查询:
14、 表的多对多关联:
15、 tp的左连接
16、 数据库缓存:
17、 数据库的锁机制
18、 字符串处理函数strtoken
19、 数组函数列举
函数
21、 动态页面的静态化的实现
22、 搜索优化
23、 char与varchar的区别
24、 int类型的判断(各种类型判断)
25、 数组的去重和排序函数的实现
26、 各个状态码的含义(12345原则)
这是一篇好博客
常见的:
100
101
200
300
301
400
401
404
403
500
501
503
504
505
27、 shell命令
这是好的博客
28、 常用sql语句(CURD)
create table name (
id int () not null primary key,
name varchar unique not null,
);
insert into table
values();
update table set ;
delete * from table;
transcate
drop
29、 sql语句加减乘除
+
-
*
/
数学函数
30、 ucwords与ucfirst
ucwords大写字符串的每个单词的首字母,ucfirst()大写字符串的首字母。
31、 数组重复元素的计数函数的实现
32、 laravel框架
33、 json_decode()函数
json_decode()与json_encode()相反,将数组与json的转换,返回object。
但是json_decode(参数1,true)返回array;
34、 接口开发及其测试工具
postman
fireBUG应该也算一个。
35、 加密函数列举
加密和解密
36、 数组与json的转换
json_encode()与json_decode();
37、 树与图的区别与联系
图包含树。
树有根节点,图没有。
树能深搜,图不能。
我觉得:树没有环路,而图有。
38、 mvc
问这个问题的面试官(个人认为)可以判定其为垃圾。
39、 建表和库
if exists ‘name
drop table name
else
create database name;
create table name();
40、 算法:累加
f(1) =1 ,f(2) =1,f(3)=f(1)+f(2),f(4)=f(3)+f(2),,,,f(n)=?至少2种以上方法。
1 递归
个人写的小函数,希望有高手留下一招半式!
//递归
echo getRecursive(8);//21
function sumRecursive ( $i , $n ,$sum , $n1 )
{
if( $i ==1 )
{
$n1 = 1;
$sum = 1;
}
else if( $i ==2 )
{
$n1 = 1;
$sum = 1;
}
if( $i == $n )
{
return $sum ;
}
else
{
$i++;
$temp = $sum ;
$sum += $n1 ;//加前一个数
$n1 = $temp;//n-1的值向前滚加
$sum =sumRecursive ( $i , $n ,$sum , $n1 );//递归调用自己
return $sum;//结束回调
}
}
function getRecursive( $n )
{
if( $n == intval($n) )
{
return sumRecursive( 1 ,$n , 0,0 );
}
else
{
return false;
}
}
2 迭代
//迭代与递归的不同是,迭代是循环,递归是调用自己。
echo getLteration(90);//2880067194370816120
function getLteration( $n )
{
$n1 = 1 ;//第一个
$sum = 1;//第二个
for( $i = 3 ; $i <= $n ; $i++ )
{
//从3开始计算,前2个太特殊
$temp = $sum ;
$sum += $n1 ;
$n1 = $temp ;
}
return $sum ;//迭代结束,返回值
}
3 其他
echo getElse(7);
function getElse( $n )
{
if( $n == intval($n) )
{
$sum = 0;
$n1 = 0;
$i = 0;
while( $i!=($n+1) )
{
switch ($i)
{
case 1:
// code...
$n1 =1 ;
$sum = 1;
$i++;
break;
case 2:
// code...
$n1 = 1;
$sum = 1 ;
$i++;
break;
default:
// code...
$temp = $sum ;
$sum += $n1 ;
$n1 = $temp ;
$i++;
break;
}
}
return $sum ;
}
else
{
return false;
}
}
正在找其他方法解决这个算法,,,,
41、 不用if和权限管理实现权限管理的功能
42、 七层架构
7层与5层
43、 echo 与var_dump、print、print_r的区别:
thinkPHP
echo 不是函数,所以没有返回值这一说,是一个语句(如同if,else,等等语句一样)。可以同时输出多个变量;
print() 语言结构,也是可以输出多个变量,但是它只能打印简单变量(比如打印数组时就只能打印数组类型),返回值总是true/false;性能慢
print_r()打印值和类型,只能打印单一变量,它的返回值是true/false,如果多加一个参数(true),则不会返回boolea值,默认是false;
注释: 参数 return 是在 PHP 4.3.0 的时候加上的。记住,print_r() 对数组作用后将把数组的指针移到最后边。使用 reset() 可让指针回到开始处。
printf()打印一个格式化过的字符串,可以追加参数(字符串中的变量,字符串中药有类似c语言一样的类型提示符%s,%d等等)而要打印%要使用%%;对应的vprintf()
sprintf()返回一个格式化的字符串;vsprintf()
(数组指针没有太理解,求高手指教!)
var_dump()只是一个测试函数,打印值和类型。
var_export()与var_dump类似,但是添加参数true可以改变输出的显示。
总结:
1、 越小的公司问的越具体;
2、 mvc基本不问了(估计会背的人太多了),最好不要被概念,说理解;
3、 面试官10个有9个是(你懂的),剩下一个是装逼的;
4、面试官也不一定会面试题;
5、随时做好遇到坑比的准备(这个问题您怎么看?面试官:这个问题几句说不清楚。说不清楚你问我,让我说?艹);
6、会答题不一定会开发,会开发不一定回答题;
7、一定不要怂,上去就是干。