我正面临一个问题,不知何故我没有看到它的解决方案。我有一个需要导入到自定义数据库结构的XML文件,当用户上传/导入文件时,ajax帖子正在等待,直到文件导入完成,但这可能需要5个小时或更长时间我不知道。处理此UI问题的最佳方法是什么。
我想到了线程上传,将文件分成多个部分并上传每个部分自己的线程(pthreads,在centos 7 / PHP 7上安装问题)
< / LI>或者,如果有任何其他方式可以在后台导入文件,并且当用户刷新页面时,将会有状态日志输出,以便用户知道导入何时完成以及是否成功。
答案 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运行单独的后台作业。