qq_33893544 2020-06-12 08:46 采纳率: 35.7%
浏览 81
已采纳

php stream_select 以及其他流函数的用法

在学习socket的使用学到流,但是一直不明白,这些流函数的执行步骤

  • 写回答

19条回答 默认 最新

  • hguisu 架构领域优质创作者 2020-06-13 03:14
    关注

    1、stream_socket_client函数是和服务器建立连接,然后返回句柄fd。记住这个只是建立tcp连接。

      由于并发建立多个连接,建立连接的fd都放在 $sockets数组里面。

      假如本例:

      请求Client1的socket fd=5555

      请求Client2的socket fd=5556

      $sockets[0] = 5555

      $sockets[1] = 5556


    2、stream_select会调用操作系统io函数select来工作,

      $read = $write = $sockets;

      select的机制:检查$read或者$write存放fd是否可以操作。

      比如$read,有数据就把$read的fd对应标志位设置为1,即通知应用层已经有数据可以读了。


    3、然后就遍历$read的fd读取数据。

    上面就达到了并发请求的目的。


    不明白的我打个比方:

      1)、目的:从A5555,B5556两地搬砖回来,每个司机搬回来的砖头都是放在指定地方。

      2)、连接:你派两个司机fd1,fd2分别开车去获取:

       fd1 = stream_socket_client(A5555)

       fd2 = stream_socket_client (A5556)


      3)、select机制:这时你等待获取砖头,谁的卸载地(缓冲区)有砖头就通知你。

       即告诉两个司机,如果在timeout时间内运回砖头,那就把fd对应的标志位设置为1,

       即如果司机fd1运回砖头,fd1对应的标志位为1.

       注意的是stream_select参数:timeout一般是设置为0,即立即返回。


      4)、并行获取结果:

       轮训从fd1,fd2的所在的缓冲区获取砖头。


    如果不是select机制,我们看看如何处理:

      1)、目的:从A5555,B5556两地搬砖回来,每个司机搬回来的砖头都是放在指定地方。

      1)、连接:你派两个司机fd1,fd2分别开车去获取:

       fd1 = stream_socket_client(A5555)

       fd2 = stream_socket_client (A5556)

      3)、直接获取结果:

       因为没人通知你缓冲区已经有数据,你只能串行执行。

       你只能从这两个卸载地(缓冲区)其中之一把砖头搬完再去另外地方搬砖。

       比如先在司机fd1的缓冲区搬砖完了,再去司机fd2的缓冲区搬砖。


      4) 结果就是串行获取。


    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(18条)

报告相同问题?

问题事件

  • 已采纳回答 8月16日

悬赏问题

  • ¥15 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 求螺旋焊缝的图像处理
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了