【问题标题】:php - file_get_contents/fread continuous input streamphp - file_get_contents/fread 连续输入流
【发布时间】:2012-08-31 19:21:39
【问题描述】:

对于我的项目,我必须从我的 (php) 网站与远程设备进行通信。我需要实现的命令之一发送一个连续的数据流,直到它接收到来自用户的更多输入。

所以我的问题是,如果我使用file_get_contents(),这会是一个问题吗?还是应该使用fread()?我的输入是一个字符串的形式,fread() 说我应该使用file_get_contents(),但是如果我使用file_get_contents(),我需要把它放在一个循环中,然后在数据包之间向我的设备发送数据以停止它发送数据?每次我调用file_get_contents() 时,循环会关闭我的连接并打开一个新连接吗?

我每天可以使用的数据量也受到限制,如果我使用 file_get_contents(),它会限制块大小为 8KB 的块大小,即我当天数据的 8%。

【问题讨论】:

    标签: php http


    【解决方案1】:

    使用fsockopenfread等...file_get_contents的目的是读取文件,而不是按照您想要的方式发送/接收数据。

    【讨论】:

      【解决方案2】:

      我会使用fopen 并使用stream_context_create

      $options = array(
          'http' => array(
              'method' => 'GET',
          ),
      );
      $context = stream_create_context($options);
      $fh = fopen($your_url, 'r', false, $context);
      

      这将允许您将流作为文件使用。让你可以访问任何你想用它做的事情......比如用fgets或其他任何东西逐行解析它。

      【讨论】:

      • 无论如何,我现在必须使用stream_create_context() 来处理file_get_contents。只是为了澄清 fopen 的流是否位于后台(可能在它自己的线程上?)在某个缓冲区中收集数据,直到我从中提取数据?
      • 至于线程,我不确定。您可以查看源代码并查看。 github.com/php/php-src。数据收集在缓冲区中,等待您读取。我从来没有检查过让缓冲区中积累的东西是否会影响我的脚本使用的内存,主要是因为我必须有一些强有力的保证,即我处理数据的速度比它到达流中的速度要快。
      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      相关资源
      最近更新 更多