Сидел я как-то думал на тему как бы слить с сервака файлы в огромных количествах и понял что можно обойтись без PEAR::Archive_Tar Написал я скрипт который генерирует РНР файл который при запуске создаёт все файлы и папки как обычный SFX-архив... Обсудим ? (разврат или нет ?)
Похожую систему я видел в какой-то простенькой CMS. Там был только один файл install.php, а в него было все запихано, даже рисунки. А при запуске он создавал нужные папки и файлы. По моему дело вкуса. Плюс, если нужно выкачать много файлом, причем какие именно заранее неизвестно. Конечно, этот способ не пойдет для каждого, а только для себя или у кого есть PHP и знает что с этим архивом делать.
Mavir Кстати не плохой форум (а не CMS), где-то в РНР инсайде о нём писали... Горбунов Олег Оппа в смысле хочешь поддержать, или оппа в смысле "ща закритикую в усмерть" Кстати аналог PEAR-Tar я тоже написал, только работает он только с классическими TAR архивами а не "USTAR" и не поддерживает имена (вместе с путями) длиннее 99 символов что делает его почти непригодным для нормального бэкапа крупных сайтов...
FUDforum2. Мне идея (в отличии от форума FUDforum2) понравилась. каждой cms, форуму, ... такой бы инсталл, причем делать так, что бы перед загрузкой можно было бы выбирать комплектацию.
А код вот (был написан за 5 минут так как срочно был нужен) PHP: <?php error_reporting(E_ALL); set_time_limit(600); function ls($dir){ $handle = opendir($dir); while(false !== ($readdir = readdir($handle))){ if($readdir != '.' AND $readdir != '..'){ $path = $dir.'/'.$readdir; if(is_file($path)) $output[] = $readdir; elseif(is_dir($path)) $output[$readdir] = ls($path); } } return $output; closedir($handle); } $backup_list = ls('.'); function backup($fp, $backup_list, $path=false) { foreach($backup_list as $dir_name => $file_entry) { if ( is_int($dir_name) ) { $filename = $path . $file_entry; if ( is_readable($filename) ) { $content = base64_encode(file_get_contents($filename)); gzputs($fp, "$" . "fp = fopen('$filename', 'w');\n"); gzputs($fp, "fputs($" . "fp, base64_decode('" . $content . "'));\n"); gzputs($fp, "fclose($" . "fp);\n"); } } elseif ( is_string($dir_name) ) { $temp = $path.$dir_name.'/'; gzputs($fp, "mkdir('$temp', 0777);\n"); backup($fp, $file_entry, $temp); } } } $fp = gzopen('backuper_output.php.gz', "w9"); gzputs($fp, "<?php\nset_time_limit(600);\n"); backup($fp, $backup_list); gzputs($fp, "?>"); gzclose($fp); echo '<a href="backuper_output.php.gz">backuper_output.php.gz</a>'; ?> (реализация ужасная, по этому распаковывается он только на Windows)
Vladson, Оппа, значит, счас посмотрю, и решу, критиковать вусмерть или поддерживать. )) Идея мне безусловно нравится... Решение конечно явно на коленке.. =) Осталось еще встроить автозаливку в БД =)))
Не, у меня был YSE или как-то похоже пишется. Кому интересно, приду домой могу дать ссылку и правильное название. Посмотрел FUDforum2, немного другой принцип. В том что у меня форум есть скрипт инсталяции и отдельно файл с которого все берется. А в FUDforum2 вставлено все в один. Зато есть деинсталлятор А какие трудности? Рядом ложишь дамп базы данных и заливаешь.
Дык надо было срочно слить с сервака 2400 файлов раскиданных по куче папок... Это лишьнее, я например пользуюсь "Site Keeper Dumper"-ом для этих целей и не занаю проблем...
Кстати для приверженцов классики вот скриптик который архивирует всё что находится в каталоге где он находится в tar (включая подкаталоги) Код (Text): <?php /*********************************************************** *\ \ ___ __ /\ ____ ____ ____ __ | | * \ \ / /| | / \ | _ \ / __>/ \| || | * \ \/ / | | / /\ \ | | \ \\_ \_ | || || \ | * \ / | |__ / __ \ | |_/ / _\ \| || || \ | * \ / |_____|/__/ \ \|____/ <____/\____/| ||__| * \/ \ \ | | *********************************************************** * Title: Classic-TAR based backup script v0.0.1-dev * URL: http://dkflbk.nm.ru/ * E-Mail: dkflbk@nm.ru *********************************************************** * * This program is free software; you can redistribute * it and/or modify it under the terms of the GNU * General Public License as published by the Free * SoftwareFoundation; either version 2 of the License, * or anylater version. * **********************************************************/ Class Tar_by_Vladson { var $tar_file; var $fp; function Tar_by_Vladson($tar_file='backup.tar') { $this->tar_file = $tar_file; $this->fp = fopen($this->tar_file, "wb"); $tree = $this->build_tree(); $this->process_tree($tree); fputs($this->fp, pack("a512", "")); fclose($this->fp); } function build_tree($dir='.'){ $handle = opendir($dir); while(false !== ($readdir = readdir($handle))){ if($readdir != '.' && $readdir != '..'){ $path = $dir.'/'.$readdir; if (is_file($path)) { $output[] = substr($path, 2, strlen($path)); } elseif (is_dir($path)) { $output[] = substr($path, 2, strlen($path)).'/'; $output = array_merge($output, $this->build_tree($path)); } } } closedir($handle); return $output; } function process_tree($tree) { foreach( $tree as $pathfile ) { if (substr($pathfile, -1, 1) == '/') { fputs($this->fp, $this->build_header($pathfile)); } elseif ($pathfile != $this->tar_file) { $filesize = filesize($pathfile); $block_len = 512*ceil($filesize/512)-$filesize; fputs($this->fp, $this->build_header($pathfile)); fputs($this->fp, file_get_contents($pathfile)); fputs($this->fp, pack("a".$block_len, "")); } } return true; } function build_header($pathfile) { if ( strlen($pathfile) > 99 ) die('Error'); $info = stat($pathfile); if ( is_dir($pathfile) ) $info[7] = 0; $header = pack("a100a8a8a8a12A12a8a1a100a255", $pathfile, sprintf("%6s ", decoct($info[2])), sprintf("%6s ", decoct($info[4])), sprintf("%6s ", decoct($info[5])), sprintf("%11s ",decoct($info[7])), sprintf("%11s", decoct($info[9])), sprintf("%8s", " "), (is_dir($pathfile) ? "5" : "0"), "", "" ); clearstatcache(); $checksum = 0; for ($i=0; $i<512; $i++) { $checksum += ord(substr($header,$i,1)); } $checksum_data = pack( "a8", sprintf("%6s ", decoct($checksum)) ); for ($i=0, $j=148; $i<7; $i++, $j++) $header[$j] = $checksum_data[$i]; return $header; } } header('Content-type: text/plain'); $start_time = array_sum(explode(chr(32), microtime())); $tar = & new Tar_by_Vladson(); $finish_time = array_sum(explode(chr(32), microtime())); printf("The time taken: %f seconds", ($finish_time - $start_time)); ?> Так-же был написан по быстрому (а.к.а - "на коленках") ибо был срочно нужен (в качестве замены прошлого)
Имхо ничего развратного. Когда бинарник содержит в себе ресурсы типа иконок, текстов и т.д. - это же не развратно? Почему тогда пхп скрипту нельзя делать то же самое? А SFX - частный случай программы и ресурсов в одном файле. Выглядит, конечно, извращенно. Но, вероятно, только лишь по непривычке
Raa Просто маленькая проблемка в том что большие архивы требуют много памяти при распаковке, таким образом распаковать большой архив на сервере не удастся... (хотя для маленьких архивчиков 3-5мб очень даже подходит)
Vladson А кто сказал что будет легко? ))))) Я, правда, так и не понял, зачем это... Не знаю, может еще не проснулся В чем, собственно, задача? Мне в голову сразу приходит мысль законнектиться по SSH, запаковать там все, и перелить потом себе. Если нет SSH - то написать скрипт, который будет синхронно запускать архиватор, возвращать архив, и удалять его с сервера. Если нельзя ничего выполнять, кроме скриптов, то написать скрипт, который любым доступным и удобным способом будет собирать все файлы в один пакет и возвращать его. Если формат нестандартный, то написать экстрактор и юзать у себя для распаковки. Все равно ведь прийдется что-то запускать для того, чтобы распаковать? Потому преимущество SFX скрипта я пока не оценил.
Когда понадобится переместить очень много файлов - все равно ведь придется еще один скрипт писать :-D
К чему я это?... Да я просто хотел услышать от автора идеи нечто вроде "мне так удобнее, потому что..." - вот и все. Если человеку так удобнее, то это может быть удобно не только ему, а и, например, мне :-D Вот я и интересуюсь, почему именно такой подход был выбран. Кстати, по поводу памяти... А что, если ресурсы, предназначенные для распаковки, сохранить в комментариях? ;-) Т.е. не генерировать скрипт скриптом, а просто все данные, предназначенные для распаковки, сохранять в комментарий. А перед комментарием - небольшой скриптик, скоторый будет читать этот же файл и извлекать все из комментариев. Я вот только не знаю, как PHP интерпритатор открывает скрипты. Если он их сразу целиком не пытается проглотить, то может быть сработает?
Он интерпритатор - т.е. выполняет по этапам ) Да, самомодифицирующийся код писать можно... Это, я так понял, получится что то вроде динамической распаковки ресурсов по мере надобности?
Та что ж это за день такой... Чего ж меня все носом сегодня тыкают?! )))))))))) Я говорю, как он открывает файлы, а не как он интерпретирует. Вдруг он сначала весь скрипт загружает в память, будь там хоть миллион тысяч байт, а потом начинает разбираться поэтапно, где там комментарии, а где исполняемый код )))
А это я вообще не понял к кому обращено. Лично я ничего подобного не имел в виду. Это Вы, простите, кому? Если не мне, то зачем там мое имя гордо над этим всем возвышается )))))))))))
Блин... лень то как!... Эх... Ладно, придется самому тест написать. А то я тут развел дискуссию на голом месте ))) Щас чаю только выпью - и буду пробовать. О результатах сообщу )
Raa Смысл скрипта чтоб на серваке (SSH нету) запаковать файлы а на локале распаковать... Но для широкого примеения (чтоб где угодно паковать в обе стороны) такой скрипт не пойдёт ибо на шаред-хостинге ресурсы ограничены и возможна только архивация а не распаковка