Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Phpclickhouse Laravel Package

smi2/phpclickhouse

PHP client for ClickHouse with an easy, fluent API. Supports queries and inserts, result sets, bindings, and connection configuration for fast analytics workflows. Suitable for Laravel and standalone PHP apps needing reliable ClickHouse access.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture Fit

  • High Fit for Laravel: The package is a zero-dependency PHP client for ClickHouse, making it a lightweight, performant choice for Laravel applications requiring analytical workloads, real-time analytics, or time-series data.
  • Laravel Integration: Works seamlessly with Laravel’s Query Builder (via custom macros) or Eloquent (via custom accessors/mutators) for ClickHouse-specific operations.
  • Microservices & Event-Driven: Ideal for event sourcing, CQRS, or real-time dashboards where ClickHouse serves as a high-performance OLAP database.
  • Hybrid Architecture: Can complement PostgreSQL/MySQL (for transactions) + ClickHouse (for analytics) in a polyglot persistence setup.

Integration Feasibility

  • Laravel Service Provider: Can be bootstrapped via a Service Provider to register a ClickHouse DB facade (ClickHouse::table()).
  • Query Builder Macros: Extend Laravel’s Query Builder with ClickHouse-specific methods (e.g., selectWithNativeParams()).
  • Eloquent Integration: Use custom accessors for ClickHouse types (e.g., DateTime64, UUID) or repository pattern for complex queries.
  • API Layer: Works well in Laravel API projects where ClickHouse powers real-time analytics endpoints.

Technical Risk

Risk Area Assessment Mitigation Strategy
Type Mismatch Laravel’s Eloquent expects Carbon, but ClickHouse uses DateTime64. Use accessors/mutators or custom casts in Eloquent models.
Connection Pooling No built-in Laravel connection pooling for ClickHouse. Use PHP-CLI workers (for queues) or Redis-based connection pooling.
Async Query Handling Laravel’s sync framework may block on async ClickHouse queries. Use Laravel Queues (bus:work) for async operations or ReactPHP for async.
Schema Migrations ClickHouse DDL differs from Laravel Migrations. Use custom Artisan commands or FlySystem-based schema management.
Error Handling ClickHouse errors differ from Laravel’s QueryException. Wrap in custom exceptions or use try-catch with ClickHouseDB\Exception.
Performance Overhead HTTP-based client may add latency vs. native drivers. Benchmark vs. ClickHouse DBAL (if available) or native HTTP client.

Key Questions for TPM

  1. Use Case Clarity:
    • Is ClickHouse used for OLAP (analytics), OLTP (transactions), or hybrid?
    • Will it replace PostgreSQL/MySQL or augment it?
  2. Data Flow:
    • Will Laravel write to ClickHouse (via bulk inserts) or just read?
    • Are there real-time sync requirements (e.g., Kafka → ClickHouse)?
  3. Team Expertise:
    • Does the team have ClickHouse query optimization experience?
    • Is there DevOps support for ClickHouse clusters?
  4. Scaling Needs:
    • Expected query volume (QPS) and data size (TB)?
    • Will sharding/replication be needed?
  5. Monitoring & Observability:
    • How will query performance and failures be monitored?
    • Will Laravel Horizon or Prometheus track ClickHouse metrics?

Integration Approach

Stack Fit

Laravel Component Integration Strategy
Database Layer Register as a secondary DB connection (config/database.php).
Query Builder Extend with macros for ClickHouse-specific syntax (e.g., nativeParams()).
Eloquent Use custom accessors for ClickHouse types or repository pattern.
Migrations Implement custom Artisan commands for ClickHouse DDL.
Queues/Jobs Offload async inserts/queries to Laravel Queues (bus:work).
API Layer Use ClickHouse for analytics endpoints (e.g., /metrics, /reports).
Caching Cache frequent ClickHouse queries in Redis (e.g., Cache::remember).

Migration Path

  1. Phase 1: Read-Only Analytics
    • Replace PostgreSQL-heavy analytics with ClickHouse.
    • Use Laravel’s DB::connection('clickhouse') for queries.
    • Example:
      $results = DB::connection('clickhouse')->select('SELECT * FROM analytics WHERE event_date > :date', ['date' => now()->subDay()]);
      
  2. Phase 2: Write Support
    • Implement bulk inserts from Laravel jobs.
    • Example:
      ClickHouse::insert('events', $batchData, ['event_time', 'user_id', 'metric']);
      
  3. Phase 3: Hybrid Transactions
    • Use Laravel transactions for PostgreSQL + async writes to ClickHouse.
    • Example:
      DB::transaction(function () {
          // PostgreSQL write
          User::create([...]);
          // Async ClickHouse write (via queue)
          dispatch(new SyncToClickHouse($user));
      });
      
  4. Phase 4: Full Replacement
    • Migrate read-heavy tables to ClickHouse.
    • Use Laravel’s DB::purge() to reset connections.

Compatibility

Laravel Feature Compatibility Notes
Eloquent Models Works via custom accessors (e.g., getDateTime64Attribute()).
Migrations Requires custom Artisan commands (ClickHouse lacks Laravel Migrations support).
Query Builder Extendable via macros (e.g., DB::macro('clickhouseSelect', fn($query) => ...)).
Caching Cache ClickHouse results in Redis or Laravel Cache.
Queues Use Laravel Queues for async ClickHouse operations.
Scouting Not applicable (ClickHouse is not a full-text search DB).
Events Use Laravel Events to trigger ClickHouse syncs (e.g., user.created).

Sequencing

  1. Setup ClickHouse Connection
    • Add to config/database.php:
      'connections' => [
          'clickhouse' => [
              'driver'   => 'clickhouse',
              'host'     => env('CLICKHOUSE_HOST', '127.0.0.1'),
              'port'     => env('CLICKHOUSE_PORT', 8123),
              'database' => env('CLICKHOUSE_DB', 'default'),
              'username' => env('CLICKHOUSE_USER', 'default'),
              'password' => env('CLICKHOUSE_PASSWORD', ''),
              'timeout'  => 10,
          ],
      ],
      
  2. Create a ClickHouse Facade
    • Publish the package as a Laravel facade (app/ClickHouse.php):
      namespace App\Facades;
      use ClickHouseDB\Client;
      class ClickHouse extends \Illuminate\Support\Facades\Facade {
          protected static function getFacadeAccessor() { return 'clickhouse'; }
      }
      
  3. Extend Query Builder
    • Add macros in a Service Provider:
      DB::macro('clickhouseSelect', function ($query, $bindings = []) {
          return app('clickhouse')->select($query, $bindings);
      });
      
  4. Implement Async Writes
    • Create a Laravel Job:
      class SyncToClickHouse implements ShouldQueue {
          public function handle() {
              ClickHouse::insert('events', $this->data, ['event_time', 'user_id']);
          }
      }
      
  5. Add Monitoring
    • Log ClickHouse query performance:
      try {
          $result = ClickHouse::select('SELECT ...');
      } catch (\ClickHouseDB\Exception $e) {
          Log::error("ClickHouse Error: " . $e->getMessage());
          throw $e;
      }
      

Operational Impact

Maintenance

Task Effort Level Notes
Dependency Updates Medium Monitor smi2/phpclickhouse for PHP 8.2+ compatibility.
Schema Changes High ClickHouse lacks migrations; use custom scripts or **
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
andydefer/laravel-cluster
testo/fiber
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity
christhompsontldr/laravel-inky
spatie/mailcoach-vapor
spatie/laravel-javascript-views