За последние 24 часа нас посетили 22292 программиста и 1062 робота. Сейчас ищут 634 программиста ...

Разврат, или новый писк моды. (SFX-архив на РНР)

Тема в разделе "Прочие вопросы по PHP", создана пользователем Vladson, 11 сен 2006.

  1. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Сидел я как-то думал на тему как бы слить с сервака файлы в огромных количествах и понял что можно обойтись без PEAR::Archive_Tar :)

    Написал я скрипт который генерирует РНР файл который при запуске создаёт все файлы и папки как обычный SFX-архив...

    Обсудим ? (разврат или нет ?)
     
  2. Anonymous

    Anonymous Guest

    Оппа!!
    Хочу глядеть код?
     
  3. Mavir

    Mavir Guest

    Похожую систему я видел в какой-то простенькой CMS. Там был только один файл install.php, а в него было все запихано, даже рисунки. А при запуске он создавал нужные папки и файлы.

    По моему дело вкуса. Плюс, если нужно выкачать много файлом, причем какие именно заранее неизвестно. Конечно, этот способ не пойдет для каждого, а только для себя или у кого есть PHP и знает что с этим архивом делать.
     
  4. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Mavir
    Кстати не плохой форум (а не CMS), где-то в РНР инсайде о нём писали...

    Горбунов Олег
    Оппа в смысле хочешь поддержать, или оппа в смысле "ща закритикую в усмерть"

    Кстати аналог PEAR-Tar я тоже написал, только работает он только с классическими TAR архивами а не "USTAR" и не поддерживает имена (вместе с путями) длиннее 99 символов что делает его почти непригодным для нормального бэкапа крупных сайтов...
     
  5. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    FUDforum2.

    Мне идея (в отличии от форума FUDforum2) понравилась.
    каждой cms, форуму, ... такой бы инсталл, причем делать так, что бы перед загрузкой можно было бы выбирать комплектацию.
     
  6. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    А код вот (был написан за 5 минут так как срочно был нужен)

    PHP:
    1. <?php
    2. function ls($dir){
    3.     $handle = opendir($dir);
    4.     while(false !== ($readdir = readdir($handle))){
    5.         if($readdir != '.' AND $readdir != '..'){
    6.             $path = $dir.'/'.$readdir;
    7.             if(is_file($path))
    8.                 $output[] = $readdir;
    9.             elseif(is_dir($path))
    10.                 $output[$readdir] = ls($path);
    11.         }
    12.     }
    13.     return $output;
    14.     closedir($handle);
    15. }
    16. $backup_list = ls('.');
    17.  
    18. function backup($fp, $backup_list, $path=false) {
    19.     foreach($backup_list as $dir_name => $file_entry) {
    20.         if ( is_int($dir_name) ) {
    21.             $filename = $path . $file_entry;
    22.             if ( is_readable($filename) ) {
    23.                 $content = base64_encode(file_get_contents($filename));
    24.                 gzputs($fp, "$" . "fp = fopen('$filename', 'w');\n");
    25.                 gzputs($fp, "fputs($" . "fp, base64_decode('" . $content . "'));\n");
    26.                 gzputs($fp, "fclose($" . "fp);\n");
    27.             }
    28.         } elseif ( is_string($dir_name) ) {
    29.             $temp = $path.$dir_name.'/';
    30.             gzputs($fp, "mkdir('$temp', 0777);\n");
    31.             backup($fp, $file_entry, $temp);
    32.         }
    33.     }
    34. }
    35.  
    36. $fp = gzopen('backuper_output.php.gz', "w9");
    37. gzputs($fp, "<?php\nset_time_limit(600);\n");
    38. backup($fp, $backup_list);
    39. gzputs($fp, "?>");
    40. gzclose($fp);
    41. echo '<a href="backuper_output.php.gz">backuper_output.php.gz</a>';
    42. ?>
    (реализация ужасная, по этому распаковывается он только на Windows)
     
  7. Anonymous

    Anonymous Guest

    Vladson, Оппа, значит, счас посмотрю, и решу, критиковать вусмерть или поддерживать. ))
    Идея мне безусловно нравится...
    Решение конечно явно на коленке.. =)
    Осталось еще встроить автозаливку в БД =)))
     
  8. Mavir

    Mavir Guest

    Не, у меня был YSE или как-то похоже пишется. Кому интересно, приду домой могу дать ссылку и правильное название.
    Посмотрел FUDforum2, немного другой принцип. В том что у меня форум есть скрипт инсталяции и отдельно файл с которого все берется. А в FUDforum2 вставлено все в один. Зато есть деинсталлятор :)

    А какие трудности? Рядом ложишь дамп базы данных и заливаешь.
     
  9. Anonymous

    Anonymous Guest

    Mavir, никто и не говорит про трудности...
     
  10. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Дык надо было срочно слить с сервака 2400 файлов раскиданных по куче папок...
    Это лишьнее, я например пользуюсь "Site Keeper Dumper"-ом для этих целей и не занаю проблем...
     
  11. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Кстати для приверженцов классики вот скриптик который архивирует всё что находится в каталоге где он находится в tar (включая подкаталоги)

    Код (Text):
    1. <?php
    2. /***********************************************************
    3.  *\  \    ___ __        /\     ____   ____  ____  __ |  |
    4.  * \  \  /  /|  |      /  \   |  _ \ /  __>/    \|  ||  |
    5.  *  \  \/  / |  |     / /\ \  | | \ \\_ \_ | || ||   \  |
    6.  *   \    /  |  |__  /  __  \ | |_/ / _\  \| || ||  \   |
    7.  *    \  /   |_____|/__/  \  \|____/ <____/\____/|  ||__|
    8.  *     \/                  \  \                  |  |
    9.  ***********************************************************
    10.  *   Title:  Classic-TAR based backup script v0.0.1-dev
    11.  *   URL:    http://dkflbk.nm.ru/
    12.  *   E-Mail: dkflbk@nm.ru
    13.  ***********************************************************
    14.  *
    15.  *   This program is free software; you can  redistribute
    16.  *   it  and/or  modify  it  under  the  terms of the GNU
    17.  *   General Public License  as  published  by  the  Free
    18.  *   SoftwareFoundation; either version 2 of the License,
    19.  *   or  anylater version.
    20.  *
    21.  **********************************************************/
    22.  
    23. Class Tar_by_Vladson {
    24.     var $tar_file;
    25.     var $fp;
    26.     function Tar_by_Vladson($tar_file='backup.tar') {
    27.         $this->tar_file = $tar_file;
    28.         $this->fp = fopen($this->tar_file, "wb");
    29.         $tree = $this->build_tree();
    30.         $this->process_tree($tree);
    31.         fputs($this->fp, pack("a512", ""));
    32.         fclose($this->fp);
    33.     }
    34.     function build_tree($dir='.'){
    35.         $handle = opendir($dir);
    36.         while(false !== ($readdir = readdir($handle))){
    37.             if($readdir != '.' && $readdir != '..'){
    38.                 $path = $dir.'/'.$readdir;
    39.                 if (is_file($path)) {
    40.                     $output[] = substr($path, 2, strlen($path));
    41.                 } elseif (is_dir($path)) {
    42.                     $output[] = substr($path, 2, strlen($path)).'/';
    43.                     $output = array_merge($output, $this->build_tree($path));
    44.                 }
    45.             }
    46.         }
    47.         closedir($handle);
    48.         return $output;
    49.     }
    50.     function process_tree($tree) {
    51.         foreach( $tree as $pathfile ) {
    52.             if (substr($pathfile, -1, 1) == '/') {
    53.                 fputs($this->fp, $this->build_header($pathfile));
    54.             } elseif ($pathfile != $this->tar_file) {
    55.                 $filesize = filesize($pathfile);
    56.                 $block_len = 512*ceil($filesize/512)-$filesize;
    57.                 fputs($this->fp, $this->build_header($pathfile));
    58.                 fputs($this->fp, file_get_contents($pathfile));
    59.                 fputs($this->fp, pack("a".$block_len, ""));
    60.             }
    61.         }
    62.         return true;
    63.     }
    64.     function build_header($pathfile) {
    65.         if ( strlen($pathfile) > 99 ) die('Error');
    66.         $info = stat($pathfile);
    67.         if ( is_dir($pathfile) ) $info[7] = 0;
    68.         $header = pack("a100a8a8a8a12A12a8a1a100a255",
    69.             $pathfile,
    70.             sprintf("%6s ", decoct($info[2])),
    71.             sprintf("%6s ", decoct($info[4])),
    72.             sprintf("%6s ", decoct($info[5])),
    73.             sprintf("%11s ",decoct($info[7])),
    74.             sprintf("%11s", decoct($info[9])),
    75.             sprintf("%8s", " "),
    76.             (is_dir($pathfile) ? "5" : "0"),
    77.             "",
    78.             ""
    79.             );
    80.         clearstatcache();
    81.         $checksum = 0;
    82.         for ($i=0; $i<512; $i++) {
    83.             $checksum += ord(substr($header,$i,1));
    84.         }
    85.         $checksum_data = pack(
    86.             "a8", sprintf("%6s ", decoct($checksum))
    87.             );
    88.         for ($i=0, $j=148; $i<7; $i++, $j++)
    89.             $header[$j] = $checksum_data[$i];
    90.         return $header;
    91.     }
    92. }
    93.  
    94. header('Content-type: text/plain');
    95. $start_time = array_sum(explode(chr(32), microtime()));
    96. $tar = & new Tar_by_Vladson();
    97. $finish_time = array_sum(explode(chr(32), microtime()));
    98. printf("The time taken: %f seconds", ($finish_time - $start_time));
    99. ?>
    Так-же был написан по быстрому (а.к.а - "на коленках") ибо был срочно нужен (в качестве замены прошлого)
     
  12. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Увековечил Classic-TAR на сайте www.php.net :)
     
  13. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Имхо ничего развратного. Когда бинарник содержит в себе ресурсы типа иконок, текстов и т.д. - это же не развратно? Почему тогда пхп скрипту нельзя делать то же самое? :) А SFX - частный случай программы и ресурсов в одном файле. Выглядит, конечно, извращенно. Но, вероятно, только лишь по непривычке :)
     
  14. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Raa
    Просто маленькая проблемка в том что большие архивы требуют много памяти при распаковке, таким образом распаковать большой архив на сервере не удастся...
    (хотя для маленьких архивчиков 3-5мб очень даже подходит)
     
  15. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Vladson
    А кто сказал что будет легко? )))))

    Я, правда, так и не понял, зачем это... :) Не знаю, может еще не проснулся :) В чем, собственно, задача?

    Мне в голову сразу приходит мысль законнектиться по SSH, запаковать там все, и перелить потом себе. Если нет SSH - то написать скрипт, который будет синхронно запускать архиватор, возвращать архив, и удалять его с сервера. Если нельзя ничего выполнять, кроме скриптов, то написать скрипт, который любым доступным и удобным способом будет собирать все файлы в один пакет и возвращать его. Если формат нестандартный, то написать экстрактор и юзать у себя для распаковки. Все равно ведь прийдется что-то запускать для того, чтобы распаковать? Потому преимущество SFX скрипта я пока не оценил.
     
  16. Anonymous

    Anonymous Guest

    Ну дык....
    его самого и запускать...
     
  17. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Горбунов Олег
    Дык
     
  18. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Когда понадобится переместить очень много файлов - все равно ведь придется еще один скрипт писать :-D
     
  19. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    К чему я это?... Да я просто хотел услышать от автора идеи нечто вроде "мне так удобнее, потому что..." - вот и все. Если человеку так удобнее, то это может быть удобно не только ему, а и, например, мне :-D Вот я и интересуюсь, почему именно такой подход был выбран.

    Кстати, по поводу памяти... А что, если ресурсы, предназначенные для распаковки, сохранить в комментариях? ;-) Т.е. не генерировать скрипт скриптом, а просто все данные, предназначенные для распаковки, сохранять в комментарий. А перед комментарием - небольшой скриптик, скоторый будет читать этот же файл и извлекать все из комментариев. Я вот только не знаю, как PHP интерпритатор открывает скрипты. Если он их сразу целиком не пытается проглотить, то может быть сработает?
     
  20. Anonymous

    Anonymous Guest

    Он интерпритатор - т.е. выполняет по этапам )
    Да, самомодифицирующийся код писать можно...
    Это, я так понял, получится что то вроде динамической распаковки ресурсов по мере надобности?
     
  21. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Та что ж это за день такой... Чего ж меня все носом сегодня тыкают?! ))))))))))

    Я говорю, как он открывает файлы, а не как он интерпретирует. Вдруг он сначала весь скрипт загружает в память, будь там хоть миллион тысяч байт, а потом начинает разбираться поэтапно, где там комментарии, а где исполняемый код :))))
     
  22. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    А это я вообще не понял к кому обращено. Лично я ничего подобного не имел в виду. Это Вы, простите, кому? Если не мне, то зачем там мое имя гордо над этим всем возвышается )))))))))))
     
  23. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Блин... лень то как!... Эх... Ладно, придется самому тест написать. А то я тут развел дискуссию на голом месте ))) Щас чаю только выпью - и буду пробовать. О результатах сообщу :))
     
  24. Anonymous

    Anonymous Guest

    Это и было про самомодифицирующийся код....
     
  25. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Raa
    Смысл скрипта чтоб на серваке (SSH нету) запаковать файлы а на локале распаковать...

    Но для широкого примеения (чтоб где угодно паковать в обе стороны) такой скрипт не пойдёт ибо на шаред-хостинге ресурсы ограничены и возможна только архивация а не распаковка