1

PHP を thrift で使用しようとしていますが、特定のクラスが見つからないため、適切に実行できません。0.8.0 では問題なくこれを実行できましたが、0.9.0 をダウンロードしたので、thrift ファイルを適切に含める方法について途方に暮れています。

コードのスニペットは次のとおりです。

$GLOBALS['THRIFT_ROOT'] = '/home/user/final/Thrift';
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( 'Hbase/Hbase.php');
require_once( 'Hbase/Types.php');

use Hbase\HbaseClient;

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();

    //show all tables
    $tables = $client->getTableNames();
    foreach ( $tables as $name )
    {
        echo( "  found: {$name}\n" );
    }
}
catch (Exception $e)
{
    echo "Exception: %e\r\n";
}

次に示すように、すべてのファイルがディレクトリに適切に配置されます。

HBase インクルード - PHP しかし、コマンド ライン (php -f index.php) からファイルを実行すると、次のエラーが表示されます。

クラス 'Thrift\Transport\TTransport' が /home/user/final/Thrift/Transport/TSocket.php の 35 行目に見つかりません

次に何をすべきか本当に途方に暮れています.PHPで「use」コマンドまたは「namespace」を使用することに慣れていません.これはこれを解決するのに役立つと感じています. php の倹約の README には、symfony の使用についても言及されていますが、これは私をさらに混乱させます。

どんなアドバイスでも大歓迎です!

ありがとう!

4

3 に答える 3

1

名前空間 次のように:

use Thrift\Transport\TSocket;
use Thrift\Transport\TBufferedTransport;
use Thrift\Protocol\TBinaryProtocolAccelerated;

    try {
                $socket = new TSocket('xxxxx', 9090);
                $transport = new TBufferedTransport($socket, 1024, 1024);
                $protocol = new TBinaryProtocolAccelerated($transport);
                $client = new HbaseClient($protocol);
                $transport -> open();

                //show all tables
                $tables = $client -> getTableNames();
                foreach ($tables as $name) {
                    echo("  found: {$name}\n");
                }
            } catch (Exception $e) {
                print_r($e);
            }
于 2013-11-09T22:50:14.553 に答える
0

クラスローダーを使用します。Hbase クラスは classLoader をサポートしていませんが、Thrift 名前空間を使用しています。

<?php
define('THRIFT_PATH', __DIR__);

require_once THRIFT_PATH . '/Thrift/ClassLoader/ThriftClassLoader.php';

$classLoader = new Thrift\ClassLoader\ThriftClassLoader();
$classLoader->registerNamespace('Thrift', THRIFT_PATH);
$classLoader->register();

// (!) include after classLoader
require_once 'Hbase/Hbase.php';
require_once 'Hbase/Types.php';

try
{
    $socket = new Thrift\Transport\TSocket('127.0.0.1', 9090);
    $transport = new Thrift\Transport\TBufferedTransport($socket, 1024, 1024);
    $protocol = new Thrift\Protocol\TBinaryProtocolAccelerated($transport);
    $client = new Hbase\HbaseClient($protocol);
    $transport->open();

    //show all tables
    $tables = $client->getTableNames();
    foreach ($tables as $name)
    {
        echo "found: {$name}\n";
    }
}
catch (Exception $e)
{
    echo "Exception: %e\r\n";
}

PSこのコードは、ディレクトリ構造で機能します。

ここに画像の説明を入力

于 2014-11-14T14:37:55.600 に答える