kafkiansky/phpclick

ClickHouse 异步 PHP 客户端。

0.1.0 2024-06-30 15:09 UTC

This package is auto-updated.

Last update: 2024-08-30 16:12:58 UTC


README

此包可以作为 Composer 依赖项安装。

composer require kafkiansky/phpclick

此包需要 PHP 8.2 或更高版本。

用法

从内存

此客户端设计用于在 ClickHouse 中大批量插入。使用 RowBinary 模式进行插入。这意味着您必须知道表列的类型及其顺序。

例如,让我们看看以下表 DDL

CREATE TABLE IF NOT EXISTS logs (
    `LogName` String CODEC(ZSTD(1)),
    `LogTime` DateTime64(9) CODEC(Delta(8), ZSTD(1)),
    `LogAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)),
    `LogUserId` Nullable(Int64)
)   ENGINE = MergeTree()
    ORDER BY (LogName, toUnixTimestamp(LogTime))
;

您可以直接使用 Row 从内存中插入

<?php

declare(strict_types=1);

require_once __DIR__.'/vendor/autoload.php';

use Kafkiansky\PHPClick;

$client = new PHPClick\Client('http://127.0.0.1:8124/');

$client->insert(
    PHPClick\Query::string('INSERT INTO test.logs (LogName, LogTime, LogAttributes, LogUserId)'),
    PHPClick\Batch::fromRows(
        PHPClick\Row::columns(
            PHPClick\Column::string('users'),
            PHPClick\Column::dateTime64(new \DateTimeImmutable()),
            PHPClick\Column::map(
                [PHPClick\Column::string('x'), PHPClick\Column::string('y')],
            ),
            PHPClick\Column::nullable(
                PHPClick\Column::int64(13),
            ),
        ),
        PHPClick\Row::columns(
            PHPClick\Column::string('users'),
            PHPClick\Column::dateTime64(new \DateTimeImmutable()),
            PHPClick\Column::map(
                [PHPClick\Column::string('x'), PHPClick\Column::string('y')],
            ),
            PHPClick\Column::nullable(),
        ),
    ),
);

从资源

或者将数据累积到文件中,然后从文件中粘贴数据

<?php

declare(strict_types=1);

require_once __DIR__.'/vendor/autoload.php';

use Kafkiansky\PHPClick;

PHPClick\rowsToFile(
    __DIR__.'/click.log', // or resource
    PHPClick\Row::columns(
        PHPClick\Column::string('users'),
        PHPClick\Column::dateTime64(new \DateTimeImmutable()),
        PHPClick\Column::map(
            [PHPClick\Column::string('x'), PHPClick\Column::string('y')],
        ),
        PHPClick\Column::nullable(
            PHPClick\Column::int64(13),
        ),
    ),
    PHPClick\Row::columns(
        PHPClick\Column::string('users'),
        PHPClick\Column::dateTime64(new \DateTimeImmutable()),
        PHPClick\Column::map(
            [PHPClick\Column::string('x'), PHPClick\Column::string('y')],
        ),
        PHPClick\Column::nullable(),
    ),
);

$client = new PHPClick\Client('http://127.0.0.1:8124/');

$logHandle = fopen(__DIR__.'/click.log', 'r');

try {
    $client->insert(
        PHPClick\Query::string('INSERT INTO test.logs (LogName, LogTime, LogAttributes, LogUserId)'),
        PHPClick\Batch::fromStream($logHandle),
    );
} finally {
    if (\is_resource($logHandle)) {
        \fclose($logHandle);
    }
}

查询构建器

您可以使用简单的查询构建器(仅插入)而不是查询字符串

<?php

declare(strict_types=1);

require_once __DIR__.'/vendor/autoload.php';

use Kafkiansky\PHPClick;

$client = new PHPClick\Client('http://127.0.0.1:8124/');

$client->insert(
    PHPClick\Query::builder('test.logs')->columns(
        'LogName',
        'LogTime',
        'LogAttributes',
        'LogUserId',
    ),
    PHPClick\Batch::fromRows(/* rows here */),
);

类型

以下列出了所有可用的 ClickHouse 类型

测试

$ composer test

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件