2

我有两台电脑,一台安装windows 7,另一台是CentOS 5.8


在 CentOS...

我使用 yum 命令安装 httpd(apache2.2)、php5.3.3 和 mysql。

  • 百胜安装httpd
  • 百胜安装php53
  • 百胜安装 pdo
  • 百胜安装 php53-mysql

首先我检查了 phpinfo,pdo,pdo_mysql 是否成功扩展,

然后我也在 CentOS Terminal 中检查 php -m ,也有扩展 pdo 和 pdo_mysql 。

在此处输入图像描述 在此处输入图像描述


我在 Windows 7 和 CentOS 之间运行相同的代码

窗口成功,但centos失败

两个文件,db.php 和 dbtest.php

这是db.php:

<?php

    class DB
    {
        private $conn;

        #### construct ####
        public function __construct( $dsn , $db_user , $db_password , $showError = false )
        {                       
            try
            {               
                $this->conn = new PDO( $dsn , $db_user , $db_password );

                if( $showError ) // set error information show or not. 
                {
                    $this->conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
                }
                else
                {
                    $this->conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
                }

                $setUtf8 = $this->conn->prepare( 'set names utf8' ); // set encoded by utf8
                $setUtf8->execute();
            }
            catch( PDOException $err )
            {
                return false;
            }
        }
    }
?>

这是dbtest.php:

<?php

    require_once( "db.php" );

    $link_test = new DB( "mysql:dbname=pdotest;port=3306;host=192.168.1.127", "root" , "123456" );  

    var_dump($link_test);
?>

在 windows 中转储时,结果是:

object(DB)#1 (1) { ["conn":"DB":private]=> object(PDO)#2 (0), { } }

在 CentOS 中转储,结果是:

object(DB)#1 (1) { ["conn":"DB":private]=> NULL }

谁能告诉我为什么在 CentOS 中连接失败?


编辑于 2012/10/24 16:10 (亚洲/台北)

为了测试很多小时,我猜是 php pdo 有问题...

因为在我的局域网中,我可以通过 CentOS 终端连接任何 3306 端口的 mysql

但是在 php pdo_mysql 类中,我无法链接任何 mysql(甚至 CentOS 本地的 mysql )

所以...如何检查我的 pdo_mysql 扩展是否正常运行?

PS:对不起,我的英语很差:(

4

3 回答 3

0

Linux 上的 PHP/PDO 将尝试通过套接字进行本地连接。pdo_mysql.default_socket您可以在 中的属性中配置此套接字的位置php.ini

您当然会遇到在 5.3.9 中修复的错误 # 60155(我认为),所以我肯定会建议升级到 5.3.3 之后的版本。

于 2012-10-26T02:43:58.590 回答
0

浪费了很多时间......终于我得到了解决方案!

当我看到这个问题时<<点击链接查看问题

这个答案解决了我的问题。

Selinux 默认设置是关闭 httpd_can_network_connect 和 httpd_can_network_connect_db

打开它!PDO 连接将正常运行:)

命令:

setsebool -P httpd_can_network_connect=1
setsebool -P httpd_can_network_connect_db=1

谢谢你,迈克尔·伯科夫斯基

于 2012-10-31T06:40:38.367 回答
0

首先,谢谢你回答我的问题:)


专注于socket,我已经尝试了两种方法:

1)就像你说的,我修改 php.ini ,添加 pdo_mysql.default_socket

然后重启httpd服务,但是pdo mysql连接还是失败

2) 我修改了 dbtest.php 第 3 行 (#3) ,是 DSN 的一部分

原始=> "mysql:dbname=pdotest;port=3306;host=192.168.1.127"
新=> "mysql:unix_socket=/var/lib/mysql/mysql.sock;dbname=pdotest;port=3306;host=192.168 .1.127"

,但连接仍然失败


我也尝试使用原始的 mysql_connect 来测试链接数据库,它的工作!

根据您的建议,我稍后将 php 更改为另一个版本(可能是 5.4.8 或低于 5.3.3),然后发布结果

谢谢!

于 2012-10-26T04:09:45.570 回答