Есть задача перехватывать запросы 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)
Подскажите, возможна ли такая интеграция вообще и как решить проблему ?