2013-04-03 1 views
0

J'écris une API IMAP php. Le constructeur se connecte au serveur Gmail et stocke le socket dans une variable. Lorsque j'utilise la même connexion de socket dans une autre méthode, la connexion est nulle. Pourquoi cela arrive-t-il et comment puis-je le réparer?La connexion socket fsockopen est établie dans le constructeur mais est nulle dans les autres méthodes

class Imap{ 

    const RESPONSE_SIZE = 4096; 
    const LOCAL_HOST = '127.0.0.1'; 
    const CRLF = "\r\n"; 

    //------------RESPONSE CODES---------// 
    const OK = "OK"; 
    const BAD = "BAD"; 
    const NO = "NO"; 

    //----------------FLAGS--------------// 
    const FLAG_ANSWERED = "\\Answered"; 
    const FLAG_FLAGGED = "\\Flagged"; 
    const FLAG_DRAFT = "\\Draft"; 
    const FLAG_DELETED = "\\Deleted"; 
    const FLAG_SEEN = "\\Seen"; 

    //------------- PRIVATE VARS ------------// 
    private $_connection = NULL; 
    private $_number = 0; 
    private $_instruction_num; 

    private $_connected = false; 
    private $_authenticated = false; 

    //------------- PUBLIC VARS ------------// 

    public $error = array(); 

    function __construct($imap_server, $imap_port) 
    { 
     $this->connect($imap_server,$imap_port); 
    } 

    function __destruct() 
    { 
     if($this->_connected) 
      $this->logout(); 
    } 

    private function connect($imap_server, $imap_port) 
    { 
     if($this->_connected == false) 
     { 
      if($imap_server == NULL) $imap_server = self::LOCAL_HOST; 
      if($imap_port == NULL)  $imap_port = 993; 

      $this->_connection = fsockopen($imap_server,$imap_port); 

      if(empty($this->_connection)) 
      { 
       throw new Exception('Connection to server could not be established'); 
      } 
      else $this->_connected = true;  

     } 

     return $this->_connected; 
    } 

    function login($username, $password) 
    { 
     echo 'connection: '.$this->_connected; 
     if(!$this->_authenticated) 
     { 
      $instruction = $this->get_instruction_num(); 
      fputs($this->_connection,"$instruction LOGIN $username $password".self::CRLF); 
      $response = $this->get_response($instruction); 

      switch ($response['code']) { 
       case self::OK: 
        $this->_authenticated = true; 
        break; 

       case self::NO: 
        $this->_authenticated = false; 
        $this->error = array('error'=>'Invalid username or password.'); 
        break; 

       case self::BAD: 
       default: 
        $this->_authenticated = false; 
        $this->error = array('error'=>$response['response']); 
       break; 
      } 
     } 

     return $this->_authenticated; 
    } 

private function get_response($aInstructionNumber) 
    { 

     $end_of_response = false; 

     if(empty($this->_connection)) 
      die('DEAD');//connection is null here. 

     while (!$end_of_response) 
     { 
      $line = fgets($this->_connection,self::RESPONSE_SIZE); 
      $response .= $line.'<br/>'; 

      if(preg_match("/$aInstructionNumber (OK|NO|BAD)/", $response,$responseCode)) 
       $end_of_response = true; 
     } 

     return array('code' => $responseCode[1], 
      'response'=>$response); 
    } 

Utilisé dans Mailer.php

class Mailer 
{ 
    const imap_server = "ssl://imap.gmail.com"; 
    const imap_port = 993; 
    const smtp_server = "ssl://smtp.gmail.com"; 
    const smtp_port = 465; 

    private $imap = NULL; 
    private $smtp = NULL; 
    private $username = ""; 
    private $password = ""; 

    private $logged_in = false; 

    function __construct() 
    { 
     try{ 
      $this->imap = new Imap(self::imap_server,self::imap_port); 
      $this->smtp = new Smtp(self::smtp_server,self::smtp_port); 
     }catch(Exception $e) 
     { 
      throw new Exception($e->getMessage()); 
     } 
    } 

    function login($username,$password) 
    { 
     if($username != NULL) $this->username = $username; 
     if($password != NULL) $this->password = $password; 

     //$this->imap = new Imap(self::imap_server,self::imap_port); 
     if(!$this->imap->login($this->username,$this->password)) 
     { 
      $result = array('success'=>0,'message'=>$this->imap->error()); 
     } 
     else 
     { 
      $this->logged_in = true; 
      $result = array('success'=>1,'message'=>'Login successful'); 
     } 

     return $result; 
    } 

Le code dans l'enregistrement à la page:

if(!isset($_SESSION['mailer'])) 
{ 
    try{ 
     $mailer = new Mailer(); 
    }catch(Exception $e){ 
     die($e->getMessage()); 
    } 

    $_SESSION['mailer'] = serialize($mailer); 
} 

if(isset($_POST['username']) && isset($_POST['password'])) 
{ 
    //ENCRYPT 
    $username = htmlentities($_POST['username']); 
    $password = htmlentities($_POST['password']); 
    $s_mailer = $_SESSION['mailer']; 
    $mailer = unserialize($s_mailer); 

    $_login = $mailer->login($username,$password); 
    if($_login['success']!=1) 
    { 
     $feedback = $_login['message']; 
    }else 
     header('Location: inbox.php');  

} 
+0

'is_resource ($ this-> connexion)' retourne faux –

Répondre

0

Vous stockez la classe Mailer en session et attend que la connexion maintient en vie à travers plusieurs demandes. Notez que cela ne fonctionnera pas. Au lieu de cela, vous pouvez stocker l'objet serialize d Mailer dans la session et implémenter __sleep and __wakeup pour rétablir la connexion sur unserialize.

+0

merci! J'ai mis à jour mon code, mais la méthode unserialize donne une erreur 'unserialize() attend que le paramètre 1 soit string, object given'. Désolé, je suis nouveau à PHP –

+0

'Désolé, je suis nouveau à PHP' -> Pas de problème. Effacez votre session ou commencez une nouvelle session avant de la tester. – hek2mgl

+0

Ok, maintenant il accède à $ mailer d'être un non-objet après la désérialisation: 'Appel à une fonction membre login() sur un non-objet'. –

Questions connexes