上文说明了socket的原理和使用,衔接上文介绍一下stream_socket_xxx函数,且与socket_xxx函数的区别

目录

一、stream_socket_xxx函数介绍

1.1 Streams的含义

1.2 PHP中stream_socket_xxx函数介绍

1.3  php实现stream_socket_xxx函数的RPC远程方法调用

二、socket_xxx函数与stream_socket_xxx函数的区别


一、stream_socket_xxx函数介绍

1.1 Streams的含义

流(Streams)它用于统一文件、网络、数据压缩等类文件操作方式,并为这些类文件操作提供一组通用的函数接口。在最简单的定义中,一个stream就是一个具有流式行为的资源对象。也就是说,它可以线性方式对stream进行读取或写入,并且可以用fseek()跳转到stream内的任意位置

流有点类似数据库抽象层,在数据库抽象层方面,不管使用何种数据库,在抽象层之上都使用相同的方式操作数据,
而流是对数据的抽象,它不管是本地文件还是远程文件还是压缩文件等等,只要来的是流式数据(是一组顺序、大量、快速、连续到达的数据序列,像流水一样来一点数据,处理一点,流式数据被封装成了byte流(其实也是二进制的)如果是全部收到数据以后再处理,那么延迟会很大,而且在很多场合会消耗大量内存),那么操作方式就是一样的
有了流这个概念就引申出了包装器wrapper这个概念
每一种流都实现了一个包装器(wrapper)类【即Stream 可以通过 <scheme>://<target> 方式来引用。其中<scheme>是包装类的名字,<target>中的内容是由包装类的语法指定,不同的包装类的语法会有所不同。】,包装器类包含一些额外的代码用来处理特殊的协议编码。PHP提供了一些内置的包装器类,我们也可以很轻松的创建和注册自定义的包装器类。我们甚至容可以使用上下文(contexts)和过滤器来改变和增强包装器

PHP默认的包装类是file://,也就是说我们在访问文件系统的时候,其实就是在使用一个stream。我们可以通过下面两种方式来读取文件中的内容,readfile('/path/to/somefile.txt')或者readfile('file:///path/to/somefile.txt'),这两种方式是等效的。如果你是使用readfile('http://google.com/'),那么PHP会选取HTTP stream包装类来进行操作。

1.2 PHP中stream_socket_xxx的函数介绍

stream_socket_xxx常用函数:

stream_socket_client() - 打开Internet或Unix域套接字连接
stream_socket_server() -创建Internet或Unix域服务器套接字
stream_socket_accept — 接受由 stream_socket_server() 创建的套接字连接
stream_set_blocking() - 为资源流设置阻塞或者阻塞模式
stream_set_timeout() - 设置流的超时时间
stream_select() - 在tv_sec和tv_usec指定的超时时间内,对给定的流数组运行等效的select()系统调用
fgets() - 从文件指针中读取一行
fgetss() - 从文件指针中读取一行并过滤掉 HTML 标记
fwrite() - 写入文件(可安全用于二进制文件)
fread() - 读取文件(可安全用于二进制文件)
fclose() - 关闭一个已打开的文件指针
feof() - 测试文件指针是否到了文件结束的位置

1.3  php实现stream_socket_xxx函数的RPC远程方法调用

创建服务端代码 rpc_server.php

<?php/*
* 服务端
*/class RpcServer{private $port = 0; // 监听端口号private $host = ''; // IPpublic function __construct($host, $port){$this->host = $host;$this->port = $port;}/*** 运行, 监听端口并处理*/public function run(){// 创建socket$server = stream_socket_server("tcp://{$this->host}:{$this->port}");if(empty($server)) throw new Exception('创建套接字失败');// 监听while (true){$client = stream_socket_accept($server);if(empty($client)) continue;// 处理请求$this->disposeClient($client);fclose($client);}}private function disposeClient($client){$buf = fread($client, 4096);$array = json_decode($buf, true);// 创建对象并调用方法$class = $array['class'] ?? '';$method = $array['method'] ?? '';$params = $array['params'] ?? [];$instance = new $class();$result = $instance->$method(...$params);fwrite($client, json_encode($result));}
}
// 测试调用类
class Test{public function returnFunction(){return 'connect_success';}public function add($a, $b){return $a + $b;}
}(new RpcServer('127.0.0.1', 8888))->run();

创建客户端代码 rpc_client.php

