【发布时间】: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 已经在下面介绍了它(以及建议的新故障排除点)