PHP - 处理大数据

Posted

技术标签:

【中文标题】PHP - 处理大数据【英文标题】:PHP - processing big data 【发布时间】:2017-06-05 07:03:52 【问题描述】:

我正在尝试通过 php 处理大数据(100 000 000 条记录)。我正在从不同的服务器下载每条记录,然后进行一些文本检查,并可能将 10% 的适当记录插入我的数据库(mysql)中。我的问题是:

    网络浏览器刚刚完成,处理被提前中断

    每次 xy 检查后,我想在浏览器中打印 适当的记录,但没有打印任何内容

MySQL 没问题。看起来浏览器可以在脚本完成后打印一些东西,但我想在短时间内中断该脚本(线程),通过浏览器打印我的结果然后继续。在处理数据浏览器被“冻结”。有任何想法吗?

示例:

    for ($i=0; $i<100000000; $i++) 
      if (($i % 1000) == 0)   //every 1000th iteration
        echo $i;               <=== HERE I need interrupt script and let browser print my result
      
    

【问题讨论】:

试试sleep()函数 浏览器只会在完成执行时打印任何东西——在完成那么多循环之后,但在 cli 上你可以看到.. PHP Background Processes的可能重复 在您的echo $i; 之后,您需要flush();ob_flush();。我不会发布答案,您使用浏览器和 PHP 处理 1 亿条记录的设计决定很糟糕。但是,您确实问过如何输出一个块,这就是您的做法。不使用睡眠,因为这会浪费 CPU 周期。浏览器被“冻结”(冻结),因为这就是 HTTP 的工作方式——您发送 请求,然后等待 响应。在 PHP 处理完所有 1 亿条记录之前,您的响应不会到达。 【参考方案1】:

首先,ignore_user_abort 是你最好的朋友。与set_time_limit(0) 配对,您就可以确保您的进程免于死亡。

其次,向用户发送内容是一项艰巨的任务。原因是您输出的任何内容都会通过几个缓冲区。这包括 PHP、Apache、您的应用程序可能使用的负载平衡器、浏览器等(注意:缓冲区通常可以轻松配置(即禁用),但它们的存在是有原因的)。因此,简单的echoing 可能并不总是有效。

您可以采取多种措施来解决此问题。

一种解决方案是使用实时通信服务,如 Pusher 或 Ably(我更喜欢后者以获得更好的免费计划)或使用 Web 套接字推出您自己的解决方案。然后,您只需每 1k 次迭代发送一条消息并在您的 JS 中监听它。一个好处是,如果用户的浏览器崩溃并重新打开它,该过程和更新仍将正常运行。这是(在我看来)是最合适的方法,但很难做到正确。

另一种解决方案是拆分数据。那就是 JS 发送一个 ajax 请求,它处理 1k 行,echos 并死掉。然后 JS 发送另一个请求来处理接下来的 2k 行。这可以更容易完成,但依赖于客户端发送请求。使用这种方法也很难“从不同的服务器下载每条记录”

【讨论】:

以上是关于PHP - 处理大数据的主要内容,如果未能解决你的问题,请参考以下文章

php处理大文件文件

php表格--大数据处理

处理大数据的错误信息

php使用yield处理大数据文件

PHP大数据处理

PHP处理大数据量老用户头像更新的操作