编码
我正在使用 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 = On
和error_reporting = E_ALL
. 我已经在 debian 7.1 上的 PHP 5.4.4-14 和 Windows 7 上的 PHP 5.5 上对此进行了测试。
有没有人遇到过类似的事情?我几乎可以肯定我的石墨或网络配置没有问题,所以我敢打赌它与 PHP 有关。