2016-04-18 2 views
2

Ich finde viele Beiträge, die nahe daran sind, aber keine sind gleich. Ich habe eine stark genutzte CodeIgniter-App, bei der möglicherweise ein paar Dutzend völlig zufällige, schwerwiegende Fehler im Fehlerprotokoll pro Tag protokolliert wurden.CodeIgniter Random PHP Schwerwiegender Fehler: Aufruf an eine Member-Funktion ... auf einem Nicht-Objekt in ... mysqli_driver.php

PHP Fatal error: Call to a member function real_escape_string() on a non-object in /system/database/drivers/mysqli/mysqli_driver.php

oder

PHP Fatal error: Call to a member function query() on a non-object in /system/database/drivers/mysqli/mysqli_driver.php

Die Mitgliedsfunktion ist zufällig. Row(), Query(), real_escape_string(), num_rows() usw.

I eine Protokollfunktion mysqli_driver.php hinzugefügt, die einen Stapel trace Dumps, wann immer es einen Nicht-Objekt empfängt:

if(!is_object($this->conn_id)) 
// Dump stack 

Das sagt mir, dass der Fehler an zufälligen Orten in meiner App passiert, so nehme ich an, dass das Problem nicht in meinem Code ist. Das lässt meine Serverkonfiguration als den Verdächtigen. Ich kann keine rauchenden Waffen finden und kann den Fehler nicht reproduzieren.

Ich fasse hier Strohhalme. Kann mir irgendjemand Ideen geben, was ich noch tun kann, um das zu verfolgen?

  • CodeIgniter v3.x
  • Apache/2.2.15
  • CentOS 6
  • MySQL 5.1.73

UPDATE: Hier sind die configs ich verwende. Haupt DB-Verbindung:

$db['default'] = array(
    'dsn' => '', 
    'hostname' => 'localhost', 
    'username' => 'cfMaster', 
    'password' => 'somemasterpw', 
    'database' => 'cfMaster', 
    'dbdriver' => 'mysqli', 
    'dbprefix' => '', 
    'pconnect' => FALSE, 
    'db_debug' => TRUE, 
    'cache_on' => FALSE, 
    'cachedir' => '', 
    'char_set' => 'utf8', 
    'dbcollat' => 'utf8_general_ci', 
    'swap_pre' => '', 
    'encrypt' => FALSE, 
    'compress' => FALSE, 
    'stricton' => FALSE, 
    'failover' => array(), 
    'save_queries' => FALSE 
); 

Wenn an einem anderen DB verbinden:

// $userDb array contains all of the connection details. 
$firmDb = array("firm_id" => $userDb[0]->firm_id, 
"hostname" => $userDb[0]->hostname, 
"username" => $userDb[0]->username, 
"password" => $userDb[0]->password, 
"database" => $userDb[0]->database, 
"dbdriver" => "mysqli", 
"pconnect" => FALSE); 
$this->db = $this->load->database($firmDb, TRUE, TRUE); 

~ 35K-Verbindungen pro Stunde. ~ 20 Fehler pro Tag. Alle meine Datenbankverbindungen funktionieren buchstäblich 99,99% der Zeit. Der Fehler von 0,01% ist mein Problem.

+0

Dies kann entweder auf Ihrem MySQL-Server oder Ihre codeigniter Datenbank-Konfiguration zusammenhängen. Können Sie uns Ihre CI-Konfiguration für die Datenbank zeigen? Sie können den Hostnamen, den Benutzernamen und das Passwort ändern, wenn Sie möchten. –

+0

Dies ist ein sehr großes, stark genutztes System mit mehreren Datenbankkonfigurationen. Im Durchschnitt werden pro Stunde etwa 35.000 Verbindungen zur DB hergestellt. Da ich nur 20 Fehler pro Tag bekomme, gehe ich davon aus, dass meine Konfigurationen in Ordnung sind. Jetzt meine Konfigurationen zur Frage hinzufügen ... –

+0

Haben Sie einen Grund dafür gefunden? Ich habe das gleiche Problem. –

Antwort

0

"Nicht-Objekt" bedeutet, dass die Variable ($ db) nicht auf ein Objekt verweist. Haben Sie es Ihrer Datenbankklasse zugewiesen (z. B. $ db = new databaseClass(); oder wie auch immer die verwendete Klasse benannt ist)? Ersetzen

0

$var = &new class(); with $var = new class(); 

es

0

try arbeiten Datenbank auf Ihrer Methode zu laden und versuchen

function __construct(){ 
    parent::__construct(); 
    $this->load->database(); 
} 
Verwandte Themen