2019年5月面试题总结-持续更新

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35461287/article/details/90174472

一、z-index是什么

 z-index属性决定了一个HTML元素的层叠级别。元素层叠级别是相对于元素在Z轴上(与X轴Y轴相对照)的位置而言。一个更高的Z-index值意味着这个元素在叠层顺序中会更靠近顶部

二,使用函数及数组来获取当月第一天及最后一天,比较实用
   function getthemonth($date)
   {
   $firstday = date('Y-m-01', strtotime($date));
   $lastday = date('Y-m-d', strtotime("$firstday +1 month -1 day"));
   return array($firstday,$lastday);
   }
   $today = date("Y-m-d");
   $day=getthemonth($today);
   echo "当月的第一天: ".$day[0]." 当月的最后一天: ".$day[1];
   echo "<br/>";

三,PHP获取上个月最后一天的一个容易忽略的问题

http://www.laruence.com/2018/07/31/3207.html

 

四,Redis 和 Memcached 和mongodb的区别

https://blog.csdn.net/qq_35461287/article/details/79913987

 

 mysql中int、bigint、smallint 和 tinyint的区别详细介绍

1 bytes = 8 bit ,一个字节最多可以代表的数据长度是2的8次方 11111111 在计算机中也就是

-128到127

1.BIT[M]

位字段类型,M表示每个值的位数,范围从1到64,如果M被忽略,默认为1

2.TINYINT[(M)] [UNSIGNED] [ZEROFILL]  M默认为4

很小的整数。带符号的范围是-128到127。无符号的范围是0到255。

3. BOOL,BOOLEAN

是TINYINT(1)的同义词。zero值被视为假。非zero值视为真。

4.SMALLINT[(M)] [UNSIGNED] [ZEROFILL] M默认为6

小的整数。带符号的范围是-32768到32767。无符号的范围是0到65535。

5.MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] M默认为9

中等大小的整数。带符号的范围是-8388608到8388607。无符号的范围是0到16777215。

6. INT[(M)] [UNSIGNED] [ZEROFILL]   M默认为11

普通大小的整数。带符号的范围是-2147483648到2147483647。无符号的范围是0到4294967295。

7.BIGINT[(M)] [UNSIGNED] [ZEROFILL] M默认为20

大整数。带符号的范围是-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615。

注意:这里的M代表的并不是存储在数据库中的具体的长度,以前总是会误以为int(3)只能存储3个长度的数字,int(11)就会存储11个长度的数字,这是大错特错的。

tinyint(1) 和 tinyint(4) 中的1和4并不表示存储长度,只有字段指定zerofill是有用,
如tinyint(4),如果实际值是2,如果列指定了zerofill,查询结果就是0002,左边用0来填充。

 

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

char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:

  char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.

(在检索操作中那些填补出来的空格字符将被去掉)

在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).

 

在MySQL中用来判断是否需要进行对据列类型转换的规则

  1、在一个数据表里,如果每一个数据列的长度都是固定的,那么每一个数据行的长度也将是固定的.

  2、只要数据表里有一个数据列的长度的可变的,那么各数据行的长度都是可变的.

  3、如果某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型.

例外:长度小于4个字符的char数据列不会被转换为varchar类型

六,PHP解决网站大数据大流量与高并发

1:硬件方面

普通的一个p4的服务器每天最多能支持大约10万左右的IP,如果访问量超过10W那么需要专用的服务器才能解决,如果硬件不给力 软件怎么优化都是于事无补的。主要影响服务器的速度

有:网络-硬盘读写速度-内存大小-cpu处理速度。

2:软件方面

第一个要说的就是数据库,首先要有一个很好的架构,查询尽量不用* 避免相关子查询 给经常查询的添加索引 用排序来取代非顺序存取,如果条件允许 ,一般MySQL服务器最好安装

在Linux操作系统中 。关于apache和nginx在高并发的情况下推荐使用nginx,ginx是Apache服务器不错的替代品。nginx内存消耗少 官方测试能够支撑5万并发连接,在实际生产环境中跑

到2~3万并发连接数。php方面不需要的模块尽量关闭,使用memcached,Memcached 是一个高性能的分布式内存对象缓存系统,不使用数据库直接从内存当中调数据,这样大大提升了速

度,iiS或Apache启用GZIP压缩优化网站,压缩网站内容大大节省网站流量。

第二,禁止外部的盗链。

