我用 Symfony2 用 PHP 编写了一个 Web 应用程序。用户可以上传包含保存到数据库中的数据的 CSV 文件。CSV 文件每一行的解析持续大约 0.2 秒,因为我向 Google Maps API 发出了一些请求。
因此,当您上传一个包含 5000 行的 CSV 文件时,这在我的应用程序中是一个现实案例,解析整个文件可能需要 16 分钟。
我不希望用户必须等待 16 分钟才能继续使用我的应用程序。所以我的问题是:如何在后台解析CSV文件,让用户继续上网?
我用 Symfony2 用 PHP 编写了一个 Web 应用程序。用户可以上传包含保存到数据库中的数据的 CSV 文件。CSV 文件每一行的解析持续大约 0.2 秒,因为我向 Google Maps API 发出了一些请求。
因此,当您上传一个包含 5000 行的 CSV 文件时,这在我的应用程序中是一个现实案例,解析整个文件可能需要 16 分钟。
我不希望用户必须等待 16 分钟才能继续使用我的应用程序。所以我的问题是:如何在后台解析CSV文件,让用户继续上网?
您可以创建一个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
}
}
您可以编写一个仅用于处理 CSV 文件的脚本,然后从管理上传的脚本中执行该脚本。在 *IX 系统上,您可以通过附加 & 字符使由 exec() 启动的命令在后台运行。
您可能还需要包含一个脚本,让用户检查处理的进度。