将大XML文件导入数据库PHP

时间:2017-06-28 15:01:54

标签: php xml database multithreading import

我正面临一个问题,不知何故我没有看到它的解决方案。我有一个需要导入到自定义数据库结构的XML文件,当用户上传/导入文件时,ajax帖子正在等待,直到文件导入完成,但这可能需要5个小时或更长时间我不知道。处理此UI问题的最佳方法是什么。

  • 我想到了线程上传,将文件分成多个部分并上传每个部分自己的线程(pthreads,在centos 7 / PHP 7上安装问题)

    < / LI>
  • 或者,如果有任何其他方式可以在后台导入文件,并且当用户刷新页面时,将会有状态日志输出,以便用户知道导入何时完成以及是否成功。

1 个答案:

答案 0 :(得分:1)

您希望使用后台作业(分离进程)运行它们,这样最终用户可以立即收到确认消息,然后在长时间运行的任务完成后发送电子邮件。然后他们不必等待它完成。正如我在评论中提到的,我有一个我在我的git hub上写的课程

https://github.com/ArtisticPhoenix/MISC/blob/master/BgProcess.php

但它将args作为路径传递,因为它是Code Igniter的设置,因此您必须在代码中更改或拆分参数。

无论如何,基本操作类似于运行cron作业,这取决于服务器的操作系统的植入。但在Linux上,命令就像这样

 php -f "path/to/phpfile.php" "{args}" > /dev/null &

> /dev/null &部分将输出发送到null(抛弃它),&将其作为非阻塞进程运行,这意味着启动命令的脚本可以继续。所以使用一个例子作为这个

 .. other code before starting background job ..
 exec( 'php -f "path/to/phpfile/xmlProcessor.php" "testXML/2" > /dev/null &');
  .. code to tell user job is started .. this runs right after the call without waiting for that process to finish.

然后在xmlProcessor.php中你会有这个

  <?php

         $args = explode('/', $argv[1]);
         $file = $ags[0];
         $user_id = $args[1];
         ... code to process xml 
          ... email user confirmation of completion

http://php.net/manual/en/reserved.variables.argv.php

正如我所说,通常会这样称呼它,

  exec( 'php -f "path/to/phpfile/xmlProcessor.php" "testXML" "2" > /dev/null &');

使用

访问它们
   $argv[1] // = testXML
   $argv[2] // = 2

但是因为我将它与CI一起使用,所以它会将它路由到一个特殊的控制器并处理所有这些。关于我的类的好处是它应该在大多数情况下找到PHP可执行文件,并且它内置了windows兼容性(这是一个痛苦的...)

使用该类,您只需将其称为

 $command = new BgProcess( "path/to/phpfile/xmlProcessor.php", "testXML", 2);

 echo $command;

在启动进程后输出'php -f "path/to/phpfile/xmlProcessor.php" "testXML/2" > /dev/null &'(返回仅用于调试)

基本上,您通过命令行使用PHP运行单独的后台作业。