2013-03-11 33 views
1

在这一段时间里我一直在挠头。我刚开始使用PHP/Thrift与HBase进行通信(我可以用Python来做到这一点)。出于某种原因,下面的代码生成类的HbaseClient“不是在$客户端=新行发现:PHP - 尽管包含'HbaseClient'类,但未找到

$GLOBALS['THRIFT_ROOT'] = 'thrift'; 
require_once($GLOBALS['THRIFT_ROOT'] . '/Thrift.php'); 
require_once($GLOBALS['THRIFT_ROOT'] . '/transport/TSocket.php'); 
require_once($GLOBALS['THRIFT_ROOT'] . '/transport/TBufferedTransport.php'); 
require_once($GLOBALS['THRIFT_ROOT'] . '/protocol/TBinaryProtocol.php'); 
require_once($GLOBALS['THRIFT_ROOT'] . '/Hbase/Hbase.php'); 

try 
{ 
    $socket = new TSocket('127.0.0.1', 9090); 
    $transport = new TBufferedTransport($socket, 1024, 1024); 
    $protocol = new TBinaryProtocolAccelerated($transport); 
    $client = new HbaseClient($protocol); 
    $transport->open(); 
} 
catch (Exception $e) 
{ 
    echo "Exception: %e\r\n"; 
} 

我硬是不知道为什么。在Hbase.php包含文件中,客户端被定义为:

class HbaseClient implements \Hbase\HbaseIf { 

我在这里丢失了一些非常简单的东西吗? (Full HBase.php here:http://pastebin.com/6kd9r2Se

在此先感谢!

回答

2

我相信这是一个命名空间问题。尝试把:

namespace Hbase; 
文件中

实例化对象使用完全合格的名称:

$client = new Hbase\HbaseClient($protocol); 
+1

上启用的错误报告的级别,但这两种方式都可以工作,但不像第一种解决方案那样劫持它们的命名空间,而应该导入它:'use Hbase;' – 2013-03-11 16:18:52

+0

@fab whoops,你是对的! – TheMethod 2013-03-11 16:37:02

+0

谢谢,我认为这是它。我也意识到,我有一个从手动安装的节俭版本,并从cloudera经理,所以我认为我也使用错误版本的包装。 – Geesu 2013-03-11 16:53:02

0

您确定已将HBase文件夹放置在THRIFT_ROOT目录下或外部?

+0

是的,那不是抛出一个不同的错误,如果我没有(在需要线)? – Geesu 2013-03-11 15:15:32

+0

你是否改变了下载包的目录结构?根据hbase客户端页面上的示例,代码应该是: '$ GLOBALS ['THRIFT_ROOT'] = dirname(__ FILE __)。'/ thrift/src';' 此外,是否require_once错误显示取决于系统 – priyolahiri 2013-03-11 15:27:56

相关问题