1

我有一个用 Symfony 1 编写的应用程序。每天,系统管理员都会上传一个带有新客户端列表的 XML。

就在最近,他们丢失了很多包含客户信息的数据库记录。

好消息是,这些信息存储在其他地方(除了他们的主数据库),因此他们能够生成一个包含所有客户数据的 XML。

问题是这样的 XML 不仅很大(大约 25MB),而且还有很多重复的节点。

它们用于上传小得多的文件(大小约为 300kb),因为它们过去每天都上传,所以在上传这个文件时,它超过了 PHP 的默认 30 秒运行时间,导致脚本停止执行。

我想知道是否有一种快速的方法来处理这个 XML 文件并使用 PHP 代码删除所有重复的节点。

XML具有以下格式

<?xml version="1.0" encoding="ISO-8859-1" ?>
 <Clientes>
  <Cliente>
  <clienteCodigo>1Z</clienteCodigo>
  <nombreCliente>COMPANY NAME</nombreCliente>
  <telefonoCliente>011-4444-4555</telefonoCliente>
  </Cliente>
  <Cliente>
  <clienteCodigo>1Z</clienteCodigo>
  <nombreCliente>COMPANY NAME</nombreCliente>
  <telefonoCliente>011-4444-4555</telefonoCliente>
  </Cliente>
  <Cliente>
  <clienteCodigo>2A</clienteCodigo>
  <nombreCliente>COMPANY NAME 2</nombreCliente>
  <telefonoCliente>011-8888-4646</telefonoCliente>
  </Cliente>
  <Cliente>
  <clienteCodigo>2A</clienteCodigo>
  <nombreCliente>COMPANY NAME 2</nombreCliente>
  <telefonoCliente>011-8888-4646</telefonoCliente>
  </Cliente>
 </Clientes>

提前致谢。

编辑:这是当前在元素中循环的代码(我没有写)。

 foreach($clientes->getElementsByTagName("Cliente") as $clienteElement)

    { 

        $clienteNew = Doctrine::getTable('Cliente')->findOneByCliente_codigo($clienteElement->getElementsByTagName("clienteCodigo")->item(0)->nodeValue);

        if (!$clienteNew)

        {

            $clienteNew = new Cliente();               

            $clienteNew->cliente_codigo = $clienteElement->getElementsByTagName("clienteCodigo")->item(0)->nodeValue;            

        }

        $clienteNew->nombre = $clienteElement->getElementsByTagName("nombreCliente")->item(0)->nodeValue;    
        $clienteNew->telefono = $clienteElement->getElementsByTagName("telefonoCliente")->item(0)->nodeValue;        
        $clienteNew->save();                          
    }
4

1 回答 1

1

尽管我是 Symfony 和 Doctrine 的忠实粉丝......对于大量的插入、更新和检查,最快的方法是这样的,使用 php pdo:

  1. 在您想要唯一的列上设置唯一索引并在当前代码中检查

  2. 伪代码:

    $conn = new \PDO("mysql:host= .... your connection string here");
    $conn->beginTransaction(); //this speeds up a lot
    $sql = "INSERT INTO tablename (field list) VALUES (parameters matching field list) ON DUPLICATE KEY UPDATE field=param pairs";
    
    foreach($clientes->getElementsByTagName("Cliente") as $clienteElement) {
        $q->execute(array(param => xml_value));
    }
    
    $conn->commit();
    

像这样,您可以使用您现在使用的代码处理更多数据。

如果这没有帮助......那么你可以考虑延长允许 php 脚本运行的时间:http: //php.net/function.set-time-limit

于 2013-10-21T17:41:16.103 回答