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