【问题标题】:How to send cookies with file_get_contents如何使用 file_get_contents 发送 cookie
【发布时间】:2010-09-23 07:47:02
【问题描述】:

我正在尝试使用 file_get_contents 从另一个文件中获取内容(不要问为什么)。
我有两个文件:test1.phptest2.phptest1.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.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,我将无法获得所需的信息。

【问题讨论】:

  • 仅供参考-如果您使用 A2hosting,则必须请求授予 fopen 访问权限(出于安全原因,他们默认将其关闭)

标签: php session cookies file-get-contents


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    首先,这可能只是您问题中的一个错字,但是 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 的存在是有原因的。如果可能的话,(我不是在问!)改用它。 :)

    【讨论】:

    • 使用此代码时出现“HTML 标头失败”错误,因此我需要通过添加“session_write_close();”来获得解决方案在 file_get_contents 之前。这是正确的方法吗?
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      只是为了分享这些信息。 使用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()

      更快

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

      【讨论】:

      • 非常感谢您发布此内容 :) 我希望我能给予更多的支持,因为您刚刚让我免于拔掉我所有的头发。
      • 谢谢,很高兴与您分享 ;)
      猜你喜欢
      • 1970-01-01
      • 2012-07-21
      • 2016-01-15
      • 2015-03-14
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      相关资源
      最近更新 更多