跳到主要内容

PHP知识点整理

· 6 分钟阅读

1. 如何避免 PHP 精度计算问题?

  • 采用BC 数学函数(bcadd、bcdiv、bcmul)。
  • 乘以指定的倍数转换为整数,再进行计算。
  • 计算时将浮点型全部转为整数来计算,显示的地方可以设置为字符串类型。

2. JSONP 的实现原理是什么?

JSONP 是一种跨域通信的手段。类似于 JSON 函数名({"data":"message"})。 因为浏览器的同源策略,浏览器从 A 网站向 B 网站请求资源,必须同时满足: 协议相同、域名相同、端口相同,任何一点不同都会产生跨域,产生跨域后,浏览器就会阻止数据返回。 JSONP 利用了 <script src=""> 标签可以链接到不同源的 JS 脚本文件,来到达跨域目的。

3. 静态资源为什么要使用 CDN 服务?

CDN 叫做(Content Delivery Networks,通常用于分发静态资源)。 现在的网站、APP存在大量的静态资源,比如高清图片、视频、CSS 样式文件,这些文件通常不会经常更改, 利用 CDN 将资源复制到分布在世界各地的边缘节点网络,当用户请求 CDN 承载的资源时,它们被路由到离你最近的节点。

4. 了解 JWT 吗?

JWT 叫做(JSON Web Token),是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准,适用于分布式站点的单点登录(SSO)场景。 JWT 由三部分组成,它们之间用圆点连接: Header、Payload、Signature

5. 保持用户会话为什么要使用 cookie?是否有代替方案?如何解决 session 共享问题?

参考文

6. 了解 swoole 吗?

Swoole 是一个使用 C++ 语言编写的基于异步事件驱动和协程的并行网络通信引擎,为 PHP 提供协程、高性能网络编程支持。提供了多种通信协议的网络服务器和客户端模块,可以方便快速的实现 TCP/UDP服务、高性能Web、WebSocket服务、物联网、实时通讯、游戏、微服务等,使 PHP 不再局限于传统的 Web 领域。

7. 了解 docker 吗?

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

8. 使用过哪些 RPC 协议?

RPC 叫做(Remote Procedure Call 远程过程调用),是一种技术思想而非一种规范或协议。 相比于 HTTP 协议,RPC 采用二进制字节码传输,因此更加高效和安全。

  • JSON RPC 服务,是一种基于 JSON 格式的轻量级的 RPC 协议标准,易于使用和阅读。
  • gRPC 服务,Java实现的底层网络库是基于Netty开发而来,其Go实现是基于net库。

9. MySQL 查询优化举例

参考文档

  • 避免全表扫描,在 WHERE 和 ORDER BY 涉及到的列上建立索引。
  • 避免在 WHERE 子句中使用 != 和 <>,否则将放弃索引而进行全表扫描。
  • 避免在 WHERE 子句中对字段进行 NULL 值判断,建议设置默认值。
  • 避免在 WHERE 子句中使用 OR 来连接条件。
  • 避免使用 IN 和 NOT IN,对于连续的数值可以采用 BETWEEN。

10. 说一下缓存的优点,高并发访问下如何正确使用缓存?

参考文档

缓存优点:

  • 提高性能:缓存查询速度比数据库查询速度快。
  • 提高并发能力:缓存分担了部分请求,支持更高的并发。

高并发下的使用方法:

  • 在缓存的过期时间加上一个随机值,避免缓存在同一时间过期。
  • 使用 Redis 集群;Redis 持久化。

11. 使用过哪些队列服务,用在什么场景?遇到过什么问题?

常见消息队列服务:RabbitMQ、ActiveMQ、RocketMQ、Kafka 使用场景:商品秒杀、系统解耦(功能订阅/取消订阅)、日志记录