Swoole 由来
PHP这个语言有很大的局限性,甚至可以说PHP语言只写做Web程序。网络通信框架、异步、多线程,协程,多进程,这些特性正是php所不完善的功能(虽然官方提供很多基础函数可以实现这些功能,PHP语言本身也提供了一些可以实现进行底层操作和网络通信的扩展,比如sockets、libevent、pcntl之类),普通的phper也不具备这些特性的基础认知,基于此 Swoole 应运而生。
Swoole是韩天峰在2010年底,因为公司业务需要自己实现一个Tcp Socket Server 实现SMTP协议接收数据,但是在当时PHP在这个领域几乎是一片空白,所以自己学习,最终完成了需求;随后便开源了此套系统,希望能帮助其他PHPer解决在这个领域的问题,让PHP从单纯的Web开发扩展到更大的空间。
Swoole这个名字不是一个英文单词,是由作者创造的一个音近字。最早想到的名字是叫做sword-server,寓意是为广大PHPer创造一把锋利的剑,后来联想到google也是凭空创造出来的,所以我就给它命名为swoole。
swoole 介绍
Swoole是一个完全使用C语言编写面向生产环境的 PHP 异步网络通信引擎,使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 使用 PHP + Swoole 作为网络通信框架,可以使企业 IT 研发团队的效率大大提升,更加专注于开发创新产品。
Swoole特性
PHP的 协程 高性能网络通信引擎,使用C/C++语言编写php扩展,提供了多种通信协议的网络服务器和客户端模块。包括:
TCP/UDP/UnixSock 服务器端
Http/WebSocket/Http2.0 服务器端
协程 TCP/UDP/UnixSock
协程 MySQL
协程 Redis
协程 Http/WebSocket
协程 Http2
AsyncTask
毫秒定时器
协程文件读写
异步 文件读写 异步mysql redis
Swoole版本
Swoole2.0 支持了类似 Go 语言的协程 不完美
3 版本协程 存在兼容问题 放弃
Swoole4支持完整的协程编程模式,可以使用完全同步的代码实现异步程序。
PHP代码无需额外增加任何关键词,底层自动进行协程调度,实现异步IO。
Swoole4协程仅支持PHP7,无法在PHP5中使用
异步回调模块已过时,目前仅修复 BUG,不再进行维护, 且在4.3版本中移除了异步模块。请使用 Coroutine 协程模块。
仅支持 Linux、FreeBSD、MacOS 三种操作系统
在Windows平台,可使用CygWin或WSL(Windows Subsystem for Linux)
目前cygwin版本为测试版本,Windows 下Swoole的功能受限。
swoole案例:https://wiki.swoole.com/wiki/page/p-case.html
workerman swoole区别
workerman纯php swoole C/C++语言编写 作为php的扩展
workerman 多进程 swoole 协程 多进程 多线程
swoole性能优于workerman
workerman win/linux swoole win测试 线上linux
swoole并没有用libevent,所以不需要安装libevent
swoole并不依赖php的stream/sockets/pcntl/posix/sysvmsg等扩展
swoole安装环境
centos 7.6
php 7.2 // lnmp 一键安装
swoole 4.4.3
建议使用 Ubuntu14、CentOS7 或更高版本的操作系统
Swoole-1.x需要 PHP-5.3.10 或更高版本
Swoole-4.x需要 PHP-7.0.0 或更高版本
单数版本为特性新增版本,主要工作是新增功能特性、代码重构、结构调整。可能会带来一些BUG
双数版本为问题修复版本,主要工作是修复现有的已知问题、提升性能、完善细节。稳定性更高
swoole安装方式
第一种
--enable-swoole 编译 php直接编译进去
第二种
pecl install swoole
第三种
docker 安装
第四种(推荐)
下载 :http://pecl.php.net/package/swoole
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --enable-openssl --enable-http2 --enable-sockets --enable-mysqlnd
编译参数 : https://wiki.swoole.com/wiki/page/437.html
make && make install
extension = swoole.so
php -m 或者 phpinfo()
php --ri swoole
Swoole的绝大部分功能只能用于cli命令行环境,请首先准备好Linux Shell环境。
进程和线程
进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。
线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程。
1. 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
2. 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
3. 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信号等),某进程内的线程在其他进程不可见;
4. 调度和切换:线程上下文切换比进程上下文切换要快得多
5 线程天生的共享内存空间,线程间的通信更简单,避免了进程IPC引入新的复杂度。
进程开销大 线程开销小
php实现多进程
pcntl是php官方的多进程扩展,只能在linux环境使用 --enable-pcntl
pcntl_fork — 在当前进程当前位置产生分支(子进程)
fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。
$pid = pcntl_fork();
if($pid==0){
echo '我是子进程 id:'.getmypid().PHP_EOL;
}else{
echo '我也是子进程 '.$pid;
}
进程间的通信
在各个进程中,内存空间都是不一致的,各个变量都是在不同的内存空间
$str = 'lampol';
$pid = pcntl_fork();
if($pid>0){
$str.='111111';
echo $str.PHP_EOL; //lampol111111
}else{
echo $str; //lampol
}
进程间空间独立 数据不能共享
管道通信
消息队列通信
进程信号通信
共享内存通信,映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC(进程间通信) 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
套接字通信
第三方通信,使用文件操作,mysql,redis等方法也可实现通信
多线程
PHP 默认并不支持多线程,要使用多线程需要安装 pthread 扩展,而要安装 pthread 扩展,必须使用 --enable-maintainer-zts 参数重新编译 PHP,这个参数是指定编译 PHP 时使用线程安全方式。
下载pthreads
wget http://pecl.php.net/get/pthreads-3.1.6.tgz
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
extension =pthreads.so
线程安全
多线程是让程序变得不安分的一个因素,在使用多线程之前,首先要考虑线程安全问题:
线程安全:线程安全是编程中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。
PHP 实现的线程安全主要是使用 TSRM 机制对 全局变量和静态变量进行了隔离,将全局变量和静态变量 给每个线程都复制了一份,各线程使用的都是主线程的一个备份,从而避免了变量冲突,也就不会出现线程安全问题。
本文档对应的视频教程:https://ke.qq.com/course/432680?tuin=30289dc0
欢迎加入workerman/swool技术交流群:604438441