php面试总结

php面试笔试题:

1.请写出以下这段代码的执行结果。如果把第三行注释打开,结果又是多少?

$a = "Hello";
$b = &$a;
//unset($b);
$b = "World";
echo $a;
​

先说结果:World,Hello

在php中,&表示引用的意思,用两个变量表示同一个内容。

这里要区分一下引用和传值的区别。

引用:

变量存储数据时可以理解为变量的值放在一个空间里,而变量有一个地址指向那个空间,就如你的$test="aaaaa"; 变量$test就有一个地址指向存储了Hello的空间,当$b=&$a, 这时就是把$a指向那个空间的地址赋给了$b,所以当$b取出的值跟$a是一样的,都访问的同样的一个空间,同样当改变$b的值时(如$b="World")就是直接改变了那个空间里的值,这时你会发现$a的输出值也跟着改变了,这就是引用;

传值:

如果是直接赋值,即$b=$a;这时就会有一个新空间,存储的值也是Hello,并且$b的地址指向这个新空间,这时$b、$a两个变量的值相同,但他们相互不影响了,改变其中的一个值另外一个不影响,这就是传值。

如果在定义$b="World"之后unset($b),就只是销毁了变量b,但该例中unset($b)是在$b="World"之前,所以销毁的是$b=&$a的引用关系,所以输出的是Hello.

此部分有个网址讲的比较全面,https://www.cnblogs.com/gengyi/p/6399752.html

2.请写出一个匹配Ip地址的正则表达式:

IP地址的长度为32位(共有2^32个IP地址),分为4段,每段8位
用十进制数字表示,每段数字范围为0~255,段与段之间用句点隔开。
// 0.0.0.0 ~ 255.255.255.255

根据规则:每段相同,范围都在 0 ~ 255
0~255 对应的正则表达式为 ` 2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2} `

下面简单介绍它的组成 ` 2(5[0-5]{1}|[0-4]\d{1}) ` 和 ` [0-1]?\d{1,2} `

一:` 2(5[0-5]{1}|[0-4]\d{1}) `

1.  5[0-5]{1}    # 匹配:50 ~ 55
2.  [0-4]\d{1}   # 匹配:0 ~ 49

那么完整的 ` 2(5[0-5]{1}|[0-4]\d{1}) ` 匹配的就是 200 ~ 255

二:` [0-1]?\d{1,2} ` 
它匹配的是 0 ~ 199

所以整段表达式匹配的就是 0 ~ 255


0 到 255 的式子已经写出来了,那么一共四段再加上中间的点就很容易了

最终版

(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})

其实是可以再简化的,重复 `点和数字` 三次就可以了

(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})(\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})){3}

3.描述你所使用过的数据接口方式,及接口校验办法。

1)curl:

<?php
 $weather = curl_init(); 
 curl_setopt($weather,CURLOPT_URL,"https://api.pc2801.com/cqssc/".time()); 
 curl_setopt($weather, CURLOPT_SSL_VERIFYPEER, false); //如果接口URL是https的,我们将其设为不验证,如果不是https的接口,这句可以不用加
 curl_setopt($weather,CURLOPT_RETURNTRANSFER,true);
 $data = curl_exec($weather); 
 curl_close($weather);     
 $data=json_decode($data,true);//将json格式转化为数组格式,方便使用
?>

2)socket:

主要就是8个函数socket_create,socket_connect,socket_bind,socket_listen,socket_accept,socket_read,socket_write,socket_close

具体请看这个网页:https://www.cnblogs.com/loveyoume/p/6076101.html

3)webservice:

https://www.cnblogs.com/AloneSword/p/3501541.html

4.Mysql中InnoDB与MyISAM 引擎的区别

1) 事务支持
MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。

MyISAM是非事务安全型的,而InnoDB是事务安全型的,默认开启自动提交,宜合并事务,一同提交,减小数据库多次提交导致的开销,大大提高性能。

2) 存储结构
MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

3) 存储空间
MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。
InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

4) 可移植性、备份及恢复
MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。

5) 事务支持
MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

6) AUTO_INCREMENT
MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。
InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。

7) 表锁差异
MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

MyISAM锁的粒度是表级,而InnoDB支持行级锁定。简单来说就是, InnoDB支持数据行锁定,而MyISAM不支持行锁定,只支持锁定整个表。即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。

8) 全文索引
MyISAM:支持(FULLTEXT类型的)全文索引
InnoDB:不支持(FULLTEXT类型的)全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。

另外,MyIsam索引和数据分离,InnoDB在一起,MyIsam天生非聚簇索引,最多有一个unique的性质,InnoDB的数据文件本身就是主键索引文件,这样的索引被称为“聚簇索引”

9) 表主键
MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。InnoDB的主键范围更大,最大是MyISAM的2倍。

10) 表的具体行数
MyISAM:保存有表的总行数,如果select count(*) from table;会直接取出出该值。
InnoDB:没有保存表的总行数(只能遍历),如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。

11) CURD操作
MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

