无法在CURL中交换会话数据

时间:2010-10-06 05:48:17

标签: php session curl

我使用来自localhost的curl.php中的CURL调用invoke.php。在invoke.php中,我将一些数据存储在会话中。但是当我尝试从curl.php访问那些会话数据时,不要获取那些会话数据。我如何获得这些价值观?

curl.php的内容

`include_once('session.php');

$ handles = array();

$ urlArray = array('http://localhost/invoke.php');

foreach($ urlArray as $ url){

// create a new single curl handle

$ch = curl_init();



curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_TIMEOUT, 30);



// add this handle to the multi handle

curl_multi_add_handle($mh,$ch);



// put the handles in an array to loop this later on

$handles[] = $ch;

}

//执行多句柄

$运行= NULL;

做{

curl_multi_exec($mh,$running);

// added a usleep for 0.25 seconds to reduce load

usleep (250000);

} while($ running> 0);

//获取网址的内容(如果有的话)

为($ I = 0; $我

{

// get the content of the handle

// $ output。= curl_multi_getcontent($ handles [$ i]);

// remove the handle from the multi handle

curl_multi_remove_handle($mh,$handles[$i]);

}

echo SessionHandler :: getData('DATA'); `

invoke.php的内容

include_once ('session.php');

echo SessionHandler :: setData('DATA','HELLO WORLD');

3 个答案:

答案 0 :(得分:1)

有两个可能的问题:

  1. 您无法确定两个脚本是否都会访问相同的会话(具有相同的会话ID),实际上我可以打赌他们有单独的会话。当然,您可以通过在URL中添加一个额外的参数将会话ID从invoke.php发送到curl.php来强制执行,然后使用该参数强制curl.php中的会话ID

  2. 第二个可能的问题是在session_start上读取会话变量(在填充$ _SESSION时),但是在启动会话后修改会话内容(在session.php中,我假设),这是为什么任何更改(即使满足1.上的条件)都不会反映在invoke.php中已经打开的会话中。我认为你应该强制会话关闭并重新启动它。

答案 1 :(得分:1)

我有同样的问题。这就是我解决它的方法:

function getContent($url){
    $cookiesStr = '';
    foreach($_COOKIE as $k => $v){
        $cookiesStr.= $k . '=' . $v . '; ';

    }#end COOKIE
    $cookiesStr = rtrim($cookiesStr, ' ');

    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/cookies.txt');
    curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/cookies.txt');
    curl_setopt ($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_COOKIE, $cookiesStr);
    ob_start();

    curl_exec ($ch);
    curl_close ($ch);
    $string = ob_get_contents();

    ob_end_clean();

    return $string;    

}#end getContent

你必须有一个tmp cookie jar,否则会产生无限循环。您必须发送cookie,否则您将无法获得结果。

答案 2 :(得分:0)

我能解决这个问题。我设置了卷曲_

setopt($ch, CURLOPT_COOKIE,session_name().'='.session_id());

使用相同的会话ID并使用php的session_write_close()函数来编写会话数据。