可以';t在linux上通过socket连接到本地MySQL服务器


Can't connect to local MySQL server through socket on linux

我试图在ubunto上运行一个php脚本,每次用sudo php -f /opt/lampp/htdocs/scanner/server/start.php运行它时,我都会收到这个消息。

服务器:正在运行。。。

PHP致命错误:未捕获异常"PDOException",消息为'SQLSTATE[HY000][2002]无法通过连接到本地MySQL服务器中的套接字"/var/run/mysqld/mysqld.sock"(2)/opt/lampp/htdocs/scanner/server/start.php:26堆栈跟踪:/opt/lampp/htdocs/scanner/server/start.php(26):PDO->__construct('mysql:host=loca…','root','datakvarnen')/opt/lampp/htdocs/scanner/server/start.php(51):openConnection(){main}在第26行的/opt/lamp/htdocs/scanner/server/start.php中抛出

我试过php -m我得到

〔PHP模块〕bcmath bz2日历核心ctype日期dba dom ereg exiffileinfo过滤器ftp gettext散列iconv json libxml mbstring mhashmysql-mysqli openssl pcntl pcre PDO PDO_mysql Phar posix readline反射会话shmop SimpleXML soap套接字SPL标准sysvmsgsysvsem sysvshm标记器wddx xml xml读取器xml写入器zip zlib

〔Zend模块〕

我得到的sudo yum install php-pdosudo yum install php-pdo_mysql都说它已经安装好了。

编辑:这是整个start.php文件

<?php
$ip     = "127.0.0.1";
$port   = 5012;
error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();
if(!$server = socket_create(AF_INET, SOCK_STREAM, 0)){
    echo socket_strerror(socket_last_error()); exit;
}
if(!socket_bind($server, $ip, $port)){
    echo socket_strerror(socket_last_error()); exit;
}
if(!socket_listen($server, 5)){
    echo socket_strerror(socket_last_error()); exit;
}
echo "Server: Running...'n'n";
function openConnection($db = "scanner"){
    $pdo = new PDO("mysql:host=localhost;dbname={$db};",'root','datakvarnen');
    $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo -> exec("SET CHARACTER SET utf8");
    return $pdo;
}
function sendMessage($connection, $message){
    $message .= "'r'n".chr(0);
    socket_write($connection, $message, strlen($message));
    usleep(5);
}
function readMessage($s){
    //TODO: Fix so it can read any lenght
    $message = @socket_read($s, 1024*10);
    if($message === false){
        return false;
    }
    return $message;
}
//The server is added in the $clients
//The reason for this is because new connection comes as read.
openConnection();
$clients = array();
$null = null;
while(true){
    //Copy $clients so the list doesn't get modified by socket_select();
    $read = $clients;
    $write = $clients;
    $read[] = $server;
    //Wait for read or write
    $ready = socket_select($read, $write, $null, 0);
    //Check if the servers is among the $read clients
    //If it is, then a someone new is trying to connect.
    if(in_array($server, $read)){
        //Search to find the server in $clients
        //It's needed since socket_select() demand we use $read instead of $server
        foreach($read as $client){
            if($client == $server){
                //We found the new connection, and accepts it.
                //TODO: Make a verify code to check it's a scanner.jar that joins
                $new = socket_accept($client);
                $clients[] = $new;
                continue 2;//<-- $server was found, so no need to search anymore.
            }
        }
    }
    foreach($read as $client){
        $message = readMessage($client);
        if($message === false){
            //Socket is closed or lost connection
            $key = array_search($client, $clients);
            unset($clients[$key]);
            continue 2;
        }else{
            //You got the message
            echo $message;
        }
    }
    foreach($write as $client){
        sendMessage($client,rand(0,99999));
    }
    sleep(1);
}
socket_close($server);

不,那不是正确的位置,我在运行时没有mysqld文件夹

好的,那么你需要改变插座的位置。您可以通过在DSN中指定每个PDO实例级别来执行此操作,也可以通过在php.ini中指定它来批量执行此操作。

对于PDO_Mysql DSN:文档中定义的PDO

$pdo = new PDO("mysql:unix_socket=/path/to/your/mysqld.sock;dbname={$db};",'root','datakvarnen');

php.ini中找到mysql.default_socket并将其更改为:

mysql.default_socket = /path/to/your/mysqld.sock

尽管对我来说,你的主页是如何工作的是个谜,除非它使用TCP DSN(使用localhost以外的ip地址或主机名作为DSN中的主机属性),或者你对CLI和Web服务器使用不同的php.ini(这并不罕见)。