問題描述
我和我的同事正在嘗試使用 Laravel 和 Vertica 數據庫開發 Web 應用程序.唯一的問題是,一旦您對這個特定數據庫使用 bindValue 或 bindParam,PHP 就會因分段錯誤而崩潰.所以我編寫了一個 PDO 包裝器類,它將調用重定向到 PHP_ODBC 模塊并且它確實有效.我現在想知道如果這樣的事情可能的話,如何將它集成到 Laravel 中.
My fellows at work and I are trying to develop a web application using Laravel with a Vertica database. The only problem is that as soon as you use bindValue or bindParam with this specific database, PHP crashes with a segmentation fault. So I've written a PDO wrapper class that redirects calls to the PHP_ODBC module and that actually works. I was now wondering how to integrate it in Laravel if such a thing is even possible.
推薦答案
好的,經過大量的反復試驗,我和我的同事設法使事情順利進行.結果證明,最耗時的部分是構建包裝器.假設你有這個,下面是你需要做的將它集成到 Laravel 中(順便說一下,這些步驟適用于 Laravel 5.1).此外,我的包裝器稱為 PDOVertica,因此每當您看到這個術語時,您都必須將其替換為您自己的包裝器的名稱.
Okay so after a lot of trial and error, my co-workers and I managed to get things up and running. The most time-consuming part turned out to build the wrapper. Assuming you have that, here's what you need to do to integrate it in Laravel (these steps are for Laravel 5.1 by the way). Also, my wrapper's called PDOVertica so whenever you see this term, you have to substitute it for the name of your own wrapper.
1) 將您的包裝文件復制到以下文件夾:
1) Copy your wrapper file to the following folder:
vendor/laravel/framework/src/Illuminate/Database/Connectors
2) 接下來,您需要修改幾個文件:
2) Next, you need to modify a couple of files:
vendorlaravelframeworksrcIlluminateDatabaseConnection.php
vendorlaravelframeworksrcIlluminateDatabaseConnection.php
namespace IlluminateDatabase;
use PDO;
use PDOVertica; //Add this line
use Closure;
use DateTime;
...
//Change the type of the first parameter to PDOVertica as follow
public function __construct(PDOVertica $pdo, $database = '', $tablePrefix = '', array $config = [])
vendorlaravelframeworksrcIlluminateDatabaseConnectorsConnector.php
vendorlaravelframeworksrcIlluminateDatabaseConnectorsConnector.php
namespace IlluminateDatabaseConnectors;
include 'clsPDOVertica.php'; //Add this line
use PDO;
use PDOVertica; //Add this line
...
public function createConnection($dsn, array $config, array $options)
{
$username = array_get($config, 'username');
$password = array_get($config, 'password');
//Modify the return value to return your wrapper
return new PDOVertica($dsn, $username, $password, $options);
}
vendorlaravelframeworksrcIlluminateDatabaseConnectorsPostgresConnector.php
vendorlaravelframeworksrcIlluminateDatabaseConnectorsPostgresConnector.php
protected function getDsn(array $config)
{
extract($config);
$host = isset($host) ? "Server={$host};" : '';
// Modify this line so that it creates the Vertica DSN.
// It should look something like this.
$dsn = "Driver=/opt/vertica/lib64/libverticaodbc.so;{$host}Database={$database}";
if (isset($config['port'])) {
$dsn .= ";port={$port}";
}
if (isset($config['sslmode'])) {
$dsn .= ";sslmode={$sslmode}";
}
return $dsn;
}
vendorlaravelframeworksrcIlluminateDatabaseConnectorsConnectionFactory.php
vendorlaravelframeworksrcIlluminateDatabaseConnectorsConnectionFactory.php
namespace IlluminateDatabaseConnectors;
use PDO;
use PDOVertica; //Add this line
use InvalidArgumentException;
...
// Modify the header of this function so that the $connection parameter
// is of type PDOVertica
protected function createConnection($driver, PDOVertica $connection, $database, $prefix = '', array $config = [])
{
if ($this->container->bound($key = "db.connection.{$driver}")) {
return $this->container->make($key, [$connection, $database, $prefix, $config]);
}
switch ($driver) {
case 'mysql':
return new MySqlConnection($connection, $database, $prefix, $config);
case 'pgsql':
return new PostgresConnection($connection, $database, $prefix, $config);
case 'sqlite':
return new SQLiteConnection($connection, $database, $prefix, $config);
case 'sqlsrv':
return new SqlServerConnection($connection, $database, $prefix, $config);
}
throw new InvalidArgumentException("Unsupported driver [$driver]");
}
3) 一旦文件被正確修改,您所要做的就是通過修改以下文件正確配置 Laravel 以使用您的自定義連接:
3) Once the files have been properly modified, all you have to do is properly configure Laravel to use your custom connection by modifying the following file:
config/database.php
config/database.php
/* |--------------------------------------------------------------------------
| Default Database Connection Name
|--------------------------------------------------------------------------
|
| Here you may specify which of the database connections below you wish
| to use as your default connection for all database work. Of course
| you may use many connections at once using the Database library.
|
*/
'default' => 'vertica',
...
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => storage_path('database.sqlite'),
'prefix' => '',
],
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', ''),
'database' => env('DB_DATABASE', ''),
'username' => env('DB_USERNAME', ''),
'password' => env('DB_PASSWORD', ''),
'port' => '5433h',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
//This is our custom connection
'vertica' => [
'driver' => 'pgsql',
'host' => env('DB_HOST', '192.168.1.1'),
'database' => env('DB_DATABASE', 'mydb'),
'username' => env('DB_USERNAME', 'myuser'),
'password' => env('DB_PASSWORD', 'mypassword'),
'port' => '5433',
'charset' => 'utf8',
'schema' => 'myschema',
],
'pgsql' => [
'driver' => 'pgsql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'port' => '5433',
'charset' => 'utf8',
'prefix' => '',
'schema' => 'public',
],
'sqlsrv' => [
'driver' => 'sqlsrv',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'prefix' => '',
],
],
據我所知,這是讓 Laravel 連接到 Vertica 數據庫而不會崩潰所需的所有步驟.我希望這會有所幫助.
So far as I could tell, this was all the steps needed to get Laravel to connect to a Vertica database without crashing. I hope this helps.
這篇關于我可以在 Laravel 中集成自定義 PDO 包裝器嗎的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!