php CURL - 多个独立会话 - 需要帮助!

时间:2010-12-28 17:03:30

标签: php session cookies curl

这是我的困境...... 我基本上有一个脚本,通过CURL发布到第三方网站进行登录,然后根据该登录会话发布另一个帖子来更新用户详细信息。现在,随着我的网站越来越繁忙,我有多个用户做同样的事情,似乎有时curl会变得混乱并用不同的用户信息更新一个用户的详细信息。这导致了实际问题。 似乎是用户在一次登录后正在使用的cookie被其他用户共享,并且他们最终使用相同的cookie登录 - 混淆了第三方系统。我的代码发布在下面,我需要使用cookiefile和cookiejar来维护php会话以允许我做我需要做的事情。但似乎所有用户都在重复使用相同的cookie .... 那有意义吗?我有什么办法可以改变这个吗?请指教.... 非常感谢!

以下是我用来登录和发布用户更新的代码

function hitForm($postURL, $postFields, $referer="", $showerr = FALSE, $ispost = TRUE) {
    global $islocal, $path_escape;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt");
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt");

    curl_setopt($ch, CURLOPT_URL, $postURL);
    if ($ispost)
        curl_setopt($ch, CURLOPT_POST, 1);
    else
        curl_setopt($ch, CURLOPT_HTTPGET, 1);
    curl_setopt($ch, CURLOPT_REFERER, $referer);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    $ret = curl_exec($ch);
    if ($error = curl_error($ch)) {
        if ($showerr)
            echo 'ERROR: ' . $error;
        return -1;
        exit;
    }
    $CU_header = curl_getinfo($ch);
    $CU_header["err"] = curl_errno($ch);
    $CU_header["errmsg"] = curl_error($ch);
    curl_close($ch);

    $returnout = $ret;

    //for debugging purposes for now we are logging all form posts
    SaveLog("hitform", "F[".$this->curruserid." - ".$this->currfunc." - ".date("d-m-y h:i:s")."]".$postFields);

    return $ret;
}

4 个答案:

答案 0 :(得分:2)

您正在为每个会话使用相同的cookies.txt文件,因此这就是共享Cookie问题的来源。您需要为要运行的每个并行会话指定一个单独的文件。

答案 1 :(得分:2)

您正在为所有用户使用共享Cookie jar。每个用户都需要一个单独的饼干罐。

答案 2 :(得分:2)

您需要为每个用户使用不同的Cookie文件。

我假设你的postFields为每个用户包含一些唯一的标识符(比如用户ID或用户名),所以请尝试以下方法:

$cookie_file = 'cookies_' . $postFields['user_id'] . '.txt';
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);

答案 3 :(得分:0)

据我了解这个问题,您的脚本收到了错误的用户信息。你如何存储用户信息?

我会说这是问题的根源 - 你没有为用户信息分配一个唯一的标识符,而这就是它变得讨厌的地方;)

因此,首先,我将会话ID与用户信息相关联(或者说,在会话中存储用户信息,这对每个人都是唯一的),并从那里加载它。我猜它应该做的伎俩;)