【问题标题】:PHP - Restricting socket connection periodPHP - 限制套接字连接时间
【发布时间】:2023-04-02 12:04:01
【问题描述】:

我正在从一个以未知间隔抽取数据的套接字获取数据。几分钟(甚至几小时)可能什么都没有,然后可以排队等待数万行。

因为我不知道会发生什么,所以我希望构建一个能连接 2-5 秒的东西,不管在服务器端排队的数量如何。

这是我目前拥有的。

<?php
set_time_limit(2);
ini_set('max_input_time', 2);

$timeout       = 3;
$host          = 'data.host.com';
$port          = 6543;
$fp            = fsockopen($host, $port, $errno, $errstr, $timeout);
stream_set_timeout($fp, 2);
if( !$fp ){
  echo "Connection to '$host' failed.\n$errstr ($errno)\n";
  exit;
}

while( !feof($fp) ){
  $xml = trim(fgets($fp));
  if(empty($xml)) continue;
  echo "XML=$xml\n";
}

echo "DONE\n";

function shutdown(){
  echo "SHUTDOWN!\n";
}

register_shutdown_function('shutdown');

然而,这永远不会结束。 while 循环似乎与人们预期的一样无限(断章取义)。如何输入和捕获一些退出/中断/杀死?

【问题讨论】:

    标签: php linux sockets


    【解决方案1】:
    $start_time = time();
    while( !feof($fp) ){
      $xml = trim(fgets($fp));
      if(empty($xml)) continue;
      echo "XML=$xml\n";
      if ( time() - $star_time > 320 ) break;
    }
    

    【讨论】:

      【解决方案2】:

      这可能不是最好/正确的方法,但它应该工作(未经测试)

          $startTime = time();
          $executionTime = 180; //180 Seconds - 2 Minutes
      
          while( !feof($fp) ){
              if ((time() - $startTime) > $executionTime) {
                  //If time has been longer than the execution time, break
                  //out of loop
                  break;
              }
              $xml = trim(fgets($fp));
              if(empty($xml)) continue;
              echo "XML=$xml\n";
          }
      

      【讨论】:

        【解决方案3】:

        我相信这是一个 mysql 连接,如果是,请使用默认端口。限制套接字连接是不可取的,除非您可以将所有事务存储在临时数据库中并在分配的时间推送到其他位置。

        【讨论】:

          猜你喜欢
          • 2016-05-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-06
          • 2015-04-06
          • 2013-04-17
          • 1970-01-01
          • 2012-04-05
          • 1970-01-01
          相关资源
          最近更新 更多