进程
PHP
自带的pcntl
,存在很多不足,如:
- pcntl没有提供进程间通信的功能
- pcntl不支持重定向标准输入和输出
- pcntl只提供了fork这样原始的接口,容易使用错误
- swoole_process提供了比pcntl更强大的功能,更易用的API,使PHP在多进程编程方面更加轻松。
Swoole\Process
提供了如下特性:
- 基于
Unix Socket
和sysvmsg
消息队列的进程间通信,只需调用write/read
或者push/pop
即可 - 支持重定向标准输入和输出,在子进程内
echo
不会打印屏幕,而是写入管道,读键盘输入可以重定向为管道读取数据 - 配合
Event
模块,创建的PHP
子进程可以异步的事件驱动模式 - 提供了
exec
接口,创建的进程可以执行其他程序,与原PHP
父进程之间可以方便的通信
使用场景
背景
执行多个url
原始方案,同步顺序执行
问题
执行慢
Swoole 优化后
$process = new swoole_process(function(){},true) $pid = $process->start(); $workers[$pid] = $process
Swoole Table
swoole_table是一个基于共享内存和锁实现的超高性能,并发数据结构
创建内存表
$table = new swoole_table(1024)
$table->column("id",TYPE_INT,4);
$table->column("name",TYPE_STRING,64 );
$table->create();
//设置
$table->set('table'.['id'=>1,'name'=>'yfsama']
//获取
$table->get('table')
//另外一种写法
$table['table'] = [
'id'=>2,
'name'=>'rbq',
];
执行完就自动释放,注意
更多食用方法清查看官方文档
协程
案例代码
$redis = new Swoole\Coroutinus\Redis();
$redis->connect("127.0.0.1",6379)
$redis->get('get')
可以通过同步的代码实现异步IO的效果,
在异步操作中如果取mysql需要0.5s redis需要1s那么最终运行时间是1s