外部网站的图片或者文件盗链往往会带来大量的负载压力,因此应该严格限制外部对
于自身的图片或者文件盗链,好在目前可以简单地通过refer来控制盗链,Apache自
己就可以通过配置来禁止盗链,IIS也有一些第三方的ISAPI可以实现同样的功能。当
然,伪造refer也可以通过代码来实现盗链,不过目前蓄意伪造refer盗链的还不多,
可以先不去考虑,或者使用非技术手段来解决,比如在图片上增加水印。

第三,控制大文件的下载。

大文件的下载会占用很大的流量,并且对于非SCSI硬盘来说,大量文件下载会消耗
CPU,使得网站响应能力下降。因此,尽量不要提供超过2M的大文件下载,如果需要
提供,建议将大文件放在另外一台服务器上。

第四,使用不同主机分流主要流量

将文件放在不同的主机上,提供不同的镜像供用户下载。比如如果觉得RSS文件占用
流量大,那么使用FeedBurner或者FeedSky等服务将RSS输出放在其他主机上,这
样别人访问的流量压力就大多集中在FeedBurner的主机上,RSS就不占用太多资源了

第五,使用不同主机分流主要流量
将文件放在不同的主机上,提供不同的镜像供用户下载。比如如果觉得RSS文件占用流量大,那么使用FeedBurner或者FeedSky等服务将RSS输出放在其他主机上,这样别人访问的流量压力就大多集中在FeedBurner的主机上,RSS就不占用太多资源了。

第六,使用流量分析统计软件。
在网站上安装一个流量分析统计软件,可以即时知道哪些地方耗费了大量流量,哪些页面需要再进行优化,因此,解决流量问题还需要进行精确的统计分析才可以。比如:Google Analytics(Google分析)。

高并发和高负载的约束条件:硬件、部署、操作系统、Web 服务器、PHP、MySQL、测试

部署:服务器分离、数据库集群和库表散列、镜像、负载均衡

负载均衡分类: 1)、DNS轮循 2)代理服务器负载均衡 3)地址转换网关负载均衡 4)NAT负载均衡 5)反向代理负载均衡 6)混合型负载均衡

部署方案1:

适用范围:静态内容为主体的网站和应用系统;对系统安全要求较高的网站和应用系统。

Main Server:主服务器

承载程序的主体运行压力,处理网站或应用系统中的动态请求;

将静态页面推送至多个发布服务器;

将附件文件推送至文件服务器;

安全要求较高,以静态为主的网站,可将服务器置于内网屏蔽外网的访问。

DB Server:数据库服务器

承载数据库读写压力;

只与主服务器进行数据量交换,屏蔽外网访问。

File/Video Server:文件/视频服务器

承载系统中占用系统资源和带宽资源较大的数据流;

作为大附件的存储和读写仓库;

作为视频服务器将具备视频自动处理能力。

发布服务器组:

只负责静态页面的发布,承载绝大多数的Web请求;

通过Nginx进行负载均衡部署。

部署方案2:

适用范围:以动态交互内容为主体的网站或应用系统;负载压力较大,且预算比较充足的网站或应用系统;

Web服务器组:

Web服务无主从关系,属平行冗余设计;

通过前端负载均衡设备或Nginx反向代理实现负载均衡;

划分专用文件服务器/视频服务器有效分离轻/重总线;

每台Web服务器可通过DEC可实现连接所有数据库,同时划分主从。

数据库服务器组:

相对均衡的承载数据库读写压力;

通过数据库物理文件的映射实现多数据库的数据同步。

共享磁盘/磁盘阵列

将用于数据物理文件的统一读写

用于大型附件的存储仓库

通过自身物理磁盘的均衡和冗余,确保整体系统的IO效率和数据安全;

方案特性:

通过前端负载均衡,合理分配Web压力;

通过文件/视频服务器与常规Web服务器的分离,合理分配轻重数据流;

通过数据库服务器组,合理分配数据库IO压力;

每台Web服务器通常只连接一台数据库服务器,通过DEC的心跳检测,可在极短时间内自动切换至冗余数据库服务器;

磁盘阵列的引入,大幅提升系统IO效率的同时,极大增强了数据安全性。

Web服务器:

Web服务器很大一部分资源占用来自于处理Web请求,通常情况下这也就是Apache产生的压力,在高并发连接的情况下,Nginx是Apache服务器不错的替代品。Nginx (“engine x”) 是俄罗斯人编写的一款高性能的 HTTP 和反向代理服务器。在国内,已经有新浪、搜狐通行证、网易新闻、网易博客、金山逍遥网、金山爱词霸、校内网、YUPOO相册、豆瓣、迅雷看看等多家网站、 频道使用 Nginx 服务器。