<?php/*
* 客户端
*/class RpcClient{private $urlInfo = null;private $className = '';private function __construct($url, $className){$this->urlInfo = parse_url($url);$this->className = $className;}public static function getInstance($className){return new RpcClient('127.0.0.1:8888', $className);}public function __call($name, $arguments){// 创建客户端$client = stream_socket_client("tcp://{$this->urlInfo['host']}:{$this->urlInfo['port']}");if(empty($client)) return null;// 发送数据fwrite($client, json_encode(['class' => $this->className,'method' => $name,'params' => $arguments,]));// 接收返回$data = fread($client, 4096);// 关闭客户端fclose($client);return json_decode($data, true);}
}$test = RpcClient::getInstance('Test');
echo $test->returnFunction();
echo PHP_EOL;
echo $test->add(2, 6);
echo PHP_EOL;

执行结果:

二、socket_xxx函数与stream_socket_xxx函数的区别

通过对比上篇文章socket_xxx函数的使用和stream_socket_xxx函数可以发现,stream_socket_xxx函数建立客户端或者服务的只需要一个函数即可,而socket_xxx函数需要执行几次函数,相对来说stream_socket_xxx函数是php自带的接口,所以更好用一些,而socket_xxx函数有点类似于C语言,更底层,所以用起来复杂一些。

1、socket_xxx函数需要按照扩展,stream_socket_xxx函数不需要安装扩展

2、socket_xxx函数可以比stream_socket_xxx函数设置的更精确

stream_socket_xxx函数详细介绍以及与socket_xxx函数的区别相关推荐

  1. php打印数组的函数,详细介绍php打印数组函数是什么

    详细介绍php打印数组函数是什么 发布时间:2020-04-16 10:30:45 来源:亿速云 阅读:159 作者:小新 今天小编给大家分享的是php打印数组函数是什么,很多人都不太了解,今天小编为 ...

  2. python max函数_Python max内置函数详细介绍

    Python max内置函数 max(iterable, *[, key, default]) max(arg1, arg2, *args[, key]) Return the largest ite ...

  3. linux下的fgetc()与fputc()函数详细介绍及代码演示

    linux下的标准I/O的fgetc()与fputc()函数详细介绍及代码演示 文章目录 前言 一.fgetc()用法介绍 二.fputc()用法介绍 代码演示 总结 前言 在C语言中,读写文件比较灵 ...

  4. mysql 字段最右匹配_Mysql字符串处理函数详细介绍、总结 -电脑资料

    一.简明总结 ASCII(char) 返回字符的ASCII码值 BIT_LENGTH(str) 返回字符串的比特长度 CONCAT(s1,s2-,sn) 将s1,s2-,sn连接成字符串 CONCAT ...

  5. linux awk 内置函数详细介绍(实例)

    原文地址为: linux awk 内置函数详细介绍(实例) 这节详细介绍awk内置函数,主要分以下3种类似:算数函数.字符串函数.其它一般函数.时间函数 一.算术函数: 以下算术函数执行与 C 语言中 ...

  6. Arduino WString.h库功能函数详细介绍

    Arduino WString.h库功能函数详细介绍 在Arduino开发框架下,String是一个很重要的数据类型.

  7. Pandas实用技能,数据筛选query函数详细介绍

    来源:Python数据之道 (ID:PyDataLab) 作者:阳哥 Pandas 可以说是 在Python数据科学领域应用最为广泛的工具之一. Pandas是一种高效的数据处理库,它以 datafr ...

  8. Pandas 实用技能,数据筛选 query 函数详细介绍

    作者 | 阳哥 来源 | Python数据之道 Pandas 可以说是 在Python数据科学领域应用最为广泛的工具之一. Pandas是一种高效的数据处理库,它以 dataframe 和 serie ...

  9. 【Python】Pandas实用技能,数据筛选query函数详细介绍

    来源:Python数据之道 (ID:PyDataLab) 作者:阳哥 Pandas 可以说是 在Python数据科学领域应用最为广泛的工具之一. Pandas是一种高效的数据处理库,它以 datafr ...

最新文章

  1. golang实现生产者和消费者
  2. WebApi中跨域解决办法
  3. ogg源端mysql添加trandata_OGG_GoldenGate日常维护(案例)
  4. suse查找oracle安装路径,Suse11sp3安装Oracle 11gR2
  5. input的onchange事件 及只能输入数字实现
  6. Linux学习总结(27)——CentOS7及以上系统的systemctl命令使用介绍
  7. Webframe x-scroll
  8. 什么是南向接口和北向接口?
  9. 我理解的一点股票技术分析
  10. Chrome浏览器另存为时浏览器假死问题
  11. 仅用10行Python代码,便可以坐拥后宫3000
  12. 宝塔部署网站无法访问
  13. 个人项目-仿微信小打卡小程序
  14. Matlab龚珀兹曲线模型预测,统计预测方法及预测模型.ppt
  15. us排名2019计算机专业排名,2019 USNews美国大学计算机专业排名
  16. R6034 又来了.
  17. 特斯拉官网上贷款利息年化费率计算错误
  18. 如何解决Namespace declaration statement has to be the very first statement or after any declare call
  19. 伪随机函数 密码学_密码学与理论2:什么是伪随机
  20. python pandas.pivot_table透视表函数

热门文章

  1. 包揽数理化国际奥赛全部第一,全员金牌,网友:中国队太秀了
  2. 板翅式换热器设计校核计算作业
  3. 基于Notebook的图像分类模板使用指南
  4. ssh 免IP密码登陆远程服务器设置
  5. windows12系统及16系统安装.NET Framework 3.5(sxs)文件包
  6. Android中的复制粘贴?
  7. html5中动画总结,前端动画总结
  8. Python实现9x9方格数独求解小工具
  9. 生鲜行业S2B2C平台重塑农产品生态圈,打造移动生鲜综合商城
  10. win10安装解压版mysql详细教程