0

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

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

4

1 回答 1

0

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

如果您希望输出尽快开始显示(即,一旦到达第一个 echo 或 output 语句),则需要考虑一些事项。

  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 让事情变得难以置信地难以做到,而且没有充分的理由。不要让这个名字欺骗你。
于 2013-01-01T18:23:14.163 回答