无法使用file_get_contents发送Cookie

时间:2008-11-20 19:46:49

标签: php cookies

我正在尝试使用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,页面就会加载。但没有我的饼干,我得不到我需要的信息。

4 个答案:

答案 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。尝试在自己的浏览器中打开它以确保!