3

我目前正在阅读 David Golding 的“Beginning CakePHP:From Novice to Professional”。有一次我必须使用 CLI 命令“cake bake”,我得到了欢迎屏幕,但是当我尝试烘焙控制器时,我收到以下错误消息:

Warning: mysql_connect(): Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (2) in /Applications/MAMP/htdocs/blog/cake/libs/model/datasources/dbo/dbo_mysql.php on line 117

Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in /Applications/MAMP/htdocs/blog/cake/libs/model/datasources/dbo/dbo_mysql.php on line 122

Warning: mysql_get_server_info(): supplied argument is not a valid MySQL-Link resource in /Applications/MAMP/htdocs/blog/cake/libs/model/datasources/dbo/dbo_mysql.php on line 130

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /Applications/MAMP/htdocs/blog/cake/libs/model/datasources/dbo/dbo_mysql.php on line 154
Error: Your database does not have any tables.

我怀疑错误消息与php试图访问错误的mysql-socket有关,即默认的osx mysql-socket - 而不是MAMP使用的那个。因此,我更改了我的数据库配置以连接到 UNIX mysql-socket (:/Applications/MAMP/tmp/mysql/mysql.sock):

class DATABASE_CONFIG {

    var $default = array(
        'driver' => 'mysql',
        'connect' => 'mysql_connect',
        'persistent' => false,
        'host' =>':/Applications/MAMP/tmp/mysql/mysql.sock', // UNIX MySQL-socket
        'login' => 'my_user',
        'password' => 'my_pass',
        'database' => 'blog',
        'prefix' => '',
    );

}

但是我收到与新套接字相同的错误消息:

Warning: mysql_connect(): Can't connect to local MySQL server through socket '/Applications/MAMP/tmp/mysql/mysql.sock:3306' (2) in /Applications/MAMP/htdocs/blog/cake/libs/model/datasources/dbo/dbo_mysql.php on line 117

Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in /Applications/MAMP/htdocs/blog/cake/libs/model/datasources/dbo/dbo_mysql.php on line 122

Warning: mysql_get_server_info(): supplied argument is not a valid MySQL-Link resource in /Applications/MAMP/htdocs/blog/cake/libs/model/datasources/dbo/dbo_mysql.php on line 130

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /Applications/MAMP/htdocs/blog/cake/libs/model/datasources/dbo/dbo_mysql.php on line 154
Error: Your database does not have any tables.

此外,即使我使用 MAMP 在其欢迎屏幕上显示的 UNIX 套接字,当使用此套接字而不是 localhost 时,CakePHP 也会丢失数据库连接。

关于如何让烘焙工作的任何想法?

-- 编辑 1 --

谢谢你们帮助我!:)

我无法确定在 my.cnf 中的哪个位置进行编辑以让 MySQL 监听 TCP/IP 请求。我能找到提到 TCP/IP 的唯一段落如下:

# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
# 
#skip-networking

这使我可以完全关闭 TCP/IP,这与我的意图相反。我不知道如何去做你的建议,如果你能更详细一点,那就太好了。在这些问题上我完全不知道:S

注册。连接到本地套接字:我删除了主机参数中的前导冒号,结果相同。

4

11 回答 11

18

我找到了解决这个问题的方法:在 cakephp app/config/database.php 文件中添加一个套接字配置

class DATABASE_CONFIG {

var $default = array(
    'driver' => 'mysql',
    'persistent' => false,
    'host' => 'localhost',
    'port' => '/Applications/MAMP/tmp/mysql/mysql.sock', // here is the key !
    'login' => 'you',
    'password' => 'yourpass',
    'database' => 'yourdb',
    'prefix' => '',

);
于 2009-08-23T16:22:14.003 回答
13

从错误来看,它似乎正在尝试连接到实际 IP 地址而不是 UNIX 套接字,请看:

'/Applications/MAMP/tmp/mysql/mysql.sock:3306'

它在套接字上附加了一个端口,这是错误的。

因此,我首先尝试将 MySQL 配置为侦听 TCP/IP 请求(编辑 my.cnf 中的适当部分)并尝试提供 127.0.0.1 而不是套接字。

如果您不会向下滚动

要在 CakePHP 级别修复它,请将 database.php 上的主机更改为“localhost”并添加一个端口指令,并将其值设置为套接字名称“/Applications/MAMP/tmp/mysql/mysql.sock”

于 2008-12-14T13:37:18.073 回答
6

对于在使用 CakePHP 2.0 时遇到此问题的任何人:对我来说,上面的数据库配置文件并没有解决问题。找到了对我有用的“unix_socket”属性:

<?php
class DATABASE_CONFIG {

