我正在尝试使用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,页面就会加载.但没有我的饼干,我没有得到我需要的信息.
首先,这可能只是你问题中的一个拼写错误,但是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存在是有原因的.如果可能的话,(我不是要问!)而是使用它.:)
只是为了分享这些信息.使用时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()
是阻塞函数,因此在尝试修改会话文件时,两个脚本都不会并发.
但我确信这不是使用扩展连接操纵会话的最佳方式.
顺便说一下:它比cURL和fsockopen()
如果你找到更好的东西,请告诉我.