【问题标题】:Does PHP or cURL cache their web responses somehow?PHP 或 cURL 是否以某种方式缓存其 Web 响应?
【发布时间】:2020-06-29 23:49:07
【问题描述】:

我有一个 php 脚本向某些网站发出请求。我从命令行运行此脚本,因此不涉及我这边的 Web 服务器。只是纯 PHP 和一个 shell。

响应被拆分为页面,因此我需要发出多个请求以通过一个脚本运行来获取所有数据。显然,请求的 URL 是相同的,除了一个参数。没什么复杂的:

$base_url = '...';
$pages = ...; // a number I receive elsewhere
$delay = ...; // a delay to avoid too many requests 
$p = 0;
while ($p < $pages) {
   $url = $base_url . "&some_param=$p";
   ... // Here cURL takes it's turn because of cookies
   sleep($delay);
}

我以这种方式获得的页面看起来都一样 - 就像请求的第一个页面一样。 (所以我得到的只是一个重复列表乘以页数。)

我认为这是因为 Web 服务器端的一些缓存仍然存在,尽管我传递了一个额外的随机参数。关闭并重新初始化 cURL 会话也无济于事。

我还注意到,如果我手动快速修复初始 $p 值(因此请求从不同页面开始)然后再次启动脚本,结果会发生变化。我比$delay 值更快。 这意味着从相同的脚本运行发出的两个不同请求给出相同的结果,而从两个不同的脚本运行发出的两个不同请求给出不同的结果,无论请求之间的延迟如何。所以不能只缓存在响应端。

我试图解决这个问题并将实际请求包装在一个单独的脚本中,我使用主脚本中的exec() 运行该脚本。所以(我认为应该)有一个单独的 shell 实例用于任何单个页面请求,并且这些请求不应该在它们之间共享任何类型的缓存。 尽管如此,我仍然再次获得相同的页面。代码看起来像这样:

$pages = ...; 
$delay = ...; 
$p = 0;
$command_stub = 'php get_single_page.php';
while ($p < $pages) {
   $command = $command_stub . " $p";
   exec($command, $response);
   // $response is the same again for different $p's
   sleep($delay);
}

如果我再次在脚本中手动更改起始页面,我会再次获得该页面的结果。直到我再次改变它。等等。两次运行主脚本之间可能会经过几分钟,但在我手动切换数字之前,它仍然会产生相同的结果。

我无法理解为什么会这样。谁能解释一下?

【问题讨论】:

  • 传递的查询参数、您希望它们如何与页面交互以及实际的 cURL 请求将大大有助于解决您的问题。如果您只想要一个简单的标题答案,我相信 Richard 已经在下面介绍了它(以及建议的新故障排除点)

标签: php curl get


【解决方案1】:

简短的回答是否定的。除非配置为这样做(例如:设置 cookie 文件),否则 Curl 在执行之间当然不会保留任何内容。

我怀疑服务器期待某种会话令牌(我猜是 cookie 或其他 HTTP 标头)。如果没有会话令牌,它将忽略对后续页面的请求。

【讨论】:

  • 我使用浏览器复制了成功请求的每个 HTTP 标头(如果我登录并打开它正确加载的页面)和 cookie。它仍然让我一遍又一遍地传递同一页。实际上,它比根本不提供任何内容更令人困惑。我会理解的。但是我观察到的行为对我来说完全无法解释。好吧,可能我错过了一些东西。我会继续研究...
猜你喜欢
  • 2018-10-12
  • 2011-02-13
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
相关资源
最近更新 更多