大XML文件导入到数据库PHP

大XML文件导入到数据库PHP,php,xml,database,multithreading,import,Php,Xml,Database,Multithreading,Import,我正面临一个不知何故我看不到解决办法的问题。我有一个XML文件需要导入到自定义DB结构中,当用户上传/导入文件时,ajax帖子会一直等到文件导入完成,但这可能需要5个小时或更长时间,我不知道。处理此UI问题的最佳方法是什么 我在考虑线程上传,将文件分为多个部分,并使用自己的线程上传每个部分(pthreads,在centos 7/PHP7上安装有问题) 或者,如果有任何其他方法可以在后台导入文件,并且当用户刷新页面时,将有一个状态日志输出,以便用户知道导入何时完成以及是否成功 您可能希望使用后台

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

  • 我在考虑线程上传,将文件分为多个部分,并使用自己的线程上传每个部分(pthreads,在centos 7/PHP7上安装有问题)

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


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

但它将参数作为路径传递,因为它是为CodeIgniter设置的,所以您必须更改它或在代码中拆分参数

无论如何,基本原理类似于运行cron作业,这在植入过程中会有所不同,具体取决于服务器的操作系统。但是在Linux上,命令是这样的

 php -f "path/to/phpfile.php" "{args}" > /dev/null &
 $command = new BgProcess( "path/to/phpfile/xmlProcessor.php", "testXML", 2);

 echo $command;
/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
并使用

   $argv[1] // = testXML
   $argv[2] // = 2
但因为我在CI中使用它,所以它会将我路由到一个特殊的控制器并处理所有这些。我的类的优点是,在大多数情况下,它都可以找到PHP可执行文件,并且内置了windows兼容性(这是一个令人痛苦的…)

使用这个类,你可以这样称呼它

 php -f "path/to/phpfile.php" "{args}" > /dev/null &
 $command = new BgProcess( "path/to/phpfile/xmlProcessor.php", "testXML", 2);

 echo $command;
启动进程后将输出
'php-f“path/to/phpfile/xmlProcessor.php”“testXML/2”>/dev/null&'
(返回仅用于调试)


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

上传需要5个小时?或者服务器端数据库处理会吗?使用后台作业,完成后给他们发送电子邮件。@AlexHowansky是的,服务器端数据库处理需要很长时间。@ArtisticPhoenix你有没有我可以看的例子。@olyar-你有没有为PHP设置过cron作业?这看起来不错,我实际上在CodeIgniter中工作,我从来没有使用过cron工作;(这与cron作业不同,因为您不使用cron,但cron允许您以一定的时间间隔运行后台进程。因此,这并不相同,但为cron作业或任何CLI(命令行界面)类型的脚本编写代码会很有用。在CI中,它会将此路由到类似于
php-f“path/to/CI/index.php”的内容“contoller/method/arg1/arg2..”
但我有一个自定义路由器,因此可以在子文件夹(welcome.php)中使用多个控制器文件此外,对于CLI脚本,我使用webroot之外的单独index.php,因此无法从浏览器访问它。为此,我仍在使用CI版本2,我们的应用程序已经有4年的历史了,要为CI 3进行重构需要很多