Итак, наконец-то я завершил с тестами Ниже - два скрипта, создающие sfx срипты. Первый - по методу Владсона, т.е. ресурс инлайн. Второй - по методу размещения ресурса в комментах. Русурсы представляют из себя 100 файлов размером около 50 кил каждый. Каждый пакет весит почти 50 метров. Загрузка каждого из скриптов занимала на моей машине около 15 секунд. Приблизительно столько же времени заняло извлечение. Но, это, собсно, скорее говорит о характиристиках моего винта )))) Как и следовало ожидать, выполнение этих скриптов не сильно отличается по времени. Намного интереснее дела обстояли с памятью. Первый вариант, как уже заметил Владсон, действительно был прожорлив на память. По мере загрузки скрипта было съедено около 60 метров. Второй тоже оказался ресурсоемким, но не таким жадным: им было откушено около 10 метров, и вся эта память была использована на протяжении всей загрузки скрипта, и незначительные всплески наблюдались во время извлечения. Так что, делаю вывод, что хранить ресурсы в комментариях намного более эффективно с точки зрения загрузки памяти. Но! Я-то поставил ограничение - 2 метра! Видимо, в консольном режиме ему абсолютно все равно, какие у меня там ограничения Поэтому я запустил их еще и из под апача. Второй вроде как послушно отработал в пределах своих двух метров. А первый вывалился. Из-за чего бы вы думали? А вот и нет. Из-за того, что "Maximum execution time of 30 seconds exceeded". И на set_time_limit он внимания не обратил - видимо потому, что даже загрузиться не успел Но из памяти он свои 60 метров все равно пытался откусить, и дошел метров до 40-ка. Почему он не обломился - я не знаю. У меня в пхп.ини стоит "memory_limit = 2M". Что ему еще надо? Просто теряюсь в догадках Народ, потестите пожалуйста кто-нибудь у себя. Уж очень интересно, что с ними будет, когда ограничение памяти работает. Еще интересная вещь произошла. Сначала во втором варианте я все данные запихнул в один большой коммент. ПХП висел несколько минут. Память росла оооочень медленно. Что он там делал - остается только догадываться. Наверное, зачитался.... В общем, мне стало скучно, и я его убил и переписал с однострочными комментариями А вот, собственно, код. Ресурс инлайн PHP: <?php set_time_limit(0); $sContent = str_repeat('qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvb', 1000); $sSfx = dirname(__FILE__).'/sfx1.php'; if (file_exists($sSfx)) unlink($sSfx); $rSfx = fopen($sSfx, 'w'); fwrite($rSfx, "<?php\n"); fwrite($rSfx, "set_time_limit(0);\n"); fwrite($rSfx, '$sFilesDir = dirname(__FILE__).\'/files1\';'."\n"); fwrite($rSfx, 'if (!file_exists($sFilesDir)) mkdir($sFilesDir);'."\n"); for ($i = 0; $i < 1000; $i++) { $sFilename = "file$i.txt"; fwrite($rSfx, "$"."rFile = fopen($"."sFilesDir.'/$sFilename', 'w');\n"); fwrite($rSfx, "fwrite($"."rFile, '$sContent');\n"); fwrite($rSfx, "fclose($"."rFile);\n\n"); } fwrite($rSfx, "\n?>"); fclose($rSfx); ?> Ресурс в комментах PHP: <?php set_time_limit(0); $sContent = str_repeat('qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvb', 1000); $sSfx = dirname(__FILE__).'/sfx2.php'; if (file_exists($sSfx)) unlink($sSfx); $rSfx = fopen($sSfx, 'w'); fwrite($rSfx, "<?php\n"); fwrite($rSfx, "set_time_limit(0);\n"); fwrite($rSfx, <<<SFX \$sFilesDir = dirname(__FILE__).'/files2'; if (!file_exists(\$sFilesDir)) mkdir(\$sFilesDir); \$rSelf = fopen(__FILE__, 'r'); \$sLine = ''; while (!feof(\$rSelf) && \$sLine != "//DATA\\n") { \$sLine = fgets(\$rSelf, 1048576); } while (!feof(\$rSelf)) { \$sLine = trim(fgets(\$rSelf, 1048576)); if (\$sLine == "//END") break; if (!empty(\$sLine)) { \$iSep = strpos(\$sLine, ':'); \$sFilename = \$sFilesDir.'/'.substr(\$sLine, 2, \$iSep - 2); \$sContent = substr(\$sLine, \$iSep + 1); \$rFile = fopen(\$sFilename, 'w'); fwrite(\$rFile, \$sContent); fclose(\$rFile); } } fclose(\$rSelf); SFX ); fwrite($rSfx, "\n//DATA\n"); for ($i = 0; $i < 1000; $i++) { $sFilename = "file$i.txt"; fwrite($rSfx, "//$sFilename:$sContent');\n"); } fwrite($rSfx, '//END'); fwrite($rSfx, "\n?>"); fclose($rSfx); ?>
Эти тесты показывают расход памяти на скрипт, содержащий в себе большой объем ресурсов. Нету здесь никакого сжатия. Так же, как и нет чтения каталогов и записи файлов. И вообще эти скрипты не выполняют никакой полезной работы. Они создают файлы с мусором внутри себя. Зачем там сжатие? Возьми скрипт Владсона - там и чтение файлов, и сжатие. А у меня - только распаковка Если потратить пять минут, то можно соединить и наслаждаться. Если соединишь - поделись скриптом. Авось пригодится
Хм... у меня идея побредовее... но знаний не очень хватает, что бы сделать заключение о ее работоспособности сразу (это к самомодифицируемому коду и динамической распаковке)... счас тоже попробую... и если получится что нить толковое, то выложу.
Горбунов Олег, ПХП интерпретатор, сначала делает лексемизацию всего содержимого файла, и лишь после этого передаёт получившийся опкод в экзекутор. Поэтому чем больше размер файла, тем больше процессорного времени и памяти уйдёт на бесполезную работу. А если памяти потребуется слишком много, будет фатал еррор...
А ни при чем! Под горячую руку попался!!! ))))))))))))) видимо, при том, что "Он интерпритатор - т.е. выполняет по этапам"
Ну это понятно, что на момент вызова скрипт должен быть лексически правильным. Я подумал о том, что можно паковать каждый скрипт "самого в себя" и распаковывать только при запросе. Естественно, это сработает только для упаковки php кода )
Смысл в этом сжатии если у большенства продуктов 90% gif|jpeg|png файлов которые сжимать нет смысла ? Основной смысл этого кскрипта в том что при скачке/закачке через FTP проще скачать один файл в 1Мб чем 1000 файлов по 1кб... Понял что ты хочешь (это как для DOS/Win exe-шников часто делают) Спешу огорчить, в реализации это проще чем два факса отослать PHP: <?php eval(gzuncompress('запакованный файл')); ?> но практической пользы полный ноль (только лишьние тормоза) а экономия сервеного места неоправдана...
Именно так, в прикладном программировании этот приём действует очень даже хорошо и он оправдан ибо там важен размер и не важна скорость запуска скрипта (какая разница перед тем как стартануть прогу будет он секунду думать или две) а вот в web это наоборот как для телеги пятое колесо...
Блин, ну объесни же мне наконец!!!! ))) Пожалуйста Я ничего не могу понять Можно какую-то схему, пример кода или псевдокода, перечень компонентов, последовательность этапов?...
Я объяснил Есть архив phpinfo.php.gz с файлом phpinfo.php и исполняемый РНР файл PHP: <?php eval(readgzfile('phpinfo.php.gz')) ?>
А возможно как нибуть реализовать, чтобы скрипт архивировал не только каталог где он находится, но еще и подкаталоги. Например скрипт лежит в /home/user/public_html/dir1/ а надо чтоб он заархивировал /home/user/public_html/ и сохранил в /home/user/public_html/dir1/file.tar
на нашем сервере активно используется рар для паковки файлов (800мб дампы в 50мб сокрашает) но вот хотелось бы распаковку -запаковку этого рара простенькую сделать или рар -закрытый алгоритм,и проще свой архиватор сделать? просто неохота заново писать то что делал 8 лет назад. ЗЫ я программу для собрания группы файлов в 1 и сжатия их делал еще на ZX-spectrume LIBRARY.B причем умудрился все на бейсике написать,даже не прибегая к машинным кодам (в машинных кодах только обращение к контроллеру дисковода для записи или чтения данных) (учитывая что архиваторов там у меня вообще не было,эта прога мне 3 года позволяла дискеты экономить не распространял,т.к. интернета еще не было тогда,а даже если и был то некуда было его воткнуть)
да нет, есть вроде расширения. В пекле глянь, да в пеаре. а в 5.3 все равно уже поддержка phar будет. Правда, чето глючный он какойто