当前位置:  开发笔记 > 编程语言 > 正文

无法使用file_get_contents发送Cookie

如何解决《无法使用file_get_contents发送Cookie》经验,为你挑选了2个好方法。

我正在尝试使用file_get_contents从另一个文件中获取内容(不要问为什么).我有两个文件:test1.php和test2.php.Test1.php返回一个字符串,基于登录的用户.

Test2.php尝试获取test1.php的内容,并由浏览器执行,从而获取cookie.

要使用file_get_contents发送cookie,我创建了一个流上下文:

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"))`;

我正在通过以下方式检索内容:

$contents = file_get_contents("http://www.domain.com/test1.php", false, $opts);

但现在我收到了错误:

警告:file_get_contents(http://www.domain.com/test1.php)[function.file-get-contents]:无法打开流:HTTP请求失败!找不到HTTP/1.1 404

有人知道我在做什么吗?

编辑:忘了提:没有streaming_context,页面就会加载.但没有我的饼干,我没有得到我需要的信息.



1> Alan Storm..:

首先,这可能只是你问题中的一个拼写错误,但是file_get_contents()的第三个参数需要是你的流上下文,而不是选项数组.我用这样的东西进行了快速测试,一切都按预期工作

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"));
$context = stream_context_create($opts);
$contents = file_get_contents('http://example.com/test1.txt', false, $context);
echo $contents;

该错误表示服务器正在返回404.尝试从运行PHP的计算机上获取URL ,不是从工作站/台式机/笔记本电脑中取出.可能是您的Web服务器无法访问站点,本地计算机具有缓存副本或其他一些网络错误.

确保在运行此测试时重复您的确切请求,包括您要发送的cookie(命令行卷曲对此有利).完全可能的是,有问题的页面可以在没有cookie的情况下在浏览器中正常加载,但是当您发送cookie时,该站点实际上正在返回404.

确保$ _SERVER ['HTTP_COOKIE']具有您认为它的原始cookie.

如果您正在进行屏幕抓取,请下载Firefox和LiveHTTPHeaders扩展程序的副本.执行所有必要的步骤,以便在Firefox中访问您想要的任何页面.然后,使用LiveHTTPHeaders的输出,重新创建完全相同的请求序列.包括每个标题,不仅仅是Cookie.

最后,PHP Curl存在是有原因的.如果可能的话,(我不是要问!)而是使用它.:)



2> Yves Lange..:

只是为了分享这些信息.使用时session_start(),会话文件由PHP锁定.因此,实际脚本是唯一可以访问会话文件的脚本.如果您尝试通过它访问它,fsockopen()或者file_get_contents()您可以等待很长时间,因为您尝试打开已锁定的文件.

解决此问题的一种方法是使用session_write_close()解锁文件并在之后重新锁定它session_start().

例:

 array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"));
 $context = stream_context_create($opts);
 session_write_close(); // unlock the file
 $contents = file_get_contents('http://120.0.0.1/controler.php?c=test_session', false, $context);
 session_start(); // Lock the file
 echo $contents;
?>

由于file_get_contents()是阻塞函数,因此在尝试修改会话文件时,两个脚本都不会并发.

但我确信这不是使用扩展连接操纵会话的最佳方式.

顺便说一下:它比cURLfsockopen()

如果你找到更好的东西,请告诉我.


非常感谢你发布这个:)我希望我可以提供更多的赞成,因为你只是让我免于拉掉我所有的头发.
推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有