表单处理过程中的状态报告


Status report during form process

我创建了一个小脚本,用于从xml文件导入wordpress帖子:

if(isset($_POST['wiki_import_posted'])) {
    // Get uploaded file
    $file = file_get_contents($_FILES['xml']['tmp_name']);
    $file = str_replace('&', '&', $file);
    // Get and parse XML
    $data = new SimpleXMLElement( $file , LIBXML_NOCDATA);
    foreach($data->RECORD as $key => $item) {
        // Build post array
        $post = array(
            'post_title' => $item->title,
            ........
        );
        // Insert new post
        $id = wp_insert_post( $post );
    }
}

问题是我的xml文件非常大,当我提交表单时,浏览器只是挂起了几分钟。

是否可以在导入过程中显示一些消息,例如在导入每个项目后显示一个点?

不幸的是,不容易。特别是如果你在WP框架上构建它,你会发现它根本不值得你花时间。当您与PHP脚本交互时,您正在发送请求并等待响应。PHP脚本完成处理并开始发送输出所需的时间就是客户端开始看到响应所需的时间。

如果您想要的是输出尽快开始显示(),那么需要考虑一些事情。一旦到达第一条echo或输出语句)。

  1. 关闭输出缓冲,使输出立即开始发送
  2. 在循环中输出任何你想要的东西,这将表明你希望知道的进度。

请注意,如果使用AJAX请求执行此操作,内容可能无法立即准备好通过XMLHttpRequest对象传输到DOM。还要注意,有些浏览器在内容准备好供用户显示之前会自己进行缓冲(如IE中的)。

一些建议,你可能想看看加快你的脚本,然而:

  • 为什么在大文件上执行str_replace('&','&',$file) ?你知道这样做没有任何好处,对吧?你什么也没完成,如果你的意思是你想要替换HTML实体&,那么你可能有一些你的逻辑非常错误。编码是你想让XML解析器处理的事情。
  • 你可以使用curl_multi而不是file_get_contents来同时执行多个HTTP请求,以节省时间,如果你正在传输大量的文件。它会快得多,因为它是无阻塞I/O
  • 你应该使用DOMDocument而不是SimpleXML和DOMXPath查询可以得到你的数组比你目前正在做的快得多。它是一个比SimpleXML更好的接口,我总是推荐它优于SimpleXML,因为在大多数情况下,SimpleXML使事情难以置信地难以完成并且没有很好的理由。