Pogledajte određenu poruku
Staro 24. 03. 2008.   #1
duki
novi član
Na probnom radu
 
Avatar duki
 
Datum učlanjenja: 01.08.2007
Lokacija: Beograd
Poruke: 10
Hvala: 1
0 "Hvala" u 0 poruka
duki is on a distinguished road
Pošaljite ICQ poruku za duki Pošaljite poruku preko MSN za duki
Question XML Parser - parsiranje više fajlova i destruktor

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!

Poslednja izmena od nixa : 24. 03. 2008. u 14:37.
duki je offline   Odgovorite uz citat