php面试题2022答案详细,PHP中高级面试题 – 第一天
php面试题2022答案详细目录
php面试题2022答案详细
1. 解释什么是PHP,并说明它的主要特点。
PHP是一种通用的开源脚本语言,主要用于Web开发。它嵌入在HTML中,并允许开发者编写动态生成的网页。PHP的主要特点包括易于学习、使用灵活、支持多种数据库、可扩展性等。
2. 描述一下PHP中的变量类型。
PHP中的变量类型主要有以下几种:
- 标量类型:包括整型(integer)、浮点型(float)、布尔型(boolean)和字符串(string)。
- 复合类型:包括数组(array)和对象(object)。
- 特殊类型:包括null和资源(resource)。
3. PHP中有哪些常见的流程控制语句?
PHP中有以下常见的流程控制语句:
- if语句:用于条件判断。
- switch语句:用于多分支选择。
- while语句:用于循环执行一段代码。
- do-while语句:先执行一次代码块,然后进行条件判断,再循环执行。
- for语句:用于循环次数已知的情况。
- foreach语句:用于遍历数组或对象。
- break语句:用于跳出循环或switch语句。
- continue语句:用于跳过当前循环的剩余语句,进入下一次循环。
4. 如何连接到MySQL数据库?
```php
u003c?php
$servername =
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 检查连接是否成功
if (!$conn) {
die( 如何执行SQL查询并获取结果?
```php
u003c?php
$servername = 数据库用户名
$password =
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 检查连接是否成功
if (!$conn) {
die(qli_query($conn, conn));
}
// 遍历结果集并输出数据
while ($row = mysqli_fetch_assoc($result)) {
echo : ($result); // 释放结果集内存
mysqli_close($conn); // 关闭数据库连接
?u003e
```
PHP中高级面试题 – 第一天
一、写一个函数,获取一篇文章内容中的全部图片,并下载
二、什么是 CSRF 攻击?XSS 攻击?如何防范?
CSRF:跨站请求伪造,可以通过通过判断来源和加 Token 的方式来防范。
XSS:跨站脚本攻击,可以通过对内容转义和过滤来防范,还有 CSP
三、应用中我们经常会遇到在 user 表随机调取 10 条数据来展示的情况,简述你如何实现该功能。
四、MYSQL 中主键与唯一索引的区别
主键:绝对不能有空值。
唯一索引:可以有空值
关键是 S 上。
六、两台 mysql 服务器,其中一台挂了,怎么让业务端无感切换,并保证正常情况下讲台服务器的数据是一致的
不是核心业务的话,先停写,把备机拉起来,查看两台机器的日志,进行数据补偿,开写。
如果是核心业务的话,现在所有的操作都在正常的状态机器上。
把好的这台机器的备机拉起来,当主机。
以上全是应急操作。
实际上数据库的容灾设计要复杂得多。
面试官要是问你,备机的数据不一致怎么办,你要勇敢怼回去,你们每秒多少写入操作。
按照百万级表,每秒 1000 的写入效率,正常的设计是,分布在 2 台机器上每台 500。
这个级别的数据同步,出现差异的概率 可以忽略不计的。
有一台出现问题,另一台也可以抗住。
(正常的操作,还是先停写,等数据一致,切换,开写。
我们公司搞这些切换都是在凌晨 4.00 左右,核心业务的每秒写操作,只有十几个。
前后耽搁不到 20 秒)。
七、10 瓶水,其中一瓶有毒,小白鼠喝完有毒的水之后,会在 24 小时后死亡,问:最少用几只小白鼠可以在 24 小时后找到具体是哪一瓶水有毒。
答案:四只
二进制问题。
薛定谔的老鼠。
一只老鼠有两个状态,死活,对应 01。
假设老鼠的个数为 A,则有 2^A>=10; A=4;
思路很简单,十瓶药编号:0,1,10,11….1001;
0 不喝。
第一只老鼠喝所有个位是 1 的:13579,第二只喝十位是 1 的,第三只和百位是 1 的,第四只喝千位是 1 的。
24 小时后,看下死了的是 1,活着的是 0。
按老鼠的顺序乖乖站好…… 假如第一只和第三只死了,那就是 0101,就是 5 有问题。
php面试遇到的面试题
面试题吗?有错吧?php 里边有 is_empty()方法吗?
改良版的代码如下
<?php
$a = '';
$b = "";
$c = null;
$d = array();
echo is_null($a)." _a1<br>";
echo is_null($b)." _a2<br>";
echo is_null($c)." _a3<br>";
echo is_null($d)." _a4<br>";
echo empty($a)." _b1<br>";
echo empty($b)." _b2<br>";
echo empty($c)." _b3<br>";
echo empty($d)." _b4<br>";
echo isset($a)." _c1<br>";
echo isset($b)." _c2<br>";
echo isset($c)." _c3<br>";
echo isset($d)." _c4";
测试的结果是
_a1
_a2
1 _a3
_a4
1 _b1
1 _b2
1 _b3
1 _b4
1 _c1
1 _c2
_c3
1 _c4
分析结果,自己看吧。
PHP中高级面试题 – 第二天
一、写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处,即 P 点
二、从扑克牌中随机抽出 5 张牌,判断是不是一个顺子,即这5张牌是连续的
这个问题有个关键点,扑克牌,1-13 不能再多了。
这就很简单了。
用PHP来做,定义一个数组分别存着1到13, 拿出一个,置空一个,最后看下这五个置空的 是不是连续的。
这种情况不考虑抽出的顺序。
三、说一下 PHP 的(内存)垃圾回收机制
每一个变量对应一个 zval 数据结构,在该结构内还有一个 val 结构体,该结构体内有一个引用计数(php7 而言,对于 php5,这个引用计数是保存在 zval 结构中的),标识该对象的引用数,当对象的引用计数为 0 时代表这个对象可被回收。
对象的 refcount 减少的时机:修改变量、函数返回(释放局部变量)、unset 变量
对于数组和对象而言,可能存在变量中的成员引用变量本身的情况,也就是循环引用,这样会造成这个变量永远不会被内存回收,而成为垃圾。
PHP 里对于这种情况给出了垃圾回收机制:如果数组、对象的引用计数减少而且不为零,则认为他们可能是垃圾,把他们放到垃圾收集器里。
等垃圾收集器到了一定的数量之后,进行垃圾处理:对所有可能的垃圾 refcount 减 1,如果为 1,说明是垃圾,则进行内存回收;如果不为 1,说明还有其他变量在使用,refcount 重新加 1;这种对象复用以及垃圾回收机制在其他语言中也有体现:redis 中也使用了引用计数表示每个对象的引用数量。
四、简述一下PHP短信验证码如何防刷?
1、时间限制:60 秒后才能再次发送
从发送验证码开始,前端(客户端)会进行一个 60 秒的倒数,在这一分钟之内,用户是无法提交多次发送信息的请求的。
这种方法虽然使用得比较普遍,但是却不是非常有用,技术稍微好点的人完全可以绕过这个限制,直接发送短信验证码。
3、短信验证码限制:30 分钟之内发送同一个验证码
网上还有一种方法说:30 分钟之内,所有的请求,所发送的短信验证码都是同一个验证码。
第一次请求短信接口,然后缓存短信验证码结果,30 分钟之内再次请求,则直接返回缓存的内容。
对于这种方式,不是很清楚短信接口商会不会对发送缓存信息收取费用,如果有兴趣可以了解了解。
4、前后端校验:提交 Token 参数校验
这种方式比较少人说到,个人觉得可以这种方法值得一试。
5、唯一性限制:微信产品,限制同一个微信 ID 用户的请求数量
如果是微信的产品的话,可以通过微信 ID 来进行识别,然后对同一个微信 ID 的用户限制,24 小时之内最多只能够发送一定量的短信。
6、产品流程限制:分步骤进行
7、图形验证码限制:图形验证通过后再请求接口
用户输入图形验证码并通过之后,再请求短信接口获取验证码。
为了有更好的用户体验,也可以设计成:一开始不需要输入图形验证码,在操作达到一定量之后,才需要输入图形验证码。
具体情况请根据具体场景来进行设计。
8、IP 及 Cookie 限制:限制相同的 IP/Cookie 信息最大数量
使用 Cookie 或者 IP,能够简单识别同一个用户,然后对相同的用户进行限制(如:24 小时内最多只能够发送 20 条短信)。
然而,Cookie 能够清理、IP 能够模拟,而且 IP 还会出现局域网相同 IP 的情况,因此,在使用此方法的时候,应该根据具体情况来思考。
9、短信预警机制,做好出问题之后的防护
以上的方法并不一定能够完全杜绝短信被刷,因此,我们也应该做好短信的预警机制,即当短信的使用量达到一定量之后,向管理员发送预警信息,管理员可以立刻对短信的接口情况进行监控和防护。
五、mySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据
相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略)。
redis 提供 6 种数据淘汰策略:
volatile-lru:从已设置过期时间的数据集(server.db [i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db [i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db [i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db [i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db [i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
(随机推荐阅读本站500篇优秀文章点击前往:500篇优秀随机文章)