Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: запарсить 4х метровый XML файл
 
 автор: simple   (14.11.2006 в 13:29)   письмо автору
 
 

Требуется запарсить XML размером больше 4х мегабайт.
Первое с чем я столкнулся это то что его невозможно прочитать..
Броузер после минуты ожидания предлогает сохранить его (скрипт) на диск (сохраняется пустой файл.. тоесть ничего не сохраняется)

<?
    $file
="http://....../...xml";
    
# $file="export.xml"; - всёравно не работает
    
if (!($fp fopen($file"r"))) {
        die(
"could not open XML input");
    }
    echo 
"FILE OPENED<br>";
    
$data="";
    while (!
feof($fp)) {
        
$data .= fread($fp4096);
    }
    echo 
"FILESIZE: ".sizeof($data);
?>


файл(XML) который я пытаюсь открыть существует 100% )

   
 
 автор: cheops   (14.11.2006 в 15:21)   письмо автору
 
   для: simple   (14.11.2006 в 13:29)
 

Попробуйте сохранить содержимое $data во временном файле на жёстком диске и выдать его содержимое при помощи
<?php
  
echo file_get_contents("имя_временного_файла");
?>

   
 
 автор: simple   (15.11.2006 в 10:22)   письмо автору
 
   для: simple   (14.11.2006 в 13:29)
 

Появилась ещо одна проблемма..
str_replace() слишком долго работает видимо и хостер пишет

Fatal error: Allowed memory size of 10485760 bytes exhausted (tried to allocate 882 bytes) in /...... on line 69

(какраз там где str_replace() ) выполняется..

нет какогонибудь спопособа быстрее сделать замену?

   $sXML = str_replace("<br/>", "\n", $sXML);
   $sXML = str_replace(chr(171), "&laquo;", $sXML);
   $sXML = str_replace(chr(187), "&raquo;", $sXML);

   
 
 автор: cheops   (15.11.2006 в 13:37)   письмо автору
 
   для: simple   (15.11.2006 в 10:22)
 

Нет, у вас просто не хаватает памяти. Дело в том, что под каждый скрипт отводится определённое количество памяти 8, реже 16 Мб. Когда вы начинаете обрабатывать 4 Мб файл, создавать массивы с фрагментами файлов - память быстро исчерпывается. В этом случае такие большие файлы обрабатывают по частям.

   
 
 автор: simple   (16.11.2006 в 14:48)   письмо автору
 
   для: simple   (14.11.2006 в 13:29)
 

делю файл пополам + закачиваю на сервак..

<?
if(@$_GET['part'])
    
$part=$_GET['part'];
else
    
$part=1;
$part--;

if(@
$_GET['cs'])
    
$cs=$_GET['cs'];
else
    
$cs=1;

require(
'/.../aCfg.inc');

function 
get_file($fileName){
    global 
$part$cs;
    echo 
"URL: $fileName";
    
$outfile_get_contents($fileName);
    echo 
"sizeof($out) ".sizeof($out)." <br>";
    
$half=(integer)(count($out)/2) + 1;
    echo 
"1/2 of size is $half <br>";
    if(
$part==1)
        
$out=substr($out,0,$half);
    else 
        
$out=substr($out,-$half);
    
$out str_replace("<br/>""\n"$out);
    
$out str_replace(chr(171), "&laquo;"$out);
    
$out str_replace(chr(187), "&raquo;"$out);
    
    
$handle fopen("/export_$cs"."_$part.xml"'w');
    if(
fwrite($handle$out) === FALSE) {
        echo 
"Cannot write to file ($filename)";
        exit;
    }
    echo 
"Success, wrote (content) to file (file)";
    
fclose($handle);
}
?>

запускаю wget 'ом , он выдаёт

/usr/local/bin/wget -t 1 -S -O log.log ..../get_xml.php
--14:11:22-- ..../get_xml.php
=> `log.log'
... ...
Запрос HTTP послан, ожидается ответ...
HTTP/1.1 200 OK
Date: Thu, 16 Nov 2006 11:11:22 GMT
Server: Apache/1.3.37 (Unix)
Cache-Control: max-age=0
Expires: Thu, 16 Nov 2006 11:11:22 GMT
Connection: close
Content-Type: text/html; charset=windows-1251
Длина: нет информации [text/html]

[ <=> ] 2,059,379 1.48M/s

14:11:38 (1.48 MB/s) - `log.log' saved [2059379]

а log.log содержит тока 1 символ "<"

   
 
 автор: simple   (16.11.2006 в 15:01)   письмо автору
 
   для: simple   (16.11.2006 в 14:48)
 

при запуске из броузера
выдаёт
URL: ....URL...
sizeof( ) 1
1/2 of size is 1
Success, wrote (content) to file (file)

Видно что съедает 2 мега (половина файла - то что нада)
файл пустой, sizeof=1 ... чтот не понимаю

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования