<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sh4dow Hell &#187; php</title>
	<atom:link href="http://www.sh4dow.pl/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sh4dow.pl</link>
	<description>Join the Darkside and get a free cookie ...</description>
	<lastBuildDate>Fri, 16 Dec 2011 14:30:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>PHP i Session oraz http vs https na debiano podobnych.</title>
		<link>http://www.sh4dow.pl/2011/12/php-i-session-oraz-http-vs-https-na-debiano-podobnych/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=php-i-session-oraz-http-vs-https-na-debiano-podobnych</link>
		<comments>http://www.sh4dow.pl/2011/12/php-i-session-oraz-http-vs-https-na-debiano-podobnych/#comments</comments>
		<pubDate>Fri, 16 Dec 2011 14:30:20 +0000</pubDate>
		<dc:creator>Sh4dow</dc:creator>
				<category><![CDATA[C0ding...]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.sh4dow.pl/?p=188</guid>
		<description><![CDATA[<a href="http://www.sh4dow.pl/2011/12/php-i-session-oraz-http-vs-https-na-debiano-podobnych/" title="PHP i Session oraz http vs https na debiano podobnych."></a>Jako że web developer goni za nowościami, przyszedł czas na upgrade serwerów testowych (przed wdrożeniem na produkcję). Czy zwykła zmiana wersji mogła odbyć się bez problemów ? Oczywiście że nie. To akurat wie każdy. Korzystamy dla przechowywania sesji Memcached. Po &#8230;<p class="read-more"><a href="http://www.sh4dow.pl/2011/12/php-i-session-oraz-http-vs-https-na-debiano-podobnych/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://www.sh4dow.pl/2011/12/php-i-session-oraz-http-vs-https-na-debiano-podobnych/" title="PHP i Session oraz http vs https na debiano podobnych."></a><p>Jako że web developer goni za nowościami, przyszedł czas na upgrade serwerów testowych (przed wdrożeniem na produkcję). Czy zwykła zmiana wersji mogła odbyć się bez problemów ? Oczywiście że nie. To akurat wie każdy.</p>
<p>Korzystamy dla przechowywania sesji Memcached. Po pierwsze w miarę szybkie i ładnie działa, po drugie sesja jest wsþółdzielona pomiędzy sporo serwerów. Oczywiście logowanie przez SSL&#8217;a przestało działać.<img class="aligncenter" title="Suhoshi" src="http://sh4dow.pl/d/1/eabff018.png" alt="" width="627" height="70" /></p>
<p>Więc w pierwszej kolejności pretensje poszły do naszej aplikacji &#8222;Znowu coś zjebaliście !&#8221;, później memcache i na koniec serwer. A nie winne były ustawienia PHP. Jeśli posiadacie serwer oparty na Debianie lub jego potomków, sprawdźcie czy macie zainstalowane rozszerzenie Suhosin, a jeśli tak to czy poniższe zmienne macie tak ustawione.</p>
<pre>suhosin.session.encrypt = off
suhosin.session.cryptua = off</pre>
<p>To magiczne rozszerzenie ma skłonności to innego sposobu zapisywania danych w naszej sesji. Jest to string base64 po rozkodwaniu którego znajdujemy jakiś bliżej nie określony zapis binarny. Którego nie mamy jak rozkodować. Sytuacja jest o tyle dziwna, że ta sama domena z SSL&#8217;em i bez są traktowane jak by były osobno ale nie. Sesje pomiędzy tak parą domen są osobne. Każda zapisuje się oddzielnie, pod tym samym session_id. Oczywiście parametry sesji są ustawione tak żeby domeny wspólnie korzystały z sesji. Niestety nie udało mi się rozkodować tego co sesja zapisuje. Może jeszcze znajdę chwile to postaram się zrozumieć to zjawisko. W każdym bądź razie. Rozszerzenie wyłączyć lub zmienić ustawienia i problemy znikają.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sh4dow.pl/2011/12/php-i-session-oraz-http-vs-https-na-debiano-podobnych/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHPCon 2010, czyli spotkanie entuzjastów i innych stworzeń</title>
		<link>http://www.sh4dow.pl/2010/05/phpcon-2010-czyli-spotkanie-entuzjastow-i-innych-stworzen/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=phpcon-2010-czyli-spotkanie-entuzjastow-i-innych-stworzen</link>
		<comments>http://www.sh4dow.pl/2010/05/phpcon-2010-czyli-spotkanie-entuzjastow-i-innych-stworzen/#comments</comments>
		<pubDate>Mon, 24 May 2010 11:13:23 +0000</pubDate>
		<dc:creator>Sh4dow</dc:creator>
				<category><![CDATA[Zdarzenia/Spotkania/Konferencje]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[PHPCon]]></category>

		<guid isPermaLink="false">http://www.sh4dow.pl/?p=143</guid>
		<description><![CDATA[<a href="http://www.sh4dow.pl/2010/05/phpcon-2010-czyli-spotkanie-entuzjastow-i-innych-stworzen/" title="PHPCon 2010, czyli spotkanie entuzjastów i innych stworzeń"></a>W dniach od 21 do 23 maja odbył się pierwszy zlot/konferencja miłośników i entuzjastów PHP i dźwięcznej nazwie PHPCon. Szczerze mówiąc czułem się tam dość dziwacznie ponieważ nie posiadam laptopa, a tym bardziej MacBooka czy iPada. I ponadto potrafię znaleźć &#8230;<p class="read-more"><a href="http://www.sh4dow.pl/2010/05/phpcon-2010-czyli-spotkanie-entuzjastow-i-innych-stworzen/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://www.sh4dow.pl/2010/05/phpcon-2010-czyli-spotkanie-entuzjastow-i-innych-stworzen/" title="PHPCon 2010, czyli spotkanie entuzjastów i innych stworzeń"></a><p><img src="http://www.sh4dow.pl/files/2010/05/logo.png" alt="" title="logo PHPCon2010" width="173" height="44" class="alignleft size-full wp-image-144" style="margin:2px; border:0px;"/> W dniach od 21 do 23 maja odbył się pierwszy zlot/konferencja miłośników i entuzjastów PHP i dźwięcznej nazwie <a href="http://phpcon.pl/">PHPCon</a>. Szczerze mówiąc czułem się tam dość dziwacznie ponieważ nie posiadam laptopa, a tym bardziej MacBooka czy iPada. I ponadto potrafię znaleźć temat inny do rozmowy niż programowanie, globalna walka z bugami oraz obiektowo strukturalne skomplikowanie kodu.<br />
Musze szczerze przyznać że większość wykładów była ciekawa. Oczywiście zdarzyły się wpadki (pozdrowienia dla Pana z firmy Microsoft) lub bardzo nudne wykłady. Ale ogólną ocenę wystawiam na cztery z dużym plusem. Samych wykładów nie chce oceniać bo każdy szukał tam czegoś innego, jedni się reklamowali, a inni przedstawiali swoją wiedzę w ciekawy sposób.<br />
Wielkie ukłony w stroną organizatorów którzy stanęli powyżej postawionego sobie zadania, organizując w całości tak świetną imprezę. Mam nadzieje że w przyszłym roku również Oni popełnią kolejną edycje, przygotują ponownie ciekawe wykłady i zachęcą ludzi do przyjazdu.<br />
Może następnym razem jakiś wykład o wydajności, skalowalności ? Może jeśli nie słuchać to samemu wyłożyć ? Może przygotować ankietę &#8222;Jakie wykłady chcielibyście usłyszeć?&#8221;.<br />
Zdjęcia oraz materiały z prezentacji będziecie mogli pościągać z <a href="http://www.phpcon.pl">oficjalnej strony PHPCon</a> jak tylko się pojawią. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.sh4dow.pl/2010/05/phpcon-2010-czyli-spotkanie-entuzjastow-i-innych-stworzen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalator w php, plik samo rozpakowywujący</title>
		<link>http://www.sh4dow.pl/2009/08/instalator-w-php-plik-samo-rozpakowywujacy/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=instalator-w-php-plik-samo-rozpakowywujacy</link>
		<comments>http://www.sh4dow.pl/2009/08/instalator-w-php-plik-samo-rozpakowywujacy/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 10:02:01 +0000</pubDate>
		<dc:creator>Sh4dow</dc:creator>
				<category><![CDATA[C0ding...]]></category>
		<category><![CDATA[automat]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[skrypt]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://www.sh4dow.pl/?p=131</guid>
		<description><![CDATA[<a href="http://www.sh4dow.pl/2009/08/instalator-w-php-plik-samo-rozpakowywujacy/" title="Instalator w php, plik samo rozpakowywujący"></a>Trudno mi powiedzieć co to takiego jest, albo raczej jak to nazwać. Kto używa Linuksa spotyka czasami się z wersją instalatora w postaci pliku .sh który dużo waży jest skryptem ale z sporym bagażem. Wszystko ładnie po otwarciu pliku widoczny &#8230;<p class="read-more"><a href="http://www.sh4dow.pl/2009/08/instalator-w-php-plik-samo-rozpakowywujacy/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://www.sh4dow.pl/2009/08/instalator-w-php-plik-samo-rozpakowywujacy/" title="Instalator w php, plik samo rozpakowywujący"></a><p>Trudno mi powiedzieć co to takiego jest, albo raczej jak to nazwać. Kto używa Linuksa spotyka czasami się z wersją instalatora w postaci pliku .sh który dużo waży jest skryptem ale z sporym bagażem. Wszystko ładnie po otwarciu pliku widoczny jest rzeczywiście skrypt shell&#8217;a, ale jeśli przewiniemy wystarczająco nisko zobaczymy tam &#8222;krzaczki&#8221; czyli dane do rozpakowania.<br />
No więc tak właśnie mechanizm stworzyłem na własny i przy okazji służbowy użytek.<br />
<span id="more-131"></span><br />
Sama zasada działania jest prosta. Uruchamiany jest skrypt który Odczytuje sam siebie i rozpakowuje sam siebie. Niby nic trudnego, kwestia tylko przesunąć wskaźnik do miejsca gdzie zaczynają się dane do rozpakowania a kończy skrypt. Jedyne co trzeba zrobić to stworzyć taki plik. A do tego tez napiszemy automacik. Lubie automatyzować co tylko się da bo tak się żyje prościej (czasami) <img src='http://www.sh4dow.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Jako że wykorzystamy do tego rozszerzenie zlib możemy pakować pliki jeden za drugim, nie kompresujemy dużej ilości plików tylko każdy po kolei. Struktura pliku będzie wyglądać następująco:<br />
Skrypt >> ([10 bajtowy nagłówek z liczba określającą długość skompresowanego pliku] >> [skompresowany plik z pełną ścieżka i nazwą pliku] ) x Dowolną ilość razy >> [end] (znacznik kończący).<br />
Sam sens jest dość prosty. Najlepsze jest to że wielkość pliku nie wpłynie na ilość &#8222;pochłoniętej&#8221; pamięci, ponieważ na końcu skryptu &#8222;zabijamy&#8221; interpreter poprzez <strong><em>die()</em></strong> i zamykamy interpreter poprzez <strong><em>?&gt;</em></strong>.<br />
W pierwszym nagłówku można by się postarać o bardziej finezyjną formę ale w chwili obecnej chodzi mi raczej o prostotę rozwiązania. w pierwszych 10 bajtach jest jawna, nieskompresowana liczba, która określa jak ile należy przeczytać aby pobrać cały plik i go rozpakować. Nagłówek pliku jest dopełniany pustymi miejscami do 10 znaków. Po tych znakach od razu rozpoczyna się skompresowany plik. Po zakończeniu pliku Rozpoczyna się kolejny 10 bajtowy nagłówek a po nich kolejny plik i tak dopóki zamiast 10 bajtowego nagłówka pojawi się string &#8222;[end]&#8221; oznaczający po prostu koniec pliku.<br />
Aby wszystko działało musimy mieć dwa pliki wykonujące oraz katalog w którym znajdują się pliki do zainstalowania. Pierwszy plik wykonujący to skrypt rozpakowujący, ale bez danych o plikach. Taki powiedzmy szablon. który zostanie skopiowany, zmodyfikowany o pewna wartość a następnie dodany do niego &#8222;bagaż&#8221;.<br />
Drugi plik to ów automacik który wykona za nas całą brudną robotę pakowania i modyfikacji szablonu. Pierwszym krokiem jest oczywiście skopiowanie szablonu, obliczenie jego długości &#8222;na pusto&#8221; i zmodyfikowanie go tak, aby wiedział od którego miejsca zaczyna się pierwszy nagłówek.<br />
W szablonie zostawimy taka linijke</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$seek</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$xx</span><span style="color: #339933;">;</span></pre></div></div>

<p>Wstawione zmienna <strong>$xx</strong> jest unikalna i pojawia się tylko raz. Użyłem zmiennej a nie unikalnego &#8222;dziwnego&#8221; string&#8217;a aby edytor PHP nie pokazywał mi błędu. Wygodniej się wtedy pracuje. Oczywiście jeśli wielkość szablonu jest różny niż 3 cyfrowa liczba, to należy tą liczbę zmodyfikować, aby po dodaniu pokazywała na dobre miejsce. Dlaczego 3 cyfrowa ? Bo zastępuje ona 3 znakowy string oznaczający zmienną.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$desc</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'./init.php'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$size</span> <span style="color: #339933;">=</span> <span style="color: #990000;">filesize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$desc</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span>string<span style="color: #009900;">&#41;</span><span style="color: #000088;">$size</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #cc66cc;">3</span> <span style="color: #009900;">&#41;</span>  <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$size</span> <span style="color: #339933;">=</span>  <span style="color: #000088;">$size</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span>string<span style="color: #009900;">&#41;</span><span style="color: #000088;">$size</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$desc</span><span style="color: #339933;">,</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'$xx'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$size</span><span style="color: #339933;">,</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$desc</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Po zmodyfikowaniu szablonu, rozpoczynamy kompresje i doklejanie danych.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #990000;">gzcompress</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'__++__'</span><span style="color: #339933;">.</span><span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$filename</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">9</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #666666; font-style: italic;">// __++__ służy jako unikalny znak rozdzielający ścieżke pliku od jego zawartości</span>
<span style="color: #000088;">$size</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$size</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_pad</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$size</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$desc</span><span style="color: #339933;">,</span> <span style="color: #000088;">$size</span><span style="color: #339933;">.</span><span style="color: #000088;">$content</span><span style="color: #339933;">,</span> FILE_APPEND <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$desc</span><span style="color: #339933;">,</span> <span style="color: #990000;">str_pad</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'[end]'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> FILE_APPEND <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">chmod</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$desc</span><span style="color: #339933;">,</span> <span style="color: #208080;">0755</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Oczywiście unikalny string &#8222;__++__&#8221; można zastąpić innym lub też zmodyfikować nagłówek tak, aby pomieścił długość danych oraz nazwę pliku. Można by też to skompresować dla mniejszej ilości danych ale należy tak dobrać tak długość nagłówka aby na pewno pomieścił wszystkie dane. Co oczywiście przy dłuższych nazwach plików lub ogólnie dłuższych ścieżkach może komplikować sprawę.<br />
Może kiedyś zmodyfikuje żeby było bardziej <em>pro</em> <img src='http://www.sh4dow.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
To na tyle jesli chodzi o kompresje, zakończenie pliku oraz ustawienie prac do wykonania. Wszystko później ubierzemy w jakiś ładny Iteratorek Rekursywny po katalogu do tego jakaś pętelka i już jesteśmy w domu. Działające pliki oczywiście na samym dole wpisu.</p>
<p>A jak działa sam szablon ? To proste. Odczytuje wartość przesunięcia i zmienia pozycje wskaźnika do pliku i odczytuje 10 bajtów nagłówka.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$seek</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">786</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//przykładowa wartość </span>
<span style="color: #000088;">$end</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//flaga dla ostatniego pliku</span>
<span style="color: #000088;">$gz</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;.<span style="color: #006699; font-weight: bold;">$argv[0]</span>.&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;r&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//wywolanie pliku z lini polecen przekazuje nazwe pliku w 0 elemencie tablicy $argv</span>
<span style="color: #990000;">fseek</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$gz</span><span style="color: #339933;">,</span> <span style="color: #000088;">$seek</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//przesuwamy wskaźnik</span>
<span style="color: #000088;">$size</span> <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">fread</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$gz</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//czytamy 10 bajtów nagłówka</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$size</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'[end]'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>	<span style="color: #000088;">$end</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span> 	<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">//szukanie znacznika koncowego</span>
<span style="color: #000088;">$seek</span> <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// przesuwamy wartość o wielkość nagłówka</span></pre></div></div>

<p>Po wykonaniu tego kodu mamy już ilość danych do przeczytania oraz zmienna gdzie mamy wartosc do jakiej mamy przesunąć wskaźnik aby trafił na początek danych pliku.</p>
<p>No więc czas odczytać zawartość pliku oraz jego nazwę, zapisać na dysk i tak dalej.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">fseek</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$gz</span><span style="color: #339933;">,</span> <span style="color: #000088;">$seek</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//przesuwamy wskaźnik za nagłówek</span>
<span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #990000;">gzuncompress</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">fread</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$gz</span><span style="color: #339933;">,</span> <span style="color: #000088;">$size</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//odczytujemy dane i odrazu dekompresujemy</span>
<span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'__++__'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//rozdzielamy nazwe pliku i dane</span>
<span style="color: #666666; font-style: italic;">//sprawdzamy czy ewentualny katalog do pliku istnieje jesli nie to będziemy go tworzyć</span>
<span style="color: #000088;">$dir</span> <span style="color: #339933;">=</span> <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$dir</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #990000;">mkdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dir</span><span style="color: #339933;">,</span> <span style="color: #208080;">0755</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Directory <span style="color: #006699; font-weight: bold;">$dir</span> ... created<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">//sprawdzamy czy sam plik istnieje</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Error ! <span style="color: #006699; font-weight: bold;">$filename</span> allready exists !<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$filename</span> ... created<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">//przesuwamy wartość o wielkość odczytywanych danych, co powinno wskazywać na nagłówek następnego pliku</span>
<span style="color: #000088;">$seek</span> <span style="color: #339933;">+=</span> <span style="color: #000088;">$size</span><span style="color: #339933;">;</span></pre></div></div>

<p>I kolejny raz wystarczy ubrać wszystko w pętelke i wszystko będzie działać ładnie.</p>
<p>W obu skryptach można pokusić się o wiele udoskonaleń. Poprawić nagłówki aby trzymały, wielkość, nazwę pliku, jego uprawnienia. Dodatkowo szablon może sprawdzać wersje PHP czy posiada rozszerzenie &#8222;<strong>zlib</strong>&#8222;. W szale nudów można by stworzyć ładny wygląd przy rozpakowywaniu, jakiś <em>progress bar</em> albo nawet wizualizacje pod konsolą Linuksa w dodatku ncurses.<br />
Można stworzyć samo wyzwalacz po rozpakowaniu, powiedzmy ładujący baze danych czy cokolwiek innego.</p>
<p>Modyfikacje pozostawiam czytelnikom którzy przypadkiem trafili na tą stronę i się zgubili i trafili na koniec tego posta. Swoje modyfikacje zaprezentuje pewnie w późniejszym czasie.<br />
Poniżej w pełni działający szablon oraz &#8222;kompresor&#8221;.</p>
<p>Skrypt &#8222;Kompresora&#8221; (używam Linuksa więc dlatego ta pierwsza linijka, to tak jak by ktoś nie rozumiał)</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">#!/usr/bin/php
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$source</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'./szablon.php'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$desc</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'./setup.php'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$path</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'./script_dir/'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$desc</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #990000;">unlink</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$desc</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">copy</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$source</span><span style="color: #339933;">,</span> <span style="color: #000088;">$desc</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$size</span> <span style="color: #339933;">=</span> <span style="color: #990000;">filesize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$desc</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span>string<span style="color: #009900;">&#41;</span><span style="color: #000088;">$size</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #cc66cc;">3</span> <span style="color: #009900;">&#41;</span>  <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$size</span> <span style="color: #339933;">=</span>  <span style="color: #000088;">$size</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span>string<span style="color: #009900;">&#41;</span><span style="color: #000088;">$size</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$desc</span><span style="color: #339933;">,</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'$xx'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$size</span><span style="color: #339933;">,</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$desc</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #000088;">$dir</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RecursiveIteratorIterator<span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> RecursiveDirectoryIterator<span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> RecursiveIteratorIterator<span style="color: #339933;">::</span><span style="color: #004000;">SELF_FIRST</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$dir</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$file</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isDir</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$filename</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$path</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'./'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFilename</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">echo</span>  <span style="color: #000088;">$filename</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot; ... &quot;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #990000;">gzcompress</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'__++__'</span><span style="color: #339933;">.</span><span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFilename</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">9</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$size</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$size</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_pad</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$size</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$desc</span><span style="color: #339933;">,</span> <span style="color: #000088;">$size</span><span style="color: #339933;">.</span><span style="color: #000088;">$content</span><span style="color: #339933;">,</span> FILE_APPEND <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot; done<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$desc</span><span style="color: #339933;">,</span> <span style="color: #990000;">str_pad</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'[end]'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> FILE_APPEND <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">chmod</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$desc</span><span style="color: #339933;">,</span> <span style="color: #208080;">0755</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Plik Szablonu</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">#!/usr/bin/php
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000088;">$seek</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$xx</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$end</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$gz</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;.<span style="color: #006699; font-weight: bold;">$argv[0]</span>.&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;r&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$end</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #990000;">fseek</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$gz</span><span style="color: #339933;">,</span> <span style="color: #000088;">$seek</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$size</span> <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">fread</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$gz</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$size</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'[end]'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>	<span style="color: #000088;">$end</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span> 	<span style="color: #009900;">&#125;</span>
	<span style="color: #000088;">$seek</span> <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">fseek</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$gz</span><span style="color: #339933;">,</span> <span style="color: #000088;">$seek</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #990000;">gzuncompress</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">fread</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$gz</span><span style="color: #339933;">,</span> <span style="color: #000088;">$size</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'__++__'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$dir</span> <span style="color: #339933;">=</span> <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$dir</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">mkdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dir</span><span style="color: #339933;">,</span> <span style="color: #208080;">0755</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Directory <span style="color: #006699; font-weight: bold;">$dir</span> ... created<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Error ! <span style="color: #006699; font-weight: bold;">$filename</span> allready exists !<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'${nazwa_projektu}'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$projekt</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$filename</span> ... created<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000088;">$seek</span> <span style="color: #339933;">+=</span> <span style="color: #000088;">$size</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">gzclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$gz</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Finish !<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//pamietajcie zostawić enter na końcu szablonu !!!</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.sh4dow.pl/2009/08/instalator-w-php-plik-samo-rozpakowywujacy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zrób to sam, wydajne odczytywanie logów linia po linii czyli Log4nalyzer</title>
		<link>http://www.sh4dow.pl/2009/04/zrob-to-sam-wydajne-odczytywanie-logow-linia-po-linii-czyli-loganalyzer/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=zrob-to-sam-wydajne-odczytywanie-logow-linia-po-linii-czyli-loganalyzer</link>
		<comments>http://www.sh4dow.pl/2009/04/zrob-to-sam-wydajne-odczytywanie-logow-linia-po-linii-czyli-loganalyzer/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 13:12:54 +0000</pubDate>
		<dc:creator>Sh4dow</dc:creator>
				<category><![CDATA[C0ding...]]></category>
		<category><![CDATA[Zrób to sam]]></category>
		<category><![CDATA[apache log]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[skrypt]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://www.sh4dow.pl/?p=89</guid>
		<description><![CDATA[<a href="http://www.sh4dow.pl/2009/04/zrob-to-sam-wydajne-odczytywanie-logow-linia-po-linii-czyli-loganalyzer/" title="Zrób to sam, wydajne odczytywanie logów linia po linii czyli Log4nalyzer"></a>Na pewno sporo osób próbowało swoich sił w stworzeniu skryptu do zliczania odwiedzin na stronie na podstawie logów z Apache&#8217;a. W sumie nic trudnego, schemat logów jest w miarę prosty, odczytać i po sprawie. A jak wygląda sprawa przy plikach &#8230;<p class="read-more"><a href="http://www.sh4dow.pl/2009/04/zrob-to-sam-wydajne-odczytywanie-logow-linia-po-linii-czyli-loganalyzer/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://www.sh4dow.pl/2009/04/zrob-to-sam-wydajne-odczytywanie-logow-linia-po-linii-czyli-loganalyzer/" title="Zrób to sam, wydajne odczytywanie logów linia po linii czyli Log4nalyzer"></a><p>Na pewno sporo osób próbowało swoich sił w stworzeniu skryptu do zliczania odwiedzin na stronie na podstawie logów z Apache&#8217;a. W sumie nic trudnego, schemat logów jest w miarę prosty, odczytać i po sprawie. A jak wygląda sprawa przy plikach wielkości setek megabajtów lub gigabajtów ? Trzeba sprytnie to odczytywać linia po linii, przeanalizować i wywalić z pamięci. A jak mamy dwa lub więcej rdzeni w procesorze, to może by tak parę linii na raz analizować ?<span id="more-89"></span><br />
Sama zasada jest dość prosta. Odczytujemy mały blok pliku i wyszukujemy gdzie jest znak końca linii. Jeśli nie znajdujemy to doczytujemy jeszcze kawałek. Jeśli już znaleźliśmy to odcinamy nasz kawałek i po sprawie. Przy wyszukiwaniu usuwamy wszystkie znaki powrotu karetki, jak by się znalazł jakiś plik z &#8222;enterami&#8221; z Windowsa.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$tresc</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//definiujemy zmienna </span>
<span style="color: #000088;">$uchwyt</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'pliczek.log'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;rb&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$tresc</span> <span style="color: #339933;">.=</span> <span style="color: #990000;">fread</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$uchwyt</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">300</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//dopisujemy do zmiennej kawałek pliku</span>
<span style="color: #000088;">$tresc</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span>&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><span style="color: #000088;">$tresc</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$tresc</span><span style="color: #339933;">,</span> <span style="color: #990000;">chr</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//doczytujemy jeszcze kawalek i jeszcze raz szukamy i tak aż znajdziemy</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$strpos</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$tresc</span><span style="color: #339933;">,</span> <span style="color: #990000;">chr</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//znajdujemy pozycje entera</span>
    <span style="color: #000088;">$linia</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tresc</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$strpos</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//odcinamy interesujący nas odcinek</span>
    <span style="color: #000088;">$tresc</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tresc</span><span style="color: #339933;">,</span> <span style="color: #000088;">$strpos</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tresc</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//i usuwamy odcięty kawałek od pobranej treści wraz z enterem i zostawiamy do następnego odczytu</span>
   funkcjaAnalizujaca<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$linia</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//możemy coś zwracać lub nie, to jest obojętne.</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Oczywiście to trzeba ładnie ubrać w pętelkę gdzie będziemy się kręcić aż otrzymamy EOF (End Of File). Oczywiście można to wszystko ubrać w klasę, konfigurowalne zmienne, w dodatkowe zabawki typu zliczanie ilości linii, statystyka czasów analizy poszczególnych linii i inne wesołe rzeczy. Wszystkie takie rzeczy możecie podejrzeć w skrypcie który ja przygotowałem dla własnych celów, gdzie większość tych rzeczy jest już dodana. </p>
<p>Teraz apropo jednoczesnym przetwarzaniu więcej niż jednej linii jednocześnie. Niestety muszę zmartwić wielu z was, działa to jedynie pod systemami *unix oraz jedynie pod konsolą czyli wywoływane z linii poleceń. Windows oraz mod-php dla apache odpadają.  To już jest ograniczenie od strony php. Będziemy korzystać z modułu <a href="http://php.net/manual/en/intro.pcntl.php">Process Control</a>, który nie jest domyślnie kompilowany do PHP. Żeby nie było nieścisłości to nie jest wielowątkowość ale <a href="http://pl.wikipedia.org/wiki/Fork">fork</a> czyli rozwidlenie procesu. Główny skrypt który jest rodzicem, tworzy dziecko które jest jego kopią. U nas tylko dzieci będą analizować pojedyncze linie logów, a rodzic będzie starał się nad tym &#8222;przedszkolem&#8221; zapanować. Zasady działania forków nie będę tłumaczył, jest <a href="http://uk.php.net/manual/en/ref.pcntl.php">Manual</a>, jest <a href="http://pl.wikipedia.org/wiki/Fork">Wikipedia</a> no i <a href="http://www.google.pl/search?q=fork+in+php">Google</a>.<br />
Wiec ustalamy sobie maksymalną ilość dzieci. Niestety w zależności od sprzętu możecie zrobić ich więcej lub mniej. Musicie po testować różne ustawienia. Więc przykładowo będziemy pracowali z czwórką dzieci. Jako że procesy się nie komunikują między sobą wykorzystamy funkcję, która obsługuje otrzymane sygnały (<a href="http://uk.php.net/manual/en/function.pcntl-signal.php">pcntl_signal</a>) a dokładniej chodzi nam o sygnał zakończenia procesu dziecka czyli <strong>SIGCHLD</strong>. Przy tworzeniu dziecka powiększamy licznik o 1 a gdy otrzymamy sygnał zamknięcia pomniejszamy. W ten sposób jesteśmy w stanie jakoś zapanować nad tym wszystkim.  a oto przykład (brany gdzieś z manuala ale ten jest w miarę przejrzysty):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$child</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$max</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">function</span> sig_handler<span style="color: #009900;">&#40;</span><span style="color: #000088;">$signo</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$child</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//zmienna która trzyma ilość &quot;wyprodukowanych&quot; dzieci</span>
    <span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$signo</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">case</span> SIGCHLD<span style="color: #339933;">:</span>
            <span style="color: #339933;">--</span><span style="color: #000088;">$child</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//tutaj możemy obsługiwać inne sygnały jak na przykład zamkniecie głównego skryptu, lub dowolnie wybrane przez nas sygnały</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
pcntl_signal<span style="color: #009900;">&#40;</span>SIGCHLD<span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;sig_handler&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$a</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">20</span><span style="color: #339933;">;</span> <span style="color: #000088;">$a</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$child</span><span style="color: #339933;">++;</span>
	<span style="color: #000088;">$pid</span><span style="color: #339933;">=</span>pcntl_fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$pid</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Nie mozna zrobić dziecka&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$pid</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$child</span> <span style="color: #339933;">&gt;=</span> <span style="color: #000088;">$max</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Za dużo dzieci w przedszkolu <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
			pcntl_wait<span style="color: #009900;">&#40;</span><span style="color: #000088;">$status</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">sleep</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'./file.log'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.'</span><span style="color: #339933;">,</span> FILE_APPEND <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">//zadanie do wykonania</span>
		<span style="color: #666666; font-style: italic;">//dla przykładu wykonujemy zapis do pliku dla każdego dzieciaka, żeby pokazać że to naprawdę działa</span>
		<span style="color: #666666; font-style: italic;">// a sleep pokaże ze czasami w różnych kolejnościach będzie to wykonywane, ze względu na rożny czas wykonania zadania</span>
&nbsp;
		<span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Tyle mechanizmu, który czyta plik. Jeśli chodzi o analizę pliku to już zależy co my tam robimy. Jako że kiedyś przymierzałem się do jakiegoś dużego analizatora to wykombinowałem takie małe wyrażenie regularne. Znając życie albo posiada błędy albo można go jeszcze zoptymalizować. Może i kiedyś przy tym usiądę ale chyba nie dziś. A oto ten malutki tasiemiec.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) ([^\s]+) ([^\s]+) \[(\d{2}\/[a-zA-Z]{3}\/\d{4}:\d{2}:\d{2}:\d{2} [+|-]\d{4})\] &quot;(?:(POST|GET|PUT|DELETE|CONNECT|OPTIONS|HEAD|TRACE) ((?:http:\/\/|\/)?[^\s]*(?:\/[^\/\s]*)?) (HTTP\/\d\.\d))&quot; ([1-5]\d{2}) (-|\d+) &quot;([^&quot;]*)&quot; &quot;([^&quot;]*)&quot;/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$linia</span><span style="color: #339933;">,</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$calosc</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ip</span><span style="color: #339933;">,</span> <span style="color: #000088;">$niemampojecia</span><span style="color: #339933;">,</span> <span style="color: #000088;">$http_user</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #339933;">,</span> <span style="color: #000088;">$method</span><span style="color: #339933;">,</span> <span style="color: #000088;">$url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$http_protocol</span><span style="color: #339933;">,</span> <span style="color: #000088;">$http_code</span><span style="color: #339933;">,</span> <span style="color: #000088;">$transfer</span><span style="color: #339933;">,</span> <span style="color: #000088;">$referrer</span><span style="color: #339933;">,</span> <span style="color: #000088;">$user_agent</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$match</span><span style="color: #339933;">;</span></pre></div></div>

<p>Oczywiście można to po swojemu wykorzystać. Ja osobiście, najczęściej zliczam wykorzystany transfer przez daną domenę. A jeśli chcecie zobaczyć jak tą całą opowieść ubrałem w skrypt to zapraszam do ściągnięcia <a href='http://www.sh4dow.pl/files/2009/04/log4nalyzer06.tar.gz'>pliku</a> gdzie jest spakowany skrypt główny oraz przykładowe rozszerzenie do analizy logów &#8216;Combined&#8217; z Apache.<br />
Należy pamiętać, że skrypt który zlicza transfer z logów, nie powinien działać w trybie &#8222;pseudo-wielowątkowy&#8221;, ponieważ transfer jest zliczany w pamięci php, czyli jest zapisany w zmiennych. Jeśli ktoś ma ochotę to może przerobić tak skrypt aby zliczał transfer w pliku, w bazie danych lub innym zewnętrznym nośniku.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sh4dow.pl/2009/04/zrob-to-sam-wydajne-odczytywanie-logow-linia-po-linii-czyli-loganalyzer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zrób to sam, z nudów układamy css&#8217;a</title>
		<link>http://www.sh4dow.pl/2009/03/zrob-to-sam-z-nudow-ukladamy-cssa/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=zrob-to-sam-z-nudow-ukladamy-cssa</link>
		<comments>http://www.sh4dow.pl/2009/03/zrob-to-sam-z-nudow-ukladamy-cssa/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 12:33:25 +0000</pubDate>
		<dc:creator>Sh4dow</dc:creator>
				<category><![CDATA[C0ding...]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[parser]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://www.sh4dow.pl/?p=54</guid>
		<description><![CDATA[<a href="http://www.sh4dow.pl/2009/03/zrob-to-sam-z-nudow-ukladamy-cssa/" title="Zrób to sam, z nudów układamy css&#039;a"></a>Z nudów człowiek robi dziwne rzeczy. Jedną z nich jest parser dla plików CSS. Początkowo miał być to tokenizer który pozwoliłby na tworzenie różnego rodzaju narzędzi operujących na stylach CSS. Niestety po zapoznaniu się dokładnie ze strukturą CSS w wersji &#8230;<p class="read-more"><a href="http://www.sh4dow.pl/2009/03/zrob-to-sam-z-nudow-ukladamy-cssa/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://www.sh4dow.pl/2009/03/zrob-to-sam-z-nudow-ukladamy-cssa/" title="Zrób to sam, z nudów układamy css&#039;a"></a><p>Z nudów człowiek robi dziwne rzeczy. Jedną z nich jest parser dla plików CSS. Początkowo miał być to tokenizer który pozwoliłby na tworzenie różnego rodzaju narzędzi operujących na stylach CSS. Niestety po zapoznaniu się dokładnie ze <a href="http://www.w3.org/TR/CSS21/css2.txt">strukturą CSS w wersji 2.1</a> odkładam ten plan na bliżej nie określoną przyszłość. Ale na pewno napisze, bo może być to ciekawe doświadczenie.</p>
<p>Po co mi ten skrypt ? Bo czasami jak otrzymam od kogoś kawałek szablonu ze skryptami. To wygląda to jak pole po bitwie lub niekończące się tasiemce. Często w pracy grafik przysyła nam szablony pocięte do tego CSS gdzie każda klasa szablonu jest napisana w jednej linii, a do tego bardzo długiej. Ja preferuje zupełnie odmienny styl.<br />
<span id="more-54"></span><br />
Na początek musimy przeanalizować plik CSS. Wykorzystamy do tego proste wyrażenia regularne, które rozpoznają nam poszczególne części. Musimy rozpoznać 3 podstawowe rzeczy: Nazwę klasy wraz z jej &#8216;ciałem&#8217;, następnie z ów ciała musimy wyciągnąć atrybuty i ich wartości. Trzecią i ostatnią rzeczą są komentarze, które z mojego punktu widzenia są w ogóle niepotrzebne więc w tej wersji są po prostu usuwane.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* wyrazenie regularne do wyszukiwania klas */</span>
<span style="color: #000088;">$patern_main</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'~([\.|#]?[^{]*)[\s]*\{([^}]*)\}~i'</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">/* wyrazenie regularne do wyszukiwania atrybutow w klasach */</span>
<span style="color: #000088;">$patern_css</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'~([^\:\;\s]+)\s*:\s*([^\;\s]+)~i'</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">/* wyrazenie regularne do wyszukania i usuniecia komentarzy */</span>
<span style="color: #000088;">$patern_comments</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'~\/\*[^*]*\*+([^/*][^*]*\*+)*\/~i'</span><span style="color: #339933;">;</span></pre></div></div>

<p>Cała reszta jest już prosta. W pierwszej kolejności usuwamy wszystkie znaki nowej linii oraz tabulatory, a następnie pozbywamy się wszystkich komentarzy. czyli:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$css</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/sciezka/do/pliku.css'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$css</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$css</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">/* usuwanie komentarzy */</span>
<span style="color: #000088;">$css</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$patern_comments</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$css</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Tak obrobiony styl będziemy teraz przeszukiwać, korzystając z wyrażeń regularnych.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* wyszukiwanie klas */</span>
<span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$patern_main</span><span style="color: #339933;">,</span> <span style="color: #000088;">$css</span><span style="color: #339933;">,</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$css_array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">array_keys</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$css_match</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//czyscimy tablice w przypadku pustej klasy</span>
	<span style="color: #000088;">$css_body</span> <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$css_body</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">''</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//jesli definicja klasy jest pusta to ja opuszczamy</span>
		<span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$patern_css</span><span style="color: #339933;">,</span> <span style="color: #000088;">$css_body</span><span style="color: #339933;">,</span> <span style="color: #000088;">$css_match</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$css_array</span><span style="color: #009900;">&#91;</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_combine</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$css_match</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$css_match</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$css_array</span><span style="color: #009900;">&#91;</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>W ten sposób mamy już &#8222;rozłożony&#8221; styl CSS na czynniki pierwsze. Można by się pokusić oczywiście o sprawdzanie poprawności poszczególnych elementów i ich wartości. Ale sądzę że jest to raczej czysta formalność stworzyć słownik atrybutów oraz ich dopuszczalnych wartości.<br />
Drugim pomysłem może być powiedzmy analiza i wyszukanie powtarzających się klas lub też wielokrotne powtarzanie tych samych atrybutów wraz z wartościami w różnych klasach. Ale podejrzewam, że będzie to materiał na inny wpis.</p>
<p>Teraz może poukładamy wszystkie klasy na dwa sposoby, &#8222;tasiemiec&#8221; oraz &#8222;drzewko&#8221;. Żeby wyjaśnić różnice pokaże przykładzie.</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">body <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">white</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #933;">0px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">0px</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
<span style="color: #808080; font-style: italic;">/*lub*/</span>
body <span style="color: #00AA00;">&#123;</span> 
	<span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">white</span><span style="color: #00AA00;">;</span> 
	<span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #933;">0px</span><span style="color: #00AA00;">;</span> 
	<span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">0px</span><span style="color: #00AA00;">;</span> 
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Poniżej układamy CSS&#8217;a jeśli chcemy tasiemce zmienne <strong>$nl</strong> i <strong>$tab</strong> pozostawiamy puste lub też pozostawiamy tak jak teraz i mamy drzewka.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$nl</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$tab</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$string</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$css_array</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$klasa</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$body</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$string</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$klasa</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' {'</span><span style="color: #339933;">.</span><span style="color: #000088;">$nl</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$body</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$att</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$string</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$tab</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$att</span>: <span style="color: #006699; font-weight: bold;">$value</span>;&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$nl</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000088;">$string</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;}<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Oczywiście kod ma parę niedociągnięć. Nie obsługuje takich tagów jak <strong>import, charset</strong> ale może to kiedy indziej.<br />
Czy komuś się to przyda nie wiem, jak w tytule był robiony w chwili wolnego czasu. Będzie chociaż troche ładnie poukładane.</p>
<p>Kod poskładany w całość:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/sciezka/do/pliku.css'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$css</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$css</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$css</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* wyrazenie regularne do wyszukiwania klas */</span>
<span style="color: #000088;">$patern_main</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'~([\.|#]?[^{]*)[\s]*\{([^}]*)\}~i'</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">/* wyrazenie regularne do wyszukiwania atrybutow w klasach */</span>
<span style="color: #000088;">$patern_css</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'~([^\:\;\s]+)\s*:\s*([^\;\s]+)~i'</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">/* wyrazenie regularne do wyszukania i usuniecia komentarzy */</span>
<span style="color: #000088;">$patern_comments</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'~\/\*[^*]*\*+([^/*][^*]*\*+)*\/~i'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* usuwanie komentarzy */</span>
<span style="color: #000088;">$css</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$patern_comments</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$css</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* wyszukiwanie klas */</span>
<span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$patern_main</span><span style="color: #339933;">,</span> <span style="color: #000088;">$css</span><span style="color: #339933;">,</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$css_array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">array_keys</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$css_match</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//czyscimy tablice w przypadku pustej klasy</span>
	<span style="color: #000088;">$css_body</span> <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$css_body</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">''</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//jesli definicja klasy jest pusta to ja opuszczamy</span>
		<span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$patern_css</span><span style="color: #339933;">,</span> <span style="color: #000088;">$css_body</span><span style="color: #339933;">,</span> <span style="color: #000088;">$css_match</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$css_array</span><span style="color: #009900;">&#91;</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_combine</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$css_match</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$css_match</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$css_array</span><span style="color: #009900;">&#91;</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$nl</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$tab</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$string</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$css_array</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$klasa</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$body</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$string</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$klasa</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' {'</span><span style="color: #339933;">.</span><span style="color: #000088;">$nl</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$body</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$att</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$string</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$tab</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$att</span>: <span style="color: #006699; font-weight: bold;">$value</span>;&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$nl</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000088;">$string</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;}<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.sh4dow.pl/2009/03/zrob-to-sam-z-nudow-ukladamy-cssa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zrób to sam, __autoload</title>
		<link>http://www.sh4dow.pl/2009/02/zrob-to-sam-__autoload/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=zrob-to-sam-__autoload</link>
		<comments>http://www.sh4dow.pl/2009/02/zrob-to-sam-__autoload/#comments</comments>
		<pubDate>Sun, 15 Feb 2009 22:01:40 +0000</pubDate>
		<dc:creator>Sh4dow</dc:creator>
				<category><![CDATA[C0ding...]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://www.sh4dow.pl/?p=19</guid>
		<description><![CDATA[<a href="http://www.sh4dow.pl/2009/02/zrob-to-sam-__autoload/" title="Zrób to sam, __autoload"></a>Autoload w PHP istnieje od wersji 5.0. Bardzo przydatna &#8222;magiczna&#8221; funkcja, która potrafi zaoszczędzić trochę zasobów serwera. Ładuje pliki z klasą jedynie w czasie gdy jest ona potrzebna. Rozwiązań jest za pewne wiele, niektórzy przeszukują za każdym razem system plików &#8230;<p class="read-more"><a href="http://www.sh4dow.pl/2009/02/zrob-to-sam-__autoload/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://www.sh4dow.pl/2009/02/zrob-to-sam-__autoload/" title="Zrób to sam, __autoload"></a><p>Autoload w PHP istnieje od wersji 5.0. Bardzo przydatna &#8222;magiczna&#8221; funkcja, która potrafi zaoszczędzić trochę zasobów serwera. Ładuje pliki z klasą jedynie w czasie gdy jest ona potrzebna. Rozwiązań jest za pewne wiele, niektórzy przeszukują za każdym razem system plików za nazwą klasy, a niektórzy tworzą specjalne konstrukcje katalogów. Są też rozwiązania ze stworzeniem tablicy z nazwami klas i ścieżką do plików.<br />
I to rozwiązanie jest moim zdaniem najbardziej efektywne. Jedynym problemem jest tworzenie takiego pliku z tablicami. Oczywiście możemy ręcznie tworzyć tablice, to jest wersja dla najtwardszych. Innym sposobem jest oczywiście stworzenie prostego narzędzie do tworzenia takiej tablicy.<span id="more-19"></span></p>
<p>Pierwsza rzecz to musimy wyszukać wszystkie pliki jakie chcemy przeszukać.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$path</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'./'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$dir</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RecursiveIteratorIterator<span style="color: #009900;">&#40;</span>
    <span style="color: #000000; font-weight: bold;">new</span> RecursiveDirectoryIterator<span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> RecursiveIteratorIterator<span style="color: #339933;">::</span><span style="color: #004000;">SELF_FIRST</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dir</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//przetwarzanie plików</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>To nam pomoże przeszukać wszystkie pliki php w danym katalogu oraz jego podkatalogach. Jeśli ktoś używa na przykład skryptu <a href="http://smarty.net" target="_blank">Smarty</a>, to pojawia się dużo plików php które napewno nie posiadają żadnej klasy lub też katalogi .svn posiadające dużo plików, gdzie nie znajdziemy niczego nam potrzebnego. Przydało by się to odfiltrować. Np przykład tak:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isFile</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> 
    and <span style="color: #990000;">end</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'.'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFilename</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'php'</span> 
    and <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFilename</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'%'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span> 
    and <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFilename</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'.svn'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//dalsze przetwarzanie plików</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Pre-kompilowane szablony smarty posiadają znaki &#8216;%&#8217; więc takie pliki możemy odrzucić. Możemy się pokusić o odrzucenie plików z katalogu gdzie zapisywane są pliki smarty, ale w przypadku zmiany nazwy katalogu, trzeba by było modyfikować skrypt. Wszystkie pliki które posiadają w ścieżce fragment &#8216;.svn&#8217; także będziemy odrzucać, ponieważ na pewno tam nic nie znajdziemy.</p>
<p>Teraz przystąpimy do samego wyszukiwania klas w plikach. Skorzystamy  z wbudowanej funkcji w <a href="http://pl.php.net/manual/en/function.token-get-all.php">token_get_all</a>, która częściowo przetworzy nam kod PHP na <a href="http://pl.wikipedia.org/wiki/Jednostka_leksykalna">poziom leksykalny</a>, co znacząco ułatwi nam wyszukiwanie potrzebnych nam rzeczy. Zasadę może pokaże na przykładzie:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># przykładowa klasa
</span><span style="color: #666666; font-style: italic;"># &lt;?php
</span><span style="color: #666666; font-style: italic;"># class NazwaKlasy {
</span><span style="color: #666666; font-style: italic;">#     //tresc klasy
</span><span style="color: #666666; font-style: italic;"># }
</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">token_get_all</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;&lt;?php<span style="color: #000099; font-weight: bold;">\n</span> class NazwaKlasy {<span style="color: #000099; font-weight: bold;">\n</span> //treść klasy<span style="color: #000099; font-weight: bold;">\n</span> }&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Wynikiem będzie wyświetlenie tablicy 2 wymiarowej. W tym konkretnym przykładzie będzie posiadała ona 11 elementów na pierwszym poziomie. Każdy taki element opisuje pojedynczą jednostkę leksykalną. Listę takich jednostek znajdziecie w <a href="http://pl.php.net/manual/en/tokens.php">dokumentacji PHP</a>. Jak znaleźć nazwę klasy. Każdy znaleziony element jest albo string&#8217;iem dla znaków takich jak ( &#8216;{&#8216;, &#8216;}&#8217;, &#8216;;&#8217;, &#8216;.&#8217;, &#8216;>&#8217;, itp.) lub tablicą 3 elementów. Pojedyncze znaki nas nie interesują, więc szukamy tablic. A dokładniej ułożenia kolejnych 3 elementów. Pierwsze to słowo kluczowe &#8216;class&#8217; (token T_CLASS), następnie odstęp (white space, token T_WHITESPACE) a na końcu ciąg znaków ( token T_STRING ). I właśnie ten ostatni element w połączeniu z nazwą i ścieżką pliku potrzebny. Więc przetworzenie pliku będzie wyglądać mniej więcej tak:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$tokens</span> <span style="color: #339933;">=</span> <span style="color: #990000;">token_get_all</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFilename</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//odczytujemy plik i przetwarzamy</span>
<span style="color: #000088;">$count</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tokens</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//zliczamy ilość elementów, poprostu optymalizacja dla pętli</span>
<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$a</span><span style="color: #339933;">&lt;</span><span style="color: #000088;">$count</span><span style="color: #339933;">;</span><span style="color: #000088;">$a</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">is_numeric</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$tokens</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//sprawdzamy czy element jest opisany tablicą</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$tokens</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> T_CLASS and <span style="color: #000088;">$tokens</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$a</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> T_WHITESPACE and <span style="color: #000088;">$tokens</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$a</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> T_STRING <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//spełnienie warunku dla kolejnych trzech elementów</span>
            <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$klasy</span><span style="color: #009900;">&#91;</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$tokens</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$a</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//sprawdzenie czy nie istnieją duplikaty klas.</span>
                <span style="color: #000088;">$double</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$tokens</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$a</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFilename</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$klasy</span><span style="color: #009900;">&#91;</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$tokens</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$a</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$file</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//tworzenie tablicy ze ścieżkami do plików oraz nazwami klas</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Teraz pozostaje nam tylko otrzymaną tablice zapisać do pliku php. Co chyba nikomu nie sprawi problemu:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'autoload.array.php'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&lt;?php<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$klasy</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$class</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$file</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">//zapisujemy skrócone ścieżki od aktualnego katalogu w górę</span>
	<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'autoload.array.php'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'$autoload[\''</span><span style="color: #339933;">.</span><span style="color: #000088;">$class</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'\'] = \''</span><span style="color: #339933;">.</span><span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">getcwd</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'.'</span><span style="color: #339933;">,</span> <span style="color: #990000;">realpath</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'\';'</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> FILE_APPEND<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>W całości będzie to wyglądać mniej więcej tak:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">set_time_limit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$klasa</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$path</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'./'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$dir</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RecursiveIteratorIterator<span style="color: #009900;">&#40;</span>
    <span style="color: #000000; font-weight: bold;">new</span> RecursiveDirectoryIterator<span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> RecursiveIteratorIterator<span style="color: #339933;">::</span><span style="color: #004000;">SELF_FIRST</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//przetwarzanie plików</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dir</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isFile</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> and <span style="color: #990000;">end</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'.'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFilename</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'php'</span> and <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFilename</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'%'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span> and <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFilename</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'.svn'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$tokens</span> <span style="color: #339933;">=</span> <span style="color: #990000;">token_get_all</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFilename</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$count</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tokens</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$a</span><span style="color: #339933;">&lt;</span><span style="color: #000088;">$count</span><span style="color: #339933;">;</span><span style="color: #000088;">$a</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">is_numeric</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$tokens</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$tokens</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> T_CLASS and <span style="color: #000088;">$tokens</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$a</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> T_WHITESPACE and <span style="color: #000088;">$tokens</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$a</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> T_STRING <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$klasy</span><span style="color: #009900;">&#91;</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$tokens</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$a</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #000088;">$double</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$tokens</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$a</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFilename</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #000088;">$klasy</span><span style="color: #009900;">&#91;</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$tokens</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$a</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$file</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//budowanie pliku z tablicą</span>
<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'autoload.array.php'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&lt;?php<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$klasy</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$class</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$file</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'autoload.array.php'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'$autoload[\''</span><span style="color: #339933;">.</span><span style="color: #000088;">$class</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'\'] = \''</span><span style="color: #339933;">.</span><span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">getcwd</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'.'</span><span style="color: #339933;">,</span> <span style="color: #990000;">realpath</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'\';'</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> FILE_APPEND<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Na początku przydaje się dodać set_time_limit() na zero ponieważ przy dużych plikach oraz przy dużej ich ilości cała operacja może chwilkę potrwać. Należy pamiętać, że po dodaniu nowej klasy, przydałoby się uruchomić skrypt ponownie, aby dodał nową klase do tablicy.<br />
Teraz pozostaje nam stworzyć jedynie funkcje __autoload, która będzie korzystać z naszej tablicy.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$autoload</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">function</span> __autoload<span style="color: #009900;">&#40;</span><span style="color: #000088;">$class_name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	static <span style="color: #000088;">$autoload</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">include_once</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'./autoload.array.php'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$autoload</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$class_name</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">include_once</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$autoload</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$class_name</span> <span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>I mamy gotową całą funkcjonalność autoload. Możemy ją poszerzyć o zliczanie ilości plików lub klas, czas wykonywania lub inne mniej lub bardziej przydatne informacje. Wszystko zależy od waszych potrzeb.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sh4dow.pl/2009/02/zrob-to-sam-__autoload/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Kolorowanie konsoli i nie tylko</title>
		<link>http://www.sh4dow.pl/2009/01/kolorowanie-konsoli-i-nie-tylko/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kolorowanie-konsoli-i-nie-tylko</link>
		<comments>http://www.sh4dow.pl/2009/01/kolorowanie-konsoli-i-nie-tylko/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 12:44:31 +0000</pubDate>
		<dc:creator>Sh4dow</dc:creator>
				<category><![CDATA[C0ding...]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://www.sh4dow.pl/?p=8</guid>
		<description><![CDATA[<a href="http://www.sh4dow.pl/2009/01/kolorowanie-konsoli-i-nie-tylko/" title="Kolorowanie konsoli i nie tylko"></a>Jak każdy programista przychodzi czas na to by ułatwić sobie pracę, piszemy dziesiątki albo i setki małych lub większych narzędzi. W 90% przypadków używamy &#8216;echo&#8217; lub &#8216;print&#8217; zamiast systemu szablonów i jest to chyba dość oczywiste. Najnormalniej w świecie jest &#8230;<p class="read-more"><a href="http://www.sh4dow.pl/2009/01/kolorowanie-konsoli-i-nie-tylko/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://www.sh4dow.pl/2009/01/kolorowanie-konsoli-i-nie-tylko/" title="Kolorowanie konsoli i nie tylko"></a><p>Jak każdy programista przychodzi czas na to by ułatwić sobie pracę, piszemy dziesiątki albo i setki małych lub większych narzędzi. W 90% przypadków używamy &#8216;echo&#8217; lub &#8216;print&#8217; zamiast systemu szablonów i jest to chyba dość oczywiste. Najnormalniej w świecie jest to zbędne i szkoda na to czasu.<br />
Ale czemu rezygnować z jakiegoś ładnego formatu, zaznaczenia ważnych rzeczy lub błędów które pojawiły się podczas pracy. W HTML&#8217;u nie jest to trudne, użycie stylu nadanie mu koloru czcionki i po sprawie. Sprawa może wyglądać trochę gorzej jeśli (np. tak jak ja) robicie małe skrypty odpalane pod konsolą Linuksa. Tak zazwyczaj tekst jest zawsze biały, a tło czarne. Kolorowanie tekstu pod konsolą jest stosunkowo proste. Trzeba jedynie pamiętać o tym, aby po wyświetleniu treści przywrócić kolor do swojej pierwotnej postaci.<br />
<span id="more-8"></span><br />
Format kolorowania tekstu jest dość prosty, składa się ze znaku specjalnego ESCAPE, oraz definicji kolorów. Aby otrzymać znać ESCAPE użyjemy jego zapisu ósemkowego (Wartość <em>\033</em>, zapisana jako &#8216;<em>\033</em>&#8216;), zupełnie tak samo jak w konsoli Linuksa oraz funkcji echo. Nastepnie po znaku &#8216;[&#8216; może występować do trzech wartości określających fomat tekstu, wszystkie oddzielane od siebie znakiem średnika &#8216;;&#8217;. Cały kod zakańczamy literą &#8216;m&#8217;. W całości kod tworzony jest na takiej zasadzie.</p>
<pre>\033[<strong>kod_formatujący</strong>;<strong>kod_koloru</strong>;<strong>kod_tła</strong>m</pre>
<p>przykład: <code>\033[1;31mCzerwony gruby napis\033[0m</code><br />
otrzymamy taką treść <code><strong><span style="color:red;">Czerwony gruby napis</span></strong></code><br />
Oczywiście nie musimy na końcu dawać kodu &#8216;\033[0m&#8217; ale cała konsola będzie wyświetlać jedynie czerwoną pogrubioną czcionkę do czasu aż zostanie ona zamknięta lub otrzyma kod resetujący ustawienia.<br />
Poniżej podaje listę kodów które można wykorzystać do formatowania konsoli.<br />
Kody formatujące</p>
<ul>
<li>0 &#8211; resetuje wszystkie ustawienia</li>
<li>1 &#8211; pogrubiona</li>
<li>2 &#8211; przyciemniona czcionka</li>
<li>4 &#8211; podkreślona</li>
<li>5 &#8211; mrugająca</li>
<li>7 &#8211; zamienia miejscami kolor czcionki i tła</li>
</ul>
<p>Kody kolorów czcionki</p>
<ul>
<li>30 &#8211; czarny</li>
<li>31 &#8211; czerwony</li>
<li>32 &#8211; zielony</li>
<li>33 &#8211; brązowy</li>
<li>34 &#8211; niebieski</li>
<li>35 &#8211; magenta</li>
<li>36 &#8211; turkusowy</li>
<li>37 &#8211; biały</li>
</ul>
<p>Kody kolorów tła</p>
<ul>
<li>40 &#8211; czarny</li>
<li>41 &#8211; czerwony</li>
<li>42 &#8211; zielony</li>
<li>43 &#8211; brązowy</li>
<li>44 &#8211; niebieski</li>
<li>45 &#8211; magenta</li>
<li>46 &#8211; turkusowy</li>
<li>47 &#8211; biały</li>
</ul>
<p>Poniżej podaje przykład jak zastosować to praktycznie w kodzie PHP. Szczerze mówiąc jest to jedynie wycinek który wykorzystuje w swoich klasach, można to oczywiście zamienić na normalną funkcję. Używana przeze mnie metoda używana jest aby wyświetlać pokolorowaną treść w konsoli oraz w przeglądarce. Równie dobrze można by zdefiniować wszystkie kolory tła i format czcionek, ale podejrzewam, że każdy może to zmodyfikować w swoim zakresie.</p>
<p>Przykładowa klasa <a href="http://www.sh4dow.pl/code/Display.phps">Display</a> której sam używam.</p>
<p>bibliografia:<br />
<a href="http://www.newlinuxuser.com/linux-console-codes/">http://www.newlinuxuser.com/linux-console-codes/</a><br />
<a href="http://www.linux.gr/cgi-bin/man2html?console_codes+4">http://www.linux.gr/cgi-bin/man2html?console_codes+4</a><br />
oraz wielkie <a href="http://www.google.com">Google</a> <img src='http://www.sh4dow.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.sh4dow.pl/2009/01/kolorowanie-konsoli-i-nie-tylko/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
