PHP cURL不存储会话cookie ...如何解决这个问题?

问题描述:

我正在做一个类与我们公司的API交流... 我使用curl发布数据并在json中检索响应。 在代码的最后部分(课后),我将用户登录到服务器(它给出了真实的),但是当我尝试再次用curl连接时,他说我没有登录! 我已经做了谷歌搜索,并添加了curl_setopt($ ch,CURLOPT_COOKIE,$ this-> Session_Cookie);一行。PHP cURL不存储会话cookie ...如何解决这个问题?

有人能告诉我一些吗?

预先感谢;)

if(!class_exists("Microdual")) { 
class Microdual{ 

    // No caso de a sessão não estar iniciada, iniciar aqui a sessão 


    ################ 
    ################ 
    ################ 
    ################ Iniciar funcoes privadas ################ 

    private function Extra_LoadSession($varname,$otherwise){ 
    return (!empty($_SESSION[$this->Session_Prefix . $varname])) ? $_SESSION[$this->Session_Prefix . $varname] : $otherwise; 
    } 
    private function Extra_SaveSession($varname,$value){ 
    $_SESSION[$this->Session_Prefix . $varname] = $value; 
    return true; 
    } 

    /** 
    * $this->API_Comunicate() "Comunicar comandos com os servidores Microdual (enviar e receber)" 
    * 
    * @param data array "Colocar as variaveis que deseja passar à plataforma (Ver Lista completa de variaveis no Inicio)" 
    * 
    * @return array or void (false) 
    */ 
    private function API_Comunicate($_data){ 

    // Converter o array em string (serialize) 
    $data = array();  
    while(list($n,$v) = each($_data)){ 
    $data[] = "$n=$v"; 
    } 
    $data = implode('&', $data); 
    // format --> test1=a&test2=b etc. 

    $ch = curl_init(); 
    curl_setopt($ch,CURLOPT_URL,$this->Geral_URLAPI); 
    curl_setopt($ch,CURLOPT_POST,count($_data)); 
    curl_setopt($ch,CURLOPT_COOKIE,$this->Session_Cookie); 
    curl_setopt($ch,CURLOPT_POSTFIELDS,$data); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
    $content = curl_exec($ch); 
    curl_close($ch); 

    if(($content !== false) && (!empty($content))){ 
    return json_decode($content, true); 
    }else{ 
    return false; 
    } 
    } 


    ################ 
    ################ 
    ################ 
    ################ Iniciar funcoes Públicas ################ 

    public function Debug_VarDump($varname){ 
    $string = "<pre>"; 
    $string .= var_dump($varname); 
    $string .= "</pre>"; 
    return $string; 
    exit; 
    } 
    /** 
    * $this->IsLogged() "Verificar se está autenticado no servidor (primeiro localmente, e depois liga ao servidor)" 
    * 
    * @return void 
    */ 
    public function IsLogged(){ 
    if($logged) return true; 
    $logged = $this->Extra_LoadSession("Login_Logged",false); 
    if($logged){ 
    return true; 
    }else{ 
    // Conectar ao servidor 
    $dados = $this->API_Comunicate(array()); 
    if($dados!==false){ 
    if(!empty($dados['auth']['logged'])){ 
     return $dados['auth']['logged']; 
    }else{ 
     return false; 
    } 
    }else{ 
    return false; 
    } 
    } 
    } 

    /** 
    * $this->Login() "Executar o Login nos servidores Microdual" 
    * 
    * @param username string "Colocar aqui o nome de utilizador da sua conta em www.microdual.com" 
    * @param password string "Colocar aqui a password da sua conta em www.microdual.com" 
    * 
    * @return void 
    */ 
    public function Login($username,$password){ 
    if(empty($username) || empty($password)) return false; 
    if($this->IsLogged()) return true; 

    $receive = $this->API_Comunicate(array(
    "type" => "auth", 
    "action" => "add", 
    "auth_username" => $username, 
    "auth_password" => $password 
    )); 

    if($receive["auth"]["status"] && $receive["auth"]["logged"]){ 
    $this->Extra_SaveSession("Login_Logged",true); 
    $this->Login_Logged = true; 
    return true; 
    }else{ 
    return false; 
    } 
    } 
    /** 
    * $this->SMS_Send() "Executar o Login nos servidores Microdual" 
    * 
    * @param number string "Colocar aqui o numero do telemovel para enviar sms" 
    * 
    * @return void 
    */ 
    public function SMS_Send($number,$msg){ 
    // Guardar apenas os numeros 
    $number = preg_replace("/[^0-9]/", "", $number); 
    $msg = trim($msg); 

    $receive = $this->API_Comunicate(array(
    "type" => "sms", 
    "action" => "add", 
    "sms_to" => $number, 
    "sms_msg" => $msg 
    )); 
    return $receive; 
    } 

    ################ 
    ################ 
    ################ 
    ################ Iniciar variaveis da class ################ 

    private $Session_Prefix; 
    private $Session_Cookie; 
    private $Geral_URLAPI; 
    private $Login_Logged; 




    ################ 
    ################ 
    ################ 
    ################ Iniciar dados da class ################ 

    function __construct(){ 
    $this->Session_Prefix = "MYCMSAPI_"; 
    $this->Session_Cookie = "PHPSESSID=".$_COOKIE['PHPSESSID']."; path=/"; 
    $this->Geral_URLAPI = "http://www.MYCOMPANY.com/MyapiURL"; 
    $this->Login_Logged = $this->Extra_LoadSession("Login_Logged",false); 
    } 
} 
} 

$Microdual = new Microdual(); 
if($Microdual->Login("usernamehere","password")){ 
$Microdual->Debug_VarDump($Microdual->SMS_Send("93211254","Teste Test Hi :)")); 
}else{ 
echo "Login com erro"; 
} 

CURLOPT_COOKIE选项是用于发送使用CURL特定的cookie。您正在寻找的选项是CURLOPT_COOKIEFILECURLOPT_COOKIEJAR,它们指定一个文件来保存和加载cookie。

所以你必须做这样的事情:

curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt'); 
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt'); 
+0

它没有工作!该文件是否放在脚本的同一文件夹中? – CuSS 2010-06-24 18:15:56

+0

它是如何工作的?选项值就是您要存储Cookie的路径。每当你想使用这些cookies时,你只需要使用这样的文件。如果它不存在,PHP将创建它。 – 2010-06-24 18:36:10

+0

我已经尝试了CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE befor在这里询问。但现在它起作用了,CURLOPT_COOKIESESSION是真实的,并且它正在每个连接中激发一个新的cookie会话。谢谢 ;) – CuSS 2010-06-24 19:11:30