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ı.
Örneğin - Bunu bir olay tabanlı çözümleyici olarak çalışan olarak, XmlReader
a> XML ayrıştırmak için kullanmak isterdim. belleğe her şeyi yüklemek, ancak girdi dosyası aracılığıyla ilerledikçe oldukça okur değildir.
SAX-style expat tabanlı ayrıştırıcı en uzay verimli bir seçenek:
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;
}
}
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.