2

编码

我正在使用 php 和 python 通过 UDP向石墨发送指标。

我的python客户端看起来像这样

#!/usr/bin/python
import time
from socket import socket

sock = socket()
try:
  sock.connect( ('127.0.0.1', 2003) )
except:
  print 'network error'
  sys.exit(12)

message = ("some.custom.metric.python 1 %d\n" % (int( time.time() )))
print message
sock.sendall(message)

输出:

一些.custom.metric.python 1 1376045467

我的php客户端是这样的

<?php

try {
    $fp = fsockopen("udp://127.0.0.1", 2003, $errno, $errstr);

    if (!empty($errno)) echo $errno;
    if (!empty($errstr)) echo $errstr;

    $message = "some.custom.metric.php 1 ".time().PHP_EOL;
    $bytes = fwrite($fp, $message);
    echo $message;
} catch (Exception $e) {
    echo "\nNetwork error: ".$e->getMessage();
}

输出:

一些.custom.metric.php 1 1376042961

测试

我开始启用调试输出:

/opt/graphite/bin/carbon-cache.py --debug start

当我运行我的python客户端时,它工作得很好,我可以在调试输出中看到它

09/08/2013 13:13:05 :: [listener] MetricLineReceiver connection with 127.0.0.1:58134 established
09/08/2013 13:13:05 :: [listener] MetricLineReceiver connection with 127.0.0.1:58134 closed cleanly

我通过 CLI 使用netcat做同样的事情

echo "some.custom.metric.netcat 1 `date +%s`" | nc -w 1 127.0.0.1 2003

我可以在调试输出中看到连接

09/08/2013 13:17:46 :: [listener] MetricLineReceiver connection with 127.0.0.1:58136 established
09/08/2013 13:17:48 :: [listener] MetricLineReceiver connection with 127.0.0.1:58136 closed cleanly

问题

我的 php 客户端从不与 carbon 通信。即使我使用没有应用程序监听的不同端口,我的 PHP 也只会告诉我一切都很好。如果我在我的 python 客户端上做同样的事情,我会收到一个网络错误。

根据 PHP 文档,由于协议的性质,使用 UDP 时fsockopen永远不会失败,但是在执行fwrite时我应该得到一个错误。在我的情况下,无论我在打开套接字时使用哪个主机/端口,fwrite 总是返回 $message 的 len() 。

如果我在 netcat 或 python 客户端中使用了错误的端口,我会按预期收到网络错误。

PHP-cli 有error_display = Onerror_reporting = E_ALL. 我已经在 debian 7.1 上的 PHP 5.4.4-14 和 Windows 7 上的 PHP 5.5 上对此进行了测试。

有没有人遇到过类似的事情?我几乎可以肯定我的石墨或网络配置没有问题,所以我敢打赌它与 PHP 有关。

4

1 回答 1

2

检查您是否有一个开放的 UDP 端口(默认情况下它是关闭的)。我用于测试的代码(简化版)(使用 TCP)

$line = "foo.bla 1 " . time() . "\n";

$fp = fsockopen('127.0.0.1', 2003, $err, $errc, 1);
fwrite($fp, $line);

fclose($fp);
于 2013-08-14T19:22:02.247 回答