16

我正在尝试从另一个文件中获取内容file_get_contents(不要问为什么)。
我有两个文件:test1.phptest2.phptest1.php根据登录的用户返回一个字符串。

test2.php尝试获取 test1.php 的内容,并且正在被浏览器执行,从而获取 cookie。

为了发送 cookie file_get_contents,我创建了一个流式上下文:

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

我正在检索内容:

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

但现在我得到了错误:

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

有人知道我在这里做错了什么吗?

编辑:
忘了提:没有streaming_context,页面只会加载。但如果没有 cookie,我就无法获得所需的信息。

4

4 回答 4

32

首先,这可能只是您的问题中的一个错字,但是 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(命令行 curl 对此很有用)。有问题的页面完全有可能在没有 cookie 的浏览器中正常加载,但是当您发送 cookie 时,该站点实际上返回 404。

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

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

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

于 2008-11-21T06:38:53.133 回答
15

只是为了分享这些信息。使用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()是一个阻塞函数,因此在尝试修改会话文件时,两个脚本都不会并发。

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

顺便说一句:它比cURLfsockopen()

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

于 2012-03-01T02:28:06.360 回答
1

只是出于好奇,您是否正在尝试file_get_contents在其中有空格的页面上?我记得尝试在名称中有空格的 URL 上使用 fgc,而我的 Web 浏览器可以很好地解析它,但 fgc 没有。我最终不得不使用 astr_replace将 ' ' 替换为 '%20'。

我认为这应该相对容易发现,因为它只报告文件名的一半。另外,我注意到在其中一篇文章中,有人在定义标题时使用了 \r\n。请记住,PHP 不喜欢将它们放在单引号中,但它们在双引号中可以正常工作。

于 2010-06-12T00:41:31.993 回答
0

确保 file1.php 存在于服务器上。尝试在您自己的浏览器中打开它以确保!

于 2008-11-20T20:03:29.003 回答