这是我的困境...... 我基本上有一个脚本,通过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;
}
答案 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与用户信息相关联(或者说,在会话中存储用户信息,这对每个人都是唯一的),并从那里加载它。我猜它应该做的伎俩;)