共计 7555 个字符,预计需要花费 19 分钟才能阅读完成。
一、单选题(共 27 题,每题 5 分)
1.阅读下面 PHP 代码,并选择输出结果()
classA{publicstatic$num=0;publicfunction\_\_construct(){self::$num++;}}newA();newA();newA();echoA::$num;
PHP
A、0
B、1
C、2
D、3
参考答案:D
答案解析:static 属性常驻内存
2.PHP 单例模式操作描述错误的是?
A、单例模式第一次实例会被建立以后执行可以直接使用
B、需要一个保存类的唯一实例的静态成员变量
C、构造函数和克隆函数必须声明为私有的
D、必须提供一个访问这个实例的公共的静态方法
参考答案:A
答案解析:PHP 中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎 PHP 单例模式就没有什么意义了,所以 PHP 单例模式只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时有意义
3.下面那个不是 mysql 存储引擎的锁类型?
A、表锁
B、页锁
C、行锁
D、无
参考答案:B
答案解析:mysql 中 myisam 是有表锁,innodb 是行锁,基于索引加锁,如果 where 条件没有索引,是所有行加锁;sql server 才有页锁
4.以下哪条不是 PHP 语言的特性?
A、开源
B、免费
C、基于客户端
D、便捷高效
参考答案:C
答案解析:PHP 语言的特性为:开源、免费和便捷高效。
5.关于 PHP 模式修饰符说法错误的是?
A、i 大小写不敏感匹配
B、m ^ 将只匹配字符串的开头
C、x 空白和 #注释将被忽略
D、将替换后的字符串作为 php 代码评估执行
参考答案:B
答案解析:m 为增强的行锚点模式,\\n 的前后也会被认为结束和开始
6.关于 Laravel 中间件错误的是?
A、运行 Artisan 命令 make:middleware 创建新的中间件
B、可定义前置 & 后置中间件
C、中间件是代理模式
D、中间件是中介模式
参考答案:C
答案解析:运行 Artisan 命令 make:middleware 创建新的中间件 可定义前置 & 后置中间件
7.要激活 GD 库,必须启用配置文件中的()命令
A、php_gd2.dll
B、PHP.dll
C、PHP.ini
D、php_mbstring.dll
参考答案:A
答案解析:PHP 中要想使用 GD 库必须启用 php_gd2.ll 动态连接库文件
8.关于在 PHP 中的 socket,说法错误的是
A、可使用 fsocketopen 函数建立 socket 连接
B、工作在第七层,可基于 TCP 和 UDP 协议
C、在 PHP 中默认超时时间是 30 秒
D、工作在第四层,可基于 TCP 和 UDP 协议
参考答案:B
答案解析:工作在第四层,可基于 TCP 和 UDP 协议 在 PHP 中默认超时时间是 30 秒
9.JSON 格式数据,错误的是?
A、JSON 一种轻量级的数据交换格式
B、JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯(包括 C, C++, C#, Java, JavaScript, Perl, Python 等)
C、这些特性使 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(网络传输速率)。
D、值是无序列表
参考答案:D
答案解析:值是有序列表
10.关于 PHP 数组排序原理,错误的是?
A、申请 n 个额外空间
B、遍历双链表
C、排序后单链表中节点的位置发生变化,因而调整指定指向
D、设置 HashTable 的 pListTail
参考答案:C
答案解析:1. 申请 n 个额外空间 2. 遍历双链表 3. 调用排序函数 zend\_qsort(内部是快速排序算法)对数组排序 4. 排序后,双链表中节点的位置发生变化,因而调整指定指向 5. 遍历数组,分别设置每一个节点的 pListLast 和 pListNext 6. 设置 HashTable 的 pListTail
11.关于 Redis 的应用场景,以下说法不正确的是?
A、交集,并集,差集
B、计数器、队列
C、排行榜
D、新闻发布系统
参考答案:D
答案解析:缓存——热数据、计算器、队列、位操作、最新列表、分布式锁与单线程机制、交集,并集,差集、排行榜,这些都是典型的 redis 处理场景。答案为 D
12.关于漏洞扫描的描述,以下哪项是错误的?
A、漏洞扫描是一种基于网络远程检测目标网络或主机安全性脆弱性的技术,可以被用来进行模拟攻击实验和安全审计.
B、漏洞扫描用来探测目标主机系统是否存在漏洞,一般是对目标主机进行特定漏洞的扫描.
C、漏洞扫描就是一种被动的防范措施,可以有效避免黑客攻击行为.
D、可以根据 Ping 扫描和端口扫描的结果进行漏洞扫描.
参考答案:C
答案解析:漏洞扫描是一种主动的防范措施,能有效避免黑客攻击行为,做到防患于未然安全扫描就是一种主动的防范措施
13.PHP 程序使用 utf- 8 编码, 以下程序输出结果是什么?
$str\=’hello 你好世界 ’;echostrlen($str);
PHP
A、9
B、13(gbk)
C、18
D、17(utf8)
参考答案:D
答案解析:strlen() 函数返回字符串的长度。utf- 8 编码一个汉字是 3 个字符,5 个英文字符 + 3 字符 \* 4 个中文 =17 个字符
14.栈和队列具有相同的()
A、抽象数据类型
B、逻辑结构
C、存储结构
D、运算
参考答案:B
答案解析:线性表、栈、队列的逻辑结构是一样的,都属于线性结构。只是他们对数据的运算不同,从而表现出不同的特点
15.为什么 InnoDB 表要建议用自增列做主键?
A、使用自增列 (INT/BIGINT 类型) 做主键,这时候写入顺序是自增的,和 B + 数叶子节点分裂顺序一致
B、无
C、该表不指定自增列做主键,同时也没有可以被选为主键的唯一索引(上面的条件),这时候 InnoDB 会选择内置的 ROWID 作为主键,写入顺序和 ROWID 增长顺序一致
D、使用自增列 (INT/BIGINT 类型) 做主键,这时候写入顺序是自增的,和 B + 数叶子节点分裂顺序一致;该表不指定自增列做主键,同时也没有可以被选为主键的唯一索引(上面的条件),这时候 InnoDB 会选择内置的 ROWID 作为主键,写入顺序和 ROWID 增长顺序一致;除此以外,如果一个 InnoDB 表又没有显示主键,又有可以被选择为主键的唯一索引,但该唯一索引可能不是递增关系时(例如字符串、UUID、多字段联合唯一索引的情况),该表的存取效率就会比较差
参考答案:D
答案解析:1.InnoDB 引擎表是基于 B + 树的索引组织表 (IOT);2. 每个表都需要有一个聚集索引(clustered index);3. 所有的行记录都存储在 B + 树的叶子节点(leaf pages of the tree);4. 基于聚集索引的增、删、改、查的效率相对是最高的;5. 如果我们定义了主键(PRIMARY KEY),那么 InnoDB 会选择其作为聚集索引;6. 如果没有显式定义主键,则 InnoDB 会选择第一个不包含有 NULL 值的唯一索引作为主键索引;7. 如果也没有这样的唯一索引,则 InnoDB 会选择内置 6 字节长的 ROWID 作为隐含的聚集索引(ROWID 随着行记录的写入而主键递增,这个 ROWID 不像 ORACLE 的 ROWID 那样可引用,是隐含的)。因此:1. 使用自增列(INT/BIGINT 类型) 做主键,这时候写入顺序是自增的,和 B + 数叶子节点分裂顺序一致;2. 该表不指定自增列做主键,同时也没有可以被选为主键的唯一索引(上面的条件),这时候 InnoDB 会选择内置的 ROWID 作为主键,写入顺序和 ROWID 增长顺序一致;3. 如果一个 InnoDB 表又没有显示主键,又有可以被选择为主键的唯一索引,但该唯一索引可能不是递增关系时(例如字符串、UUID、多字段联合唯一索引的情况),该表的存取效率就会比较差
16.对以下 Javascript 代码说法正确的是?
varobj1 ={
name:’sss’, value:0,add:function(a, b, c){
this.value =a +b + c;
},get:function(){
console.log(this.name,this.value)
}}varobj2 ={name:’qqq’, value:0}
obj1.add.call(obj2,1,2,3);
console.log(obj2.value);
JavaScript
A、值为 0
B、obj2 引用了 obj1 的方法
C、执行 call 时,函数里的 this 指向 obj1
D、最后 obj1 的 value 值为 6
参考答案:B
答案解析:调用了 call,则 obj2 , add 的 this 就指向了 obj2。就像 obj2 借用了 obj1 的方法
17.以下关于引用说法错误的是?
A、引用不是 C 的指针
B、引用不允许用两个变量来指向同一个内容
C、用引用可以传递变量
D、可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。
参考答案:B
答案解析:引用是允许用两个变量来指向同一个内容的
18.GoAccess 虽然很强大但是他不能做以下哪项工作?
A、生成统计数据带宽统计
B、可生成 HTML 报告
C、可发送 HTTP 请求
D、各 HTTP 状态码统计
参考答案:C
答案解析:GoAccess:是一款开源、实时,运行在命令行终端下的 web 日志分析工具。该工具提供快速、多样的 HTTP 状态统计,可以令管理员不再纠结于统计各类数据 GoAccess 主要以统计为主
19.关于线程的,说法错误的是?
A、线程是进程的一个实体, 是 CPU 调度和分派的基本单位
B、它是比进程更小的能独立运行的基本单位
C、线程和进程一样拥有系统资源
D、线程自己基本上不拥有系统资源
参考答案:C
答案解析:线程是指进程内的一个执行单元, 也是进程内的可调度实体。线程自己基本上不拥有系统资源
20.关于 php 文件指针的说法错误的是?
A、feeek() 移动文件指针到指定位置
B、fcreate() 用于创建一个文件
C、rewind()将文件指针设为文件流的开头
D、feof() 测试文件指针是否到达文件结束的位置
参考答案:B
答案解析:php 中 打开和创建文件都是 fopen()函数,不存在 fcreate()函数
21.下边是 php 的函数而不是语言结构的是?
A、eval()
B、require_once()
C、list()
D、empty()
参考答案:B
答案解析:仅仅是提纲挈领、提醒下大家注意 php 的语言结构和函数这个点、可能过多的时候我们认为 empty、list、isset 等这类的是函数、实际上不上。语言结构列表:echo() print() die() isset() unset() include(),注意,include_once()是函数 require(),注意,require_once()是函数 array() list() empty()
22.该正则可以匹配下列哪个字符串?/^sjm/
A、absjm
B、phpsjm
C、sjmphp
D、phpsimd
参考答案:C
答案解析:该正则匹配以 sjm 开头的字符串
23.下列哪个选项可以查看 php 运行模式?
A、php -r phpinfo();|find / grep”Server API”
B、php -r “echo php_sapi_name();”
C、phpinfo();
D、以上都是
参考答案:D
答案解析:三个都可以查看 php 的运行模式
24.以下 inode 不包含的是?
A、文件的读写权限
B、文件的位置
C、当前目录下的文件数
D、文件的时间戳
参考答案:C
答案解析:inode 中存的是该文件种的信息,包含文件的字节数,uid 和 gid,读写执行权限,时间戳 ctime、mtime、atime,链接数:有多少个文件名指向这个 inode,文件数据 block 位置
25.以下代码输出的结果是?
if(‘xuexi’==0){
echo1;}else{
echo2;}
PHP
A、1
B、2
C、3
D、4
参考答案:A
答案解析:if($str==0),字符串和数字比较是否相等,相当于 把 $str 字符串隐性转换为数字,然后再比较,相当于 if(intval($str) == 0 )。if($str==0) 判断 和 if(intval($str) == 0 ) 是等价的,而和 if ($str) 是不一样的。if ($str) 可以判断 $str 值有没有被初始化。有没有付值,只要付值,就返回 true。当然你也可以使用 $str=” 字符串 ”;if($str===0){echo “ 返回了 true.”;} , 就是 判断 $str 的数据类型 和值 都和 0 的值 数据类型一样,才可以返回 true
26.把 CSS 样式表与 HTML 网页关联,不正确的方法是()。
A、在 HTML 文档的 <head> 标签内定义 CSS 样式
B、用 @import 引入样式表文件
C、在 HTML 文档的 <!– –> 标签内定义 CSS 样式
D、用 <link> 标签链接网上可访问的 CSS 样式表文件
参考答案:C
答案解析:是 HTML 注释的表示方式,在这里定义 CSS 样式无效。
27.一下哪个不是 PHP 的运行模式?
A、CGI
B、FastCGI
C、apache2handler
D、apache
参考答案:D
答案解析:前三个是常用的运行模式,apache 是 web 服务器软件
二、多选题(共 3 题,每题 5 分)
1.分库分表之后,id 主键如何处理?
A、单库生成自增 id
B、设置数据库 sequence 或者表自增字段步长
C、UUID
D、snowflake 算法
参考答案:A,B,C,D
答案解析:
snowflake 算法
A、B、C 也是理论可行的,但是都各自有缺点,最好用 snowflake 算法。
snowflake 算法是 twitter 开源的分布式 id 生成算法,采用 Scala 语言实现,是把一个 64 位的 long 型的 id,1 个 bit 是不用的,用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。
1 bit:不用,为啥呢?因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。41 bit:表示的是时间戳,单位是毫秒。41 bit 可以表示的数字多达 2^41 – 1,也就是可以标识 2^41 – 1 个毫秒值,换算成年就是表示 69 年的时间。10 bit:记录工作机器 id,代表的是这个服务最多可以部署在 2^10 台机器上哪,也就是 1024 台机器。但是 10 bit 里 5 个 bit 代表机房 id,5 个 bit 代表机器 id。意思就是最多代表 2^5 个机房(32 个机房),每个机房里可以代表 2^5 个机器(32 台机器)。12 bit:这个是用来记录同一个毫秒内产生的不同 id,12 bit 可以代表的最大正整数是 2^12 – 1 = 4096,也就是说可以用这个 12 bit 代表的数字来区分同一个毫秒内的 4096 个不同的 id。
2.Redis 内存淘汰机制有哪些?
A、noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错
B、allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key
C、volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key
D、allkeys-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
参考答案:A,B,C
答案解析:
redis 内存淘汰机制有以下几个:
noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
3.关于 PHP-FPM 子进程数量说法正确的有?
A、PHP-FPM 子进程数量不能太多,太多了增加进程管理的开销以及上下文切换的开销
B、dynamic 方式下,最合适的子进程数量为 在 N + 20% 和 M / m 之间(N 是 CPU 内核数量,M 是 PHP 能利用的内存数量,m 是每个 PHP 进程平均使用的内存数量)
C、static 方式:M / (m * 1.2)(M 是 PHP 能利用的内存数量,m 是每个 PHP 进程平均使用的内存数量)
D、pm.max_requests 可以随便设置 , 但是为了预防内存泄漏的风险,还是设置一个合理的数比较好
参考答案:A,B,C,D
答案解析:
首先,我们关注下 PHP-FPM 的运行方式:
·static:表示在 php-fpm 运行时直接 fork 出 pm.max_chindren 个子进程,
·dynamic:表示,运行时 fork 出 start_servers 个进程,随着负载的情况,动态的调整,最多不超过 max_children 个进程。
一般推荐用 static,优点是不用动态的判断负载情况,提升性能;缺点是多占用些系统内存资源。
PHP-FPM 子进程数量,是不是越多越好?当然不是,pm.max_chindren,进程多了,增加进程管理的开销以及上下文切换的开销。更核心的是,能并发执行的 php-fpm 进程不会超过 cpu 个数。如何设置,取决于你的代码。如果代码是 CPU 计算密集型的,pm.max_chindren 不能超过 CPU 的内核数。如果不是,那么将 pm.max_chindren 的值大于 CPU 的内核数,是非常明智的。国外技术大拿给出适用于 dynamic 方式的公式:在 N + 20% 和 M / m 之间。
00001.N 是 CPU 内核数量。
00002.M 是 PHP 能利用的内存数量。
00003.m 是每个 PHP 进程平均使用的内存数量。
*static 方式的公式:M / (m 1.2)**
当然,还有一种保险的方式,来配置 max_children。先把 max_childnren 设置成一个比较大的值。稳定运行一段时间后,观察 php-fpm 的 status 里的 max active processes 是多少,然后把 max_children 配置比它大一些就可以了。
pm.max_requests:指的是每个子进程在处理了多少个请求数量之后就重启。这个参数,理论上可以随便设置,但是为了预防内存泄漏的风险,还是设置一个合理的数比较好。