swoole——从入门到放弃(三)
一、进程
-
swoole_process
Swoole\Process
swoole_process::__construct(callable $function, $redirect_stdin_stdout = false, $create_pipe = true);
-
$function
:子进程创建成功后要执行的函数 -
$redirect_stdin_stdout
:重定向子进程的标准输入和输出。启用此选项后,在子进程内输出内容将不是打印屏幕,而是写入到主进程管道。读取键盘输入将变为从管道中读取数据。默认为阻塞读取。 -
$create_pipe
:是否创建管道,启用$redirect_stdin_stdout
后,此选项将忽略用户参数,强制为true
。如果子进程内没有进程间通信,可以设置为false
-
bool swoole_process->exec(string $execfile, array $args)
-
$execfile
指定可执行文件的绝对路径,如"/usr/bin/php"
-
$args
是一个数组,是exec
的参数列表,如array('test.php', 123)
,相当与php test.php 123
-
-
function swoole_process->start() : int
:执行fork系统调用,启动进程 array swoole_process::wait(bool $blocking = true);
:回收结束运行的子进程$result = array('code' => 0, 'pid' => 15001, 'signal' => 15);
-
$blocking
参数可以指定是否阻塞等待,默认为阻塞 - 操作成功会返回一个数组包含子进程的PID、退出状态码、被哪种信号KILL
- 失败返回
false
process
小实例
$process = new Swoole\process(function (swoole_process $pro) {
// 子进程启用http服务
$pro->exec('/opt/soft/php/bin/php', [__DIR__ . '/../http/http.php']);
}, true);
$pid = $process->start();
echo $pid . PHP_EOL;
// 回收进程
$process->wait();
二、内存
swoole_table一个基于共享内存和锁实现的超高性能,并发数据结构。用于解决多进程/多线程数据共享和同步加锁问题。
swoole_table->__construct(int $size, float $conflict_proportion = 0.2)
-
$size
参数指定表格的最大行数,如果不是2的N次方,底层会自动调整为一个接近的数字,如果小于1024,默认为1024
-
bool swoole_table->column(string $name, int $type, int $size = 0);
内存表增加一列-
$name
指定字段的名称 -
$type
指定字段类型:swoole_table::TYPE_INT
,swoole_table::TYPE_FLOAT
,swoole_table::TYPE_STRING
-
$size
字符串必须指定长度
-
-
function swoole_table->create() : bool;
创建内存表 swoole_table->set(string $key, array $value)
-
$key
相同的key会覆盖 -
$value
必须是一个数组
-
-
function swoole_table->incr(string $key, string $column, mixed $incrby = 1);
原子自增操作 -
function swoole_table->decr(string $key, string $column, mixed $decrby = 1);
原子自减操作 -
array swoole_table->get(string $key, string $field = null);
获取一行数据 -
bool swoole_table->exist(string $key);
检查table中是否存在某一个key -
bool swoole_table->del(string $key)
删除数据 -
int function swoole_table->count();
返回table中存在的条目数
swoole_table简单的CURD实例
$table = new swoole_table(1024);
$table->column('id', swoole_table::TYPE_INT);
$table->column('name', swoole_table::TYPE_STRING, 16);
$table->column('age', swoole_table::TYPE_INT);
$table->create();
// 第一种设置、获取方式
$table->set('ronaldo', ['id' => 1, 'name' => 'ronaldo', 'age' => 32]);
$table->incr('ronaldo', 'age', 2); // 原子自增
$rtn1 = $table->get('ronaldo');
print_r($rtn1);
// 第二种设置、获取方式
$table['ronaldo2'] = ['id' => 2, 'name' => 'ronaldo2', 'age' => 28];
$table->decr('ronaldo2', 'age', 2); // 原子自减
$table->del('ronaldo'); // 删除列
$rtn2 = $table['ronaldo2'];
print_r($table['ronaldo']);
print_r($rtn2);
三、协程
协程可以理解为纯用户态的线程,其通过
协作而不是抢占来进行切换。相对于进程或者线程,协程所有的操作都可以在用户态完成,创建和切换的消耗更低。
优势:
- 开发者可以无感知的用同步的代码编写方式达到异步IO的效果和性能,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护。
- 同时由于swoole是在底层封装了协程,所以对比传统的php层协程框架,开发者不需要使用yield关键词来标识一个协程IO操作,所以不再需要对yield的语义进行深入理解以及对每一级的调用都修改为yield,这极大的提高了开发效率。
协程操作redis实例
$http = new swoole_http_server('0.0.0.0', 9501);
$http->on('request', function ($request, $response) {
$redis = new Swoole\Coroutine\Redis();
$redis->connect('0.0.0.0', 6379);
$rtn = $redis->get($request->get['a']);
$response->header('Content-Type', 'text/plain');
$response->end($rtn);
});
$http->start();