在file_get_contents中为connect和read设置超时

时间:2015-06-29 15:46:41

标签: php curl file-get-contents

先决条件

群集服务器

我有一台运行多个虚拟"集群节点的服务器"。基本上,它们中的每一个都是一个公共的,非常小的HTTP服务器,它有两个功能:

127.0.0.1:XXXXn/ping
127.0.0.1:XXXXn/api/arg/arg/arg

这两个函数都返回一个200OK标题,后跟HTML。 ping用于测试节点是否繁忙。如果节点n忙,则连接将超时(因为节点正忙于处理另一个请求)。但是,如果节点具有响应性且可用,则ping将返回

PING=NODE.FREE

致电服务器

我想编写一个可以在任何Web服务器上加载的PHP程序,以便为API提供更好的界面。以下代码来自较旧的API版本,每个IP只有一个节点,因此代码非常简单:

<?php
    error_reporting(0);
    ini_set('display_errors', 0);
    echo file_get_contents("http://127.0.0.1:XXXX9/".$_REQUEST['script']."/".$_REQUEST['query']."/".$_REQUEST['sort']."/".$_REQUEST['num']);
?>

这当然被称为

http://server.org/api.php?script=api&query=... (etc.)

并返回节点#9的结果(因此XXXX9)。有10个节点填充一个服务器,因此有10个服务器从:XXXX0:XXXX9

目标

我想实现PHP(即webserver端)负载平衡。基本上,在调用时,PHP程序应循环遍历所有节点,直到一个节点在少于指定的时间内成功返回PING=NODE.FREE

由于我使用file_get_contents,我读到了为此设置超时的方法。事实证明,有很多方法,例如使用流上下文或curl选项(而不是文件_...)。我认为我面临的问题是每个选项(在这些答案[{3}}和here中提供)仅影响连接读取。

我要检查的是,如果在给定时间内(例如每个节点1000毫秒),节点连接并且返回消息。然后,只有 ,代码应继续使用上述语法在此节点上调用API。当然,如果没有节点可用。 atm。,它应循环,直到一个人自由。

现在,设置和检查此超时的最佳和最安全的方法是什么?如果可能,我希望避免fsock,因为大多数托管网络服务器都禁用此功能。

1 个答案:

答案 0 :(得分:0)

使用流上下文方法解决:

lease 10.0.0.1 {
  starts 1 2015/06/29 07:22:01;
  ends 2 2015/06/30 07:22:01;
  tstp 2 2015/06/30 07:22:01;
  cltt 1 2015/06/29 07:22:01;
  binding state active; 
  next binding state free;
  hardware ethernet 08:2e:5f:f0:8b:a1;
}
lease 10.0.0.2{
  starts 1 2015/06/29 07:31:20;
  ends 2 2015/06/30 07:31:20;
  tstp 2 2015/06/30 07:31:20;
  cltt 1 2015/06/29 07:31:20;
  binding state active; 
  next binding state free;
  hardware ethernet ec:b1:d7:87:6f:7a;
  uid "\001\354\261\327\207oz";
  client-hostname "SYSTEM123456789";
}