【问题标题】:Fastest way to quickly execute an array of many PHP pages?快速执行许多 PHP 页面数组的最快方法?
【发布时间】:2012-09-30 09:32:45
【问题描述】:

执行许多 PHP 页面的最快方法是什么。我不需要查看它们(即从任何输出的 html 中抓取或保留任何信息),但它们需要加载。需要执行每个页面内的PHP代码。

我一开始是在做foreach (...){echo <iframe src=....非常丑陋,花了非常很长而且非常糟糕的主意

现在我正在考虑设置一个 jquery 计时器来继续加载 ajax 请求并通过一个数组。

有没有更好的方法来解决这个问题?

【问题讨论】:

  • 页面或类或自定义函数?这个至少有意义
  • 你想做什么?您是在客户端还是服务器上执行此操作(如果客户端则 PHP 标记不相关,因为它与可能的答案无关)。
  • @nickdos 服务器端(最好),但我也可以使用 jquery。我想它就像爬行一样,除非页面加载完成后我不需要任何东西——除了它加载并运行每个 php 文件中的命令。
  • @metal_fan 它们本质上只是 php 脚本,它们不会产生任何输出。
  • 我敢打赌,在您提出正确的问题之前,您不会得到明确的答案。您的问题我们不清楚

标签: php jquery


【解决方案1】:

到目前为止,最有效的做法是线程化...

http://pthreads.org

http://docs.php.net/manual/en/book.pthreads.php

http://pecl.php.net/package/pthreads(不包含最新版本,如果可以的话 git)

我认为代码包含在多个页面中(我假设是本地的)的唯一原因很可能是因为这是在 PHP 中实现并发的唯一方法......如果这是正确的,那么你很可能应该重写代码,因为您不再需要服务器进行并发。即使它们是不同物理机器上的外部站点,线程化请求也是要做的事情......你甚至可以

http://pthreads.org/pool.php

真的很简单

http://pthreads.org/pool.phps

【讨论】:

    【解决方案2】:

    多线程将让您尽可能快地调用 URL,因为您可以同时进行多个加载。 PHP 对多线程并没有很好的支持,但我们可以让它进行多处理。这将允许您启动 URL 请求并立即启动更多请求,而无需等待任何页面加载。

    以下代码是如何使用 wget 完成此操作的示例。这会很快,但缺点是不会让您知道成功或失败。

    <?php
    foreach($pages as $page){
        exec('/usr/bin/wget '.$page.' > /dev/null 2>&1 &');
    }
    ?>
    

    这可以进一步调用您自己的 php 脚本而不是 wget。在这种情况下,您的程序可以记录加载失败的 url。

    所以一个完整的例子可能是这样的:

    run.php

    <?php
    foreach($pages as $page){
        exec('loadPage.php '.$page.' > /dev/null 2>&1 &');
    }
    ?>
    

    loadPage.php

    <?php
    $handle = curl_init($url);
    curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);
    $response = curl_exec($argv[1]);
    $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
    if($httpdCode != '200'){
        $fp = fopen('error.log', 'w');
        fwrite($fp, 'The URL '.$url.' had an issue. It returned a '.$httpCode.' error.');
        fclose($fp);
    }
    ?>
    

    【讨论】:

    • 有两个错误(至少):1)PHP 不像 Python 或 JavaScript。为了迭代数组(或对象),我们使用foreach 而不是for ... in。 2) 函数exec()在PHP中不存在。
    • for() 是一个错字,因为我从 for($i=0;iExec() 肯定存在于 PHP 中。
    • @Brett 我会试试这个。对于我正在尝试做的事情,这听起来像是一个完美的答案。我可以使用 mysql 轻松验证它是否有效。事实上,它会比某种文本输出更容易。谢谢!我会告诉你进展如何
    【解决方案3】:

    虽然与我的理解差异很小,但 foreach 是最慢的循环类型。你真正的问题是 iframe 他们是出了名的慢。你应该做的是一个 include();或要求();甚至 require_once();

    $pages = array();
    $pages[] = "Page1.php";
    $pages[] = "Page2.php";
    $pages[] = "Page3.php";
    foreach($pages as $page)
    {
    require($page);
    }
    

    避免使用 iframe,因为我认为它们实际上计划放弃对它们的支持。 如果您需要它们显示为某种风格或样式,只需使用 CSS 将它们定位为您在使用 iframe 时的位置,但在其位置使用 div。

    我希望这会有所帮助。

    【讨论】:

    • 谢谢。我不需要浏览器中呈现的任何 html,只需要执行。
    【解决方案4】:

    您可以执行以下操作:

    <?php
    
    $pages = array();
    
    $pages[] = 'page1.php';
    $pages[] = 'page2.php';
    $pages[] = 'page3.php';
    $pages[] = 'page4.php';
    $pages[] = 'page5.php';
    
    foreach($pages as $page):
        include $page;
    endforeach;
    ?>
    

    【讨论】:

    • 最好使用require() 而不是include(),因为我们不知道包含是否会失败。
    猜你喜欢
    • 2013-11-11
    • 2020-07-07
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多