【问题标题】:Set Default MySQL Socket in PHP, pdo_mysql.default_socket PHP 5.3在 PHP 中设置默认 MySQL 套接字,pdo_mysql.default_socket PHP 5.3
【发布时间】:2012-12-21 18:22:00
【问题描述】:

我在为 MySQL 设置默认 PDO 套接字位置时遇到问题,而没有通过将 PDO 类初始化为变量来完成。我试过改变 mysql.default_socket 变量。但这并不令人高兴。目前唯一可行的方法是通过类 DSN 实例化。

php.ini 内容:

[PHP]
engine = On
zend.ze1_compatibility_mode = Off
short_open_tag = On
asp_tags = Off
precision    =  14
y2k_compliance = On
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func=
serialize_precision = 100
allow_call_time_pass_reference = Off
safe_mode = Off
safe_mode_gid = Off
safe_mode_include_dir =
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
disable_functions =
disable_classes =
expose_php = Off
max_execution_time = 300
max_input_time = 60
memory_limit = 128M
error_reporting = E_ALL & ~E_NOTICE
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
variables_order = "EGPCS"
register_globals = Off
register_long_arrays = Off
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 8M
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
doc_root =
user_dir =
extension_dir = "/usr/lib64/php/modules"
enable_dl = On
file_uploads = On
upload_max_filesize = 500M
allow_url_fopen = On
default_socket_timeout = 60

[Syslog]
define_syslog_variables  = Off

sendmail_path = /usr/sbin/sendmail -t -i

[SQL]
sql.safe_mode = Off

[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1

[MySQL]
mysql.allow_persistent = On
mysql.max_persistent = -1
mysql.max_links = -1
mysql.default_port = 3306
mysql.default_socket = /home/mysql/mysql.sock
mysql.default_host = 127.0.0.1
mysql.default_user = conner
mysql.default_password = danica4eva
mysql.connect_timeout = 60
mysql.trace_mode = Off

[MySQLi]
mysqli.max_links = -1
mysqli.default_port = 3306
mysqli.default_socket = /home/mysql/mysql.sock
mysqli.default_host = 127.0.0.1
mysqli.default_user = conner
mysqli.default_pw = danica4eva
mysqli.reconnect = Off

[mSQL]
msql.allow_persistent = On
msql.max_persistent = -1
msql.max_links = -1

[PostgresSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0

[Sybase]
sybase.allow_persistent = On
sybase.max_persistent = -1
sybase.max_links = -1
sybase.min_error_severity = 10
sybase.min_message_severity = 10
sybase.compatability_mode = Off

[Sybase-CT]
sybct.allow_persistent = On
sybct.max_persistent = -1
sybct.max_links = -1
sybct.min_server_severity = 10
sybct.min_client_severity = 10

[bcmath]
bcmath.scale = 0

[Informix]
ifx.default_host =
ifx.default_user =
ifx.default_password =
ifx.allow_persistent = On
ifx.max_persistent = -1
ifx.max_links = -1
ifx.textasvarchar = 0
ifx.byteasvarchar = 0
ifx.charasvarchar = 0
ifx.blobinfile = 0.
ifx.nullformat = 0

[Session]
session.save_handler = files
session.save_path = "/var/lib/php/session"
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor     = 1000
session.gc_maxlifetime = 1440
session.bug_compat_42 = 0
session.bug_compat_warn = 1
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 1
session.hash_bits_per_character = 5
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"

[MSSQL]
mssql.allow_persistent = On
mssql.max_persistent = -1
mssql.max_links = -1
mssql.min_error_severity = 10
mssql.min_message_severity = 10
mssql.compatability_mode = Off
mssql.secure_connection = Off

[Verisign Payflow Pro]
pfpro.defaulthost = "test-payflow.verisign.com"
pfpro.defaultport = 443
pfpro.defaulttimeout = 30

[Tidy]
tidy.clean_output = Off

[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400

zend_extension = /etc/ioncube/ioncube_loader_lin_5.3.so

如您所见,我已经更改了 php.ini 文件中的默认套接字设置,但是当我尝试连接到 MySQL 时,仍然在 PDO 中遇到套接字错误。这让我相信 PDO 驱动程序没有使用 php.ini 中的设置。我确信有某种配置 PDO 的方法,但我的 php.ini 中没有任何内容。 php.ini 中是否应该有 PDO 的设置,或者它们是否包含在其他地方?

【问题讨论】:

  • but I still get a socket error。你有错误信息吗?你能用 strace 执行一个小的 php cli 例子吗?

标签: mysql centos php


【解决方案1】:

PDO mysql 驱动程序有不同的 ini 设置。它被称为

pdo_mysql.default_socket

您是否尝试设置此 ini 值?请参考http://php.net/manual/en/ref.pdo-mysql.php

使用以下配置选项在编译期间也可能会影响该值:

--with-mysql-sock=/my/path/mysql.sock

更新:我发现问题是已知的PHP bug

首先:您可以在使用 127.0.0.1 作为 db 主机而不是 localhost 时解决该问题。 PHP 会以这种方式通过 TCP 套接字进行连接。

要更改位置,您必须使用特殊配置选项从源代码编译 PHP。我成功地使用以下(基本)命令行更改了 mysql 套接字的位置:

 ./configure \
  --with-mysql \
  --with-mysqli=mysqlnd \
  --enable-pdo \
  --with-pdo-mysql=mysqlnd \
  --with-mysql-sock=/home/mysql/mysqld.sock

 make
 make install

最后一招将最后一招合二为一。 --with-mysql-sock=file 设置 .sock 文件的位置仅在 --with-pdo-mysql= 设置为 mysqlnd(mysql 本机驱动程序)时使用。如果缺少此选项,pdo 将与系统中的 libmysqlclient 链接。因此,您还可以重新编译 libmysqlclient(使用修改的套接字路径)并保持 php 不变。

注意:这只是使 PHP 与 PDO 一起工作的基本配置。如果您需要额外的扩展(如 json、xml 等),您将需要额外的配置选项。如果您以这种方式执行(原始发行版)版本,您将找到您的 Linux 发行版用于编译 PHP 的配置:php -i

【讨论】:

  • 是的,我尝试添加它,但它也被忽略了。真烦人。我在您在那里提供的文档中看到,您可以使用 ./configure 脚本来添加它,这个脚本在哪里?我一直在寻找它,但我似乎找不到它。我正在运行 CentOS 6.4。
  • ./configure 是从源代码编译 PHP 时使用的脚本。这是您的选择吗?
  • 我没有意识到这是在编译 PHP。如果它只是从 php.ini 工作,我会更喜欢它。我会为“pdo_mysql.default_socket”选项添加什么。你能给我举个例子吗?
  • Ok 会尝试准备一个例子。只是为了兴趣,你为什么需要这个? :) 这个问题对我来说听起来有点“异国情调”(但很有趣)。您使用哪种操作系统?
  • 当我使用 127.0.0.1 测试它时,它不会使用套接字。尝试按照我的描述从源代码编译。此外,您还会在 SO 和 web 上找到许多关于 PHP 编译的帮助。
猜你喜欢
  • 2011-09-03
  • 2014-06-09
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 2020-04-21
  • 1970-01-01
  • 2012-03-29
相关资源
最近更新 更多