簡體   English   中英

使用PHP處理XML文件的更快方法

[英]Faster way to process xml file using PHP

我有一個名為flight-itinerary.xml的xml文件。 縮小版本如下所示。

<itin line="1" dep="LOS" arr="ABV">
    <flt>
        <fltav>
            <cb>1</cb>
            <id>C</id>
            <av>10</av>
            <cur>NGN</cur>
            <CurInf>2,0.01,0.01</CurInf>
            <pri>15000.00</pri>
            <tax>30800.00</tax>
            <fav>1</fav>
            <miles></miles>
            <fid>11</fid>
            <finf>0,0,1</finf>

            <cb>2</cb>
            <id>J</id>
            <av>10</av>
            <cur>NGN</cur>
            <CurInf>2,0.01,0.01</CurInf>
            <pri>13000.00</pri>
            <tax>26110.00</tax>
            <fav>1</fav>
            <miles></miles>
            <fid>12</fid>
            <finf>0,0,0</finf>
        </fltav>
    </flt>
</itin>

完整的文件包含8個行程<itin>元素。 所述<fltav>每個的元素<itin>元素包含的11 <cb>1</cb><finf>0,0,1</finf>基團。

下面是我用來處理文件的代碼:

<?php

function processFlightsData()
{
    $data = array();
    $dom= new DOMDocument();
    $dom->load('flight-itinerary.xml');

    $classbands  = $dom->getElementsByTagName('classbands')->item(0);
    $bands       = $classbands->getElementsByTagName('band');
    $itineraries = $dom->getElementsByTagName('itin');
    $counter     = 0;

    foreach($itineraries AS $itinerary)
    { 
        $flt = $itinerary->getElementsByTagName('flt')->item(0);

        $dep = $flt->getElementsByTagName('dep')->item(0)->nodeValue;
        $arr = $flt->getElementsByTagName('arr')->item(0)->nodeValue;

        $time_data       = $flt->getElementsByTagName('time')->item(0);
        $departure_day   = $time_data->getElementsByTagName('ddaylcl')->item(0)->nodeValue;
        $departure_time  = $time_data->getElementsByTagName('dtimlcl')->item(0)->nodeValue;
        $departure_date  = $departure_day. ' '. $departure_time;
        $arrival_day     = $time_data->getElementsByTagName('adaylcl')->item(0)->nodeValue;
        $arrival_time    = $time_data->getElementsByTagName('atimlcl')->item(0)->nodeValue;
        $arrival_date    = $arrival_day. ' '. $arrival_time;
        $flight_duration = $time_data->getElementsByTagName('duration')->item(0)->nodeValue;

        $flt_det       = $flt->getElementsByTagName('fltdet')->item(0);
        $airline_id    = $flt_det->getElementsByTagName('airid')->item(0)->nodeValue;
        $flt_no        = $flt_det->getElementsByTagName('fltno')->item(0)->nodeValue;
        $flight_number = $airline_id. $flt_no;
        $airline_type  = $flt_det->getElementsByTagName('eqp')->item(0)->nodeValue;
        $stops         = $flt_det->getElementsByTagName('stp')->item(0)->nodeValue;

        $av_data = $flt->getElementsByTagName('fltav')->item(0);

        $cbs     = iterator_to_array($av_data->getElementsByTagName('cb')); //11 entries
        $ids     = iterator_to_array($av_data->getElementsByTagName('id')); //ditto
        $seats   = iterator_to_array($av_data->getElementsByTagName('av')); //ditto
        $curr    = iterator_to_array($av_data->getElementsByTagName('cur')); //ditto
        $price   = iterator_to_array($av_data->getElementsByTagName('pri')); //ditto
        $tax     = iterator_to_array($av_data->getElementsByTagName('tax')); //ditto
        $miles   = iterator_to_array($av_data->getElementsByTagName('miles')); //ditto
        $fid     = iterator_to_array($av_data->getElementsByTagName('fid')); //ditto    

        $inner_counter = 0;

        for($i = 0; $i < count($ids); $i++)
        {
            $data[$counter][$inner_counter] = array
            (
                'flight_number'                   => $flight_number,
                'flight_duration'                 => $flight_duration, 
                'departure_date'                  => $departure_date,
                'departure_time'                  => substr($departure_time, 0, 5),
                'arrival_date'                    => $arrival_date,
                'arrival_time'                    => substr($arrival_time, 0, 5),
                'departure_airport_code'          => $dep,
                'departure_airport_location_name' => get_airport_data($dep, $data_key='location'),
                'arrival_airport_code'            => $arr,
                'arrival_airport_location_name'   => get_airport_data($arr, $data_key='location'),
                'stops'                           => $stops,
                'cabin_class'                     => $ids[$i]->nodeValue,
                'ticket_class'                    => $ids[$i]->nodeValue,
                'ticket_class_nicename'           => formate_ticket_class_name($ids[$i]->nodeValue),
                'available_seats'                 => $seats[$i]->nodeValue,
                'currency'                        => $curr[$i]->nodeValue,
                'price'                           => $price[$i]->nodeValue,
                'tax'                             => $tax[$i]->nodeValue,
                'miles'                           => $miles[$i]->nodeValue,
            );

            ++$inner_counter;
        }

    return $data;
}

?>

現在,外循環為每個<itin>元素迭代8次,並且在外循環的每次迭代過程中,內循環迭代11次,導致每遍總共進行88次迭代,並導致嚴重的性能問題。 我正在尋找的是一種處理文件的更快方法。 任何幫助將不勝感激。

我認為循環不是瓶頸。 您應該檢查循環中調用的操作get_airport_dataformate_ticket_class_name

在多個itin元素上嘗試代碼(不執行輔助操作)不到一秒鍾,請檢查以下小提琴: http : //phpfiddle.org/main/code/7fpi-b3ka (請注意,XML可能與您的,我猜想很多元素都缺失了)。

如果有被調用的操作大大增加了處理時間,請嘗試使用批量數據調用該操作或緩存響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM