最近在广州找工做,大四狗,读着三本前两年刚升二本的学校,文科生,好像一切条件都很是不利,但我仍是毅然选择这条路——拍黄片,人不能固步自封,仍是要拓展一下本身的知识面,不能只学php而不拓展视野,仍是要学学python、java、前端这些
面试得有点心塞,各类由于学历被刷,校招只投了几个,不是被刷了简历就是没勇气投,默默告诉本身,之后必定要叫本身的儿子多考几分!
她说我最近看起来很疲惫。
对啊由于找工做数日睡很差了
他说还好,咱们如今惟一的目标是找工做,不用考虑其余的。
是啊,就像高考那会同样。
话很少说,下面写一下最近所经历的一些面试题,之后会继续补充的php
如下代码输出什么css
<?php function judge(){ $num = 0; if($num = ''){ echo 'a'; }else{ echo 'b'; } } ?>
输出b,if中的空值赋值给$num,所以if条件一定为false,还有其余一些大同小异的题目,用=和==判断for循环的,只要把握好基本的概念就好了html
empty
、isset
概念的考察isset()
和empty()
函数的区别在于,前者只验证一个值是否存在,后者在此基础上还会检验它的值是否非空和非0
注:empty()
只检测变量,检测任何非变量的东西都将致使解析错误isset()
判断一个变量是否已经设置
当设置一个变量值为0,empty()
认为这个变量同等于空,即至关于没有设置前端
能够定义一个变量,设置值为'',0,null,'aaa'
几种不一样状况下,用if判断empty、isset
看看结果java
如:php中输出当前脚本文件名的预约义变量是$_SERVER['PHP_SELF']
与DOCUMENT_ROOT
有关。如:地址为http://baidu.com/test/kkk.php...,$_SERVER['PHP_SELF']
='/test/kkk.php'
还有一些重要的如$_SERVER['DOCUMENT_ROOT']
,输出网站所在的根目录,如'D:/work/www'$_SERVER['SCRIPT_FILENAME']
,输出'D:/work/www//kkk.php'$_SERVER['HTTP_USER_AGENT']
,获取客户端浏览器,操做系统等等
其余一些能够经过print_r($_SERVER)
测试得到,固然不止这些,还有其余一些预约义变量,系统常量如__FILE__
也是须要稍微去看一下python
主要考察php的原生函数,暂时分为数组函数、字符串处理函数、时间函数、文件操做函数、数据库函数
,后面再看看需不须要扩展。注意这些函数必定都要去过一遍。mysql
肯定是文件夹 —— 打开文件夹(产生dh句柄) —— 循环读取文件夹内容(读取句柄的内容,即为file/folder) —— 递归读取上一步判断为folder且文件夹不为'.'或者'..'的文件夹内容
jquery
<?phpnginx
$dir = "D:/www/project/"; function readDirectory($dir){ if(is_dir($dir)){ // if ($dh = opendir($dir)) { while (($file = readdir($dh)) != false) { if (is_dir($dir.$file) && $file!="." && $file!="..") { echo $dir.$file."<br/>"; readDirectory($dir.$file."/"); } } closedir($dh); } } } readDirectory($dir);
?>web
<?php $dir = "D:/www/project/"; function readDirectory($dir){ if(is_dir($dir)){ // if ($dh = opendir($dir)) { while (($file = readdir($dh)) != false) { if (is_file($dir.$file)) { echo "filename:".$file."<br/>"; // echo $dir.$file."<br/>"; echo "filetype:".filetype($dir.$file)."<br/>"; } if (is_dir($dir.$file) && $file!="." && $file!="..") { readDirectory($dir.$file."/"); } } closedir($dh); } } } readDirectory($dir); ?>
如$url = 'http://www.qq.com/test.php?a=...'; 取出'php'
function getFileName($url){ $a = explode('?', $url); $b = strrpos($a[0], '.'); //strrpos(被搜索字符串,要查找字符串,[查找开始的位置]) 查找字符串最后一次出现的位置: 找到则返回最后一次出现的位置;未找到则返回false $c = substr($a[0], $b+1, 3); //substr(被操做字符串,开始位置,[结束位置]) 返回字符串的一部分 return $c; }
eg.
用户登陆认证,请求地址为http://www.aa.com/user.php,后...,验证是否正确
请求参数:时间戳 Time
什么鬼参数忘了,即为param
还有一个是token
,token值是Time+param的MD5加密,中间有加号
返回参数:
成功:res['ret'] = 0; res['msg'] = 'success';
失败:res['ret'] = 1; res['msg'] = 'fail';
返回数据格式:json
下面是个人思路:
function valid(){ $data = $_GET['data']; if(!$data){ $res['ret'] = 1; $res['msg'] = 'fail'; echo json_encode($res); } $str = $data['Time'] . '+' . $data['param']; if($data['token'] != md5($str)){ $res['ret'] = 1; $res['msg'] = 'fail'; echo json_encode($res); }else{ $res['ret'] = 0; $res['msg'] = 'success'; echo json_encode($res); } }
其实今天笔试的时候作这道题忘了怎么返回json格式的数据了,就直接用了Thinkphp的ajaxReturn,后来回来的时候查了一下才知道原来直接echo,这么简单,框架仍是为辅吧,要多写原生。今天笔试的是一家手游公司,对数据库操做和原生要求比较多。
是http协议的两种请求方式,而http是基于TCP/IP应用层的协议,因此两种都是用的同一个传输层协议get
是将请求信息以键值对的形式放在URL上,post
是经过HTTP Header 传递数据
当咱们使用get
时,全部的信息都会出如今URL地址中,安全性比较低。
使用get
最大传递的数据长度是2kb
(根据服务器配置以及用户浏览器配置考虑),因此若是在传输量小或者安全性不那么重要的状况下可使用get
。
而post
并无长度限制,安全性较高
有人说post比get更安全,这只是相对的,但都是能够被抓包的。要想安全传输,就只有加密,也就是 HTTPS
(1)cookie
数据存放在客户的浏览器上,session
数据放在服务器上
(2)cookie
不是很安全,别人能够分析存放在本地的COOKIE
并进行COOKIE欺骗,若是主要考虑到安全
应当使用session
(3)session
会在必定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,若是主要考虑到减轻服务器性能方面
,应当使用COOKIE
(4)单个cookie
在客户端的限制是3K
,就是说一个站点在客户端存放的COOKIE不能3K。
(5)因此:将登录信息等重要信息
存放为SESSION
;其余信息若是须要保留,能够放在COOKIE
中
第一种方式:在每一个超连接
上添加一个PHPSESSID=$sid
//防止返回初始页产生新的session
if(isset($_GET["PHPSESSID"])){ session_id($_GET["PHPSESSID"]); } //启动一个session session_start(); //获取当前session的session_id() $sid=session_id(); //在每一个连接上添加参数PHPSESSID=$sid 其余页面的获取方式为: if(isset($_GET["PHPSESSID"])){ //设置当前的session为初始的session,session_id()一致便可 session_id($_GET["PHPSESSID"]) } session_start();
第二种方式:使用 SID
常量替换连接上的 PHPSESSID=$sid (SID的值相似:PHPSESSID=sddg34r593dfdlksrewr)
if(isset($_GET["PHPSESSID"])){ session_id($_GET["PHPSESSID"]); } //启动一个session session_start(); 其余页面的获取方式为: if(isset($_GET["PHPSESSID"])){ //设置当前的session为初始的session,session_id()一致便可 session_id($_GET["PHPSESSID"]) } session_start();
第三种方式:使用session.use_trans_sid=1
,php.ini中配置
这种方式会在url上自动加上SID(href,location,action,注意:js跳转不会添加上SID)
分布式缓存了解一下
相关的问题还有PHP7性能提高了,为何
curl(链接通信各类服务器、使用各类协议)、gd(图像生成和处理)、mcrypt(加密扩展库)、mysqli(跟mysql系统函数的区别:mysqli是mysql系统函数的加强版,更稳定更高效更安全,与mysql_query()对应的有mysqli_query(),属于面向对象,用对象的方式操做驱动mysql数据库。mysqli是永远链接函数,mysqli屡次运行mysqli将使用同一链接进程,从而减小了服务器的开销。
) openssl(对称/非对称加解密)、pcre(正则,相关的问题还有经常使用的正则库PCRE/POSIX)
notice、warning、error、exception等
————————————————
基本的增删改查语句,关联语句,函数等过一遍就行,能够过一下imooc的教程
慕课网——与MySQL的零距离接触
(1)遇到一个页面查询缓慢的时候,由于可能会有多个sql,因此我首先是会去开启慢查询日志,定位到是哪一条sql
(2)肯定sql以后,若是是非查询类型的如修改删除就改成查询类型。
(3)检查sql是否是有一些复杂查询,好比子查询,联合查询等等,将这些能够拆分的sql拆解出来
(4)把拆解出来的sql进行show profiles
检查,查看具体每条子sql的执行时间
(5)或者直接explain
你的sql语句,
最主要的一个是type类型,能够看到指定的表使用的链接方式,是null,system,const,eq_ref,ref,range,index仍是all(各自表明的含义)
比较好的sql查询至少达到range
级别,最好达到ref
看看id列,id列表示执行顺序,id越大,则越先执行
(6)一张表的索引最好不超过6个。考虑删除使用不频繁的索引。理想的索引状况下,查询频繁,区分度高(如字段值只有男和女区分度就不高),长度小,尽可能能覆盖经常使用的查询字段
针对列中的值从左往右创建索引,截的越短,重复度越高区分度越小,因此效果越很差
截的越长,区分度越高,索引效果好,可是增删改慢间接影响查询速度
优先考虑在where 和orderby创建索引。
还有其它常见的就
(7)字符集的转换:客户端或者应用程序使用的字符集可能和数据库使用的字符集不一致,须要在mysql运行过程当中隐含转化
(8)模糊查询优化:
使用FULLTEXT
全文搜索(注意前提是MyISAM
存储引擎)
FULLTEXT解析器用“ ”(空格)、“,”(逗号)“.”(点号)做为默认的单词分隔符,所以对于不使用这些分隔符的语言如汉语来讲,FULLTEXT解析器不能正确的识别单词,对于这种状况需作额外处理。
(9)尽可能知足范式(有的状况下要用反范式)下面是三大范式
的区别,也要去看一下
第一范式:数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。若是实体中的某个属性有多个值时,必须拆分为不一样的属性
第二范式:知足第一范式前提,当存在多个主键的时候,才会发生不符合第二范式的状况。好比有两个主键,不能存在这样的属性,它只依赖于其中一个主键,这就是不符合第二范式
MyISAM强调性能
,其执行速度比InnoDB类型更快,但不支持事务,而InnoDB
提供事务支持以及外部键、行级锁等高级数据库功能
(2)若是增删改
操做比较多,或者须要事务支持,则使用Innodb,若是是读的操做
比较多,则使用Myisam
(3)MyISAM表锁,Innodb行锁
(1)memcached只能使用简单的key-value形式进行存储,而redis还支持hash,list,set等等。所以须要其余的数据类型支持的时候用redis更方便
(2)memcached是多核,redis是单核,因此在存储小数据上redis性能更高,反之大数据上memcached的性能比redis要高
(3)memcached不支持持久化操做,数据不能备份,只能用于缓存使用,重启后数据所有丢失。
redis支持持久化操做能够数据备份和数据恢复
(4)redis只能使用单线程,性能受限于cpu性能,memecached是多线程
ACID
)Atomicity原子性:事务是一个不可分割的工做单位,要么都发生要么都不发生
Consistency一致性:必须使数据库从一个一致性状态变换到另一个一致性状态(即开启一个事务以后不能再开启一个事务,除非提交或者新建一个线程)
Isolation隔离性:多个用户并发访问数据库时,数据库为每一个用户开启的事务不能被其它事务的操做数据干扰,多个并发事务之间要相互隔离
Durability持久性:未commit以前能够回滚,一旦commit对数据的改变就是永久性的
事务保存点
能够设置多个保存点 savepoint a;savepoint b;savepoint c;
可是回退须要按照顺序回退,即若是回退rollback to b; c保存点就不存在了
①读未提交(read uncommitted
)set session transaction isolation level read uncommitted
②读已提交(read committed
)set session transaction isolation level read committed
③可重复读(repeatable read
) 系统默认的隔离级别set session transaction isolation level repeatable read
④可串行化(serializable
)(独占某个线程的时候使用,直到A程序commit后B程序才能成功update,在那以前是在队列中)set session transaction isolation level serializable
隔离程度,从上到下愈来愈强
①脏读:一个事务读取另外一个事务还没有提交的修改
②不可重复读:同一查询在同一事务中屡次进行,因为其余提交事务所作的修改或删除,每次返回不一样的结果集
③幻读(虚读):同一查询在同一事务中屡次进行,因为其余提交事务所作的插入操做,每次返回不一样的结果集
function getDepth($arr){
$max_depth = 1; foreach($arr as $key=>$val){ if(is_array($val)){ $depth = getDepth($val) + 1; if($depth > $max_depth){ $max_depth = $depth; } } } return $max_depth;
}
(1)消息(临时响应):1字头。
这一类型的状态码,表明请求已被接受,须要继续处理。
这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。因为 HTTP/1.0 协议中没有定义任何 1xx 状态码,因此除非在某些试验条件下,服务器禁止向此类客户端发送 1xx 响应。
eg.
100: 服务器仅接收到部分请求
101: 服务器已经理解了客户端的请求,并将经过Upgrade 消息头通知客户端采用不一样的协议来完成这个请求。(2)成功:2字头。
表明请求已经被服务器所接收、理解、并接受
eg.
200: 请求成功(其后是对GET和POST请求的应答文档。)
201: 请求被建立完成,同时新的资源被建立。(3)重定向:3字头。
表示要完成请求,须要进一步操做。 一般,这些状态代码用来重定向。
eg.
300: 多重选择。连接列表。用户能够选择某连接到达目的地。
301: 页面永久重定向
302: 页面临时重定向
304: 资源未被修改,服务器告诉客户,原来缓冲的文档还能够继续使用(4)请求错误:4字头。
这些状态代码表示请求可能出错,妨碍了服务器的处理
eg.
400: 服务器未能理解请求
401: 被请求的页面须要用户名和密码。
403: 对请求页面的访问被禁止。(一般为没有读权限)
404: 服务器没法找到被请求的页面。
408: 超出服务器等待时间
413: 因为所请求的实体的太大,服务器不会接受请求。
414: 因为url太长,服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时,就会发生这种状况。(5)服务器错误:5字头。
这些状态代码表示服务器在尝试处理请求时发生内部错误。
这些错误多是服务器自己的错误,而不是请求出错
eg.
500: 请求未完成。服务器遇到不可预知的状况。
502: 做为网关或者代理工做的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503: 服务器临时过载或当机。
504: 网关超时。
<input type="text" good="" />
获取input标签中的good属性值所用的函数是getAttribute("good")
<div id='table'></div>
用ajax方法,把请求返回的参数(格式是json)填充到table中,以表格形式列出
21号下午一道笔试题,由于须要联系上文有点麻烦,大概讲一下思路吧,主要是考察对jq的ajax函数还有其余一些jq函数的熟悉程度,我直接上代码
var html = ''; $(function(){ $.ajax({ type:'post', url:'.....', data:(忘了发送的参数是什么了,随便写一下){ a:111, b:222 }, dataType:json, success:function(data){ var res = jQuery.parseJSON(data); for(var i=0;i<res.length;i++){ html += '<tr><td>' + res[i].Time + '</td><td>' + res[i].num + '</td></tr>'; } $('#table').html('<table>' + html + '</table>'); }, error:function(){ } }) })
随便写些经常使用指令:mkdir cd chmod rm cp tar make cat vi ps
等等
查看文件最后10行:tail 1.txt
最后25行:tail -25 1.txt
头5行:head -5 1.txt
755 rwxr-xr-x
表明含义:
第一位7等于4+2+1,因此就是rwx,全部者有读取、写入、执行的权限
第二位5是4+1,r-x,同组用户具备读取、执行权限,
第三位5,表明其余用户有读取、执行的权限。
从左至右,1-3位表明文件全部者的权限,4-6位表明同组用户的权限,7-9表明其余用户的权限。
防盗链处理(在nginx上配置),防止图片、资源等被非法调用
①合并一些css、js文件,减小http请求
雪碧图css spirites 前端自动构建工具打包 图片使用base64编码
②启用浏览器缓存和文件压缩
给静态资源文件指定过时时间 文件压缩如把图片压缩小一些,减小流量带宽消耗
③CDN加速
把一些前端资源文件放到cdn中,还能够把数据缓存到cdn节点中 cdn原理:
④创建独立图片服务器
⑤一些不重要的数据,能够作成ajax异步请求,在须要的时候再进行引入、展现,如js、jquery等等
①页面静态化,如smarty
②作一些程序上的并发处理,如多线程多进程的异步处理、队列处理等
③队列处理
①数据库缓存(memcache redis等)
②分库分表、分区操做
垂直拆分、水平拆分 分区
③读写分离
把一些服务器、一些数据彻底分开 一些服务器作读操做(查询) 一些服务器作些操做(增删改)
④负载均衡
⑤索引、高并发安全问题加锁
使用nginx的反向代理来实现负载均衡
我回答的时候举了作项目的时候的例子,先缕一下思路。由于后台这一块,只要思路缕清了,在纸上写出来,接下来一步一步去debug,不断var_dump、print_r、echo,最后exit()一下,其实很好debug
后来发现面试官想问的其实不是这个,而是错误日志,今天特地去搜了一下,研究了一个下午终于会一点点
首先开启错误日志,配置php.ini
error_reporting = E_ALL ;将会向PHP报告发生的每一个错误,包括ERROR、NOTICE、WARNING等等
display_errors = Off ;本地测试开启,项目上线要关闭,防止服务器重要信息泄露
log_errors = On ;开启错误日志
log_errors_max_len = 1024 ;设置每一个日志项的最大长度
error_log = /www/phpernote/error.log ;指定产生的错误报告写入的日志文件位置
配置完以后重启服务器便可,参考了php的异常和处理文章的一小段代码,本身另外作了测试
<?php set_error_handler('myErrorHandler'); function myErrorHandler($errno,$errmsg,$file,$line){ echo "<b>错误代码:</b>[{$errno}] {$errmsg} <br/>".PHP_EOL; echo "<b>错误行号:</b>{$file}文件中的第 {$line} 行<br/>".PHP_EOL; echo "<b>PHP版本:</b>".PHP_VERSION."(".PHP_OS.") <br/>".PHP_EOL; $datetime = date('Y-m-d H:i:s',time()); error_log('时间:' . $datetime . '错误的信息:' . $errmsg . '错误文件所在位置:' . $_SERVER['SCRIPT_FILENAME']); } echo $test; test(); echo 'good'; ?>
下面是error.log输出的内容
网页输出的内容:
手动分割线
在上面提到的内容,其实有一些能够本身去拓展看一下的,好比提到innodb和myisam,前者是使用行锁,后者是使用表锁,那能够去拓展一下,什么是表锁什么事行锁,逐渐增大本身的知识面
先更新到这,明天还得去招聘会碰壁...
2017/03/18
先写到这里。前两天跑了广工招聘会,今天有一家联系明天面试了 ,继续去撞壁...
2017/03/20
今天基本肯定offer,去一家手游公司,实习期一天100,转正后6K,包三餐,单双休,上午九点上班,周五周六6点下班,平时都是到8点,8~8.5小时的工做时间,上班时间有点大,不过应届毕业生嘛,学历也通常,其实这样的工做强度加上薪资我以为已是能够接受了。hr姐姐今天跟我说其实我笔试成绩通常,面试不错。但愿实习期之间表现好一点,争取可以转正吧,但愿各位应届毕业生也能有一份好的offer,多去尝试,学历高的当然好,学历低的也不要怕,多去跑一下招聘会宣讲会,仍是感谢一直鼓励我去投其余公司的黑妹(男的),多尝试,总会有机会的!昨天刚过完22岁生日,今天肯定offer,明天五月天演唱会,一切来得刚恰好。切骄切燥,加油!
2017/03/24
七月底裸辞了,顺便考了驾照,潇洒了一阵子。可是辞职时有多洒脱,如今就有多焦虑,找工做仍是须要看缘分,不知道之后会不会继续作技术,仍是以为本身对技术没有太多的天分,不少东西仍是比较文科生思惟,但愿能肯定一份好的offer吧,期待下午这声铃响。2019/10/21