CSP 并发模型 作者: lovingyu_er 时间: 2019-10-31 11:43:27 分类: PHP 评论 ##### CSP 并发模型概念: CSP ,全称:Communicating Sequential Process ,翻译成中文是,通信顺序进程,最初于Tony Hoare的1977年的论文中被描述,影响了许多编程语言的设计。用于描述两个的ulinix并发的实体通过共享的通讯管道(channel)进行通信的 并发模型。在该模型中,channel 是比较重要的对象,它并不关注发送消息的实体,而只关心与发送消息时实体使用的```channel``` 其简单的模型可以大概简化如下: work1 ----->Channel --------->work2 work1和work2并不直接通信,而是通过中间的媒介角色```Channel```进行通信。消息的发送者work1和work2通过```channel```实现了松耦合。、 Go语言中是通过goruntime 和channel实现的; php swoole 中是通过协程(\Swoole\Coroutine)+ 通道(Channel)来实现的 下面是使用php 的swoole 写的协程并发: ```php $http = new swoole_http_server("127.0.0.1", 9501); $http->on("request", function ($request, $response) { $client = new Swoole\Coroutine\Client(SWOOLE_SOCK_TCP); $client->connect("127.0.0.1", 8888, 0.5); //调用connect将触发协程切换 $client->send("hello world from swoole"); //调用recv将触发协程切换 $ret = $client->recv(); $response->header("Content-Type", "text/plain"); $response->end($ret); $client->close(); }); $http->start(); ``` 当代码执行到```connect()```和```recv()```函数时,底层会触发进行协程切换,此时可以去处理其他的事件或者接受新的请求。当此客户端连接成功或者后端服务回包后,底层会恢复协程上下文,代码逻辑继续从切换点开始恢复执行。开发者整个过程不需要关心整个切换过程。 协程可以理解为```纯用户态的线程```,其```通过协作而不是抢占来进行切换```。相对于进程或者线程,协程所有的操作都可以在```用户态完成```,创建和切换的消耗更低。Swoole可以为每一个请求创建对应的协程,根据IO的状态来合理的调度协程,这会带来了以下优势: 开发者可以无感知的```用同步的代码编写方式```达到异步IO的效果和性能,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护 同时由于底层封装了协程,所以对比传统的PHP层协程框架,开发者不需要使用yield关键词来标识一个协程IO操作,所以不再需要对yield的语义进行深入理解以及对每一级的调用都修改为yield,这极大的提高了开发效率 可以满足大部分开发者的需求。对于私有协议,开发者可以使用协程的TCP或者UDP接口去方便的封装。 swoft 框架中,在bin文档的开头部分,就指定了协程的```set option:nums``` 代码如下: ```php Swoole\Coroutine::set([ 'max_coroutine' => 300000, ]); ``` 参考文档: 1.[php swoole的协程](https://wiki.swoole.com/wiki/page/p-coroutine.html "php swoole的协程") 2.[并发模型:Actors与CSP](https://jingwei.link/2018/07/08/actor-and-csp-model.html "并发模型:Actors与CSP") 3.[Actor模型和CSP模型的区别](https://www.jdon.com/concurrent/actor-csp.html "Actor模型和CSP模型的区别")
Mysql一些基本操作语言 作者: lovingyu_er 时间: 2019-10-23 13:52:00 分类: MYSQL 评论 LTER TABLE:添加,修改,删除表的列,约束等表的定义。 查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:alter table 表名 add column 列名 varchar(30); 删除列:alter table 表名 drop column 列名; 修改列名MySQL: alter table bbb change nnnnn hh int; 修改列名SQLServer:exec sp_rename't_student.name','nn','column'; 修改列名Oracle:lter table bbb rename column nnnnn to hh int; 修改列属性:alter table t_book modify name varchar(22); MYSQL修改表名:```ALTER TABLE table_name RENAME TO new_table_name``` ,比如:```ALTER TABLE admin RENAME TO admin_user;``` 涉及到数据库表操作,请再三检查,是否有语法和逻辑上的问题 ####数据库数据的导出操作 1、导出数据库为dbname的表结构(其中用戶名為root,密码為dbpasswd,生成的脚本名為db.sql) mysqldump -uroot -pdbpasswd -d dbname >db.sql; 2、导出数据库为dbname某张表(test)结构 mysqldump -uroot -pdbpasswd -d dbname test>db.sql; 3、导出数据库为dbname所有表结构及表數據(不加-d) mysqldump -uroot -pdbpasswd dbname >db.sql; 4、导出数据库dbname某张表(test)结构及表數據(不加-d) mysqldump -uroot -pdbpasswd dbname test>db.sql; 注意:如果你需要导出远程数据库的数据,你可以添加```-h``` 参数,直接添加ip地址就可以了 ```mysqldump -uroot -pdbpasswd -hip_address dbname table_name > dbname_table_name.sql```
使用php判断两台服务器之间能否通信 作者: lovingyu_er 时间: 2019-10-16 12:28:25 分类: PHP,Ubuntu 评论 公司的网络业务,在出现问题的时候,总是需要手工去ping 主机,比较被动,为此,想通过php实现其自动ping功能,使用php 的shell_exec,exec,system 这些函数是我不太喜欢的,索性使用php的网络通信函数,比如socket 或者fsock 之类的函数来实现通信,写出了一下函数,用于检测 两台服务器之间的ping 状态,函数如下: ```php /** * 使用fsockopen * @param $host * @param int $timeout * @return array */ function __pingfsockopen($host, $timeout = 30) { $start = microtime(true); $fp = @fsockopen($host, 80, $errno, $errstr, $timeout); if (!$fp) { $end = microtime(true); $msg = "errorno :" . $errno . "; errorstr :" . $errstr . ";use seconds :" . ($end - $start) . PHP_EOL; return array("code" => -1, 'msg' => $msg); } else { $end = microtime(true); $msg = "use seconds :" . ($end - $start); return array('code' => 0, 'msg' => $msg); } } ``` 返回的是一个数组,根据数组中的code判断其是否能够通信, 其中```@fsockopen```的写法,忽视错误,比如在```@mysql_query()``` 这种写法比较常见,是PHP提供的错误信息屏蔽的专用符号,比如一些warning信息 主要函数:```fsockopen``` ```fsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] ) : resource``` 作用:打开一个网络连接或者一个Unix套接字连接 参数详解: $hostname :需要连接的主机 $port :打开主机的端口,案例中使用的是80端口, 改函数返回的是一个文件句柄,可以被文件函数(fgets,fgetss(),fwrite(),fclose()还有feof())调用,如果失败,会返回false 这个函数相比较socket系列函数比起来,正确率比较高,原来采用的socket_create之类的函数,发现在ping主机的时候,会有比较大的概率出现ping 的结果的误判,故而,修改成了上述的这种情况