【问题标题】:Showing multiple pages with cURL/PHP使用 cURL/PHP 显示多个页面
【发布时间】:2017-06-17 17:19:31
【问题描述】:

我正在尝试使用 cURL 构建各种监视器来跟踪各种不同的仪表板。这个想法是我加载了一堆我想从数据库中查看的 URL,在浏览器窗口上运行此代码后,我会在有限的时间内显示这些 URL(例如,我会显示 www.dashboard .zopim.com 10 秒,然后它转到另一个不同的 URL 30 秒,以此类推,当它结束时,它又重新开始)。

<?php

include_once('connection.php');

$query = "SELECT url, time FROM $tb ORDER BY position";
$result = mysqli_query($connection_, $query);

$rowcount = mysqli_num_rows($result);

$curl_handle = curl_init();
$data = array();

//base array building
while ($row = mysqli_fetch_array($result, MYSQLI_NUM)) {
    $data_b = array();
    $data_b['curl_handle'] = $curl_handle;
    $data_b['url'] = $row[0];
    $data_b['time'] = $row[1];
    array_push($data, $data_b);
}

for ($i=0; $i < $rowcount; $i++) {
    $ch = $data[$i]['curl_handle'];
    curl_setopt($ch, CURLOPT_URL, $data[$i]['url']);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    //curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 1);

    $grab = curl_exec($ch);
    usleep($data[$i]['time']*100);
    curl_close($ch);
    return $grab;
}
?>

问题是我什至无法让它开始运行。就像现在一样,它只是加载第一页并保留在那里。

另外,作为一个评论,由于我对整个 cURL 很不熟悉,有没有更好的方法来做到这一点?我读到有一个多功能功能可以让我异步加载多个 URL,但我不确定它是否能满足我的需求。

【问题讨论】:

  • 我认为其中大部分将不得不依赖于某种类型的 JS。
  • 我不允许直接篡改服务器或任何类似的东西,所以它必须限于代码本身。愿意分享建议吗?
  • 我认为您最好的选择是将所有 URL 一次推送到您的 JS,并设置 IFRAME 来显示该站点,并让 JS 刷新
  • 遗憾的是,我已经尝试过 iframe 方法,但效果不佳,因为 iframe 被阻止,让我回到原点。

标签: php curl monitor


【解决方案1】:

脚本在加载页面后结束的原因是在 PHP 中,当您在函数外部使用 return 时,它会终止脚本的执行,并且您在循环块的末尾有 return

(有关return 的文档,请参阅http://php.net/manual/en/function.return.php。)

您无法真正使用 PHP 完成您想要做的所有事情。 PHP 在服务器上运行,如果浏览器所做的只是发送请求、接收响应并结束连接(通常会发生这种情况),那么服务器不能只向浏览器发送指令来执行某些操作。您需要客户端的某些东西来让浏览器采取行动。

正如 Kaylined 所说,Javascript 可能是要走的路。我相信您可以使用 Javascript 以某种方式不断地从您的服务器获取更多信息,并且只需设置您的服务器以响应来自 Javascript 的这些请求。另一方面,如果您想要使用 PHP 做的只是从 Internet 上的其他位置查找内容并将其直接传递给浏览器,就像您现在所做的那样,您可能很容易让您的页面包含一个 Javascript 脚本它确实可以访问您要直接查看的仪表板。

编辑:如果您真的只想为此使用 PHP,您可以让它发送一个标题,该标题会导致页面在给定时间后刷新(重定向到自身)。然后,您可以使用带有 GET 的 URL 参数或会话变量来确定您的 PHP 脚本应该发回哪个页面,然后执行此操作。 (见Page redirect after certain time PHP

基本上,你会添加一行

header("refresh:30;url=this.php");

在您发送任何内容之前,其中的 url 是您的监控页面的 url,而不是 this.php。然后你会发送页面来显示。然后,三十秒后,浏览器会再次请求您的页面,您可以发回具有相同标题的不同页面。当然,您还希望有一些机制让服务器跟踪它应该发送哪个页面。需要注意的一点是,此标头不是标准的,因此某些浏览器很可能会忽略它,这将是一个问题。

【讨论】:

  • 感谢您的快速回复。我现在遇到的主要问题是我对 javascript 的使用非常有限,因为我的老板明确要求尽可能少地使用它,因此我重复使用这个我没有实际经验的库。我不能以任何方式篡改服务器,因此这真是令人头疼。我想我会按照您在评论最后部分的建议,在此代码上实现 Javascript。
  • 哇,直到现在才看到您的编辑。但是,如果我使用标头重定向方法,是否意味着要废弃整个 cURL 的东西?
  • 不,不完全是。我可以概述我认为应该在答案中起作用的内容。我认为最好使用某种 Javascript 来执行此操作,但如果有必要,应该可以不使用任何 Javascript。
  • 遗憾的是,标头方法似乎不起作用。我使用数组的变量创建了一个for 循环......我总是得到一个空白页。
  • 如果您保持脚本相同,除了将sleep 行替换为上述标题行,您的页面是否正确显示并自动刷新?因为如果确实如此,您可能会成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多