|
|
|
| Требуется запарсить 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($fp, 4096);
}
echo "FILESIZE: ".sizeof($data);
?>
|
файл(XML) который я пытаюсь открыть существует 100% ) | |
|
|
|
|
|
|
|
для: simple
(14.11.2006 в 13:29)
| | Попробуйте сохранить содержимое $data во временном файле на жёстком диске и выдать его содержимое при помощи
<?php
echo file_get_contents("имя_временного_файла");
?>
|
| |
|
|
|
|
|
|
|
для: 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), "«", $sXML);
$sXML = str_replace(chr(187), "»", $sXML);
|
| |
|
|
|
|
|
|
|
для: simple
(15.11.2006 в 10:22)
| | Нет, у вас просто не хаватает памяти. Дело в том, что под каждый скрипт отводится определённое количество памяти 8, реже 16 Мб. Когда вы начинаете обрабатывать 4 Мб файл, создавать массивы с фрагментами файлов - память быстро исчерпывается. В этом случае такие большие файлы обрабатывают по частям. | |
|
|
|
|
|
|
|
для: 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";
$out= file_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), "«", $out);
$out = str_replace(chr(187), "»", $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 в 14:48)
| | при запуске из броузера
выдаёт
URL: ....URL...
sizeof( ) 1
1/2 of size is 1
Success, wrote (content) to file (file)
Видно что съедает 2 мега (половина файла - то что нада)
файл пустой, sizeof=1 ... чтот не понимаю | |
|
|
|