基础题

场景:

你入职了一家新公司.

上班第一天,接待人给你安排好了座位,然后拉过来一台没拆封的新电脑.

你把电脑连接好之后,按下电源....

好吧,这真是一台新电脑,里边竟然内置了个DOS系统!!

你找同事拿来了操作系统光盘/U盘(这个无所谓了).半个小时后,操作系统安装好了.

    1. 第一件事就是要把LAMP环境搭建起来,这样才好工作.简述搭建LAMP环境过程中的注意点.

    2. LMAP环境搭建好之后,你拿到了第一个开发任务.给公司内部开发一个通用审批系统.公司内部有一个DNS服务器,上边已经配好了这个系统的域名,叫approving.great-company.com,并指向了你本机的ip. 你尝试访问了一下http://approving.great-company.com ,出现了apache经典的It Works页面,域名是生效的.你打算在桌面新建一个目录叫approving并在这个目录下完成这个系统的开发.如何配置apache使得访问http://approving.great-company.com的时候能够打开approving/index.php

    3. apache配置好之后,你开始了开发工作.这时,同事给了你一份代码,是另一个人写了一半的通用审批系统.这下好多了,你不用从零开始写代码了.你翻看了他的代码,发现逻辑是这样的: 用户使用email和密码登录这个系统后,程序把这个用户的id放到了session里.通过$_SESSION['uid']就可以拿到登录用户id,然后去数据库里就能把这个用户的个人信息(比如叫什么名字,是哪个部门的)拿到了.接着,你找到了这个通用审批系统主要功能点的代码

<form action="new-approving.php" method="post">
审批事项: <input type="text" name="title" />
详细描述: <textarea name="details"></textarea>
<input type="submit" value="提交" />
</form>
<?php

include __DIR__ . '/conndb.php';

$title   = $_POST['title'];
$details = $_POST['details'];
$access = md5(uniqid()); $db->query("INSERT INTO approving(title, details) VALUES ('$title', '$details')");
$insertId = $db->getLastinsertId();
$db->query("INSERT INTO access(approving_id, access) VALUES ($insertId, $access)"); // 通知boss@great-company.com审批
$to = 'boss@great-company.com';
$subject = "请审批 $title";
$body = "$details\n<a href=\"approve.php?access=$access\">快速审批链接</a>"; include __DIR__ . '/lib/mail.php';
$mail = new Mail();
$mail->addTo($to);
$mail->setSubject($subject);
$mail->setBodyHtml(nl2br($body));
$mail->send(); header('Location: success.php');

看到这里,你大概看明白了.用户登录进来之后,提交一个表单,填写好要boss审批什么东西以及详细的描述,程序接收到提交数据后,除了把审批事项存放到approving表之外,还生成了一个access,发送给了boss,应该是boss在邮件里点击这个”快速审批链接”就不需要登录系统就直接把事项审批了.接着,你找到了approving.php的代码:

<?php

include __DIR__ . '/conndb.php';

$access = $_GET['access'];
$row = $db->query("SELECT approving_id FROM access WHERE access = '$access'");
if (!$row) {
die('No such access');
} $approvingId = $row['approving_id'];
$approvingRow = $db->query("SELECT * FROM approving WHERE approving_id = $approvingId"); echo '<h3>审批事项: ', $approvingRow['title'], '</h3>';
echo '<p>详细描述:</p>';
echo '<p>', nl2br($approvingRow['details']), '</p>';
echo "<a href=\"pass.php?access=$access\">通过</a>";
echo "<a href=\"deny.php?access=$access\">拒绝</a>";

Review上述三段代码,指出代码中存在的问题.

 

4. 在你翻看完成了大部分代码之后,你发现里边有一个TODO尚未完成.

// TODO: 如果两天了boss还没有审批,那么系统就再发一封邮件催一下.

这个该怎么实现?

进阶题

  1. 有哪些得意之作?

  2. 是否实践过PHP编码规范?

  3. 如何做质量控制?

  4. 如何做测试?

  5. js命名空间的作用?

  6. 是否用过jslint?

  7. 是否写过jQuery plugin?

  8. Linux使用多长时间了?

  9. 常用工具: vim, grep, sed awk, wget, curl

  10. 写过哪些shell脚本?

  11. 做过服务器管理吗?

  12. 接触到的Mysql数据库表最大是多少行记录?

  13. 使用哪种存储引擎?

  14. 出现性能瓶颈如何定位解决?

  15. MyISAM与InnoDB索引的区别?InnoDB的Primary Index 和 secondary Index有何区别?

  16. 你手里有300W份简历的工作经历和教育背景?如何从中提取出学校/专业/公司?

  17. 学习一个新框架如何入手?


------------------------------------------------------------------------------------

为什么我更新了面试题?

招研发的必须实打实的上代码,我的确遇到了一些面试时回答问题还不错,一写代码让人头疼的工程师.
所以招人时分了两个层次:
1) 期望面试者入职工作后,代码写出来,一两天内能发布到线上.(对应基础题)
2) 了解面试者对编程认知的广度和深度.(对应进阶题)

基础题分析说明

1. 搭建LAMP环境过程中,一定要把错误报警全都打开(安装了xdebug后,错误报警会更显眼,track_errors也很有用...)
2. 会配虚拟主机
3. Code Review.
首先,这三段代码均缺少权限判断.
第2段代码的问题:
1) 对提交过来的数据没有任何验证.
如果没有提交title字段,$_POST['title']就报undefined index了
如果title,details为空,或者过长都会有问题
2) 数据库操作部分有SQL注入
一个操作涉及到多个表时需要考虑事务的问题
第3段代码的问题:
1) 数据验证
2) SQL注入
3) XSS
4. 写一个在CLI运行php程序,然后放入cronjob即可.
熟悉CLI环境还是需要的,让一个新人明白数据不一定是从他写的表单里提交过来的,好费劲.
------------------------------------------------------------------------------------

我觉得,如果一个应聘者能对如下关于LMAPJ(J指Javascript)方面的问题有自己的实战经验或者能提出解决方案的,都是可以考虑录用的。以下只是个人最近的一些思考,不见得合理,但是我会很愿意和能清楚解答如下问题的人在一起工作的。 
======================================

== PHP == 
# 编码规范 
你在以前的项目中采用什么样的编码规范? 
# 正则 
你对正则有多熟悉?在以前的项目中用过吗?用在哪些地方了?是自己写的,还是从网上找的? 
以下是apache的一段访问日志,从中取出访问的站点名称,访问者ip (<del>访问时间,访问页面,访问者的客户端</del>)

http://www.fake.com:80 157.55.16.231 - - [25/Dec/2011:06:44:08 +0800] "GET /robots.txt HTTP/1.1" 200 394 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +Meet our crawlers)" 
http://site1.fake.com:80 61.175.193.51 - - [25/Dec/2011:07:02:28 +0800] "GET /home/list HTTP/1.0" 302 399 "http://www.a.com/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MASN)" 
http://site2.fake.com:80 61.237.230.38 - - [25/Dec/2011:09:55:55 +0800] "GET /blog/archive/?year=2010 HTTP/1.1" 200 8467 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CIBA; Tablet PC 2.0; InfoPath.3; MS-RTC LM 8; 360SE)"

# 开发过PHP的CLI程序吗? 
# 你做的哪个东西自己都觉得自己很NB? 
# 有哪些好书可以推荐一下吗? 
## Book List

== Javascript == 
# 你是怎么接触并学习js的? 
# 在团队中,采用什么机制来解决命名冲突的? 
# 采用什么办法来保证代码质量的? 
# 知道jslint吗?使用过吗?用多长时间了?怎么和日常的开发工作结合在一起的? 
# jQuery熟吗?写过jQuery的插件吗? 
# 有哪些好书可以推荐一下吗? 
## Book List 
> js语言精粹 
> [JavaScript高级程序设计(第2版)].(美)泽卡斯 
> High Performance JavaScript - Nicholas C. Zakas

== Linux == 
# linux熟吗?使用多长时间了? 
# 常用工具: vim,grep,sed,awk,wget,curl...熟吗? 
# 写过shell脚本吗? 
# 管理过服务器吗? 
# 有哪些好书可以推荐一下吗? 
## Book List 
> [sed与awk(第二版)].(美)多尔蒂,(美)罗宾斯

== Apache == 
# 会配置虚拟主机吗?有几种配置方法?(基于ip的,基于端口的,基于域名的,混杂的) 
# 浏览器缓存是怎么使用的?(mod expires)

== MySQL == 
# 你接触到的最大的mysql数据库表是多大?(行记录数大概是什么量级的?) 
# 使用的是哪种存储引擎(MyISAM, InnoDB, ...) 
# 出现性能瓶颈时是如何解决的? 
# 自己创建过索引吗?是怎么决定要在某些列上创建索引的? 
# 关于索引,清楚MyISAM与InnoDB的区别吗? MyISAM的主键索引和其它索引有区别吗? InnoDB的主键索引和其它索引有区别吗? 
# 有哪些好书可以推荐一下吗? 
## Book List 
> [MySQL技术内幕InnoDB存储引擎].姜承尧 
> [高性能MySQL(第2版)中文版].施瓦茨

== 其它 == 
# 数据结构和算法怎么样?觉得有用吗?在什么地方用到了?有什么好书推荐一下吗? 
# 除了PHP,还有哪门语言是你的强项,可以拿来用在production中的? 
# 工作之余做过什么有意思的项目吗? 
# 有好的技术博客推荐一下吗? 
风雪之隅-Laruence的博客
酷壳 – CoolShell.cn
黑客志 | Hacker的社交礼仪与自我修养
# csdn的用户名密码泄露出来一批,有643W多(其格式是username # password # email),现在想把它导到数据库里,你有什么办法?


转自 http://www.zhihu.com/question/19757909  (何广宇)

[转]PHP 面试问哪些问题可以比较准确的反映出应聘者的开发水平?的更多相关文章

  1. 面试问烂的 MySQL 查询优化,看完屌打面试官!

    Java技术栈 ,一般把连接数设置得大一些). 并发量:同一时刻数据库服务器处理的请求数量 3.超高的 CPU使用率:CPU资源耗尽出现宕机. 4.磁盘 IO:磁盘 IO性能突然下降.大量消耗磁盘性能 ...

  2. ThreadPoolExecutor源码分析-面试问烂了的Java线程池执行流程,如果要问你具体的执行细节,你还会吗?

    Java版本:8u261. 对于Java中的线程池,面试问的最多的就是线程池中各个参数的含义,又或者是线程池执行的流程,彷佛这已成为了固定的模式与套路.但是假如我是面试官,现在我想问一些更细致的问题, ...

  3. 面试大厂回来后,有一些话想对 Java 后端开发说一说

    在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面 ...

  4. 面试问我 Java 逃逸分析,瞬间被秒杀了。。

    记得几年前有一次栈长去面试,问到了这么一个问题: Java中的对象都是在堆中分配吗?说明为什么! 当时我被问得一脸蒙逼,瞬间被秒杀得体无完肤,当时我压根就不知道他在考什么知识点,难道对象不是在堆中分配 ...

  5. 面试问了解Linux内存管理吗?10张图给你安排的明明白白!

    文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 今天来带大家研究一下Linux内存管理.对于精通 CURD 的业务同学 ...

  6. 字节面试问我如何高效设计一个LRU,当场懵

    首发公众号:bigsai 转载请放置作者和原文(本文)链接 前言 大家好,我是bigsai,好久不见,甚是想念! 最近有个小伙伴跟我诉苦,说他没面到LRU,他说他很久前知道有被问过LRU的但是心想自己 ...

  7. java面试问道的

    1.java可重入锁 2.Hashmap原理.说说hashMap是怎样实现的(这个之前看过,顺利回答上.还回答了多线程的问题出现的原因,面试官表示很惊讶的样.用hashmap实现hashset 3.

  8. 面试问烂的 Spring AOP 原理、SpringMVC 过程(求求你别问了)

    Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以.但今天笔者带大家一起深入浅出源码,看看他的原理.以期让印象更加深刻,面试的时候游刃有余. Sp ...

  9. 从源码层面聊聊面试问烂了的 Spring AOP与SpringMVC

    Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以.但今天笔者带大家一起深入浅出源码,看看他的原理.以期让印象更加深刻,面试的时候游刃有余. Sp ...

随机推荐

  1. Java_脚本引擎_00_资源帖

    一.精选资料 1.w3cschool—Java 脚本引擎 2.Riding the Nashorn 二.参考资料

  2. uva11134 - Fabled Rooks(问题分解,贪心法)

    这道题非常好,不仅用到了把复杂问题分解为若干个熟悉的简单问题的方法,更是考察了对贪心法的理解和运用是否到位. 首先,如果直接在二维的棋盘上考虑怎么放不好弄,那么注意到x和y无关(因为两个车完全可以在同 ...

  3. uva10892(暴力枚举)

    把n的所有因子求出来,总数不会太多,所以直接O(n2)的暴力枚举所有对行不行. 有几个细节要注意,详见代码. #include<iostream> #include<cstdio&g ...

  4. 超简单tensorflow入门优化程序&&tensorboard可视化

    程序1 任务描述: x = 3.0, y = 100.0, 运算公式 x×W+b = y,求 W和b的最优解. 使用tensorflow编程实现: #-*- coding: utf-8 -*-) im ...

  5. 用Java实现异构数据库的高效通用分页查询功能

    不同数据库的分页查询语句有着较大区别,其中MySQL数据的limit offset语法最为简单,而SQL Server数据库和Oracle数据库的分页就比较复杂了. 网上常见的SQL Server和O ...

  6. mysql之 xtrabackup原理、备份日志分析、备份信息获取

    一. xtrabackup备份恢复工作原理: extrabackup备份简要步骤 InnoDB引擎很大程度上与Oracle类似,使用redo,undo机制,XtraBackup在备份的时候,以read ...

  7. jraiser模块加载执行简要总结

    1 在html文件中,通过require方式来加载指定的入口文件:2 然后通过正则表达式来匹配入口文件中的所有require的依赖文件:注意,此时入口文件已加载完毕,不过,还没执行而已.3 之后逐一通 ...

  8. ECMAScript6入门-序言

    本系列笔记基于阮一峰大佬的开源书籍.如果大家想看可以去该地址 本系列笔记只记录本人自己学习的过程,如果有侵权收到通知会自行下架. 如果大家看到可以直接去地址处学习,如果觉得好还望支持正版. 在此感谢阮 ...

  9. Python collections系列之可命名元组

    可命名元组(namedtuple)  根据nametuple可以创建一个包含tuple所有功能以及其他功能的类 1.创建一个坐标类 import collections # 创建类, defaultd ...

  10. C# 获取计算机的硬件信息

    /// <summary> /// 获得CPU编号 /// </summary> /// <returns></returns> public stri ...