Php mysql连接错误太多。

Php mysql连接错误太多。,php,mysql,pdo,Php,Mysql,Pdo,我有一个.txt文件,里面有60000个英语单词的列表。我想把它们插入到我的数据库中,所以我只是按照这里显示的那样做 $file = new SplFileObject('list.txt'); foreach ($file as $line => $word) { $p = new PDO('mysql:host=localhost; dbname=test_dictionary', 'root', 'test'); $p->query("INSERT INTO

我有一个
.txt
文件,里面有60000个英语单词的列表。我想把它们插入到我的数据库中,所以我只是按照这里显示的那样做

$file = new SplFileObject('list.txt');

foreach ($file as $line => $word) {
    $p = new PDO('mysql:host=localhost; dbname=test_dictionary', 'root', 'test');
    $p->query("INSERT INTO words (english) VALUES('$word') ");
}
现在,运行此脚本后,出现以下错误:

致命错误:在/var/www/skillz/test/curl/index.php:17堆栈跟踪:#0/var/www/test/index.php(17):PDO->u构造('mysql:host=loca…,'root','test')#1{main}抛出在第4行的/var/www/test/index.php中

第4行是新PDO('mysql:')
所在的位置。所以,我试图搜索这个错误,并发现。我相应地编辑了mysql,如下所示:

$ vi /etc/my.cnf
  max_connections=250

但是我仍然会遇到同样的错误,我在CentOS 6.5中运行PHP-FPM和NGINX,但我没有为每个单词打开新的连接。在插入的整个生命周期中,您只需要打开一个连接。我不确定PDO对象的真实生存期,我知道它们在不使用时会被清除,但垃圾收集可能在几分钟内无法做到这一点,而对于60000个字,你将以比清理它们更快的速度达到数据库连接的极限

$file = new SplFileObject('list.txt');
$p = new PDO('mysql:host=localhost; dbname=test_dictionary', 'root', 'test');

foreach ($file as $line => $word) {

    $p->query("INSERT INTO words (english) VALUES('$word') ");
}

不要为每个单词打开新连接。在插入的整个生命周期中,您只需要打开一个连接。我不确定PDO对象的真实生存期,我知道它们在不使用时会被清除,但垃圾收集可能在几分钟内无法做到这一点,而对于60000个字,你将以比清理它们更快的速度达到数据库连接的极限

$file = new SplFileObject('list.txt');
$p = new PDO('mysql:host=localhost; dbname=test_dictionary', 'root', 'test');

foreach ($file as $line => $word) {

    $p->query("INSERT INTO words (english) VALUES('$word') ");
}

您应该在foreach外部声明SQL连接。 因为它将建立60000个连接

$file = new SplFileObject('list.txt');
$p = new PDO('mysql:host=localhost; dbname=test_dictionary', 'root', 'test');

foreach ($file as $line => $word) {

    $p->query("INSERT INTO words (english) VALUES('$word') ");
}
您只需要声明SQL连接一次,就可以随时使用它。
如果你把它放在foreach中,它会在每个单词之间建立一个SQL连接,这就是为什么你会收到这个消息。

你应该在foreach之外声明SQL连接。 因为它将建立60000个连接

$file = new SplFileObject('list.txt');
$p = new PDO('mysql:host=localhost; dbname=test_dictionary', 'root', 'test');

foreach ($file as $line => $word) {

    $p->query("INSERT INTO words (english) VALUES('$word') ");
}
您只需要声明SQL连接一次,就可以随时使用它。
如果你把它放在foreach中,它会在每个单词之间建立一个SQL连接,这就是为什么你会收到这个消息。

解决方案1 使用批插入语句:

INSERT INTO words (col1, col2) VALUES ('val1', 'val2'), ('val3', 'val4'), ...('val3n', 'val4n');
如果还要检查某些行是否失败,则此操作将失败。下面是另一个解决方案

解决方案2

创建持久数据库连接。这将在循环的所有迭代中使用相同的连接

$file = new SplFileObject('list.txt');
$p = new PDO('mysql:host=localhost; dbname=test_dictionary', 'root', 'test', array(
    PDO::ATTR_PERSISTENT => true)); //Persistent Database Connection
foreach ($file as $line => $word) {
    $p->query("INSERT INTO words (english) VALUES('$word') ");
}
$p = null; //Destroy Connection

解决方案1 使用批插入语句:

INSERT INTO words (col1, col2) VALUES ('val1', 'val2'), ('val3', 'val4'), ...('val3n', 'val4n');
如果还要检查某些行是否失败,则此操作将失败。下面是另一个解决方案

解决方案2

创建持久数据库连接。这将在循环的所有迭代中使用相同的连接

$file = new SplFileObject('list.txt');
$p = new PDO('mysql:host=localhost; dbname=test_dictionary', 'root', 'test', array(
    PDO::ATTR_PERSISTENT => true)); //Persistent Database Connection
foreach ($file as $line => $word) {
    $p->query("INSERT INTO words (english) VALUES('$word') ");
}
$p = null; //Destroy Connection

解决了的!很抱歉当我将PDO从循环中移出时,它起作用了。这么愚蠢的错误解决了!很抱歉当我将PDO从循环中移出时,它起作用了。对于60000个条目来说,这是一个愚蠢的错误,如果SQL未能插入一个条目,我就不想尝试查看它。嘿@Hammerstein,我已经对答案进行了编辑。您可以使用
sleep
命令强制重新使用连接。效果不是很好,但效果为+1。因为,
sleep(1)
会将每个迭代延迟1秒,完成queryHey@Hammerstein几乎需要60000秒,我做了另一次编辑。解决方案2非常适合您。如果它不起作用,请告诉我。我不是那个想要插入60000个单词的人。但是,是的,我们都同意在60000年期间开通单一连接是个好主意。尽管如此,看看在PDO中使用持久连接是一个有趣的答案。对于60000个条目,如果SQL插入失败,我不想尝试查看该SQL。嘿@Hammerstein,我已经对答案进行了编辑。您可以使用
sleep
命令强制重新使用连接。效果不是很好,但效果为+1。因为,
sleep(1)
会将每个迭代延迟1秒,完成queryHey@Hammerstein几乎需要60000秒,我做了另一次编辑。解决方案2非常适合您。如果它不起作用,请告诉我。我不是那个想要插入60000个单词的人。但是,是的,我们都同意在60000年期间开通单一连接是个好主意。尽管如此,看看在PDO中使用持久连接是一个有趣的答案。