Pozdrav svima...
Napravio sam XML parser koji obrađuje svašta, ali ga koristim za FXClient bankarske izvode, snimljene u XML format, i njihovo pakovanje u bazu. E sad, kako izvoda u direktorijumu ima stotinak, a svi se obrađuju po istom principu napravio sam petlju koja čita fajl po fajl i okida parser. Kada učitam drugi fajl u isti parser, parser pukne.
Ispod je uprošćeni primer:
PHP kôd:
<?php
<?php
// Error reporting ---------------
error_reporting (E_ALL);
ini_set("display_errors", "1");
//--------------------------------
//=== XML Data =======================================================================
$XMLData1 = "<A><B>Neki tekst</B><C><D>jos neki tekst</D><E>i opet tekst</E></C></A>";
$XMLData2 = "<TAG1><Tag2>Peskir</Tag2><T3><D>Traal</D><E>Vodic</E></T3></TAG1>";
//=== XML Handlers ==========================
function XMLStartHandler($Parser, $Tag, $aTagAttrib)
{
echo "Open: [$Tag]\n";
}
function XMLEndHanler($Parser, $Tag)
{
echo "Close: [/$Tag]\n";
}
function XMLDataHandler($Parser, $Data)
{
trim($Data);
echo "Data: $Data\n";
}
//=== XML Parser ============================
$XMLParser = xml_parser_create();
xml_set_element_handler($XMLParser, "XMLStartHandler", "XMLEndHanler");
xml_set_character_data_handler($XMLParser, "XMLDataHandler");
//=== Parse problem =========================
// Ovo radi
xml_parse($XMLParser, $XMLData1) or die (sprintf("Nece! XML error: %s at line %d code %d\n", xml_error_string(xml_get_error_code($XMLParser)), xml_get_current_line_number($XMLParser), xml_get_error_code($XMLParser)));
// Skini komentar od ispod i nece odraditi parse $XMLData2
//xml_parse($XMLParser, $XMLData2) or die (sprintf("Nece! XML error: %s at line %d code %d\n", xml_error_string(xml_get_error_code($XMLParser)), xml_get_current_line_number($XMLParser), xml_get_error_code($XMLParser)));
//=== Cleanup ===============================
xml_parser_free($XMLParser);
?>
Pitanje 1:
Mogu li da učinim da se za više fajlova koristi isti parser, ili svaki put moram da kreiram novi parser za svaki fajl posebno?
Pitanje 2:
Ako već moram da kreiram parser za svaki fajl posebno (što mi se ne dopada), zašto onda ne radi destruktor u okviru petlje, po principu:
[petlja]
new parser
...nešto...
free parser
[kraj petlje]
Nego PHP napravi onoliko instanci parsera koliko fajlova treba da obradi, pa ih po izlazu iz skripte sve poubija.
Evo opet primera:
PHP kôd:
//Problem sa destruktorom u loop=u?
//Zasto mora da kreira 5 instanci pa posle sve da ubije a ne moze jednu po jednu?
include("Parser_Class.php");
for ($Cnt = 0; $Cnt < 5; $Cnt++)
{
$MyParser = new XMLParser();
echo "Before destruction $Cnt\n";
$MyParser->__destruct();
}
Mogu da pošaljem i Parser_Class, mada nije bitno šta ona radi.
Probajte samo da kreirate parser na početku petlje i da ga ubijete na kraju petlje - i to ne radi kako valja.
Ako pak izbacite destruktor iz petlje, po izlazu iz skripte PHP uredno pobije instance, ali to znači da u toka rada pojede mnogo memorije pa je svu oslobodi, što može da ubije server ako se alocira previše memorije.
Onda moram da podešavam memory_limit u php.ini pa...
Sve u svemu ne ide u dobrom pravcu
Hvala unapred na odgovoru ili hintu!