本文介绍如何在 PHP 开发环境连接并访问 ByteHouse 云数仓。
细分项 | 已验证版本/注意事项 |
---|---|
ClickHouse驱动程序版本 | 已验证版本:1.6.0,版本详情请参见:phpClickhouse v1.6.0 |
PHP版本 | 已验证版本:PHP 8.4 |
获取ClickHouse驱动后,可以通过composer
进行安装:
composer require smi2/phpclickhouse
可参考下面代码样例,通过PHP驱动连接ByteHouse。
<?php // Include the ClickHouse PHP driver require_once __DIR__ . '/../vendor/autoload.php'; // ByteHouse connection configuration $config = [ // ByteHouse gateway host 'host' => 'tenant-{TENANT_ID}-{REGION}-public.bytehouse.volces.com', // ByteHouse HTTP port 'port' => '8123', // Your database name 'database' => 'your_database', // ByteHouse uses fixed username 'bytehouse' 'username' => 'bytehouse', // Your ByteHouse API key 'password' => 'your_api_key', // HTTPS is required for ByteHouse 'https' => true, // use settings()->set() $db->settings()->set('send_timeout', (int)300); // Socket发送超时时间(单位:秒) $db->settings()->set('receive_timeout', (int)300); // Socket发接收时时间(单位:秒) $db->settings()->set('virtual_warehouse', 'virtual_warehouse id'); // 指定计算组id $db->setTimeout(300); // 查询超时时间(单位:秒) $db->setConnectTimeOut(5); // 连超时时间(单位:秒) ]; try { // Initialize the client $db = new ClickHouseDB\Client($config); // Test connection with ping $db->ping(); echo "Successfully connected to ByteHouse!\n"; // Set the working database (optional if specified in config) $db->database('your_database'); $result = $db->select('SELECT 1'); print_r($result->rows()); } catch (\Exception $e) { echo "Connection failed: " . $e->getMessage() . "\n"; }
参数 | 配置要点 |
---|---|
host | 配置为ByteHouse的公网连接域名,其中{TENANT_ID}、{REGION}分别为火山引擎主账号的账号ID和ByteHouse的地域信息,您可以在ByteHouse控制台的 租户管理>基本信息>网络信息 中查看对应信息。 |
port | 固定配置为:8123。 |
database | 配置为连接ByteHouse的数据库名称。 |
username & password |
|
https | 固定配置为:true。 |
$db->settings()->set() | (可选)用于设置ByteHouse服务器相关参数,例如,配置连接ByteHouse后使用的计算组。如果您有多个计算组,希望后续查询ByteHouse数据时使用指定计算组,或者希望设置其他指定参数,您可以在 |
连接ByteHouse后,您可以通过ClickHouse Rust (HTTP) Driver进行建表、数据读写等操作,以下为简单的操作示例。
<?php require_once __DIR__ . '/../vendor/autoload.php'; $config = [ // Fill in ByteHouse connection configuration ]; try { $db = new ClickHouseDB\Client($config); $db->ping(); // Create table $db->write('DROP TABLE IF EXISTS demo_table'); $db->write(' CREATE TABLE demo_table ( event_date Date, user_id UInt32, message String ) ENGINE = CnchMergeTree ORDER BY tuple() '); // Insert data $db->insert('demo_table', [ [date('Y-m-d'), 1001, 'Hello ByteHouse'], [date('Y-m-d'), 1002, 'Another row'], ], ['event_date', 'user_id', 'message']); // Select data $result = $db->select('SELECT * FROM demo_table'); print_r($result->rows()); } catch (\Exception $e) { echo "Error: " . $e->getMessage() . "\n"; }
您可以使用insertBatchFiles()
来并行插入多个CSV文件,可以有效地将数据批量加载到ByteHouse。
<?php require_once __DIR__ . '/../vendor/autoload.php'; $config = [ // Fill in ByteHouse connection configuration ]; // Helper function to generate CSV files with demo data function generateDemoCSV($filename, $numRows): void { $fp = fopen($filename, 'w'); for ($i = 0; $i < $numRows; $i++) { fputcsv($fp, [ date('Y-m-d'), // event_date rand(1000, 9999), // user_id 'Message ' . $i, // message rand(1, 100) // value ], ',', '"', "\\", "\n"); } fclose($fp); echo "Generated $numRows rows in $filename\n"; } try { $db = new ClickHouseDB\Client($config); $db->write('DROP TABLE IF EXISTS demo_table'); $db->write(' CREATE TABLE demo_table ( event_date Date, user_id UInt32, message String, value UInt32 ) ENGINE = CnchMergeTree ORDER BY tuple() '); // Generate CSV files $files = [ __DIR__ . '/demo_data_1.csv' => 1000, __DIR__ . '/demo_data_2.csv' => 1000 ]; foreach ($files as $file => $rows) { generateDemoCSV($file, $rows); } // Insert data via Batch Operation $result = $db->insertBatchFiles( 'demo_table', array_keys($files), ['event_date', 'user_id', 'message', 'value'] ); $totalCount = $db->select('SELECT count() as count FROM demo_table')->fetchOne('count'); echo "Total rows: $totalCount\n"; } catch (\Exception $e) { echo "Error: " . $e->getMessage() . "\n"; }
当前支持通过':param'
语法、'{param}'
语法,使用占位符安全地将参数值传递给查询,示例如下。
<?php require_once __DIR__ . '/../vendor/autoload.php'; $config = [ // Fill in ByteHouse connection configuration ]; $db = new ClickHouseDB\Client($config); try { // Create a sample table $db->write('DROP TABLE IF EXISTS user_events'); $db->write(' CREATE TABLE user_events ( event_date Date, event_type String, user_id UInt32, score Float32, tags Array(String) ) ENGINE = CnchMergeTree ORDER BY tuple() '); // Insert sample data $db->insert('user_events', [ [ '2024-01-01', 'login', 101, 0.5, ['new', 'mobile'] ], [ '2024-01-01', 'purchase', 102, 0.8, ['vip', 'desktop'] ], [ '2024-01-02', 'login', 101, 0.3, ['mobile'] ] ], [ 'event_date', 'event_type', 'user_id', 'score', 'tags' ]); // Example 1: Basic parameter binding $result = $db->select( 'SELECT * FROM user_events WHERE user_id = :id', ['id' => 101] ); echo "Events for user 101:\n"; print_r($result->rows()); // Example 2: Multiple parameter binding $result = $db->select( 'SELECT * FROM user_events WHERE event_date = :date AND event_type = :type', [ 'date' => '2024-01-01', 'type' => 'login' ] ); echo "\nLogin events on 2024-01-01:\n"; print_r($result->rows()); // Example 3: Array binding $result = $db->select( 'SELECT * FROM user_events WHERE user_id IN (:users) AND score >= :min_score', [ 'users' => [101, 102], 'min_score' => 0.5 ] ); echo "\nHigh-scoring events for selected users:\n"; print_r($result->rows()); // Example 4: Template binding for column selection $columns = 'event_date, event_type, user_id'; $result = $db->select( 'SELECT {cols} FROM user_events WHERE score > :score', [ 'cols' => $columns, 'score' => 0.4 ] ); echo "\nSelected columns for high scores:\n"; print_r($result->rows()); } catch (\Exception $e) { echo "Error: " . $e->getMessage() . "\n"; }