【问题标题】:How to automate data gathering and not freeze in 10%如何自动化数据收集而不是冻结在 10%
【发布时间】:2012-05-12 19:59:22
【问题描述】:

我有什么:

(如果需要,请查看或在 localhost 上触发:http://pastebin.com/virLR7dF

(看看展示我的案例的图片:http://iv.pl/images/47143498348127804676.png

我有一个 PHP 脚本可以抓取给定的网站,并将数据提取为变量:

$ID = "data"; //this is just an example
$name = "data";
$price = "data";
$image = "data";

脚本会将这些数据放入 MySQL 数据库中。

怎么了?

我可以使用 for 循环将其自动化,这样我就可以一次获得更多数据。但是,如果我将其循环 1,000,000 次,我的脚本将在某个时间点冻结​​,并且重新开始(找到它中断的位置并从该点开始) 是有问题的。

如何使用 PHP/JS 实现:

1.收集 10 部分数据

2.停止并显示有关收集数据的信息

3.收集接下来的 10 部分数据

4.停止并向先前显示的信息添加新信息

*具有暂停功能,可在下一部分收集后停止

* 有一个 RESUME 功能在最后一部分收集后开始

【问题讨论】:

  • 你需要 JavaScript 做什么?还是 Node.js 是 PHP 的替代品?
  • 问题是什么——你说它冻结了,但你的问题是如何编写几部分代码?如果您希望有人为您编写代码,请访问 freelancer dot com 之类的。请就具体问题提出具体问题
  • 感谢您的回复 ppumkin。我有整个脚本,只是不知道工具如何让 PHP 停止一段时间并将数据添加到现有和已显示的收集数据列表。 Arun 已经在 sleep() 方面提供了帮助。
  • @Bergi - 我不知道,这就是我问的原因
  • 您只想要一个 PHP 脚本还是应该将结果流式传输到客户端的 Web 应用程序?

标签: php javascript mysql loops for-loop


【解决方案1】:

输出缓冲可能会在 PHP 中帮助您

试试ob_start & ob_flush

ob_start 此函数将打开输出缓冲。输出时 缓冲处于活动状态 没有从脚本发送输出(除了 headers),而是将输出存储在内部缓冲区中。

ob_flush 该函数将发送输出缓冲区的内容(如果 任何)

【讨论】:

    【解决方案2】:

    在执行此操作时,有些事情可能会导致问题。

    1) 循环内触发错误,脚本停止执行。

    解决方案:将错误转化为可捕获的异常

    2) 你超过了时间限制。

    解决方案:将时间限制设置为零

    例子:

    set_error_handler(function($errno, $errstr, $errfile, $errline) {
        if($errno != E_STRICT && $errno != E_DEPRECATED && $errno != E_NOTICE) {
          throw new Exception($errstr.' in '.$errfile.' on line '.$errline);
        }
        return false;
    });
    
    set_time_limit(0);
    
    function my_loop_func() {
     // do what ever...
    }
    
    while(true) {
      try {
         my_loop_func();
      }
      catch(Exception $e) {
        // write some log message here might be good
      }
      sleep(10);
    }
    

    【讨论】:

    • 谢谢你的例子,下午我会看的。
    猜你喜欢
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    相关资源
    最近更新 更多