当前位置: 首页 > 后端技术 > PHP

swoole——从入门到放弃(三)

时间:2023-03-29 20:03:47 PHP

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