===========================
写在前面:
这两天面了几家,赶紧趁着还记得,把面试题记录下来,以供参考。
链家:注重基础和底层原理,还有代码的异常处理,抠细节。不过比较人性化,注重持久化发展,上下班不用打卡,活干完了6,7想撤就可以撤,好任性的有没有。然后php界的number 1鸟哥就在此厂。再然后技术交流也比较多比较成体系化,一周最少3次,其中还有教人穿衣搭配的学习,好全面啊,包3餐,住房优惠,连生活上的穿搭都照顾到了,哈哈,感动1秒钟。。。
新浪:新浪看点这个部门注重高并发时的处理:sql优化,代码质量要求比较高,还有他们承诺他们开发的产品7*24随时发现问题随时响应,这就有点尴尬了,说不准哪天半夜睡着睡着,一个异常电话过来,你就得爬起来修bug…
一下科技:新兴公司,主要是攻短视频这块,旗下产品有秒拍、小咖秀、一直播、VPlayer全能播放器、Vitamio多媒体SDK
包三餐,996单双休,晚上加班到22:30之后打车报销。工作满半年可以享受1万块的住房补贴。工作满1年以后公司每个季度给你父母1000块钱,相当于一年给员工父母4K,这个福利还是第一次听说。。然后再有就是这个公司注重广告宣传和明星效应,一搜,哇,赵丽颖,还有3小只TFBoys,他们在此公司也挂着荣誉职位。
自如:地方有点偏,上来就是一张试卷要在45分钟写完。
百度:不用说,路人皆知。
===========================
链家(4轮技术+1轮hr)
一串11位的手机号,将php中间4位变为4个*
//1.字符串截取法
$new_tel1 = substr($tel, 0, 3).'****'.substr($tel, 7);
var_dump($new_tel1);
//2.替换字符串的子串
$new_tel2 = substr_replace($tel, '****', 3, 4);
var_dump($new_tel2);
//3.用正则
$new_tel3 = preg_replace('/(\d{3})\d{4}(\d{4})/', '$1****$2', $tel);
var_dump($new_tel3);
php常用的数据类型
int, float, double, double,
mysql索引
(1)select * from table name where b=xx and a=xx and c=xx
建索引:索引与where里出现的顺序无关。所以===>(a,b,c)
(2)select * from table name where a=xx and c=xx
建索引:索引不一定要全部包括where查询的子列。所以===>(a),然筛选出记录中含有b的记录
(3)select * from table name where a=xx and b=xx
select * from table name where b=xx and c=xx
select * from table name where b=xx and a=xx
这三条语句如何加索引?
如果建2个索引(a,b)和(b,c)
如果建1个索引(b)还是(a,b,c)??????我猜想是(b),然后再筛。有不对之处欢迎留言拍砖~
简述where和order by原理,查询的时候是先where还是先order by
select * d from table name where a>1000 and b<1000 and c=‘foo’ order by b desc这句如何加索引优化?
分情况:根据结果集判断优化方向,加索引后筛选剩下的结果集越少,这个索引假的必要性越大。
(1)如果数据库里所有记录的c=‘foo’,c的命中率是100%,c就不用加索引,==>索引(a,b)
(2)如果a的命中率1%,b的命中率30%,c的命中率20%,那么加索引的顺序按照命中率从小到达排序,==>索引(a,c,b)
(3)如果b的命中率比较大,可以不用给b加索引,==>索引(a,b)
(4)加索引优先考虑where子列,其次才是order by子列,主要还是根据上面所说的结果集来判断如何加索引
isset与emty的区别
当变量是未定义,NULL时=====>if(!isset)和if(empty)效果相同,都是false
当变量是"",0,"0",array(),flase时====>if(!isset)和if(empty)效果相反,变量存在但是为空
综上:(1)判断变量是够存在,用isset
(2)判断一个存在的变量是否为空,用empty
Linux中awk的使用
i++, i+=1, i=i+1哪个执行快,为什么?
在有优化的编译器下,生成的机器代码是相同的,在没有优化的情况下,i++效率最好,另外两个完全等效。
i++相比 ++i哪个更高效?为什么?
++i的效率高些,++i在运算过程中不产生临时对象,返回的就是i,是个左值,类似++i=1这样的表达式是合法的,而i++在运算的过程中会产生临时对象,返回的是零时对象的值,是个右值,像i++=1这样的表达式是非法的
对于内置类型,单独的i++和++i语句,现在的编译器基本上都会优化成++i,所以就没什么区别了
foreach内部原理,php底层是c语言,简单说说底层的一些理解。
redis与memcache比较,redis过期键的处理,redis数据结构,redis底层数据结构
redis2大特性:持久化、支持除k-v外更多的数据结构
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/54988982
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79635872
php常用的几大框架的优缺点,php几大设计模式以及使用场景
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78770647
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79736735
一堆数,按照元素出现次数按从大到小排序
(1)如果数无限大:
(2)如果数有限大:先hash,统计元素次数,然后针对次数做大根堆排序。
如果让你封装一个数据库类,怎么做?
(1)单例设计模式去使数据库连接只有1个,每次使用完立马关闭。适配器模式数据库连接方式多样化,可以连mysql,mysqli,pdo
(2)权限控制。不能让外人随随便便就能访问数据库。
缓存cookie与session的区别,缓存存放位置(file,redis,memcache),redis和memcache区别以及各自的内部实现。
海量日志文件的存放
(1)如每天入库的数据量特大,可以考虑按照月去存表
(2)日志可以不放在数据库里加重服务器负担,可放在redis,消息队列(kafka)、ELC。目前链家就用的后两个。
mysql的存储引擎以及比较。聚合索引以及非聚合索引的底层数据结构(B+树,前者叶子结点存放实际数据,后者叶子结点存放实际数据的地址)
array_walk与array_map的区别
===========================
一下科技(3轮技术+1轮hr)
简述对fpm的理解
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78918771
php各大设计模式和应用场景
常见php框架的优缺点
http常见状态码,http与https区别
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/61918954
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78507762
a、通信使用明文不加密,内容可能被窃听
b、不验证通信方身份,可能遭到伪装
c、无法验证报文完整性,可能被篡改
HTTPS就是HTTP加上SSL加密处理(一般是SSL安全通信线路)+认证+完整性保护
http如何通过TCP连接的过程(stream)
TCP3次握手和4次挥手
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78772276
tcp与udp的区别
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78507826
docker容器
http://www.docker.org.cn/book/docker/what-is-docker-16.html
swoller
缓存的理解,memcache与redis区别,redis支持的数据类型,一个热度前100排行榜,使用哪个数据类型(zset)
mysql索引的底层数据结构(B+树),描述该结构。mysql几种存储引擎以及之间的区别。
常见linux命令,假设有个很大的文件,达到没办法进去,取里面第100-200条,另存到另一个文件
直接取有三种方式
sed -n '100,200p' inputfile
awk 'NR>=100&&NR<=200{print}' inputfile
head -200 inputfile|tail -100
取完还得另存到另一文件应该只能用awk
inputfile|awk '{if(NR>=100 && NR<=200) print $0}' > outfile
linux查看磁盘占用情况。
df -h
简述操作系统里的堆和栈的理解
php的截取类的函数。php的排序类函数,二维数组排序,php的运算符优先级(! != == & |)
截取类的函数:array_slice array_splice array_chunk implode与explode、substr、strstr、strrchr
排序类的函数:sort 与rsort asort 与arsort ksort与krsort natsort与natcasesort usort
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78184763
抽象类和接口的区别
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/69388626
php常见魔术函数
魔术方法:
__construct() :实例化对象时被调用;
__destuct():当删除一个对象或者对象操作终止是被执行;
__call():调用对象不存在方法时被调用;
__get():调用对象不存在的属性时被调用;
__set():设置对象不存在的属性时被调用;
__toString():打印一个对象时被调用,比如echo $obj,print($obj);
__clone():克隆对象时被调用,比如$t = new Test();$tt = clone $t;
__sleep():serialize之前被调用,若对象比较大,想做一些删除在序列化,可以考虑使用该方法;
__wakeup():unserialize之前被调用,做些对象的初始化;
__isset():检测对象是否存在属性的时候被调用,如 isset($c->name);
__unset():unset一个对象属性时被调用,如:unset($c->name);
__set_state():调用var_export时被调用,用__set_state的返回值作为 var_export的返回值;
__autoload():实例化一个对象时,如果对应的类不存在,在该方法被调用。
魔术常量:
__LINE__:返回当前行号;
__FILE__:返回文件的完整路径和文件名,如果用在包含文件里面,则返回包含文件名,自 php4.0.2后,__FILE__总是包含一个绝对路径,而在此前的版本有时候会包含一个相对路径;
__FUNCTION__:返回函数名称(自 php4.3.0新加的)。自php5起本常量返回该函数被定义时的名称,区分大小写,在php4中该值总是小写;
__CLASS__:返回类的名称,自 php4.3.0新加的,自php5起本常量返回该类被定义时的名称,区分大小写,在php4中该值总是小写的;
__METHOD__:返回类的方法名。 php5新加的
mysql优化方法
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78412679
如何提高web server性能
===========================
新浪
主要是高并发的处理比较多,新浪看点做公众号,每天数据库要插入20万到40万条数据。
mysql如何查询优化
1、数据库查询分页,perpage和page
2、查询分页当(limit 40万,200)遍历前40万也会超慢,这时候可以采用切片来查
select min, max(id) 然后计算分成若干片,每片的起始id和技术id可以算出来,然后放每片放缓存中。
简述单点登录
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78773035
==========================
自如笔试题
1、输出啥
弹出弹框,内容为1
2、有下面语句:
编写代码,当鼠标滑过文本框,自动选中文本框中的内容
var textBox = document.getElementById('txt');
textBox.onmouseover = function(){
this.select();
}
3、用php打印出前一天的时间格式是xxxx-xx-xx xx:xx:xx
echo date('Y-m-d H:i:s',strtotime('-1 days'));
4、php可以将GBK转换成UTF-8的函数有
echo $str= '你好,这里是卖咖啡!';
$result=iconv("gbk","utf8",$str);
5、使用php正则匹配一段内容里的所有ziruroom.com域名及其子域名的url
$preg='[0-9a-zA-Z]*\.ziruroom\.com\/';
preg_match($preg,$str,$target);
var_dump($target);
6、Linux系统下,使用什么命令来设置一个目录下的所有文件与子目录下的文件具有可写权限
chmod -R a+w /tmp
7、添加一条作业crontab,每月1日,16点执行一次,记录日志
http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html
8、用php验证手机号码的正确性
2种方式,php和javascript
php
$phonenumber = '13712345678';
if(preg_match("/^1[3|4|5|7|8]\d{9}$/",$phonenumber)){
echo "是手机号码";
}else{
echo "不是手机号码";
}
javascript
9、Linux系统下,查找/tmp/目录下的以'.php'结尾的文件,并将这些文件复制到/home/phpfile/目录下,请用一条命令写出
cp /tmp/*.php /home/phpfile/
10、访问日志access.log,统计ip访问次数,并倒序输出
(
LogFormat "%h %l %u %t ¥"%r¥" %>s %b" common
CustomLog logs/access.log common
)
cat access.log |cut -d ' ' -f 1 | sort |uniq -c | awk '{print $0 }' | sort -rn | less
其它详见:https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79783115
11、将1234567890转换成 1,234,567,890 每3位用逗号隔开的形式
$str = '1234567890';
function mystr($str)
{
$str = strrev($str);
$str = chunk_split($str, 3, ',');
$str = strrev($str);
$str = ltrim($str, ',');
return $str;
}
echo mystr($str);
12、给定一个数组,将数组中的数字连接起来,求最大数。例如:array(4,94,9,14,1)连接后,所得的最大数:9944141
13、写出你所知道的,从一次web请求开始到结束这个过程中都会使用哪些缓存?
(按照由客户端到服务器端的顺序)
1.浏览器端存储:
HTML5中的本地存储功能允许在浏览器端保存数据.
Flash等第三方插件也有类似的功能.
JavaScript保存一些数据在当前Context也算这种类型.
2.浏览器端文件缓存
HTTP协议中在时间未过期等情况下,不请求服务器数据而直接使用本地的文件 (请参考HTTP协议中关于缓存控制的部分)
常用于html JavaScript css等文件的缓存,以减少请求次数
3.HTTP缓存304:
HTTP协议中,如果服务器文件未发生变化,不返回用户请求的数据,而只是返回一个304响应 (更多内容请参考HTTP协议)
不减少请求数量,但是减少了响应的体积
通过控制动态文件的输出内容实现缓存(可以了解一下 Etag 等相关内容)
4.服务器端文件类型缓存
动态页面静态化为html文件;
代理服务器, CDN等..
某些不常更新的的数据静态化为文件
主要是为了节省服务器资源,例如CPU
5.普通内存缓存:
这是我们平时用的最多的缓存
功能很强,例如.net中的Cache类按照时间等规则定时过期数据,例如缓存数据库数据
6.分布式缓存
例如Memcached,现代应用程序的规模越来越大,难免用上此类方案
经常通过自己分割程序实现分布式的缓存
7.数据库缓存
大部分数据库都会把数据加载到内存中以提高性能
8.表现层&DOM缓存
在客户端和服务器端缓冲HTML片段,(只更新需要更新的部分,如很多ajax的实现)
例如jQuery中的链式表达式 (某些数据说明链式表达式会快25%)
以上涉及的部分都是可以通过开发或者配置实现控制的(有些不容易控制的缓存类型就没有提到)
此外:
许多编程语言中把数据放在静态变量等成员中,其实也是一种缓存
除了对于数据和文件的缓存以外,还有很多对于程序本身的缓存
关于HTTP Cache部分可以查看 RFC 2616
许多组件自带缓存功能,例如NHibernate,如果注意其配置可以获得不错的性能提升
按照常用程度从多到少,开发难度从容易到复杂,在开发中优先度从高到低
个人建议的顺序为 5 > 2 > 3 > 8 > 4
服务器缓存直接在代码中开发,成本低,功能强
HTTP缓存一般由服务器(IIS,apache)等内置支持,当然 也可以编程实现,也是很推荐的做法
本地存储还不够普及,在对客户端要求较高的网站中使用较多
MemCached之类的解决方案是对较大规模的网站必用的
数据库缓存是一个比较难以控制的范畴,(相比来说 优化索引和数据库设计更为有效)
14、请写出你所知道的设计模式,并写出所适合的应用场景。
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79736735
15、用过哪些php框架吗?有什么特点,优点,缺点?
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78770647
16、反射性XSS漏洞的原理及危害?
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79774187
17、php的垃圾回收机制是怎么样的?
PHP使用了引用计数这种单纯的垃圾回收机制。每个对象都内含一个引用计数器,每个reference链接到对象,计数器加1,当reference离开生存空间或者被设为null,计数器减1,当某个引用计数器的对象为0时,PHP知道你将不再需要使用这个对象,释放其所占有的内存空间。
18、是否使用过git,简单写下常用的命令,并描述下与svn的区别
git add
git commit -m “edit test.php”
git -b checkout dev
git clone [email protected]:username/projectname.git
没用过svn。。。
19、写出SQL语句的格式,插入、更新、删除表名User
Name Tel Content Date
张三 13333663366 大专毕业 2006-10-11
张三 13612312331 本科毕业 2006-10-15
张四 021-55665566中专毕业 2006-10-15
(a)有一条新记录(小王 13254748547高中毕业 2007-05-06)请用SQL语句新增至表中
(b)请用sql语句把张三的时间更新成为当前系统时间
(c)请写出删除名为张四的全部记录
20、mysql出现ERROR:(2006,'Mysql server has gone away')报错事什么意思,如何解决
原因:一般出现在倒入较大数据库的时候。SQL语句过大或者语句中含有BLOB或者longblob字段,超出了默认允许最大的数据包。
解决办法:先查看这些参数的值是否过小
show global variables like '%timeout';
show VARIABLES like '%max_allowed_packet%';
然后在my.cnf文件中添加以下参数(windows中是my.ini文件)
wait_timeout=2880000 #服务器关闭非交互连接之前等待活动的秒数。默认值:28800秒(8小时)
interactive_timeout = 2880000 #服务器关闭交互式连接前等待活动的秒数。默认值:28800秒(8小时)
max_allowed_packet = 10M #包或任何生成的中间字符串的最大大小。如果表中包含BLOB列或长字符串,就必须增加该值。
另外,
交互式操作:通俗的说,就是你在你的本机上打开mysql的客户端,就是那个黑窗口,在黑窗口下进行各种sql操作,当然走的肯定是tcp协议。
非交互式操作:就是你在你的项目中进行程序调用。比如一边是tomcat web服务器,一边是数据库服务器,两者怎么通信?在java web里,我们通常会选择hibernate或者是jdbc来连接。那么这时候就是非交互式操作。
在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。
如果这个值过大的话,很可能会造成大量的无用的闲置的连接存在,对数据库压力过大;如果设置的小,会增加系统服务器的业务压力。所以,设置为多大,得根据你的服务器的压力大小来配置的,可不是随便写一个数就行了的。
21、mysql的主从复制的原理,开发过程中要注意的事项。
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78553401
===========================
百度
1、php生命周期
2、call()函数的作用
当调用不到响应的类的时候,就调用call生成一个
3、redis的value空间固定分配比较省资源
4、消息队列的异步跑脚本
5、如何设计铁路12306?
如:2000个城市,初始化,查询代替纵横线路上的各站点
6、TCP的三次握手和四次挥手
7、建议学python.原话是学php是为了现在找工作,学python是为了将来找工作
未完待续。。。