最近一次的PHP面试题记录,office已到手!

1、explain 具体哪些等级

具体有 system、const、range、index、all

2、MySQL 优化

  • 避免全表查询,首先应考虑在 where 及 order by 涉及的列上建立索引

  • 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描 (可以将字段默认值设置为 0)

  • 应尽量避免在 where 子句中使用!= 或 <> 操作符,否则引擎将放弃使用索引而进行全表扫描

  • 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or num=20 可以这样查询:select id from t where num=10 union all select id from t where num=20

  • n 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in (1,2,3) 对于连续的数值,能用 between 就不要用 in 了:select id from t where num between 1 and 3

  • 下面的查询也将导致全表扫描:select id from t where name like ‘% 李 %’若要提高效率,可以考虑全文检索。

  • 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描

  • 不要在 where 子句中的 “=” 左边进行函数、算术运算或其他表达式运算

  • 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

  • 很多时候用 exists 代替 in 是一个好的选择:select num from a where num in (select num from b)
    用下面的语句替换:
    select num from a where exists(select 1 from b where num=a.num)

  • 索引并不是越多越好,索引固然可 以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过 6 个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。

  • 任何地方都不要使用 select from t ,用具体的字段列表代替 “”,不要返回用不到的任何字段。

  • 尽量避免大事务操作,提高系统并发能力.

  • 分库分别

  • 分区分表分库

3、redis 支持哪些类型

支持 5 种类型:字符串、哈希、链表、有序、无序,最新的 redis 5.0 中,新增 stream 类型,非常高效的支持队列。

4、PHP7 与 php5 的区别

  • foreach 不再改变内部数组指针

  • 标量类型声明,在旧版中,函数的参数申明只能是 (Array $arr)、(CLassName $obj) 等,基本类型比如字符串 (string), 整数 (int), 浮点数 (float), 以及布尔值 (bool) 等是不能够被申明的

  • 增加了对返回类型声明的支持

declare(strict_types=1);
function add(int $a, int $b){
    
    
return $a+$b;
}

echo add(1,2);
echo add(1.5, 2.6);
  • null 合并运算符

项目中存在大量同时使用三元表达式和 isset () 的情况,新增了 null 合并运算符 (??) 这个语法糖。如果变量存在且值不为 NULL, 它就会返回自身的值,否则返回它的第二个操作数。

旧版:isset ($_GET [‘id’]) ? $_GET [id] : err;

新版:$_GET [‘id’] ?? ‘err’;

  • 通过 define () 定义常量数组
PHP 5.6 中仅能通过 const 定义常量数组,PHP 7 可以通过 define() 来定义。
<?php
define('ANIMALS',
['dog', 'cat', 'bird']);
echo ANIMALS[1];
// outputs "cat"

const name = ['1','2'];
echo name[1];
  • 现在支持通过 new class 来实例化一个匿名类,这可以用来替代一些 “用后即焚” 的完整类定义

  • preg_replace_callback_array()

​ 新增了一个函数 preg_replace_callback_array (),使用该函数可以使得在使用 preg_replace_callback () 函数时代码变得更加优雅。在 PHP7 之前,回调函数会调用每一个正则表达式,回调函数在部分分支上是被污染了。

5、指针问题

<?php
$array = [1,2,3];
foreach ($array as $k=>&$v){
    
    
    $v++;
}

var_dump($array);
foreach ($array as $k=>$v){
    
    
    echo $v;
}

233

6、array_column()

返回输入数组中某个单一列的值。

array_column(array,column_key,index_key);

<?php
// 可能从数据库中返回数组
$a = array(
  array(
    'id' => 5698,
    'first_name' => 'Peter',
    'last_name' => 'Griffin',
  ),
  array(
    'id' => 4767,
    'first_name' => 'Ben',
    'last_name' => 'Smith',
  ),
  array(
    'id' => 3809,
    'first_name' => 'Joe',
    'last_name' => 'Doe',
  )
);

$last_names = array_column($a, 'last_name', 'id');
print_r($last_names);
?>

结果

Array
(
    [5698] => Griffin
    [4767] => Smith
    [3809] => Doe
)

7、取出前五通话记录

select name,count(*)  as num  from order
where date_sub(curdate(), INTERVAL 10 DAY) <= date(`created_at`)
group by name 
order by num desc 
limit 10;

8、php 扩展安装

    //下载libevent扩展文件压缩包(在当前系统哪个目录下载随意)
~# wget http://pecl.php.net/get/libevent-0.1.0.tgz
    //解压文件
~# tar -zxvf libevent-0.1.0.tgz
    //进入源码目录
~# cd libevent-0.1.0/
    //运行phpize命令,写全phpize的路径
~# /usr/local/php/bin/phpize
    //运行configure命令,配置时 要将php-config的路径附上
~# ./configure --with-php-config=/usr/local/php/bin/php-config
    //运行make命令
~# make
    //测试编译安装
~# make test
    //正式编译安装
~# sudo make install
    //修改php.ini,结尾加入:extension=libevent.so
    //重启对应的php-fpm

9、session 和 cookie 的关系

前提是服务端开启了session
1. 第一次访问页面时, 服务端生成一个不重复的sessionid(当前会话id)以及命名为sess_xxx的session文件
该session文件保存在php.ini文件中指定的目录, xxx是sessionid, sessionid可以通过session_id()函数来获取

2. 服务端向客户端返回响应, 其中有响应头Set-Cookie:PHPSESSID=xxx

3. 客户端收到Set-Cookie响应头, 将sessionid写入cookie, cookie的key为PHPSESSID, value为sessionid
比如PHPSESSID=jlis2mcmv6d5hejkemom77ibm3

4. 当第二次访问页面时, 客户端会把cookie放在请求头(Request Header), 服务端识别PHPSESSID这个cookie
然后根据这个cookie获取当前会话ID(sessionid), 从而找到对应的session文件, 再从session文件中读取信息

10、jsonp 原理

11、ajax 跨域

12、主从复制的原理

13、运算符优先级问题

<?php
$tmp = 0 == 'a' ? 1: 2;
echo $tmp;
?>

点关注,不迷路

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。之前说过,PHP方面的技术点很多,也是因为太多了,实在是写不过来,写过来了大家也不会看的太多,所以我这里把它整理成了PDF和文档,如果有需要的可以

点击进入暗号: PHP+「平台」

在这里插入图片描述

在这里插入图片描述


更多学习内容可以访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的 PHP技术交流群

猜你喜欢

转载自blog.csdn.net/weixin_49163826/article/details/109123496