Nginx的优势:

高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。

内存消耗少:在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。

内置的健康检查功能:如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。

策略:相对于老牌的Apache,我们选择Lighttpd和Nginx这些具有更小的资源占用率和更高的负载能力的web服务器。

Mysql:

MySQL本身具备了很强的负载能力,MySQL优化是一项很复杂的工作,因为这最终需要对系统优化的很好理解。大家都知道数据库工作就是大量的、 短时的查询和读写,除了程序开发时需要注意建立索引、提高查询效率等软件开发技巧之外,从硬件设施的角度影响MySQL执行效率最主要来自于磁盘搜索、磁盘IO水平、CPU周期、内存带宽。

  根据服务器上的硬件和软件条件进行MySQl优化。MySQL优化的核心在于系统资源的分配,这不等于无限制的给MySQL分配更多的资源。在MySQL配置文件中我们介绍几个最值得关注的参数:

改变索引缓冲区长度(key_buffer)

改变表长(read_buffer_size)

设定打开表的数目的最大值(table_cache)

对缓长查询设定一个时间限制(long_query_time)

如果条件允许 ,一般MySQL服务器最好安装在Linux操作系统中,而不是安装在FreeBSD中。
策略: MySQL优化需要根据业务系统的数据库读写特性和服务器硬件配置,制定不同的优化方案,并且可以根据需要部署MySQL的主从结构。

PHP:

1、加载尽可能少的模块;

2、如果是在windows平台下,尽可能使用IIS或者Nginx来替代我们平常用的Apache;

3、安装加速器(都是通过缓存php代码预编译的结果和数据库结果来提高php代码的执行速度)
eAccelerator,eAccelerator是一个自由开放源码php加速器,优化和动态内容缓存,提高了性能php脚本的缓存性能,使得PHP脚本在编译的状态下,对服务器的开销几乎完全消除。

Apc:Alternative PHP Cache(APC)是 PHP 的一个免费公开的优化代码缓存。它用来提供免费,公开并且强健的架构来缓存和优化 PHP 的中间代码。

memcache:memcache是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。主要机制是通过在内存里维护一个统 一的巨大的hash表,Memcache能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等

Xcache:国人开发的缓存器,

策略: 为PHP安装加速器。

代理服务器(缓存服务器):

Squid Cache(简称为Squid)是一个流行的自由软件(GNU通用公共许可证)的代理服务器和Web缓存服务器。Squid有广泛的用途,从作为网页服务器的前置cache服务器缓存相关请求来提高Web服务器的速度,到为一组人共享网络资源而缓存万维网,域名系统和其他网络搜索,到通过过滤流量帮助网络安全,到局域网通过代理网。Squid主要设计用于在Unix一类系统运行。

策略:安装Squid 反向代理服务器,能够大幅度提高服务器效率。

压力测试:压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分。压力测试的基本思路很简单:不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试。通常要进行压力测试的资源包括内部内存、CPU 可用性、磁盘空间和网络带宽等。一般用并发来做压力测试。
压力测试工具:webbench,ApacheBench等

漏洞测试:在我们的系统中漏洞主要包括:sql注入漏洞,xss跨站脚本攻击等。安全方面还包括系统软件,如操作系统漏洞,mysql、apache等的漏洞,一般可以通过升级来解决。

漏洞测试工具:Acunetix Web Vulnerability Scanner

No related content found.

七,Ajax之同步请求和异步请求的区别

同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。

 

用户填写所有信息后,提交给服务器,等待服务器的回应(检验数据),是一次性的。信息错误又要重新填写!

 

异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。

 

当用户填写完一条信息后,该信息会自动向服务器提交,然后服务器响应客户端,在此过程中,用户依然在填写表格的信息,即向服务器请求多次,节省了用户的时间,提高了用户的体验。

 

同步请求:

 

客户端请求(等待)->服务端处理->响应->页面载入

 

(缺少对象:XMLhttpRequest)

这时候如果有错误,只能再次发送请求,再次等待

 

 

 

异步请求:

 

比如当你填写邮箱地址的时候,页面当时就把邮箱地址发送到了服务器(也就是页面发送了一个请求),服务器做处理和响应,得到你的邮箱地址填写重复了,把响应结果发给页面,在这个过程中你仍然可以填写其他内容,这时候服务器会提示你有重复的邮箱地址,在页面上的表现只是邮箱地址旁别加了一行字或者把整个文本框标红,并没有重新刷你的页面,所有的填写错误会实时的显示出来,你也会实时的更正。这个过程中,你会有整个页面的刷新,也不会有整个页面的提交和等待,最后提交,一切都会搞定的

 

