Как работать с большим ZIP архивом PclZip

DmbITpo

Новичок
Как работать с большим ZIP архивом PclZip

Здравствуйте. Прошу вашей помощи.
У меня есть файл zip-архив. Он весит около 3-х мегобайт. В нём заархивирован xml-файл. При разархивации (пробовал на компьютере) xml-файл занимает около 200 мегобайт. Т.е. очень много.
Так вот мне надо этот архив разархивировать на сервере.
Я пробовал пару вариантов.
Вариант 1)
PHP:
$zip = zip_open($file);
	if ($zip)
	{
	  while ($zip_entry = zip_read($zip)) 
	  {
		$fp = fopen("unzip/".zip_entry_name($zip_entry), "w");
		if (zip_entry_open($zip, $zip_entry, "r")) 
		{
		  $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
		  fwrite($fp,"$buf");
		  zip_entry_close($zip_entry);
		  fclose($fp);
		}
	  }
 	  zip_close($zip);
Но этот вариант не подходит, потому что содержимое 200 метрового xml-файла заносится в переменную $buf. На это серверу не хватает памяти.
вариант 2)
PHP:
$zip = new PclZip($file);	

    $list = $zip->extract("unzip/");	
    if ($list == 0) 
         echo "ERROR : ".$zip->errorInfo(true);
Этот подход мне нравиться больше. Но в этом варианте не выдаётся никакая ошибка,а просто файл не обрабатывается, насколько я понимаю.

И в связи с этим у меня вопрос. Может в PclZip стоит какой-то ограничитель на размер файла? и есть возможность снять это ограничение?

Вариант 3)
PHP:
   $out=exec("unzip ".$unzip_dir.$file);
Так же самая проблема. просто ничего не выполняется....

А если нет, то как можно разархивировать такой большой файл?

Буду благодарен за любые ответы по теме.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Видим, это сейчас новая мода такая - скачивать откуда-то гигантские xml в zip-архивах, распаковывать их скриптом, парсить и жаловаться на форуме на нехватку памяти.

-~{}~ 12.06.09 23:33:

DmbITpo
почитай форум, вчера обсуждали подобные вопросы
 

DmbITpo

Новичок
А в какой конкретной теме, не подскажешь? а то я не могу найти :(
 

DmbITpo

Новичок
Это я читал. Но я же не писал что у меня проблемы с парсингом. Проблем с парсингом такого большого файла нет.
У меня проблема в том что при _разархивировании_ файла нехватает памяти!
 

cDLEON

Онанист РНРСlub
Может в PclZip стоит какой-то ограничитель на размер файла? и есть возможность снять это ограничение?
Может быть стоит посмотреть внутрь этого PclZip и не гадать на кофейной гуще? Или он у тебя зазенден?
 

DmbITpo

Новичок
у меня есть исходный код PclZip . только вот что там мне искать? я так просмотрел - ничё в глаза не бросилось похожего...
Могу выложить исходник сюда
 

cDLEON

Онанист РНРСlub
Ни кто за тебя в исходнике, скаченном с phpclasses, копаться не станет.
По-крайней мере на этом форуме. И это - правильно.
я так просмотрел - ничё в глаза не бросилось похожего...
Имена переменных рассматривал что ли?
Вот у меня лично, ни один класс с этого приславутого сайта не работал на 100%. Приходилось подрабатывать напильником.
Так что - давай, не ленись - разбирайся.
 

Major

Новичок
Вариант 1: выделить больше памяти(через ini_set)
Вариант 2: использовать system и консольный архиватор
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
cDLEON
смотри на рейтинг - есть хорошие

-~{}~ 15.06.09 14:27:

Major еще можно написать самому правильный алгоритм с низким потреблением памяти, как все мы поступаем в подобных ситуациях, и не ныть
 

Major

Новичок
grigori

Если бы человек мог

написать самому правильный алгоритм с низким потреблением памяти, как все мы поступаем в подобных ситуациях, и не ныть
то, как бы и топика этого не было. Так что я дал 2 варианта, которые ему приемлимы (ну я так думаю).
 

vovanium

Новичок
DmbITpo
Ну насоветовали, кучу всего кроме самого простого :)
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
Ты же сам указываешь сколько байт хочешь прочитать из архива, так не указывай что хочешь весь файл сразу прочитать, читай по кусочкам (к примеру 64 КБ) в цикле и сохраняй также по кусочкам, и не будет никаких проблем c памятью ;)
 
Сверху