1

有没有办法使用 file_get_contents() 在 URL 中传递变量并让 file_get_contents() 检索基于传递的变量值的动态内容?

例如,假设我在网站 A的页面上有以下代码:

$contents=file_get_contents('http://example.com/get.php?a='.$number);
echo $contents;

$number网站 A 上生成的位置(值可以是 1、2、3 等)

然后在example.comget.php托管。get.php是否可以根据传递的变量的值检索不同的内容?例如,如果a=1然后某个部分get.php将被提取,但如果a=2和不同部分get.php将被提取,等等。这可能吗?

4

4 回答 4

1

它仅取决于get.php. 如果它在不同的值上返回不同的内容a,它肯定会起作用。

于 2013-05-15T20:34:44.913 回答
1

当然。

如果您找出变量的模式,这是可能的。

如果你注意到模式是一个数字,你可以尝试这样的事情:

您不想在代码或输出中显示任何不相关的内容,也不想动态过滤,因为它只会增加延迟。在get.php目标机器上:

if(!empty($_GET['a']) and is_numeric($_GET['a'])){

$id = $_GET['a'];
$sql = "select contents from database where id='$id'";
$results = mysqli_query($sql);
$row_cnt = mysqli_num_rows($result);
if ($row_cnt == 1){

   while ($row = mysqli_fetch_array($results)){
    echo $row['contents'];
   }
} elseif (empty($row_cnt) {
  echo "No results";
} else {
  echo "Too many records.";
}

} else {
 die;
}

在进行采矿的机器中(机器 2):

$contents = '';

for($x=0;$x<150;$x++){
  $contents.=file_get_contents('http://example.com/get.php?a='.$number);
}

echo $contents;

请记住,在通过 Web 打开 URL 时,您需要:

  1. 如有必要,授予allow_url_fopen访问权限
  2. 添加延迟,这样您就不会压倒目标服务器的资源
  3. 验证您没有违反某人的robots.txt文件
  4. 传递正确的标头,包括 user_agent,这样您的服务器就不会被禁止
  5. 如果您在 Apache 下将脚本作为网页运行,请增加运行时间限制。

cURL更适合于此,并包含许多高级功能。

更新 - 但这可能不是一个好主意

上面的示例仅适用于一两个页面,而不是用于查看网站上的内容作为重新显示内容。我误解并认为您正在对网站进行数据挖掘(一次性)。

LAN 在本地网络 LAN 上显示来自另一台服务器的内容应该非常快,并且即使您正在挖掘内容,网站也应该运行得相当快(按照现代标准)。

您需要将目标站点的域和 ip 添加到 hosts 文件中,这样系统就不会在每次调用该函数时执行 DNS 查找(如果缓存被禁用)。

相同的盒子 如果它们在同一台机器上,如果没有适当的暂停,您可能会使系统过载。

WAN 如果您在两个相隔一定距离的服务器场中的两个独立网络上,则跃点数将极大地影响脚本的性能。就运行任何时间长度的实时生产服务器而言,这不是一个好主意。大多数人不会等待几秒钟来加载页面。

此外,您需要从正在挖掘的服务器的统计信息中过滤挖掘服务器的 ip,因为看起来目标计算机上的所有流量都来自一个位置。

由于它们位于两个不同的盒子上,因此您需要确保诸如 IP 表(防火墙)之类的东西不会锁定目标服务器上的所有访问权限,因为您可能会从同一个 IP 太快地重复连接到站点。如果您无法控制这两个网络,那么各种事物也会阻止重复访问,例如防火墙和路由器。许多网络主机不喜欢重复的大量流量。此外,如果您不小心错误地配置了任一框,您可能会因带宽受到处罚。

数据库复制 如果您从数据库中提取内容,您可能需要查看数据库复制并在每台机器上保留两个数据库副本。然后,您只需像加载任何其他文件一样加载内容。

于 2013-05-15T20:39:05.437 回答
0

希望我正确理解你。你的脚本:

http://wwww.domain1.com/get.php

其他一些资源:

http://www.resource.com/other.php

您的 get.php 可能如下所示:

$findResource = $_GET['a'];
// You should perform some validation here on the $findResource value to prevent security issues
$contents=file_get_contents('http://www.resource.com/other.php?a='.$findResource);
于 2013-05-15T20:37:55.733 回答
0

是的,这是可能的,但您必须关注隐私政策(许多网站都不允许抓取)。

于 2013-05-15T20:38:25.070 回答