总结:页面上的操作和服务器端的操作互相之间不会造成阻塞

 

 

====一道面试题=建立异步请求过程的4个步骤:============

 

a:new一个XHR对象

 

b:调用open方法

 

c:send一些数据

 

d:对过程进行监听,来知道服务器是不是正确地做出了响应,接着可以做一些事情

mysql的锁

https://www.jianshu.com/p/2633fc36b57a

php计算 处理丢失精度问题 保留小数

 

参考链接:http://www.cnblogs.com/liuqd001/p/9401044.html

解决方法:

使用php的内库libbcmath(自 PHP 4.0.4,libbcmath 随同 PHP 一起发布。该扩展不需要任何外部的库)

$a = bcdiv(100, 100, 2); //除法
那么$a = 1.00;

bcadd — 2个任意精度数字的加法计算
bcsub — 2个任意精度数字的减法计算
bcdiv — 2个任意精度的数字除法计算
bcmul — 2个任意精度数字乘法计算
bcmod — 对一个任意精度数字取模
bccomp — 比较两个任意精度的数字
bcpow — 任意精度数字的乘方
bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulus
bcscale — 设置所有bc数学函数的默认小数点保留位数
bcsqrt — 任意精度数字的二次方根

mysql中订单量大发现索引比较慢如何优化索引

https://www.jb51.net/article/136000.htm

https://www.cnblogs.com/victor2302/p/6073821.html

十一MySQL对varchar型字段的索引,字段类型不同造成的隐式转换,导致索引失效

MySQL索引使用:字段为varchar类型时,条件要使用”包起来,才能正常走索引 
表user 里的id是BigInt类型,order表里关联到user表的id误建成userId varchar类型了,在ibatis上查询时,直接传入id Long类型,SQL查询非常慢,即使建立了userId索引,于是改成String 类型的userId去查询,SQL立马变的很快了。

通过explain sql可看下SQL是否走了索引,很快对比出来 
原因:字段类型不同造成的隐式转换,导致索引失效

http://www.mamicode.com/info-detail-2206023.html

十二PHP中数组合并的两种方法及区别介绍

一、写在前面

目前工作中接触到的PHP数组合并方式主要有三种:

1、+操作符

2、array_merge()

3、array_merge_recursive()

 

它们的区别主要体现在对于相关键名(数字键名、字符串键名)的处理方式,下面本文将以两个实际例子来体现~

 

二、相同字符串键

<?php

 

$arrFirst = [

    "first_key"  => 1,

    "second_key" => 1,

    "third_key"  => 1,

];

 

$arrSecond = [

    "first_key"  => 2,

    "second_key" => 2,

    "fourth_key" => 2,

];

 

//对于重复的字符串键,array_merge后,后面数组的键值会覆盖前面的

echo sprintf("\narray_merge result:\n%s", print_r(array_merge($arrFirst, $arrSecond), true));

 

//对于重复的字符串键,+操作后,前面数组的键值会覆盖后面的

echo sprintf("\narray + result:\n%s", print_r($arrFirst + $arrSecond, true));

 

//对于重复的字符串键,array_merge_recursive后,相同键名的键值会被合并到同一数组中(会递归)

echo sprintf("\narray_merge_recursive result:\n%s", print_r(array_merge_recursive($arrFirst, $arrSecond), true));

运行结果:

三、相同数字键

<?php

 

$arrFirst = [

    111 => "first",

    222 => "first",

    "first" //会指定默认的数字键223

];

 

$arrSecond = [

    111 => "second",

    333 => "second",

    "second" //会指定默认的数字键334

];

 

//对于重复的数字键,+操作后,前面数组的键值会覆盖后面的,保留之前数字键

echo sprintf("\narray + result:\n%s", print_r($arrFirst + $arrSecond, true));

 

//对于重复的数字键,array_merge后,重排数字键,不会覆盖

echo sprintf("\narray_merge result:\n%s", print_r(array_merge($arrFirst, $arrSecond), true));

 

//对于重复的数字键,array_merge_recursive后,重排数字键,不会覆盖

echo sprintf("\narray_merge_recursive result:\n%s", print_r(array_merge_recursive($arrFirst, $arrSecond), true));

运行结果:

