我试图通过php curl传递当前登录的会话(因此我不必在发送表单数据之前使用curl登录)。
似乎无论我尝试什么CURLOPT_COOKIE导致页面超时:
function postForm($post_data, $URL) {
//traverse array and prepare data for posting (key1=value1)
foreach ( $post_data as $key => $value) {
$post_items[] = $key . '=' . $value;
}
//create cURL connection
$curl_connection = curl_init($URL);
//set curl to current session
//$strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/';
//$strCookie = session_name() . '=' . session_id());
$strCookie = 'PHPSESSID=' . session_id() . '; path=/';
$useragent = $_SERVER['HTTP_USER_AGENT'];
//set curl options
curl_setopt($curl_connection, CURLOPT_USERAGENT,$useragent);
curl_setopt($curl_connection, CURLOPT_COOKIE,$strCookie);
curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);
...
//create the final string to be posted using implode()
$post_string = implode ('&', $post_items);
//set data to be posted
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string);
行curl_setopt($curl_connection, CURLOPT_COOKIE,$strCookie);
导致脚本执行超时。
如何通过cUrl
当前会话,以便不需要登录发布表单?
编辑(更多信息): curl_getinfo()在超时时显示500个http_code错误。
编辑:
好吧,我仍然无法让它发挥作用。我可以在POSTMAN REST Client Chrome扩展程序中发送表单,但我无法弄清楚如何使用curl执行此操作。
我这样尝试过CURLOPT_COOKIEFILE / CURLOPT_COOKIEJAR,但它仍然没有用:
$useragent = $_SERVER['HTTP_USER_AGENT'];
$tmp_fname = tempnam("/tmp", "COOKIE");
//set curl options
...
curl_setopt($curl_connection, CURLOPT_COOKIEJAR, $tmp_fname);
curl_setopt($curl_connection, CURLOPT_COOKIEFILE, $tmp_fname);
...
如果这对我发送POSTMON的方式有帮助,看起来非常简单,不知道为什么我不能使用curl:
编辑:更多信息 当我检查IIS日志时,我可以看到两个请求之间的差异。第一个是php,第二个是工作,是POSTMON:
2014-04-17 22:31:44 ::1 POST /mysite/categories.php ccsForm=categories_maint 80 - ::1 Mozilla/5.0+(Windows+NT+6.1)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/33.0.1750.154+Safari/537.36 200 0 64 109717
2014-04-17 22:34:21 SERVERS.IP.ADDRESS.HERE POST /mysite/categories.php ccsForm=categories_maint 80 - MY.IP.ADDRESS.HERE Mozilla/5.0+(Windows+NT+6.1)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/33.0.1750.154+Safari/537.36 302 0 0 62
看起来PHP试图从自己发送请求?这可能是问题吗?
答案 0 :(得分:2)
如PHP Manual中所述,会话不支持并发写入。
但是会话数据被锁定以防止并发写入任何时候只有一个脚本可以在会话上运行。
然后超时问题的原因是主脚本首先访问了您的会话,因此当它仍在运行时,其他脚本仍然无法访问该会话。
在运行session_write_close
之前,您可以将curl_exec
用于此目的,以使 cURL 电话可以访问您的会话数据。
希望它有所帮助。