@Kypidon4ik
Фрилансер, Wordpress developer

Как перенаправить все select запросы из wp mysql в clickhouse?

Есть задача перехватывать запросы select и отдавать их не mysql, а в реплику clickhouse.
Через compose поставил smi2/phpClickHouse. Добавил в autoload.php. Есть такой код для перехвата.

add_filter('query', 'redirect_select_posts_to_clickhouse');

function redirect_select_posts_to_clickhouse($query) {
    if (stripos($query, 'SELECT') === 0) {
        $config = [
            'host' => '93.111.111.1111,
            'port' => '8123',
            'username' => 'click',
            'password' => 'sh',
            'https' => false
        ];

        $client = new \ClickHouseDB\Client($config);
        $client->database('prod_mysql');

        $client->setTimeout(10);
        $client->setConnectTimeOut(5);

        try {
            $result = $client->select($query)->rows();
            
            return handle_clickhouse_results($result);
        } catch (Exception $e) {
            error_log($e->getMessage());
            return new WP_Error('clickhouse_error', 'Error querying ClickHouse: ' . $e->getMessage());
        }
    }
    return $query;
}

function handle_clickhouse_results($result) {
    if (empty($result)) {
        return []; // Пустой массив для WordPress
    }
    return array_map(function($row) {
        return (object) $row; // Преобразование ассоциативного массива в объект
    }, $result);
}


Но получаю ошибку
2024/11/16 15:17:36 [error] 2883856#2883856: *2979443 FastCGI sent in stderr: "PHP message: PHP Warning:  Array to string conversion in /var/www/www-root/data/www/site/wp-includes/class-wpdb.php on line 2232; PHP message: PHP Fatal error:  Uncaught TypeError: mysqli_query(): Argument #2 ($query) must be of type string, array given in /var/www/www-root/data/www/site/wp-includes/class-wpdb.php:2345
Stack trace:
#0 /var/www/www-root/data/www/site/wp-includes/class-wpdb.php(2345): mysqli_query(Object(mysqli), Array)
#1 /var/www/www-root/data/www/site/wp-includes/class-wpdb.php(2259): wpdb->_do_query(Array)
#2 /var/www/www-root/data/www/site/wp-includes/class-wpdb.php(3142): wpdb->query(Array)
#3 /var/www/www-root/data/www/site/wp-includes/class-wp-query.php(3367): wpdb->get_results('SELECT   wp_pos...')
#4 /var/www/www-root/data/www/site/wp-includes/class-wp-query.php(3852): WP_Query->get_posts()
#5 /var/www/www-root/data/www/site/wp-includes/post.php(6418): WP_Query->query(Array)
#6 /var/www/www-root/data/www/site/wp-content/themes/ztml-theme/functionality/carbon-fields.php(198): get_pages(Array)

Подскажите, возможна ли такая интеграция вообще и как решить проблему ?
  • Вопрос задан
  • 31 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы