检测异步ping何时完成

时间:2014-02-04 18:28:13

标签: php

我使用运行PHP的IIS7网络服务器和ping.exe来ping我们客户的互联网地址。为了让pinging同时运行,我做了以下几点:

  • 将所有要监视的IP地址放在数据库表中
  • 创建一个名为batch.php的PHP文件,生成一个批处理文件pinglist.bat,其中包含一行代码,如每个IP的“启动php -qc:\ inetpub \ monitor \ autotask \ pingip.php IPADDRESS”,然后执行批处理文件。通过使用“start”,批处理文件不会等待上一个命令完成。
  • 将任务计划程序中的batch.php文件计划为每分钟运行一次。
  • pingip.php ping参数中给出的IP地址,然后将ping结果插入到mysql数据库中。

但是,我希望脚本执行一些更多的处理步骤(例如,为该批次生成平均值),同时为该批次的所有IP进行ping操作。

问题在于,由于回复时间和地址数量不同,我不知道所有同时发生的事情都已完成。

最好的方法是什么?要让batch.php启动pinglist.php,然后使用while循环查询数据库,如果该批次的所有结果都是每隔x毫秒?

请指教。感谢。

1 个答案:

答案 0 :(得分:2)

使用升序号作为批次标识符。让batch.php将两个参数传递给pingip.php - 批处理和要ping的IP:

$batch = time(); // or whatever
foreach ($ips as $ip) {
  echo "start php pingip.php $batch $ip";
}

pingip.php脚本应该将批次编号和ping结果写入db。确保批号字段上有索引。然后,您可以使用以下命令查找最近运行的批次编号:

SELECT MAX(batch) FROM pings

您可以通过以下方式查找最后一批中是否有任何错误:

SELECT COUNT(*) FROM pings WHERE batch = $batch AND <whatever>

你可以找到平均值:

SELECT AVG(ping) FROM pings WHERE batch = $batch

只要批次字段上有索引,每个查询都会非常快。我不打算分成两个表,这只是不必要的工作。