一、进程
进程:正在运行程序的一个实例
swooole_process->exec
1、创建实例
<?php
/**
* process.php
* User chenzhuo
* Date 2020/8/20 7:17 下午
* Description :
*/
$process = new swoole_process(function (swoole_process $process){
//todo
},true);
$pid = $process->start();
echo $pid . PHP_EOL;
2、命令
$ ps aux | grep process.php
$ pstree -p 主进程id
$ ps aft | grep http_server
3、使用场景:
执行10个url
4、解决方案:
- 引入swoole process
- 按需开启N个子进程执行
5、代码
<?php
/**
* curl.php
* User chenzhuo
* Date 2020/8/20 7:56 下午
* Description :
*/
echo "process-start".date("Y-m-d H:i:s");
$urls = [
'http://baidu.com',
'http://sina.com.cn',
'http://qq.com1',
'http://qq.com2',
'http://qq.com3',
'http://qq.com4',
'http://qq.com5',
'http://qq.com6',
];
$workers = [];
for($i=0; $i<7; $i++){
//子进程
$process = new swoole_process(function (swoole_process $worker) use($i, $urls){
//curl
$content = curlData($urls[$i]);
// echo $content.PHP_EOL;
$worker->write($content.PHP_EOL);
},true);
$pid = $process->start();
$workers[$pid] = $process;
}
foreach ($workers as $worker){
echo $worker->read();
}
function curlData($url){
sleep(1);
return $url .'success'.PHP_EOL;
}
echo "process-end".date("Y-m-d H:i:s");
二、内存
1、内存操作模块
- Lock
- Buffer
- Table
- Atomic
- mmap
- channel
- serialize
Swoole Table
- 基于共享内存和锁实现的超高内存,并发数据结构
2、代码
<?php
/**
* table.php
* User chenzhuo
* Date 2020/8/20 8:20 下午
* Description :
*/
//创建内存表
$table = new swoole_table(1024);
//内存表增加一列
$table->column('id', $table::TYPE_INT,4);
$table->column('name', $table::TYPE_STRING,64);
$table->column('age', $table::TYPE_INT,4);
$table->create();
$table->set('calm',['id' => 1, 'name' => 'calm', 'age' => 25]);
$calm = $table->get('calm');
print_r($calm);
$table->incr('calm','age',2);
$calm = $table['calm'];
print_r($calm);
3、使用场景
进程间数据共享
三、协程
1、redis
代码
<?php
/**
* redis.php
* User chenzhuo
* Date 2020/8/20 8:37 下午
* Description :
*/
$http = new swoole_http_server('0.0.0.0',8092);
$http->on('request', function ($request, $response) {
//获取key输出到浏览器
$redis = new Swoole\Coroutine\Redis();
$redis->connect('127.0.0.1','6379');
// $redis->set('calm','chenz');
$value = $redis->get($request->get['a']);
$response->header('Content-Type', 'text-plain');
$response->end($value);
});
$http->start();