表单流程中的状态报告

时间:2013-01-01 17:52:18

标签: php xml forms post import

我创建了一个从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文件非常大,当我提交表单时,浏览器只挂了几分钟。

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

1 个答案:

答案 0 :(得分:0)

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

如果你想要的是输出尽快开始显示(,一旦达到第一个回声或输出语句),有几件事需要考虑。

  1. 关闭output buffering,以便输出立即开始发送。
  2. 在循环中输出您想要的任何内容,以指示您希望了解的进度。
  3. 请注意,如果您使用AJAX请求执行此操作,则可能无法立即通过XMLHttpRequest对象将内容传输到DOM。另请注意,某些浏览器会在内容准备好供用户显示之前进行自己的缓冲(就像IE一样)。

    您可能需要考虑一些建议来加快您的脚本速度:

    • 为什么要在大文件上执行str_replace('&','&',$ file)?你意识到成本没有任何好处,对吧?你没有完成任何事情,如果你想要替换HTML实体&那么你可能有一些你的逻辑非常错误。编码是你想让XML解析器处理的东西。
    • 如果要传输大量文件,可以使用curl_multi而不是file_get_contents同时执行多个HTTP请求,以节省时间。它会快得多,因为它是无阻塞I / O
    • 您应该使用DOMDocument而不是SimpleXML,并且DOMXPath查询可以比您当前所做的更快地获得您的阵列。它是一个比SimpleXML更好的界面,我总是推荐它在SimpleXML上面,因为在大多数情况下 SimpleXML使得事情难以置信并且没有充分的理由。 不要让这个名字欺骗你。