四、附:PHP数组基础概述

一、KEY

1、Key只能为Integer或String,可同时存在

2、包含合法整型值的字符串Key会被转化为整型存储,如:’6’的Key会被转化为6存储

3、布尔值Key会被转化为整型存储,true会被转化为1存储,false会被转化为0存储

4、Null会被转化为空串存储

5、如果多个Key值被转化后为相同的值,则只使用最后一个,前面的被覆盖,如:一个数组中依次定义了’1’、true、1的key,则最后只会存储key为1的value,之前的值都被覆盖

6、如果未指定Key,则会被自动设定为之前用过的最大的整型Key+1,最小为0

 

二、VALUE

1、可以为PHP任意类型(字符串、整形、浮点型、布尔型、对象、数组、NULL、资源类型)

 

三、其他类型转化为数组类型

1、Integer、String、Float、Boolean、Resource类型转化为数组类型时,会被自动分配Key为0,Value为其原值

2、Object类型转化为数组类型时,成员变量名会作为数组Key,私有属性的Key会加上类名前缀,保护属性的Key会加上’*’前缀

3、Null会被转化为空数组

 

四、foreach

1、两种形式,foreach(arrasarraskey => value)与foreach(value)与foreach(arr as

value),其中value),其中value是值传递,使用&value是引用传递2、遍历依赖数组内部指针3、遍历结束后,value是引用传递2、遍历依赖数组内部指针3、遍历结束后,value会被保留,为防止在多次foreach时出现问题,可以在一次foreach后unset($value)或使用不同的变量

十三PHP的反射机制

https://www.cnblogs.com/aiweixiao/p/5766978.html

 

十四PHP数组键值使用单引号和双引号和无符号的区别

 

 

https://blog.csdn.net/shenpengchao/article/details/52447884

 

十五php中引用&的真正理解-变量引用、函数引用、对象引用

https://www.cnblogs.com/thinksasa/p/3334492.html

 

十六Redis总结(五)缓存雪崩和缓存穿透等问题

https://www.cnblogs.com/zhangweizhong/p/6258797.html

 

十七什么是格拉布斯准则

https://blog.csdn.net/weixin_42178492/article/details/81630707

 

十八请列举PHP规范PSR2不少于6条

https://blog.csdn.net/lcli2009/article/details/83450502

十九请列举列举php7相比php5新增的特性不少于5条

https://www.cnblogs.com/dong-blog/p/6376907.html

https://www.cnblogs.com/HKUI/p/10051569.html

二十php中假设ide中配置了xdebug调试端口9090,如何配置php.ini中的参数

https://blog.csdn.net/chengjianghao/article/details/80755046https://blog.csdn.net/yinhangbbbbb/article/details/79247331

 

二十一请列举设计模式不少于5条,并写出原理,和6大设计原则

 

https://www.cnblogs.com/geek6/p/3951677.html

https://www.cnblogs.com/liliuguang/p/9283384.html

 

二十二请补全下面单元代码

class Base

Todo//返回绑定类的实例对象

public  static  function instane(){

 //如果不存在实例,则返回实例

  if (empty(self::$instance)) {

   self::$instance = new self();

  }

  return self::$instance;

}

https://www.jb51.net/article/119891.htm

Todo//返回调用对象的类名

 

public function name1():string{

  return get_class($this);

}

二十三请实现一个手写一个完成的php中单链表基类

https://www.cnblogs.com/yulibostu/articles/10144157.html

https://blog.csdn.net/u012658346/article/details/51141288

 

二十四写一个pdo数据库操作函数,执行条件并返回满足条件的记录总数,以及实现完整的一个操作数据库的增删改查code;

https://blog.csdn.net/wxhzt/article/details/38459879

https://blog.csdn.net/Eyseem/article/details/53941758

 

二十五yii框架中自带的返回json格式的函数是哪个

$criteria=new CDbCriteria(array( 'order'=>'id asc', )); $count = Grade::model()->count($criteria); $model=Grade::model()->findAll($criteria); //$arr=array(array('id'=>1,'title'=>'高一'),array('id'=>1,'title'=>'高三')); $data2=CJSON::encode($model); $data='{'.'"total":'.$count.','.'"rows":'.$data2.'}'; echo $data;

二十六请写出yii框架中如何实现重定向跳转页面

二十七请写出yii中常用的验证rule()

https://blog.csdn.net/u010010725/article/details/51099326

猜你喜欢

转载自blog.csdn.net/qq_35461287/article/details/90174472