fsockopen套接字连接在构造函数中建立,但在其他方法中为null

时间:2013-04-03 11:50:41

标签: php fsockopen

我正在编写一个php IMAP API。构造函数将Gmail服务器连接到它们,并将套接字存储在变量中。当我在另一个方法中使用相同的套接字连接时,连接为空。为什么会发生这种情况,我该如何解决?

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);
    } 

在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;
    }

登录页面中的代码:

    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');      

}

1 个答案:

答案 0 :(得分:0)

您正在将Siler类存储在SESSION中,并期望连接在多个请求中保持活动状态。请注意,这不起作用。

相反,您可以将serialize d Mailer对象存储在SESSION中并实施__sleep and __wakeup以在unserialize上再次建立连接。