PHP经典高级工程师面试题
1.PHP 如何实现不用自带的 cookie 函数为客户端下发 cookie。对于分布式系统,如何来保存 session 值。
这个题有点绕。考的还是 COOKIE 和 SESSION 的基础知识。服务端通过 set-cookie 命令来通知客户端保存 cookie。
只要按照 domain path 过期时间等规则 用 header 函数就可以实现。
分布式系统 session,集中处理。按我们公司的架构,为了实现高可用和高容灾,提供一个分布式的验签服务。具体的可以看下 redis 的分布式服务架构。
2、数据库中的存放了用户 ID, 扣费很多行,redis 中存放的是用户的钱包,现在要写一个脚本,将数据库中的扣费记录同步到 redis 中,每 5 分钟执行一次。请问要考虑哪些问题?
思路:生产者和消费者模式。这个问题也没有说其他的状态,比如数据库的数据会实时增加么?redis 中每个钱包是否有其他服务在读取或者写入啊。什么的。数据库和 REDIS 放一起,要么考数据一致性,要么考出现锁,导致效率降低。
3、根据 access.log 文件统计最近 5 秒的 qps,并以如下格式显示,01 1000(难点在 01 序号)
tail -f access.log | awk -F \'[\’ \'{print $2}\’ | awk \'{print $1}\’ | uniq -c
4.redis 是如何进行同步的,同步的方式,同步回滚怎么办,数据异常怎么办,同时会问 MYSQL 的同步方式和相关异常情况
redis 集群主从同步的简单原理
Redis 的复制功能是基于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了 Redis 的复制功能,就一定会有内存快照发生。
当 Slave 启动并连接到 Master 之后,它将主动发送一个 SYNC 命令 (首先 Master 会启动一个后台进程,将数据快照保存到文件中 [rdb 文件] Master 会给 Slave 发送一个
Ping 命令来判断 Slave 的存活状态 当存活时 Master 会将数据文件发送给 Slave 并将所有写命令发送到 Slave )。
Slave 首先会将数据文件保存到本地 之后再将 数据 加载到内存中。
当第一次链接 或者是 故障后 重新连接 都会先判断 Slave 的存活状态 在做全部数据的同步 , 之后只会同步 Master 的写操作 (将命令发送给 Slave)
问题:
当 Master 同步数据时 若数据量较大 而 Master 本身只会启用一个后台进程 来对多个 Slave 进行同步 , 这样 Master 就会压力过大 , 而且 Slave 恢复的时间也会很慢!
redis 主从复制的优点:
(1)在一个Redis集群中,master负责写请求,slave负责读请求,这么做一方面通过将读请求分散到其他机器从而大大减少了master服务器的压力,另一方面slave专注于提供
读服务从而提高了响应和读取速度。
(2) 在一个 Redis 集群中,如果 master 宕机,slave 可以介入并取代 master 的位置,因此对于整个 Redis 服务来说不至于提供不了服务,这样使得整个 Redis 服务足够安全。
(3) 水平增加 Slave 机器可以提高性能
5.两台 mysql 服务器,其中一台挂了,怎么让业务端无感切换,并保证正常情况下讲台服务器的数据是一致的
不是核心业务的话,先停写,把备机拉起来,查看两台机器的日志,进行数据补偿,开写。
如果是核心业务的话,现在所有的写操作都在正常的状态机器上。把好的这台机器的备机拉起来,当主机。
以上全是应急操作。实际上数据库的容灾设计要复杂的多。
面试官要是问你,备机的数据不一致怎么办,你要勇敢怼回去,你们每秒多少写入操作。按照百万级表,每秒 1000 的写入效率,正常的设计是,分布在 2 台机器上每台 500。这个级别的数据同步,出现差异的概率 可以忽略不计的。有一台出现问题,另一台也可以抗住。
(正常的操作,还是先停写,等数据一致,切换,开写。我们公司搞这些切换都是在凌晨 4.00 左右,核心业务的每秒写操作,只有十几个。前后耽搁不到 20 秒)。
6.请写出自少三种截取文件名后缀的方法或函数(PHP 原生函数和自己实现函数均可)
echo substr(strrchr($file, \’.\’), 1);
echo substr($file, strrpos($file, \’.\’)+1);
$arr=explode(\’.\’, $file);
echo $arr[count($arr)-1];
$arr=explode(\’.\’, $file);
echo end($arr);
echo strrev(explode(\’.\’, strrev($file))[0]);
echo pathinfo($file)[\’extension\’];
echo pathinfo($file, PATHINFO_EXTENSION);
PHP面试题+完整答案
【公司面试题之: PHP笔试题】1. 禁用COOKIE 后 SEESION 还能用吗?2. 抓取远程图片到本地,你会用什么函数?3. 已知姓名A,姓名B,给一个求他们缘份的算法4. 你觉得在PV10W的时候, 同等配置下,LUNIX 比WIN快多少?5. 简述POST 和GET传输的最大容量分别是多少?6. 用最少的代码写一个求3值最大值的函数.
答:1、cookie是保存在本地的,而seesion是保存在服务器上的。所以两者没有直接的关系,禁用cookie后seesion依然可以用。
2、用file_get_contents函数,ex:
<?php$img = file_get_contents(\’http://www.baidu.com/img/baidu_logo.gif\’);file_put_contents(\’1.gif\’,$img);echo \'<img src=\”1.gif\”>\’;?>
3、<?phpfunction is_gfriend($na,$nb){$random1=rand(1,5);//计算他们有1/5的缘分$random2=rand(1,5);if ($random1==$random2)return $na.\”+\”.$nb.\”你们有缘分\”;elsereturn $na.\”+\”.$nb.\”可惜无缘份\”;
}echo is_gfriend(a,b);
?>
4、
公司面试题之:百度Web开发工程师笔试题】2007-11-07百度笔试题(web开发和新产品搜索方向)第一部分:1.解释下面语句的意思:document.form[\”formName\”].submit;2.有下面语句:<input id=\”txt\” type=\”text\” value=\”baidu\” />编写代码,当鼠标划过文本框,自动选中文本框中的内容。3.将字符09转换成十进制数字。4.将1234567890转换成1,234,567,890 每3位用逗号隔开的形式。5.关于HTML和CSS的,忘记了。6.在文本框中输入一个年份,判断其生肖,并输出在文本框旁边。对html和javaServlet都要求写出。7.Ajax从服务器取数据 {id:123, name:\”baidu\”, username:\”mm\”,checked:true};分析name对应的值(\”baidu\”).(题目较长,不记得了)8.谈关于客户体验的问题。
答案:1、获取formName表单submit按钮元素。
2、 <input id=\”txt\” type=\”text\” value=\”baidu\” οnmοuseοver=\”javacript:document.getElementById(\’txt\’).select()\” />
3、<?php$a=\”09\”;echo ( int ) $a;echo \”<br>\”;echo intval(\”09\”);?>
4、<?php $num = \”1234567890.11\”; $num = preg_replace(\’/(?<=[0-9])(?=(?:[0-9]{3})+(?![0-9]))/\’, \’,\’, $num);echo $num; ?>
6、$t= 1986;switch ($t){case 1986:echo \”牛\”;break;case \”\”:break;case \”\”:break;……}
8、从满意度、忍受度、回馈度分析。
第二部分:1.Ajax,数据库触发器,GUI,中断机制的共同思想。谈一谈该种思想(机制)。2.把一篇英文文档中所有单词的首字母转为大写,文档存在doc.txt中。可以在多种编程语言中选择(C\\C++,JAVA,PHP…)写出你的思路,尽量优化你的程序。3.关于树的数据结构.4.数据库优化:有一个表 PRODUCT(ID,NAME,PRICE,COUNT);在执行一下查询的时候速度总是很慢:SELECT * FROM PRODUCT WHERE PRICE=100;在price字段上加上一个非聚簇索引,查询速度还是很慢。(1)分析查询慢的原因。(2)如何进行优化。5.CREATE TABLE topid{topicId int not null primary key auto_increment,title text,author varchar(30),content blob,isDeleted int…… //好像在author上定义了一个索引}CREATE TABLE reply{topicId int foreign key,replyId int primary key auto_increment,replyAuthor varchar(30),replyTime datetime,context blob……. //定义了一个索引和key}一个为主题表,一个为回复表。1.问从性能上考虑,这样做有什么不足。2.查询回复时间不超过一个特定的时间段,回复的作者名字以MIKE开头的主题的title,以如下的查询:select * from topic where replyid in (select replyid from reply wherereplyAuthor like \’mike%\’ and (currentTime()-replyTime<specialTime))从性能上考虑上述的查询语句有什么不足?如何进行优化?
答案:1、数据库触发器和中断机制是数据库自动完成的,而ajax触发器是用户激发的。ajax把GUI和数据库异步优化。
2、<?php$fp=fopen(\”aa.txt\”,\’r\’); //英文文档aa.txtwhile(!feof($fp)){$char=fgets($fp);}$e= explode(\”,\”,$char);$write=fopen(\”doc.txt\”,\’w\’);//没有doc.txt则创建foreach ($e as $w){if($w==$e[count($e)-1])//最后一个单词没有逗号输入if($w==end($e))$w=ucwords($w);//第一个字母转大写else$w=ucwords($w).\”,\”;echo $w;fwrite($write,$w);//写入doc.txt 文档中}
fclose($write);fclose($fp);?>
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。