2013-05-15 2 views
4

Depuis un certain temps, nous rencontrons un problème très étrange avec notre serveur d'hébergement. Une fois par moment (semble aléatoire), les variables dans PHP deviennent NULL.Les variables PHP deviennent aléatoirement

En général, tout fonctionne parfaitement bien, mais une fois que cela arrive. Tous les comptes sur le serveur sont affectés et toutes les applications PHP (y compris PHPMyAdmin, Wordpress nos propres scripts). Nous avons contacté notre hébergeur, mais ils ne trouvent aucune solution. J'ai eu peu d'idées, la plus prometteuse était un problème avec Suhosin. Mais je n'obtiens aucun message directement dans le journal.

Nous avons fait un script le plus simple possible de reproduire l'erreur:

<?php 
class Example 
{ 

    protected $stringVar = 'this is a string value'; 

    public function accessParameter() 
    { 
     $error = false; 
     if (isset($this->stringVar) && !is_null($this->stringVar)) { 
      echo "string var : " . $this->toStringWithType($this->stringVar) . "\n"; 
     } else { 
      echo "string var is not set\n"; 
      $error = true; 
     } 

     if ($error) { 
      $logfile = dirname(__FILE__)."/random_bug_log.log"; 
      file_put_contents($logfile, date('Y-m-d H:i:s')."\n", FILE_APPEND); 
      file_put_contents($logfile, $this->toStringWithType($this->stringVar) . "\n", FILE_APPEND); 
     } 
    } 

    public function toStringWithType($var) 
    { 
     $type = gettype($var); 
     return "($type) '$var'"; 
    } 

} 

$e = new Example(); 
$e->accessParameter(); 

Sortie normale:

string var : (string) 'this is a string value' 

sortie lorsque la chose étrange se produit:

string var is not set 

J'ouvert à tout idées ou suggestions comment résoudre ce problème. Je suppose que la solution ultime est de changer la société d'hébergement. Je n'ai pas réussi à créer ce problème sur localhost ou sur un autre serveur.


Éprouvette qui ont été faites, y compris vos suggestions:

<?php 
class Example 
{ 
    protected $stringVar = 'this is a string value'; 

    public function accessParameter() { 
    $error = false; 
    if(isset($this->stringVar) && !is_null($this->stringVar)) { 
     echo "string var : " 
    .$this->toStringWithType($this->stringVar) 
    ."\n"; 
    } else { 
     echo "string var is not set\n"; 
     $error = true; 
    } 

    if($error) { 
     $logfile = dirname(__FILE__)."/random_bug_log.log"; 
     file_put_contents($logfile, date('Y-m-d H:i:s')." ", FILE_APPEND); 
     file_put_contents($logfile, 
      $this->toStringWithType($this->stringVar) . "\n", 
      FILE_APPEND); 
    } 

    } 

    public function writeParameter() { 
    $this->stringVar="variable assigned"; 
    if(isset($this->stringVar) && !is_null($this->stringVar)) { 
     echo "string var : " 
    .$this->toStringWithType($this->stringVar) 
    ."\n"; 
    } else { 
     echo "string var is not set\n"; 
     $error = true; 
    } 
    } 

    public function toStringWithType($var) 
    { 
    $type = gettype($var); 
    return "($type) '$var'"; 
    } 


} 

$e = new Example(); 
$e->accessParameter(); 
$e->writeParameter(); 

La sortie alors que la chose se produit:

string var is not set 
string var is not set 
+1

C'est un cas très étrange. Je suggère de voir si elles peuvent changer votre serveur plutôt que de changer de compagnie, cela pourrait être le signe d'une défaillance matérielle intermittente ou d'une défaillance imminente d'une puce mémoire par exemple – Anigel

+0

'isset - Détermine si une variable est définie et n'est pas NULL' [voir ici] (http://ir2.php.net/manual/fr/function.isset.php). vous n'avez donc pas besoin de vérifier 'is_null'. – Amir

+0

J'ai également rencontré un problème étrange, comme aléatoirement 'strpos' renvoie' false' ... – mpyw

Répondre

0

il est un problème très étrange.

peut-être pas une solution mais vaut la peine d'essayer;

protected $stringVar; 

function __construct() { 
    $this->stringVar = 'this is a string value'; 
} 
0

Je recommanderais d'utiliser! == au lieu de is_null pour voir si la variable est réellement nulle.

if (isset($this->stringVar) && ($this->stringVar !== null)) {

ou

if (isset($this->stringVar) && (!empty($this->stringVar)) {

devrait faire le travail aussi.

0

Dans le cas de ce type de problèmes, vérifiez avec la valeur que vous avez dans si la condition et faites ce que vous voulez dans d'autres. Comme dans votre situation, faites comme:

if(isset($this->stringVar) && ($this->stringVar == "this is a string value")) { 

}else{ 
    // your code here... 
} 
Questions connexes