Como permitir que o PHP se conecte ao banco de dados usando o soquete UNIX (Joomla)

2

Eu gostaria que meus aplicativos PHP, como o Joomla, usassem o soquete UNIX para conectar-se ao banco de dados mysql local.

Eu já configurei o php.ini com:

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

Mas no Joomla eu só posso definir localhost ou 127.0.0.1 como banco de dados, é possível substituir isso? Como posso testar o soquete UNIX na verdade está sendo usado?

Meu MySQL / MariaDB está configurado como:

[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/
    
por gijs007 08.03.2015 / 17:42

2 respostas

2

127.0.0.1 é usado para o soquete TCP.

'localhost' é usado para o soquete do sistema de arquivos Unix.

Podemos usar netstat -ln | grep 'mysql' para determinar o método de conexão.E explorar a opção para impor um tipo específico

shell> mysql --host=127.0.0.1
shell> mysql --protocol=TCP
shell> mysql --host=localhost
shell> mysql --host=localhost --protocol=TCP

Os parâmetros de conexão devem ser assim

$ link = mysql_connect ('host local: /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';
    
por 08.03.2015 / 18:09
0

Em libraries / joomla / database / database.php é definida a classe abstrata JDatabase, que é então implementada para diferentes tipos de banco de dados em libraries / joomla / database / driver /, neste caso mysql ou mysqli ..

No mysqli.php (Joomla! 3.3.6) __construct ($ options) define defaults se nada for especificado em configuration.php, que irá alterá-lo para 'localhost'. Da linha 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);
}

Em seguida, a função connect (), finalmente, os usa para criar conexão nas linhas 163-165:

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

Se nada mais for dado, mysqli_connect () usa os padrões do php.ini para hostname, port e soquete

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") ]]]]]] )

Agora você conhece a faixa inteira que afeta esses parâmetros de conexão. Editando o mysqli.php você deve ser capaz de impor as configurações que o configuration.php não permite que você mude. No entanto, você deve ser cuidadoso e considerar documentar bem essas modificações, já que

  1. configuration.php não funciona mais como documentado
  2. As atualizações do Joomla podem (e eventualmente irão) substituir suas modificações
  3. Outra coisa pode estar dependendo dessa configuração específica
por 08.03.2015 / 20:07