web-dev-qa-db-ja.com

PHP UNIXソケットを使用してデータベースに接続する方法(Joomla)

PHP Joomlaなどのアプリケーションで、UNIXソケットを使用してローカルのmysqlデータベースに接続するようにしたいと思います。

私はすでにphp.iniを設定しています:

mysqli.default_socket = /var/run/mysqld/mysqld.sock
mysql.default_socket = /var/run/mysqld/mysqld.sock
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock

しかし、Joomlaでは、データベースとしてlocalhostまたは127.0.0.1しか設定できません。これを上書きすることはできますか? UNIXソケットが実際に使用されていることをどのようにテストできますか?

私のMySQL/MariaDBは次のように構成されています。

[client]
port        = 3306
socket      = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket      = /var/run/mysqld/mysqld.sock
Nice        = 0

[mysqld]
user        = mysql
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
port        = 3306
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
lc_messages_dir = /usr/share/mysql
lc_messages = en_US
skip-external-locking
bind-address        = 127.0.0.1
max_connections     = 500
connect_timeout     = 10
wait_timeout        = 600
max_allowed_packet  = 16M
thread_cache_size       = 1000
sort_buffer_size    = 512M
bulk_insert_buffer_size = 16M
tmp_table_size      = 8G
max_heap_table_size = 8G

myisam_recover          = FORCE,BACKUP
key_buffer_size     = 128M
open-files-limit    = 65535
table_open_cache    = 10240
table_open_cache_instances = 8
table-definition-cache = 4096
myisam_sort_buffer_size = 512M
key-cache-segments=8
concurrent_insert   = 2
read_buffer_size    = 32M
read_rnd_buffer_size    = 64M

query_cache_limit       = 96M
query_cache_size        = 128M
query_cache_min_res_unit=7108
query_cache_type        = 1

log_warnings        = 2

slow_query_log_file = /var/log/mysql/mariadb-slow.log
long_query_time = 10
log_slow_verbosity  = query_plan


log_bin         = /var/log/mysql/mariadb-bin
log_bin_index       = /var/log/mysql/mariadb-bin.index
sync_binlog     = 1
expire_logs_days    = 14
max_binlog_size         = 100M

default_storage_engine  = InnoDB
innodb_log_file_size    = 50M
innodb_buffer_pool_size = 6G
innodb_buffer_pool_instances=8
innodb_log_buffer_size  = 32M
innodb_file_per_table   = 1
innodb_concurrency_tickets=5000
innodb_open_files   = 240000
innodb_io_capacity  = 240000
innodb_flush_method = O_DIRECT
innodb-log-files-in-group      = 2
innodb-flush-log-at-trx-commit = 1

[mysqldump]
quick
quote-names
max_allowed_packet  = 16M

[mysql]
#no-auto-rehash # faster start of mysql but no tab completition

[isamchk]
key_buffer      = 512M

!includedir /etc/mysql/conf.d/
3
gijs007

127.0.0.1はTCPソケットに使用されます。

'localhost'はUnixファイルシステムソケットに使用されます。

netstat -ln | grep 'mysql'接続方法を決定します。特定のタイプを強制するオプションを探索します

Shell> mysql --Host=127.0.0.1
Shell> mysql --protocol=TCP
Shell> mysql --Host=localhost
Shell> mysql --Host=localhost --protocol=TCP

接続パラメータはこのようにする必要があります

$ link = mysql_connect( 'localhost:/var/run/mysqld/mysqld.sock'、 'mysql_user'、 'mysql_password');

var $Host = ':/var/run/mysqld/mysqld.sock';
var $user = 'your_user_db_name';
var $db = 'your_db_name';
var $password = 'your_db_password';
3

Libraries/joomla/database/database.phpで定義されている抽象クラスJDatabaseは、libraries/joomla/database/driver /のさまざまなデータベースタイプ(この場合はmysqlまたはmysqli)に実装されています。

Mysqli.php(Joomla!3.3.6)では、__ construct($ options)はconfiguration.phpで何も指定されていない場合にデフォルトを設定し、それを 'localhost'に変更します。 64行目から:

public function __construct($options)
{
// Get some basic values from the options.
$options['Host']     = (isset($options['Host'])) ? $options['Host'] : 'localhost';
$options['user']     = (isset($options['user'])) ? $options['user'] : 'root';
$options['password'] = (isset($options['password'])) ? $options['password'] : '';
$options['database'] = (isset($options['database'])) ? $options['database'] : '';
$options['select']   = (isset($options['select'])) ? (bool) $options['select'] : true;
$options['port']     = null;
$options['socket']   = null;

// Finalize initialisation.
parent::__construct($options);
}

次に、関数connect()は、最終的にそれらを使用して、行163-165に接続を作成します。

    $this->connection = @mysqli_connect(
        $this->options['Host'], $this->options['user'], $this->options['password'],
        null, $this->options['port'], $this->options['socket']
    );

他に何も指定されていない場合、 mysqli_connect() は、ホスト名、ポート、ソケットにphp.iniのデフォルトを使用します

mysqli mysqli_connect ([ string $Host = ini_get("mysqli.default_Host") 
   [, string $username = ini_get("mysqli.default_user") 
   [, string $passwd = ini_get("mysqli.default_pw") 
   [, string $dbname = "" 
   [, int $port = ini_get("mysqli.default_port") 
   [, string $socket = ini_get("mysqli.default_socket") ]]]]]] )

これで、これらの接続パラメーターに影響を与えるトラック全体がわかりました。 mysqli.phpを編集することにより、configuration.phpでは変更できない設定を適用できるはずです。ただし、これらの変更を十分に文書化することを注意して検討する必要があります。

  1. configuration.phpがドキュメントのように機能しない
  2. Joomlaの更新により、変更が上書きされる可能性があります
  3. 他の何かがこの特定の構成に依存している可能性があります
0
Esa Jokinen