【问题标题】:Make PHP socket_connect timeout使 PHP socket_connect 超时
【发布时间】:2012-08-09 10:48:05
【问题描述】:

我创建了一个小应用程序来分析网络连接。它从浏览器运行并连接到本地 PHP/Apache 服务器。然后它要求 PHP 通过原始套接字发送一个 ping 数据包。问题是,如果我尝试 ping 的主机不存在或不响应 ping,我们永远不会从服务器得到响应。

我相信套接字请求会一直存在,直到 apache 重新启动。我最近从我的应用程序中得到了好坏参半的结果,我指责 apache 使用了太多的套接字。目前我已经设置了 AJAX 调用的超时时间,我对此很满意。但我确实需要让 PHP 进行超时,这样我就不会有 500,000 个套接字对无法访问的主机开放。

一些示例代码:

$sockconn = @socket_connect($socket, $target, null);
if(!$sockconn)
{
    $raw['error'] = socket_strerror(socket_last_error());
    $raw['status'] = false;
    return $raw;
}

这是不会超时的函数。我需要让它超时。 PHP 脚本执行时间也不会影响套接字。

我一无所知。

【问题讨论】:

  • 说真的,请改用fsockopen()。它使很多事情变得更容易,更容易获得(它是必须明确禁用的核心功能,而套接字扩展必须明确启用)第 5 个参数允许您基于每次调用定义连接超时。
  • 理论上是的(尽管使用更高级的stream_socket_* 函数而不是fsockopen())。在实践中,这将是一个巨大的 PITA。我有点假设您将处理 TCP,大多数时候这就是人们正在做的事情。但是,如果您想要的是 PHP 驱动的 ICMP 回显实现,那么我已经做到了……看看这个:download.networkm.net/code/php/class.ping.1.0.tar.gz(请注意,它是为 PHP4 编写的,当我的 OO 技能离开时…… . 需要的东西,但它确实有效,我用过几次)
  • 哦,还有一大堆随机调试废话。只需删除第 291-296 行
  • 新!改进!通常更容易使用,而且没有那么垃圾! download.networkm.net/code/php/class.ping.2.0.tar.gz
  • 在 LGPL 下获得许可,总而言之,这基本上意味着“是的,您可以随意使用它”:-)

标签: php sockets timeout ping


【解决方案1】:

您可以使用以下options 设置读取和发送超时:

socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => 1, 'usec' => 0));
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 1, 'usec' => 0));

或者,您可以使用non-blocking sockets 并定期轮询套接字以查看远程主机是否响应。

【讨论】:

    【解决方案2】:

    尝试设置default_socket_timeout

    【讨论】:

      猜你喜欢
      • 2013-05-17
      • 2019-06-29
      • 2014-05-18
      • 2013-08-07
      • 2012-07-07
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2016-03-08
      相关资源
      最近更新 更多