1. SWOOLE

1.1. 常见问题

1.1.1. swoole 特性

Swoole 是一个 PHP 的协程高性能网络通信引擎, 使用 C/C++ 编写, 支持多种通信协议的网络服务器, 可以快速的在多种领域(TCP/UDP服务器, 高性能WEB, 实时通讯, 游戏, 微服务) 等, 使 PHP 不再局限于传统的 Web 领域.

1.1.2. swoole 与 go

  • 优势
    • 动态语言, 更适合 PHP 开发者学习, 开发效率佳
    • 两者就能够实现的功能上来说几乎没有差别
  • 劣势
    • go 静态语言, 更适合底层软件的开发
    • go 协程是原生支持的, 而且支持多核利用

1.1.3. 协程实现

  • 使用 C/C++ 来实现的协程
  • 核心使用栈结构来处理协程创建, 销毁, 切换时的操作

1.1.4. 什么是协程

协程可以简单的理解为线程, 只不过这个线程是用户态的, 不需要操作系统参与, 创建销毁和切换的成本非常低, 和线程不同的是协程没有办法利用 多核 CPU 的, 想要利用多核 CPU 需要依赖 Swoole 的多进程模型

1.1.5. 什么是通道

channel 可以理解为消息队列, 只不过是协程间的消息队列, 多个协程通过 push pop 来操作生产和消费消息, 用来协程间通信. channel 无法跨进程

1.1.6. 为什么协程只能利用单核, 多核怎么利用?

协程可以看做是轻量级的线程, 所以只能利用单核. 想要利用多核的话, 可以使用多进程+协程的方式.

1.1.7. 协程调度机制

Swoole 的协程调度方案:

  1. 当执行某个协程过程中发现代码遇到了 Co::sleep() 或者网络IO(查询操作数据库, 读取写入文件)等, swoole 就会把这个连接的Fd放到 EventLoop 中
    • 然后让出这个协程的 CPU 给其它协程使用: 即 yield (挂起)
    • 扥带 MySQL 数据返回后就继续执行这个协程: 即 resume (恢复)
  2. 其次, 如果协程的代码有 CPU 密集型代码, 我们可以开启 enable_preemptive_scheduler

1.1.8. 全局变量不安全

协程使得原有的异步逻辑同步化,但是在协程的切换是隐式发生的,所以协程切换的前后不能保证全局变量以及 static 变量的一致性.

results matching ""

    No results matching ""