代码之家  ›  专栏  ›  技术社区  ›  user3010617

无法使用laravel项目中的php驱动程序连接到Cassandra db

  •  0
  • user3010617  · 技术社区  · 6 年前

    我真的需要一些帮助,在过去的两天里我一直在想办法。

    我正在尝试将一个laravel项目从Mongo迁移到Cassandra。我使用docker容器进行本地设置, 这是docker compose。包含相关信息的yml文件

    version: '2'
    services:
    mongodb:
        image: mongo
        container_name: marketdata_mongodb
        environment:
        - MONGODB_DATABASE=marketdata
        - MONGODB_USER=marketdata
        - MONGODB_PASS=marketdata
        - MONGO_DATA_DIR=/data/db
        volumes:
        - ./data/db:/data/db
        ports:
            - 27017
        networks:
        - main_network
    
    cassandra:
        image: cassandra
        container_name: marketdata_cassandra
        command: bash -c 'if [ -z "$$(ls -A /var/lib/cassandra/)" ] ; then sleep 0; fi && /docker-entrypoint.sh cassandra -f'
        environment:
        - CASSANDRA_CLUSTER_NAME=dev_cluster
        # Cassandra ulimt recommended settings
        ulimits:
        memlock: -1
        nproc: 32768
        nofile: 100000
        volumes:
        - ./cassandra_data:/var/lib/cassandra
        ports:
        - 7000
        - 7001
        - 7199
        - 9042
        - 9160
        networks:
        - main_network
    
    networks:
    main_network:
        driver: bridge
    

    在谷歌上搜索了一下后,我找到了这个图书馆 https://github.com/cubettech/lacassa 我一直在尝试在 该项目连接到我的Cassandra容器,但一直无法做到这一点。

    以下是我到目前为止为实现这一目标所采取的步骤

    我使用以下命令安装了php Cassandra驱动程序依赖项

    wget http://downloads.datastax.com/cpp-driver/ubuntu/16.04/dependencies/libuv/v1.11.0/libuv_1.11.0-1_amd64.deb
    wget http://downloads.datastax.com/cpp-driver/ubuntu/16.04/dependencies/libuv/v1.11.0/libuv-dev_1.11.0-1_amd64.deb
    wget http://downloads.datastax.com/cpp-driver/ubuntu/16.04/cassandra/v2.8.0/cassandra-cpp-driver-dev_2.8.0-1_amd64.deb
    wget http://downloads.datastax.com/cpp-driver/ubuntu/16.04/cassandra/v2.8.0/cassandra-cpp-driver_2.8.0-1_amd64.deb
    
    dpkg -i libuv_1.11.0-1_amd64.deb
    dpkg -i libuv-dev_1.11.0-1_amd64.deb
    dpkg -i cassandra-cpp-driver_2.8.0-1_amd64.deb
    dpkg -i cassandra-cpp-driver-dev_2.8.0-1_amd64.deb
    
    apt-get install libgmp-dev
    pecl install cassandra
    echo "extension=cassandra.so" >> /etc/php/7.0/apache2/php.ini
    echo "extension=cassandra.so" >> /etc/php/7.0/cli/php.ini
    

    我将服务提供商添加到配置/应用程序文件中

    Cubettech\Lacassa\CassandraServiceProvider::class

    我还将cassandra的新数据库连接添加到配置/数据库文件中

    'cassandra' => [
        'driver' => 'Cassandra',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', 7199),
        'keyspace' => env('DB_DATABASE', 'cassandra_db'),
        'username' => env('DB_USERNAME', ''),
        'password' => env('DB_PASSWORD', ''),
    ],
    

    这些是我的环境变量

    DB_CONNECTION=cassandra
    DB_HOST=marketdata_cassandra
    DB_PORT=7199
    DB_DATABASE=marketdata
    DB_USERNAME=marketdata
    DB_PASSWORD=marketdata
    

    根据我找到的所有文档,这应该足以让它启动并运行,但我一直遇到这个错误

    没有可用于控制连接的主机

    在试图找出问题的时候,我遇到了 this ,则, 也就是说,这个问题可以通过升级PHP驱动程序/扩展来解决,所以我尝试了几种不同的扩展 here ,但我仍然有同样的问题。

    任何帮助都将不胜感激

    2 回复  |  直到 6 年前
        1
  •  1
  •   Fero    6 年前

    端口7199是JMX监控端口;您应该将端口从7199更改为>9042

    https://docs.datastax.com/en/cassandra/3.0/cassandra/configuration/secureFireWall.html

    如果在连接Apache Cassandra时仍然存在问题,请尝试执行以下操作,以确保通过CLI正确加载驱动程序:

    php -m | grep cassandra
    

    如果显示PHP驱动程序模块,则尝试直接使用驱动程序连接到服务器:

    <?php
    
    $cluster = \Cassandra::cluster()->build();
    $session = $cluster->connect('cassandra_db');
    
        2
  •  0
  •   user3010617    6 年前

    所以我得到了外部帮助,找到了解决办法。

    主机和端口实际上未在原始中使用 lacassa 图书馆 如果您查看文档,这里会显示:默认情况下连接到localhost-这与lacassa中使用的行相同 here

    $cluster = Cassandra::cluster()                 // connects to localhost by default
                   ->build();
    

    https://docs.datastax.com/en/developer/php-driver/1.3/#quick-start

    可在此库中找到此问题的修复程序 https://github.com/seta0909/lacassa 或者,也可以用叉子叉拉卡萨 库并自行实施修复