PHP CSV büyük XML dosyasını dönüştürmek

7 Cevap php

Ben bir 50MB XML dosyası var. Ben bir CSV dosyasına dönüştürmek istiyorum, ama çoğu yöntemleri I sunucu belleği egzoz bulduk. Böyle XMLReader gibi bir akım yöntemi kullanarak bunu yapmak için iyi bir yolu var mı.

7 Cevap

SAX-style expat tabanlı ayrıştırıcı en uzay verimli bir seçenek:

http://php.net/xml_parse

Bir eleman etiketi açıldığında ya da kapatıldığında oldukça bellekte tüm belge tutmak yerine, senin $ start_element_handler ve $ end_element_handler geri çağrıları yürütecek.

ama yine de, 50 MB bir çok belki sağlayıcı limiti olabilir, değil.

php_value memory_limit 100M

.htaccess / httpd.conf veya php.ini olarak ayarlayın.

Ben bir süre önce bu algoritmayı yazdık .. denemek için çekinmeyin.

http://sites.google.com/site/soichih/q-a/xml-to-csv-converter

Partiye geç ...

<domains><domain><name>myname.com</name></domain></domains> bir xml yapısı

$url = "http://mysite.com/my.xml";
  $returnData = file_get_contents($url);
  $xml = simplexml_load_file($url);

     $csv = 'my.csv';
     $path = '/var/www/html/';

  $domain = $xml->domains->domain;

      $fullpath = $path.$csv;
      $fp = fopen($fullpath, 'w');

    foreach ($xml->domains->domain as $domain) {

        fputcsv($fp, get_object_vars($domain),',','"');

    }

    fclose($fp);

       header('Content-Description: File Transfer');
           header('Content-Type: application/csv');
       header('Content-Disposition: attachment; filename='.basename($csv));
       header('Content-Transfer-Encoding: binary');
       header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
       header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
       header('Pragma: public');
       header('Content-Length: ' . filesize($fullpath));
       readfile($fullpath);

    exit;
    }
}

Eğer hafıza limitini artırmak için denediniz mi? ini_set('memory_limit', '256M')

(Bu btw çok kötü bir çözüm)

Ben PHP API hakkında çok şey biliyorum, ama bu sınıf yardımcı olabilir gibi görünüyor yok: XML Parser

Temelde eski SAX gibi olaylara dayalı bir çözümleyici arıyoruz. Bu ayrıştırıcı tip bir olay, ya da benzer bir şey patlayacaktır. Belleğe tüm Belgeyi yüklemek gerekmez gibi, bellek verimli olacak.

XML dosyası oldukça basit ve tam teşekküllü bir XML ayrıştırıcı geçiyor önlemek olabilir, ve bunun yerine PHP ile satır-satır okumak ve gider gibi her satırı ihraç olabilir, bu seferde bellekte tüm dosyayı sahip kaydetmek istiyorsunuz . XML yapısı nedir?