4

我用 Symfony2 用 PHP 编写了一个 Web 应用程序。用户可以上传包含保存到数据库中的数据的 CSV 文件。CSV 文件每一行的解析持续大约 0.2 秒,因为我向 Google Maps API 发出了一些请求。

因此,当您上传一个包含 5000 行的 CSV 文件时,这在我的应用程序中是一个现实案例,解析整个文件可能需要 16 分钟。

我不希望用户必须等待 16 分钟才能继续使用我的应用程序。所以我的问题是:如何在后台解析CSV文件,让用户继续上网?

4

3 回答 3

7

您可以创建一个kernel.terminate事件侦听器并在那里进行解析。此事件在响应发送到浏览器后触发。示例实现将是,

服务声明,

//services.yml
csv_parse_listener:
    class: FQCN\Of\CsvParseListener
    tags:
        - { name: kernel.event_listener, event: kernel.terminate, method: onKernelTerminate }

听课,

namespace Your\namespace;
use Symfony\Component\HttpKernel\Event\PostResponseEvent;

class CsvParseListener
{
    public function onKernelTerminate(PostResponseEvent $event)
    {
        $request = $event->getRequest();
        if($request->get('_route') !== "Your_route"){
            return;
        }

        $csvFile = $request->files->get('file_field_name');

        //move file using $csvFile->move()
        //read and parse
    }
}
于 2012-06-03T09:11:45.667 回答
4

让上传将作业插入作业队列表,并让cron定期运行命令来处理作业队列表中的任何工作。

随着作业处理的进行,您可以更新作业表,以便用户可以检查并查看正在发生的进度(例如,您可以有一个 ajax 进度条)并且可以知道作业何时完成。

通过这种方式,您还可以将上传与处理分离,并且您可以控制一次处理多少个作业。在没有限制/排队系统的情况下直接从用户输入启动长时间运行的作业是一种让自己面临拒绝服务攻击的好方法......

于 2012-06-03T08:41:53.550 回答
1

您可以编写一个仅用于处理 CSV 文件的脚本,然后从管理上传的脚本中执行该脚本。在 *IX 系统上,您可以通过附加 & 字符使由 exec() 启动的命令在后台运行。

您可能还需要包含一个脚本,让用户检查处理的进度。

于 2012-06-03T08:38:53.803 回答