【问题标题】:Passing variable in a URL (php) & file_get_contents()在 URL (php) 和 file_get_contents() 中传递变量
【发布时间】:2013-05-10 13:54:48
【问题描述】:

有没有办法使用 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.com 上托管 get.php。是否可以根据传递的变量值从get.php 检索不同的内容?例如,如果a=1,那么get.php 的某个部分会被提取,但是如果a=2get.php 的不同部分会被提取,等等。这可能吗?

【问题讨论】:

  • 如果有办法测试这个......

标签: php url file-get-contents


【解决方案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;

记住在通过网络打开 URL 时需要:

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

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

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

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

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

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

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

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

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

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

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

【讨论】:

  • 我认为你误会了。我控制两个网站/脚本。因此,假设在 http://wwww.domain1.com/example.php 我有代码 $contents=file_get_contents('http://example.com/get.php?a='.$number); echo $contents;$number=something ,然后在文件 http://example.com/get.php 中有各种内容对应于每个可能的变量(a=1、a=2 等),我只想获取与变量对应的内容,然后将其发布到http://wwww.domain1.com/example.php。这可能吗?怎么做?在 cURL 中怎么做?
  • @Davidmichael 他们都在同一个盒子里吗?
  • 感谢您的更新,但我仍然不确定如何实施;我必须在get.php 中输入什么?感谢您的帮助。
  • @Davidmichael 我已经更新了我的回复以显示一些示例代码。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    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);
    

    【讨论】:

    • 我认为你误会了。我控制两个网站/脚本。因此,假设在 http://wwww.domain1.com/example.php 我有代码 $contents=file_get_contents('http://example.com/get.php?a='.$number); echo $contents;$number=something ,然后在文件 http://example.com/get.php 中有各种内容对应于每个可能的变量(a=1、a=2 等),我只想获取与变量对应的内容,然后将其发布到http://wwww.domain1.com/example.php。这可能吗?如何做到?
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多