【发布时间】: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 下获得许可,总而言之,这基本上意味着“是的,您可以随意使用它”:-)