2019年的PHP面试,把每天面试的东西记录下来。
PHP部分
1. php无限级分类
function getTree($data, $pid)
{
$tree = [];
foreach($data as $value) {
// 父亲找儿子
if ($value['parent_id'] == $pid) {
$value['children'] = getTree($data, $value['id']);
$tree[] = $value;
}
}
return $tree;
}
2. 三种方法实现字符串翻转
//第一种
function str_rev1($str) {
$newstr = '';
for($i = strlen($str); $i >= 0; $i --) {
$newstr .= $str{$i};
}
return $newstr;
}
//第二种
function str_rev2($str) {
$newstr = '';
$arr = str_split($str, 1);
foreach($arr as $value) {
$newstr = $value . $newstr;
}
}
//第三种
function str_rev3($str) {
$newstr = '';
if (strlen($str) <= 1) return $str;
$newstr .= substr($str, -1) . str_rev3(substr($str, 0, strlen($str) - 1));
}
3.多进程同时写入一个文件成功
$fp = fopen('a.txt', 'w+');
if (flock($fp, LOCK_EX)) {
// 获得写锁,写数据
fwrite($fp, 'write something');
flock($fp, LOCK_UN);
} else {
echo 'file is locking'
}
fclose($fp);
4.处理文件里上亿条数据,并去重。
MYSQL 部分
1. 远程连接mysql数据库
mysql -h localhost -u root -p
2. 备份数据库命令
mysqldump -u root -p person >d:\person.sql
3.union 和 union all 的区别
union: 对结果进行并集操作,会自动压缩重复的结果,同时会进行默认的结果排序。
union all: 对结果进行并集操作,直接全部显示出来,不进行任何排序。
其他
1. 高并发
- 从前端方向看
1.web资源防盗链
两种方式防护,一种是检验referer,一种用签名算法,加载第三方模块HttpAccessKeyModule实现防盗链。
2.减少http请求次数,因为HTTP协议规定请求只能串行发送,也就是一个一个发。
- css雪碧图
- 合并js与css文件
- 图片使用base64编码
3. CDN加速
4. 资源压缩
- 从php方向
1. 动态语言静态化
- 使用像smarty模板引擎
- 使用ob系列函数
2.数据缓存
- 从mysql方向
1. 字段数据类型优化
- 尽量避免null
- varchar储存可变长字符串,char定长的,适合很短的字符串
- 满足存储需要的情况下使用最小的数据类型
2. 索引优化
3.SQL语句优化
- 少用select *
- 用外连接代替子查询,尽量用inner join
- 尽量不要使用NOT IN和<>操作
4. 储存引擎的优化
5.表结构设计优化
- 从服务器方向
负载均衡
- 七层负载均衡(Nginx)
- 四层负载均衡(LVS/硬件设备)
2. 查看端口占用
// 查看3306是否被占用
netstat -anp | grep 3306
//查看当前所有已经使用的端口情况
netstat -nultp
3. 进程和线程的区别
一、区别:
- 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,它是系统进行资源分配和调度的一个独立单位。
- 线程是进程的一个实体,是CPU调度和分配的基本单位。线程基本不拥有系统资源,与同一个进程的其他线程共享进程中所拥有的所有资源。
二、联系:
- 一个进程可以包括多个线程。
- 在没有实现线程的操作系统中,进程是资源分配的基本单位,又是调度的基本单位,它是系统中并发执行的单元;而在实现了线程的操作系统中,进程是资源分配的基本单位,但是线程是调度的基本单位,是系统中并发执行的单元。