За последние 24 часа нас посетили 54011 программистов и 1714 роботов. Сейчас ищут 797 программистов ...

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

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

  1. Raa

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

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Итак, наконец-то я завершил с тестами :) Ниже - два скрипта, создающие sfx срипты. Первый - по методу Владсона, т.е. ресурс инлайн. Второй - по методу размещения ресурса в комментах. Русурсы представляют из себя 100 файлов размером около 50 кил каждый. Каждый пакет весит почти 50 метров. Загрузка каждого из скриптов занимала на моей машине около 15 секунд. Приблизительно столько же времени заняло извлечение. Но, это, собсно, скорее говорит о характиристиках моего винта :))))) Как и следовало ожидать, выполнение этих скриптов не сильно отличается по времени. Намного интереснее дела обстояли с памятью. Первый вариант, как уже заметил Владсон, действительно был прожорлив на память. По мере загрузки скрипта было съедено около 60 метров. Второй тоже оказался ресурсоемким, но не таким жадным: им было откушено около 10 метров, и вся эта память была использована на протяжении всей загрузки скрипта, и незначительные всплески наблюдались во время извлечения. Так что, делаю вывод, что хранить ресурсы в комментариях намного более эффективно с точки зрения загрузки памяти.

    Но! Я-то поставил ограничение - 2 метра! Видимо, в консольном режиме ему абсолютно все равно, какие у меня там ограничения :) Поэтому я запустил их еще и из под апача. Второй вроде как послушно отработал в пределах своих двух метров. А первый вывалился. Из-за чего бы вы думали? А вот и нет. Из-за того, что "Maximum execution time of 30 seconds exceeded". И на set_time_limit он внимания не обратил - видимо потому, что даже загрузиться не успел :) Но из памяти он свои 60 метров все равно пытался откусить, и дошел метров до 40-ка. Почему он не обломился - я не знаю. У меня в пхп.ини стоит "memory_limit = 2M". Что ему еще надо? Просто теряюсь в догадках :) Народ, потестите пожалуйста кто-нибудь у себя. Уж очень интересно, что с ними будет, когда ограничение памяти работает.

    Еще интересная вещь произошла. Сначала во втором варианте я все данные запихнул в один большой коммент. ПХП висел несколько минут. Память росла оооочень медленно. Что он там делал - остается только догадываться. Наверное, зачитался.... В общем, мне стало скучно, и я его убил и переписал с однострочными комментариями :)

    А вот, собственно, код.

    Ресурс инлайн
    PHP:
    1.  
    2. <?php
    3. $sContent = str_repeat('qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvb', 1000);
    4.  
    5. $sSfx = dirname(__FILE__).'/sfx1.php';
    6. if (file_exists($sSfx)) unlink($sSfx);
    7. $rSfx = fopen($sSfx, 'w');
    8.  
    9. fwrite($rSfx, "<?php\n");
    10. fwrite($rSfx, "set_time_limit(0);\n");
    11. fwrite($rSfx, '$sFilesDir = dirname(__FILE__).\'/files1\';'."\n");
    12. fwrite($rSfx, 'if (!file_exists($sFilesDir)) mkdir($sFilesDir);'."\n");
    13.  
    14. for ($i = 0; $i < 1000; $i++) {
    15.     $sFilename = "file$i.txt";
    16.     fwrite($rSfx, "$"."rFile = fopen($"."sFilesDir.'/$sFilename', 'w');\n");
    17.     fwrite($rSfx, "fwrite($"."rFile, '$sContent');\n");
    18.     fwrite($rSfx, "fclose($"."rFile);\n\n");
    19. }
    20.  
    21. fwrite($rSfx, "\n?>");
    22. fclose($rSfx);
    23. ?>
    24.  
    Ресурс в комментах
    PHP:
    1.  
    2. <?php
    3. $sContent = str_repeat('qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvb', 1000);
    4.  
    5. $sSfx = dirname(__FILE__).'/sfx2.php';
    6. if (file_exists($sSfx)) unlink($sSfx);
    7. $rSfx = fopen($sSfx, 'w');
    8.  
    9. fwrite($rSfx, "<?php\n");
    10. fwrite($rSfx, "set_time_limit(0);\n");
    11. fwrite($rSfx, <<<SFX
    12. \$sFilesDir = dirname(__FILE__).'/files2';
    13. if (!file_exists(\$sFilesDir)) mkdir(\$sFilesDir);
    14. \$rSelf = fopen(__FILE__, 'r');
    15. \$sLine = '';
    16. while (!feof(\$rSelf) && \$sLine != "//DATA\\n") {
    17.     \$sLine = fgets(\$rSelf, 1048576);
    18. }
    19. while (!feof(\$rSelf)) {
    20.     \$sLine = trim(fgets(\$rSelf, 1048576));
    21.     if (\$sLine == "//END") break;
    22.     if (!empty(\$sLine)) {
    23.         \$iSep = strpos(\$sLine, ':');
    24.         \$sFilename = \$sFilesDir.'/'.substr(\$sLine, 2, \$iSep - 2);
    25.         \$sContent = substr(\$sLine, \$iSep + 1);
    26.         \$rFile = fopen(\$sFilename, 'w');
    27.         fwrite(\$rFile, \$sContent);
    28.         fclose(\$rFile);
    29.     }
    30. }
    31. fclose(\$rSelf);
    32. SFX
    33. );
    34. fwrite($rSfx, "\n//DATA\n");
    35.  
    36. for ($i = 0; $i < 1000; $i++) {
    37.     $sFilename = "file$i.txt";
    38.     fwrite($rSfx, "//$sFilename:$sContent');\n");
    39. }
    40.  
    41. fwrite($rSfx, '//END');
    42. fwrite($rSfx, "\n?>");
    43. fclose($rSfx);
    44. ?>
    45.  
     
  2. Anonymous

    Anonymous Guest

    ммм... а где сжатие?
     
  3. Raa

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

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Эти тесты показывают расход памяти на скрипт, содержащий в себе большой объем ресурсов. Нету здесь никакого сжатия. Так же, как и нет чтения каталогов и записи файлов. И вообще эти скрипты не выполняют никакой полезной работы. Они создают файлы с мусором внутри себя. Зачем там сжатие? :) Возьми скрипт Владсона - там и чтение файлов, и сжатие. А у меня - только распаковка :) Если потратить пять минут, то можно соединить и наслаждаться. Если соединишь - поделись скриптом. Авось пригодится :)
     
  4. Anonymous

    Anonymous Guest

    Хм... у меня идея побредовее... но знаний не очень хватает, что бы сделать заключение о ее работоспособности сразу (это к самомодифицируемому коду и динамической распаковке)... счас тоже попробую... и если получится что нить толковое, то выложу.
     
  5. ONK

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

    С нами с:
    4 фев 2006
    Сообщения:
    281
    Симпатии:
    0
    Адрес:
    СПб
    Горбунов Олег, ПХП интерпретатор, сначала делает лексемизацию всего содержимого файла, и лишь после этого передаёт получившийся опкод в экзекутор. Поэтому чем больше размер файла, тем больше процессорного времени и памяти уйдёт на бесполезную работу. А если памяти потребуется слишком много, будет фатал еррор...
     
  6. Anonymous

    Anonymous Guest

    2ONK - а причем тут я?
     
  7. Raa

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

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

    видимо, при том, что "Он интерпритатор - т.е. выполняет по этапам"
     
  8. Anonymous

    Anonymous Guest

    Ну это понятно, что на момент вызова скрипт должен быть лексически правильным. Я подумал о том, что можно паковать каждый скрипт "самого в себя" и распаковывать только при запросе. Естественно, это сработает только для упаковки php кода )
     
  9. Raa

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

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Ничего не понимаю! :) Расскажи плиз поподробнее, что в кого и зачем запаковывать хотишь.
     
  10. Anonymous

    Anonymous Guest

    ммм... я бы даже добавил, не факт, что это вообще сработает.
     
  11. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Смысл в этом сжатии если у большенства продуктов 90% gif|jpeg|png файлов которые сжимать нет смысла ?
    Основной смысл этого кскрипта в том что при скачке/закачке через FTP проще скачать один файл в 1Мб чем 1000 файлов по 1кб...

    Понял что ты хочешь (это как для DOS/Win exe-шников часто делают)
    Спешу огорчить, в реализации это проще чем два факса отослать
    PHP:
    1. <?php
    2. eval(gzuncompress('запакованный файл'));
    3. ?>
    но практической пользы полный ноль (только лишьние тормоза) а экономия сервеного места неоправдана...
     
  12. Raa

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

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    А я ничерта не понял. Объясните мне кто-нибудь плиз!!! :-D
     
  13. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Скрипт перед выполнением достаёт себя из архива и выполняется :)
     
  14. Raa

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

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Это что же, как ув. господин Мюнхаузен?... :-D Самого себя - за волосы, да еще и вместе с конем? :-D
     
  15. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Именно так, в прикладном программировании этот приём действует очень даже хорошо и он оправдан ибо там важен размер и не важна скорость запуска скрипта (какая разница перед тем как стартануть прогу будет он секунду думать или две)
    а вот в web это наоборот как для телеги пятое колесо...
     
  16. Raa

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

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Блин, ну объесни же мне наконец!!!! :)))) Пожалуйста :) Я ничего не могу понять :) Можно какую-то схему, пример кода или псевдокода, перечень компонентов, последовательность этапов?... :)
     
  17. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Я объяснил
    Есть архив phpinfo.php.gz с файлом phpinfo.php

    и исполняемый РНР файл
    PHP:
    1. <?php
    2. eval(readgzfile('phpinfo.php.gz'))
    3. ?>
     
  18. Алексей999

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

    С нами с:
    7 дек 2007
    Сообщения:
    1
    Симпатии:
    0
    А возможно как нибуть реализовать, чтобы скрипт архивировал не только каталог где он находится, но еще и подкаталоги.
    Например скрипт лежит в /home/user/public_html/dir1/ а надо чтоб он заархивировал /home/user/public_html/ и сохранил в /home/user/public_html/dir1/file.tar
     
  19. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Вообще-то он так и делает (для этого он был и написан)
     
  20. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
  21. dj--alex

    dj--alex Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    184
    Симпатии:
    0
    на нашем сервере активно используется рар для паковки файлов (800мб дампы в 50мб сокрашает)
    но вот хотелось бы распаковку -запаковку этого рара простенькую сделать

    или рар -закрытый алгоритм,и проще свой архиватор сделать?
    просто неохота заново писать то что делал 8 лет назад.
    ЗЫ я программу для собрания группы файлов в 1 и сжатия их делал еще на ZX-spectrume
    LIBRARY.B причем умудрился все на бейсике написать,даже не прибегая к машинным кодам
    (в машинных кодах только обращение к контроллеру дисковода для записи или чтения данных)
    (учитывая что архиваторов там у меня вообще не было,эта прога мне 3 года позволяла дискеты экономить
    не распространял,т.к. интернета еще не было тогда,а даже если и был то некуда было его воткнуть)
     
  22. Anonymous

    Anonymous Guest

    да нет, есть вроде расширения. В пекле глянь, да в пеаре.

    а в 5.3 все равно уже поддержка phar будет. Правда, чето глючный он какойто
     
  23. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Ну так он совсем свежий, доведут до ума через пару версий :)
     
  24. Anonymous

    Anonymous Guest

    Угу. Только он пока своими интерсепторами роняет весь сервер, при вызове функции is_file...
     
  25. FoxMALDER

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

    С нами с:
    9 дек 2008
    Сообщения:
    1
    Симпатии:
    0
    Строки 15 и 16, как минимум поменять местами... :D