    public $default = array(
        'datasource' => 'Database/Mysql',
        'driver' => 'mysql',
        'persistent' => false,
        'host' => 'localhost',
        'unix_socket' => '/tmp/mysql.sock',
        'login' => 'xxx',
        'password' => 'xxx',
        'database' => 'xxx',
        'encoding' => 'UTF8',
        'prefix' => ''
    );

}
于 2011-12-23T09:55:35.693 回答
1

在使用 MAMP 和 Cake CLI 时,我遇到了同样的问题。我正在运行 CakePHP 1.1xxx 和 MAMP 1.7。

问题是,找不到 MySQL 套接字:D

打开终端并输入以下内容:

my-macbook:~ chris$ php -i | grep mysql.default_socket
mysql.default_socket => no value => no value
my-macbook:~ chris$ php -i -c /Applications/MAMP/conf/php5 | grep mysql.default_socket
mysql.default_socket => /Applications/MAMP/tmp/mysql/mysql.sock => /Applications/MAMP/tmp/mysql/mysql.sock

问题是,如果没有明确地为 php 二进制文件提供其(读取 MAMP 的)配置文件的路径,则 mysql.default_socket 未设置。

使用它我不需要更改我的数据库配置。

于 2008-12-17T02:37:02.723 回答
1
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp/mysql.sock

我对 mamp 有同样的问题,并用上面的命令修复了它。我认为每次重新启动计算机时都必须运行此命令。也许有更好的方法可以做到这一点,但我将它与 clix.app 一起使用,所以它通常很快。另外,将您的主机更改为 localhost。

于 2009-03-13T14:32:11.270 回答
1

对我来说,我忘了在主机上设置端口,因为我没有在 MAMP 中使用默认的 MySQL 端口。

即如果你的 MySQL 端口是 8889,设置hostlocalhost:8889.

于 2012-01-24T21:45:36.487 回答
0

是的,有一个类似的问题,我认为像 Vinko 建议的那样指向 socket:portno 可能会起作用 - 但是,如果你使用 IP 地址/本地主机,你会没事的。

于 2008-12-14T17:19:07.563 回答
0
    class DATABASE_CONFIG
{
    public $default  =   array(
        'driver'        =>  'mysql',
        'persistent'    =>  false,
        'host'          =>  'localhost',
        'login'         =>  'account',
        'password'      =>  'password',
        'database'      =>  'database',
        'prefix'        =>  '',
        'port'          =>  '/var/mysql/mysql.sock'
    );
}
于 2009-01-02T17:52:03.010 回答
0

这对我有用:

class DATABASE_CONFIG
{
        public $default  =       array(
                'driver'                =>      'mysql',
                'persistent'    =>      false,
                'host'                  =>      'localhost',
                'login'                 =>      'account',
                'password'              =>      'password',
                'database'              =>      'database',
                'prefix'                =>      '',
                'port'                  =>      '/Applications/MAMP/tmp/mysql/mysql.sock'
        );
}
于 2009-03-06T04:42:23.927 回答
0

尝试配置你的防火墙......对我来说就是这种情况!

于 2009-08-10T08:38:31.930 回答
0

你也可以做一个符号链接,bake 是在 /tmp 中寻找 mysql.sock

像这样:

ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp/mysql.sock

干杯,埃博特。

于 2009-09-21T10:40:51.543 回答