传统的FPM模式也就是多进程模型的运行方式,但每个进程只能处理完当前请求,才能接受下一个请求。
也就是说,php-fpm是多进程,单线程,每个进程一次只能处理一个请求。而且php作为一个解释型语言,每个请求都要初始化环境,调用各个扩展模块的MINIT解析代码,还有重新连接数据库资源。请求处理完毕之后还要再释放资源,销毁所有定义的类,实例,符号表。然后按照顺序调用各个扩展模块的RSHUTDOWN。
最后再将请求生成的结果返回给代理服务器。比如nginx和Apache.php-fpm这种运行模式,频繁创建和销毁资源,会导致高内存使用和低执行效率,在系统处于高并发,高负载的情况下会带来致命效果。
允许一个进程同时监视多个文件描述符。并且只在至少一个文件描述符就绪可读,可写或异常等事件情况下才进行真正的IO才做。可以在MYSQL读写,Redis操作,网络请求,文件读取IO操作时,不会阻塞整个进程的执行。Redis, Nginx, go都用了这种模型。
Swoole不仅使用了IO多路复用,引以为傲的协程都是基于时间循环EventLoop机制实现的。
workerman 和 swoole的区别:Workerman实际上是利用pcntl, posix扩展实现了进程管理。是基于php的,但是Swoole是基于C/C++语言实现。进程管理方面也是完全采用了C/C++实现。
Workerman 没有类似 Swoole 的并发管理、协程管理、通道管理、通道通信、进程间的通信等底层功能
Swoole的缺点:是一个基于多进程模型的异步通信扩展,多进程的模式也存在许多问题,比如跨进程间通信,进程资源共享。
Swoole V6 变为单进程多线程的运行模式。
zts版本PHP就是会对全局变量进行拷贝,整体使用跟进程没区别,swoole v6提供了可以线程间通讯的map和array list,这一部分需要自行使用锁或者信号量来进行处理;
完整的多线程编程还需要条件变量、互斥锁、信号量、事件等,罗马并不是一天就建立的
最后结论,如果想直接使用多线程,建议直接使用swoole v6 + zts php即可
同步阻塞:当一个操作被调用时,调用者将被阻塞,直到这个操作完成并返回结果。在此期间,调用者无法进行其他任务。