我正在尝试使用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,页面就会加载。但没有我的饼干,我得不到我需要的信息。
答案 0 :(得分:29)
首先,这可能只是你问题中的一个错字,但是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.尝试从工作站/台式机/笔记本电脑上运行和不的计算机上的URL 。可能是您的Web服务器无法访问站点,本地计算机具有缓存副本或其他一些网络错误。
确保在运行此测试时重复您的确切请求,包括您要发送的cookie(命令行卷曲对此有利)。完全可能的是,有问题的页面可以在没有cookie的情况下在浏览器中正常加载,但是当您发送cookie时,该站点实际上将返回404.
确保$ _SERVER ['HTTP_COOKIE']具有您认为的原始Cookie。
如果您正在进行屏幕抓取,请下载Firefox和LiveHTTPHeaders扩展程序的副本。执行所有必要的步骤,以便在Firefox中访问您想要的任何页面。然后,使用LiveHTTPHeaders的输出,重新创建完全相同的请求序列。包括每个标题,不只包含Cookie。
最后,PHP Curl存在是有原因的。如果可能的话,(我不是要问!)而是使用它。 :)
答案 1 :(得分:12)
只是为了分享这些信息。
使用session_start()
时,会话文件由PHP锁定。因此,实际脚本是唯一可以访问会话文件的脚本。如果您尝试通过fsockopen()
或file_get_contents()
访问它,则可能需要等待很长时间才能尝试打开已锁定的文件。
解决此问题的一种方法是使用session_write_close()
解锁文件,然后使用session_start()
重新锁定文件。
示例:
<?php
$opts = array('http' => 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()
如果你找到更好的东西,请告诉我。
答案 2 :(得分:1)
出于好奇,您是否在有空格的网页上尝试file_get_contents
?我记得尝试在名称中有空格的URL上使用fgc,而我的网页浏览器解析它就好了,fgc没有。我最终不得不使用str_replace
将''替换为'%20'。
我认为这应该相对容易发现,因为它只报告文件名的一半。另外,我在其中一篇文章中注意到有人在定义标题时使用了\ r \ n。请记住,PHP并不喜欢这些单引号,但它们在double中工作正常。
答案 3 :(得分:0)
确保服务器上存在file1.php。尝试在自己的浏览器中打开它以确保!