12) 外键
MyISAM:不支持
InnoDB:支持

13) 查询效率
没有where的count(*)使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count(*)时一般要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count(*)的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。

通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。

MyISAM和InnoDB两者的应用场景:
1) MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
2) InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。

5.如何分析一条sql语句的性能:

1)Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。

Explain语法:explain select … from … [where ...]

https://blog.csdn.net/jwq101666/article/details/78561022

2)

http://www.cnblogs.com/knowledgesea/p/3686105.html

6.数据表设计原则,常见的分库分表策略。

1)集群:

做mysql集群,有人会问mysql集群,跟分表有什么关系吗?虽然它不是实际意义上的分表,但是它启到了分表的作用,做集群的意义是什么呢?为一个数据库减轻负担,说白了就是减少sql排队队列中的sql的数量,举个例子:有10个sql请求,如果放在一个数据库服务器的排队队列中,他要等很长时间,如果把这10个sql请求,分配到5个数据库服务器的排队队列中,一个数据库服务器的队列中只有2个,这样等待时间是不是大大的缩短了呢?这已经很明显了。所以我把它列到了分表的范围以内,我做过一些mysql的集群:

linux mysql proxy 的安装,配置,以及读写分离 

mysql replication 互为主从的安装及配置,以及数据同步

优点:扩展性好,没有多个分表后的复杂操作(php代码)

缺点:单个表的数据量还是没有变,一次操作所花的时间还是那么多,硬件开销大。

2)分表

垂直拆分,水平拆分

数据库的话:

主从复制,垂直分区,水平分片

7.你能想象到的微信朋友圈数据库结构是什么样的?

8.如何实现负载均衡?多台服务器之间如何共享session?

https://www.cnblogs.com/danbing/p/7459224.html

9.XSS和CSRF分别指什么?原理是什么?怎么防范?

XSS(跨站脚本攻击)

原理:通过html注入来攻击,使用户输入的内容被程序识别为指令并执行。

防范:

 1. 在输入流中截住form data中的恶意脚本(然后过滤,只允许用户输入应该合法的值)
具体是:我们可以截下进入server的每一个request,对用户的输入数据进行恶意脚本清理。其中有效的一个方法就是使用spring的filter。
 2.html encode,对用户输入进行编码,对标签进行转换
--------------------- 
作者:ArthurZhou96 
来源:CSDN 
原文:https://blog.csdn.net/ArthurZhou96/article/details/79912153 
版权声明:本文为博主原创文章,转载请附上博文链接!

CSRF(跨站点请求伪造)

原理:

防范:

  1. Get 请求不对数据进行修改
  2. 不让第三方网站访问到用户 Cookie
  3. 阻止第三方网站请求接口
  4. 请求时附带验证信息,比如验证码或者 token

10.常用的排序算法有哪些,时间复杂度有什么差别?写出一种排顺序算法的具体实现方式。

冒泡排序,选择排序。

冒泡排序:

$array = array(1,3,5,2,9,38,23,13);

function bubbleSort($arr){
	$len = count($arr);
	for($i=0;$i<$len-1;$i++){
		for($j=0;$j<$len-1-$i;$j++){			
			if($arr[$j]>$arr[$j+1]){
				$tem = $arr[$j+1];
				$arr[$j+1] = $arr[$j];
				$arr[$j] = $tem;
			}
		}
	} 
	return $arr;
}

$new = bubbleSort($array);

11.从用户在浏览器中输入网址并回车开始,到看到完整的网页,中间都经历了那些过程?

1) 域名解析

2.)发起TCP的3次握手

3) 浏览器向服务器发送http请求

4)浏览器发送请求头信息

5) 服务器处理请求

6) 服务器做出应答

7)服务器发送应答头信息

8)服务器发送数据

9)tcp连接关闭

12.一个网站从前端到后端有哪些可以缓存的地方。

前端:cookie、localStorage、sessionStorage

13.请简述您最得意的开发之作。

 

后来技术面,当面问的一些问题:

1.Thinkphp框架在程序员写业务逻辑之前做了什么?

http://www.thinkphp.cn/topic/35803.html

2.数据结构有哪几种类型?

线性结构(数组、栈、队列和线性表),树形结构(二叉树,完全二叉树,二叉查找树,平衡二叉树),图形结构。

3.二分法查找算法。

$array = array(1,2,5,6,8,9,10);

function middleSearch($num,$arr){
    $start = 0;
    $end = count($arr);    
    while($start<$end-1){
        $middle = floor(($start+$end)/2);
        if($arr[$middle] == $num){
            return $middle;
        }elseif($arr[$middle] > $num){
            $end = $middle;
        }else{
            $start = $middle;
        }

    }
}
echo middleSearch(6,$array);

问了这几个问题,他就问不下去了,因为我都答得不好,主要是面试之前没有好好做功课。面试官很好,还给我提了意见,让我

以后面试的时候先做一些基础的面试题,说话的时候自信点。说明这次面试黄了。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值