如何让PHP通过使用UNIX套接字连接到数据库(Joomla)

我希望我的PHP应用程序(如Joomla)使用UNIX套接字连接到本地mysql数据库。

我已经configuration了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设置为数据库,是否可以重写? 我怎样才能testingUNIX套接字是否真的被使用?

我的MySQL / MariaDBconfiguration如下:

 [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/ 

TCP套接字使用127.0.0.1。

'localhost'用于Unix文件系统套接字。

我们可以使用netstat -ln | grep 'mysql' netstat -ln | grep 'mysql'来确定连接方法。并且探索一个强制执行特定types的选项

 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'; 

在库/ joomla / database / database.php中定义了抽象类JDatabase,然后在库/ joomla / database / driver /中执行不同的数据库types,在这种情况下是mysql或mysqli ..

在mysqli.php(Joomla!3.3.6)中,如果在configuration.php中没有指定,__construct($ options)会设置默认值,这会将其更改为“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行build立连接:

  $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不允许你改变。 但是,您应该小心并考虑logging这些修改,因为

  1. configuration.php不像logging工作了
  2. Joomla更新可以(并最终将)覆盖您的修改
  3. 其他的东西可能取决于这个特定的configuration