PDO: MySQL server has gone away

7 Cevap php

Ben gece ayak işi çok yapan bir komut dosyası var.

Bu bir döngü içinde yürüten bir PDO hazırlanmış deyimi kullanır.

The first few are running fine, but then I get to a point where they all fail with the error: "MySQL server has gone away".

Biz MySQL 5.0.77 çalıştırın.

PHP Version 5.2.12

Sitenin geri kalanı iyi çalışır.

7 Cevap

MySQL kılavuzun B.5.2.9. MySQL server has gone away bölümünde bu hata için olası nedenleri bir listesi vardır.

Belki bu durumlardan biri vardır? - Özellikle uzun bir işlemi, yaklaşık noktasını çalıştıran düşünüyor wait_timeout ilginç olabilir ...

Ya bağlantı (örneğin WAIT_TIMEOUT veya KILL komutu veren başka bir iş parçacığı tarafından) öldürüldü, sunucu düştü veya bir şekilde mysql protokolünü ihlal ettik olasıdır.

(: Do not ipucu) ikincisi sunucu tarafı hazırlanmış deyimleri ya da multi-sonuçlarını kullanarak eğer son derece muhtemeldir PDO'de bir hata, olması muhtemeldir

Bir sunucu çökmesi araştırılması gerekir; sunucu günlükleri bakmak.

Hala neler bilmiyorsanız, bağlantı içeriğini dökümü için bir ağ paket belden (örn. tcpdump'ı) kullanın.

Ayrıca genel sorgu günlük etkinleştirebilirsiniz - ama üretimde çok dikkatli yapmak.

Eğer izin verilen maksimum paket daha uzundur sunucusuna bir paket gönderdi büyük ihtimalle.

Hatta yerel bir sunucu üzerinde, sunucunuzun en büyük paket boyutunu aşan bir BLOB eklemeye çalıştığınızda "Hata 1153 'max_allowed_packet' bayt daha büyük bir paket büyük var" istemci tarafında "MySQL server has gone away", ve göreceksiniz Sunucu günlük (hata günlüğü etkinse). Eğer hiç ekleyeceksiniz büyük DAMLA boyutu ne karar vermeniz gerekir, ve max_allowed_packet, örneğin my.ini buna göre ayarlanır Bunu düzeltmek için:

[mysqld]
...
max_allowed_packet = 200M
...

I had the exact same problem. I resolved this issue by doing unset on the PDO object instead of seting it to NULL.

Örneğin:

function connectdb($dsn,$username,$password,$driver_options) {
    try {
        $dbh = new PDO($dsn,$username,$password,$driver_options);
        return dbh;
    }
    catch(PDOException $e)
    {
        print "DB Error: ".$e->getMessage()."<br />";
        die();
    }

}

function closedb($dbh) {
    unset($dbh);             // use this line instead of $dbh = NULL;
}

Ayrıca, son derece bütün PDO nesneleri yoketmek için tavsiye edilir. Yani hazır deyimleri içeren değişkenleri içerir.

Mysql günlükleri bir göz (/ var / log / mysql çoğu muhtemelen) var

Bakla örneği (ler) PDO::setAttribute(PDO::ATTR_EMULATE_PREPARES, true) kullanmayı deneyin. Yardımcı olacaktır biliyorum ama günlük veri ile onun tüm i var Dont.

$pdo = new PDO(
    $dsn,
    $config['username'],
    $config['password'],
    array(
        PDO::ATTR_PERSISTENT => true,
        PDO::ATTR_ERRMODE    => PDO::ERRMODE_EXCEPTION
    )
);

Bu deneyin. Bu işe yarayabilir