<?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>Aiv&#039;s dev blog &#187; Programowanie</title>
	<atom:link href="http://aiv-dev.info/category/programowanie/feed/" rel="self" type="application/rss+xml" />
	<link>http://aiv-dev.info</link>
	<description>Ciekawostki programistyczne i tematy związane z bezpieczeństwem</description>
	<lastBuildDate>Sat, 09 Jan 2010 16:48:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Zend Studio 7.0 &#8211; praca zdalna</title>
		<link>http://aiv-dev.info/2009/08/27/zend-studio-7-0-praca-zdalna/</link>
		<comments>http://aiv-dev.info/2009/08/27/zend-studio-7-0-praca-zdalna/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 20:19:04 +0000</pubDate>
		<dc:creator>Mariusz Dalewski</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[zend studio]]></category>

		<guid isPermaLink="false">http://aiv-dev.info/?p=106</guid>
		<description><![CDATA[Programując w PHP od wielu lat, odczuwam potrzebę posiadania edytora, który rzeczywiście ułatwi mi pracę wykonywaną na co dzień. Od środowiska programistycznego można oczekiwać naprawdę dużo, ale ja wiele nie wymagam. Podstawowe funkcje jakie powinien zapewnić mi edytor:
- szybkość
- praca na zdalnym FTP
- kolorowanie kodu
- jakiekolwiek skróty klawiaturowe ułatwiające obsługę programu.
Wszystkie te funkcje od ponad [...]]]></description>
		    		<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-107" style="margin: 5px;" title="zend7" src="http://aiv-dev.info/wp-content/uploads/2009/08/zend7.jpg" alt="zend7" width="169" height="150" />Programując w PHP od wielu lat, odczuwam potrzebę posiadania edytora, który rzeczywiście ułatwi mi pracę wykonywaną na co dzień. Od środowiska programistycznego można oczekiwać naprawdę dużo, ale ja wiele nie wymagam. Podstawowe funkcje jakie powinien zapewnić mi edytor:<br />
- szybkość<br />
- praca na zdalnym FTP<br />
- kolorowanie kodu<br />
- jakiekolwiek skróty klawiaturowe ułatwiające obsługę programu.</p>
<p>Wszystkie te funkcje od ponad 10 lat zawiera program <strong>EditPlus</strong> którego używam na co dzień.</p>
<p>Prócz PHP programuje w kilku innych językach, gdzie używam często środowiska opartego o Eclipse, bądź innych rozbudowanych IDE. Dlatego też, raz na jakiś czas wpadam na genialny pomysł żeby odstawić EditPlus&#8217;a i poszukać godnego następcy. Wybór zazwyczaj pada na najnowsze wersje najpopularniejszych IDE (np: <strong>PDT</strong>,<strong> Zend Studio</strong> i inne).<span id="more-106"></span><!--feed--><br />
Dzisiaj pobrałem <strong>Zend Studio 7.0</strong>. Pierwsze co zrobiłem po zainstalowaniu to testy funkcji na zakładce &#8220;<strong>Remote Systems</strong>&#8220;. Zapowiada się bardzo ciekawie, bo wśród zdalnych systemów znajdziemy <strong>FTP</strong>, <strong>SSH</strong>, telnet, coś o magicznej nazwie Linux, Unix, Windows.</p>
<p>Po skonfigurowaniu konta <strong>FTP</strong>, wchodzę sobie do katalogu zawierającego średniej wielkości projekt (z dużą ilością obrazków z systemu newsowego) i eksportuje go do projektu w Zend Studio. Eksport taki trwa około 30 minut. Zend biega po całym FTP i zapisuje sobie jego strukturę. Dodam tylko, że z powodzeniem wykluczyć mogę problemy z serwerem czy łączem.</p>
<p>Po wyeksportowaniu projektu (poprzez opcje &#8220;<strong>Create remote Project</strong>&#8220;) okazuje się, że Zend nie potrafi uzupełniać najprostszych funkcji (np: mysql_*). Pomyślałem, że może musi sobie całość przeparsować i to może trochę potrwać. Oczywiście to było bardzo naiwne z mojej strony. Z jednoplikowym projektem sytuacja wygląda tak samo.</p>
<p>Stwierdziłem, że skasuje mój &#8220;Remote project&#8221; i zrobię go od nowa &#8211; może czegoś nie zaznaczyłem itd. Podczas kasowania projektu (PPM na nazwie w oknie &#8220;PHP Explorer&#8221; &gt; Delete) widzimy tradycyjne okienko z Eclipse z informacją &#8220;<strong>Delete project contents on disk (cannot be undone)</strong>&#8220;, a pod tym między innymi przycisk &#8220;<strong>Preview</strong>&#8220;. Kliknąłem &#8220;<strong>Preview</strong>&#8221; żeby zobaczyć co zostanie skasowane (bez zaznaczonego ww. checkboxa) i czekam, czekam, czekam &#8230; czekam. Widzę, że Zend znowu biega po całym ftpie, i jak już skończył (kilkanaście minut) to pokazało się &#8220;No preview available&#8221;. Myśląc, że to już koniec niespodzianek z Zend&#8217;em klikam &#8220;Ok&#8221; (nadal ww. checkbox nie zaznaczony), a Zend zaczyna kasować całą zawartość na serwerze &#8211; po prostu genialnie. Pozwoliłem mu dokończyć dzieła (15 minut). Ciekawe co by zrobił gdybym jednak kazał mu skasować ten projekt lokalny.</p>
<p>Kolejną ciekawostką, którą zaobserwowałem pisząc ten tekst jest fakt, iż Zend bardzo lubi sobie ciągle rozmawiać z naszym FTP. Dodałem do lokalnego projektu jeden plik zdalny. Plik ten ma już poprawne uzupełnianie kodu, a więc rozwiązało to mój poprzednie problem z projektami zdalnymi. Podczas pisania w tym pliku wyrazu &#8220;mysql&#8221; Zend wydał serwerowi ponad 40 komend. Co chwila wysyła NOOP, CWD na katalog w którym niezmiennie się znajduje i LIST -a. Nie ma to jak optymalizacja &#8230;</p>
<p>Podsumowując, nie chciał bym tutaj zrażać do tego typu oprogramowania. Sam doceniam bardzo porządne uzupełnianie składni, debugging i profiling i inne opcje Zend Studio. Niestety Zend od dawien dawna nie potrafi opracować dobrego modelu pracy zdalnej &#8211; modelu w którym nie trzeba mieć na własnym komputerze serwera http, bazy danych i innych dodatków.</p>
]]></content:encoded>
	    			<wfw:commentRss>http://aiv-dev.info/2009/08/27/zend-studio-7-0-praca-zdalna/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Współpraca Zend i Adobe</title>
		<link>http://aiv-dev.info/2008/09/18/wspolpraca-zend-i-adobe/</link>
		<comments>http://aiv-dev.info/2008/09/18/wspolpraca-zend-i-adobe/#comments</comments>
		<pubDate>Thu, 18 Sep 2008 11:41:55 +0000</pubDate>
		<dc:creator>Mariusz Dalewski</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://aiv-dev.info/?p=22</guid>
		<description><![CDATA[Przedstawiciele Zend i Adobe ogłosili nawiązanie współpracy w zakresie integracji Zend Framework i narzędzi związanych z technologią Flex. Efektem ich pracy ma być wypracowanie i dostarczenie developerem RIA narzędzi integracyjnych z platformą Zend.
Być może na rynku aplikacji integracyjnych prócz Weborb i AMFPHP wkrótce pojawi się rozwiązanie z Zend Framework.
Zobacz więcej na temat współpracy Zend i [...]]]></description>
		    		<content:encoded><![CDATA[<p>Przedstawiciele Zend i Adobe ogłosili nawiązanie współpracy w zakresie integracji Zend Framework i narzędzi związanych z technologią Flex. Efektem ich pracy ma być wypracowanie i dostarczenie developerem RIA narzędzi integracyjnych z platformą Zend.<!--feed--><span id="more-22"></span></p>
<p>Być może na rynku aplikacji integracyjnych prócz <a href="http://www.themidnightcoders.com/weborb/php/" target="_blank">Weborb</a> i <a href="http://www.amfphp.org/" target="_blank">AMFPHP</a> wkrótce pojawi się rozwiązanie z Zend Framework.</p>
<p><a href="http://www.zend.com/en/company/news/press/zend-to-collaborate-with-adobe" target="_blank">Zobacz więcej na temat współpracy Zend i Adobe</a></p>
]]></content:encoded>
	    			<wfw:commentRss>http://aiv-dev.info/2008/09/18/wspolpraca-zend-i-adobe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Framework 1.6 wydany</title>
		<link>http://aiv-dev.info/2008/09/04/zend-framework-1-6-wydany/</link>
		<comments>http://aiv-dev.info/2008/09/04/zend-framework-1-6-wydany/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 11:38:27 +0000</pubDate>
		<dc:creator>Mariusz Dalewski</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://aiv-dev.info/?p=17</guid>
		<description><![CDATA[W dniu dzisiejszym światło dzienne ujrzała finalna wersja Zend Framework w wersji 1.6.
Jest sporo nowości w stosunku do poprzedniej finalnej wersji. Można o nich posłuchać z ust managera Zend Framework Tram:

Linki:
Pobierz Zend Framework 1.6
News mówiący o przyczynach nawiązania współpracy właśnie z Dojo
]]></description>
		    		<content:encoded><![CDATA[<p>W dniu dzisiejszym światło dzienne ujrzała finalna wersja Zend Framework w wersji 1.6.</p>
<p>Jest sporo nowości w stosunku do poprzedniej finalnej wersji. Można o nich posłuchać z ust managera Zend Framework Tram:<!--feed--><span id="more-17"></span></p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="src" value="http://www.youtube.com/v/wozzrJRqD0Y&amp;hl=en&amp;fs=1" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/wozzrJRqD0Y&amp;hl=en&amp;fs=1" allowfullscreen="true"></embed></object></p>
<p>Linki:<br />
<a href="http://framework.zend.com/download/latest">Pobierz Zend Framework 1.6</a><br />
<a href="http://framework.zend.com/announcements/2008-09-03-dojo">News mówiący o przyczynach nawiązania współpracy właśnie z Dojo</a></p>
]]></content:encoded>
	    			<wfw:commentRss>http://aiv-dev.info/2008/09/04/zend-framework-1-6-wydany/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nowa wersja PHP &#8211; 4.4.8</title>
		<link>http://aiv-dev.info/2008/01/04/nowa-wersja-php4/</link>
		<comments>http://aiv-dev.info/2008/01/04/nowa-wersja-php4/#comments</comments>
		<pubDate>Fri, 04 Jan 2008 17:36:14 +0000</pubDate>
		<dc:creator>Mariusz Dalewski</dc:creator>
				<category><![CDATA[Bezpieczeństwo]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php4]]></category>

		<guid isPermaLink="false">http://aiv-dev.info/2008/01/04/nowa-wersja-php-448/</guid>
		<description><![CDATA[W dniu wczorajszym (3.I.2008) ukazała się nowa wersja PHP z serii 4 oznaczona numerem 4.4.8. Jako iż drzewo PHP4 nie jest już rozwijane, są to istotne poprawki wraz z zaleceniem natychmiastowej aktualizacji. Oto lista wprowadzonych modyfikacji:

Improved fix for MOPB-02-2007.
Fixed an integer overflow inside chunk_split(). Identified by Gerhard Wagner.
Fixed integer overlow in str[c]spn().
Fixed regression in glob [...]]]></description>
		    		<content:encoded><![CDATA[<p>W dniu wczorajszym (3.I.2008) ukazała się nowa wersja PHP z serii 4 oznaczona numerem 4.4.8. Jako iż drzewo PHP4 nie jest już rozwijane, są to istotne poprawki wraz z zaleceniem <strong>natychmiastowej aktualizacji</strong>. Oto lista wprowadzonych modyfikacji:<!--feed--><span id="more-15"></span></p>
<ul>
<li>Improved fix for MOPB-02-2007.</li>
<li>Fixed an integer overflow inside chunk_split(). Identified by Gerhard Wagner.</li>
<li>Fixed integer overlow in str[c]spn().</li>
<li>Fixed regression in glob when open_basedir is on introduced by #41655 fix.</li>
<li>Fixed money_format() not to accept multiple %i or %n tokens.</li>
<li>Addded &#8220;max_input_nesting_level&#8221; php.ini option to limit nesting level of input variables. Fix for MOPB-03-2007.</li>
<li>Fixed INFILE LOCAL option handling with MySQL &#8211; now not allowed when open_basedir or safe_mode is active.</li>
<li>Fixed session.save_path and error_log values to be checked against open_basedir and safe_mode (CVE-2007-3378).</li>
<li>Fixed bug #43010 (Fixed regression in imagearc with two equivelent angles).</li>
<li>Fixed bug #41765 (Recode crashes/does not work on amd64).</li>
<li>Fixed bug #41630 (segfault when an invalid color index is present in the image data).</li>
<li>Fixed bug #41628 (PHP settings leak between Virtual Hosts in Apache 1.3).</li>
<li>Fixed bug #38798 (OpenSSL init corrected in php5 but not in php4).</li>
</ul>
<p>Większość z ww. modyfikacji ma istotny <strong>wpływ na bezpieczeństwo środowiska</strong> w którym się znajduje.</p>
]]></content:encoded>
	    			<wfw:commentRss>http://aiv-dev.info/2008/01/04/nowa-wersja-php4/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Konfiguracja Apache + FastCGI + SuExec + PHP 4/5 + kilka innych rozwiązań</title>
		<link>http://aiv-dev.info/2007/12/30/konfiguracja-apache-fastcgi-suexec-php-4-5-kilka-innych-rozwiazan/</link>
		<comments>http://aiv-dev.info/2007/12/30/konfiguracja-apache-fastcgi-suexec-php-4-5-kilka-innych-rozwiazan/#comments</comments>
		<pubDate>Sun, 30 Dec 2007 15:45:38 +0000</pubDate>
		<dc:creator>Mariusz Dalewski</dc:creator>
				<category><![CDATA[Administracja]]></category>
		<category><![CDATA[Bezpieczeństwo]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[fastcgi]]></category>
		<category><![CDATA[php.ini]]></category>
		<category><![CDATA[php4]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[suexec]]></category>

		<guid isPermaLink="false">http://aiv-dev.info/2007/12/30/konfiguracja-apache-fastcgi-suexec-php-45-kilka-innych-rozwiazan/</guid>
		<description><![CDATA[Postanowiłem na własne potrzeby stworzyć pewien szablon konfiguracji PHP opartej o Apache. Podstawowym celem było bezpieczeństwo rozwiązania, a jak udało mi się to zrealizować &#8211; życie pokaże. W prezentowanych przykładach pominąłem większość parametrów konfiguracyjnych, a więc podczas tworzenia własnego środowiska na bazie niniejszego artykuły zalecam dostosowanie ich do własnych potrzeb.
Na potrzeby niniejszej konfiguracji użyłem:

Linux Slackware [...]]]></description>
		    		<content:encoded><![CDATA[<p>Postanowiłem na własne potrzeby stworzyć pewien szablon konfiguracji PHP opartej o Apache. Podstawowym celem było bezpieczeństwo rozwiązania, a jak udało mi się to zrealizować &#8211; życie pokaże. W prezentowanych przykładach pominąłem większość parametrów konfiguracyjnych, a więc podczas tworzenia własnego środowiska na bazie niniejszego artykuły zalecam dostosowanie ich do własnych potrzeb.</p>
<h4>Na potrzeby niniejszej konfiguracji użyłem:</h4>
<ul>
<li>Linux Slackware w wersji 12. Starałem się nie używać ustawień i pakietów pochodzących z dystrybucji, żeby rozwiązanie było jak najbardziej uniwersalne</li>
<li>Apache w wersji 2.2.6</li>
<li>FastCGI w wersji 2.4.6</li>
<li>PHP w wersji 4.4.7 i 5.2.5</li>
</ul>
<h4>Przyjąłem również kilka założeń:</h4>
<ul>
<li>Skrypty PHP powinny być uruchamiane w zamkniętym środowisku (np: chroot() albo open_basedir())</li>
<li>Skrypty PHP powinny być uruchamiane z uprawnieniami właściciela pliku/virtualhosta</li>
<li>Każdy użytkownik powinien mieć indywidualny folder tmp i folder przechowywania plików sesji</li>
<li>Każdy użytkownik sam może wybrać wersji PHP</li>
<li>Dla każdego virtualhosta powinien istnieć oddzielny plik php.ini</li>
<li>Tworzone rozwiązanie powinno być jak najbardziej uniwersalne. Jednocześnie powinno oferować administratorowi wygodę zarządzania</li>
</ul>
<p><!--feed--><span id="more-14"></span></p>
<h3>Instalacja Apache:</h3>
<p>Apache wraz z modułem suexec potrafi uruchamiać skrypty CGI z uprawnieniami użytkownika. Model bezpieczeństwa suexec <strong>wymaga deklarowania zmiennych środowiskowych</strong>, które mają być przekazywane do CGI. Większość zmiennych środowiskowych np.: REQUEST_URL, DOCUMENT_ROOT itp. są wpisane na stałe do pliku support/suexec.c, jednak <strong>brakuje tam zmiennych dla PHP</strong>, które pomagają mu współpracować z modułem FastCGI. Musimy je ręcznie dopisać, a więc otwieramy plik <strong>support/suexec.c</strong> w ulubionym edytorze tekstowym i znajdujemy kod:</p>
<textarea name="code" class="c:firstline[94]" cols="50" rows="10">
static const char *const safe_env_lst[] =
{
/* variable name starts with */
"HTTP_",
"SSL_",

/* variable name is */
"AUTH_TYPE=",
"CONTENT_LENGTH=",
"CONTENT_TYPE=",
"DATE_GMT=",
"DATE_LOCAL=",
"DOCUMENT_NAME=",
"DOCUMENT_PATH_INFO=",
"DOCUMENT_ROOT=",
</textarea>
<p>Dopisujemy przed linijką zawierającą AUTH_TYPE:</p>
<textarea name="code" class="c:nogutter" cols="50" rows="10">
"PHP_FCGI_MAX_REQUEST=",
"PHP_FCGI_CHILDREN=",
</textarea>
<p>Plik wynikowy powinien wyglądać następująco:</p>
<textarea name="code" class="c:firstline[94]" cols="50" rows="10">
static const char *const safe_env_lst[] =
{
/* variable name starts with */
"HTTP_",
"SSL_",

/* variable name is */
"PHP_FCGI_MAX_REQUEST=",
"PHP_FCGI_CHILDREN=",
"AUTH_TYPE=",
"CONTENT_LENGTH=",
"CONTENT_TYPE=",
"DATE_GMT=",
"DATE_LOCAL=",
"DOCUMENT_NAME=",
"DOCUMENT_PATH_INFO=",
"DOCUMENT_ROOT=",
</textarea>
<p>Dzięki wykonanej modyfikacji suexec będzie <strong>przekazywał zmienne środowiskowe</strong>, które ustawi FastCGI, do wrappera PHP (w dalszej części artykuły opisze obie zmienne i dlaczego trzeba było wprowadzić tą poprawkę).</p>
<p>Teraz możemy przystąpić do rzeczywistej konfiguracji Apache. Uruchamiamy komendę:</p>
<textarea name="code" class="general:nogutter" cols="50" rows="10">
./configure --enable-so  --with-suexec-caller=www --with-suexec-docroot=/var/www --with-suexec-logfile=/var/log/suexec --enable-suexec=shared --enable-cgi=shared --with-suexec-bin=/usr/local/apache2/sbin/suexec
</textarea>
<h4>Opis parametrów:</h4>
<ul>
<li><strong>&#8211;enable-so</strong>: włączenie mechanizmu DSO</li>
<li><strong>&#8211;with-suexec-caller</strong>: użytkownik z którego będzie wywoływany suexec. Należy tutaj wpisać nazwę użytkownika na którym działa Apache</li>
<li><strong>&#8211;with-suexec-docroot</strong>: ścieżka w której znajdują się wszystkie skrypty PHP uruchamiane przez suexec</li>
<li><strong>&#8211;with-suexec-logfile</strong>: plik do którego suexec będzie logował. Należy pamiętać o utworzeniu takiego pliku i nadaniu mu uprawnień do zapisu dla użytkownika na którym działa Apache. Należy mieć też na uwadze konieczność rotowania tego pliku &#8211; Apache się tym nie zajmuje</li>
<li><strong>&#8211;enable-suexec</strong>: włączenie mechanizmu suexec</li>
<li><strong>&#8211;enable-cgi</strong>:włącza obsługę CGI &#8211; niezbędne do konfiguracji PHP jako CGI</li>
<li><strong>&#8211;with-suexec-bin</strong>: ścieżka do pliku suexec w naszym systemie. Plik ten może znajdować się w dowolnym miejscu</li>
</ul>
<p>Jeżeli nie dodałeś żadnego layoutu ustawień (&#8211;enable-layout=LAYOUT) podczas konfigurowania Apache, pliki zostaną <strong>umieszczone w katalogu /usr/local/apache2</strong>. Jeżeli zmieniłeś layout, pamiętaj o zmianie ścieżki do pliku suexec (&#8211;with-suexec-bin).</p>
<textarea name="code" class="general:nogutter" cols="50" rows="10">
make
make install
</textarea>
<h3>Instalacja FastCGI:</h3>
<p>Konfiguracja FastCGI sprowadza się do wykonywania instrukcji instalacyjnych z pliku <strong>INSTALL.AP2</strong>. Należy pamiętać o zmianie ścieżki <strong>top_dir</strong> w przypadku innej konfiguracji Apache. We wskazanym katalogu powinien się znaleźć plik <strong>build/special.mk</strong>:</p>
<textarea name="code" class="general:nogutter" cols="50" rows="10">
cp Makefile.AP2 Makefile
make top_dir=/usr/local/apache2
make install
</textarea>
<h3>Instalacja PHP:</h3>
<p>Instalacja obu wersji PHP przebiega podobnie dlatego opiszę tylko jedną wersję w tym miejscu. W przypadku PHP 4 zalecał bym tylko zmianę prefixu na /usr/local/php4. Dalsza część artykułu zawiera konfiguracje dla systemu z obiema wersjami PHP.</p>
<textarea name="code" class="general:nogutter" cols="50" rows="10">
./configure --prefix=/usr/local/php5 --enable-force-cgi-redirect --enable-fastcgi
</textarea>
<p>Celowo nie dodawałem tutaj parametru –sysconfdir, który wskazuje na miejsce szukania domyślnego pliku php.ini. Będę używał parametru -c do wskazania pliku php.ini. Dowiedz się więcej o <a href="/2007/12/29/kolejnosc-wczytywania-plikow-phpini/">kolejności ładowania plików php.ini</a> z mojego artykułu.</p>
<h4>Opis parametrów:</h4>
<ul>
<li><strong>&#8211;prefix</strong>: prefix instalacji ustawiłem na /usr/local/php5 gdyż równolegle będziemy instalować php4 i dobrze by było gdyby dwie wersji nie wchodziły sobie w drogę</li>
<li><strong>&#8211;enable-force-cgi-redirect</strong>: parametr ten zabezpiecza przed wywołaniem skryptu PHP poprzez link bezpośredni do skryptu FastCGI w folderze fcgi. Skrypt PHP zostanie wykonany tylko i wyłącznie jeżeli odwołanie do parsera zostało wykonane przez Apache</li>
<li><strong>&#8211;enable-fastcgi</strong>: włączenie obsługi FastCGI w parserze PHP</li>
</ul>
<p>Zanim wykonasz poniższe komendy utwórz katalog /usr/local/php5.</p>
<textarea name="code" class="general:nogutter" cols="50" rows="10">
make
make install
</textarea>
<p>W tym momencie zakończyliśmy instalacje i podstawową konfigurację niezbędnego programowania. Przystąpmy zatem do dalszej konfiguracji.</p>
<h3>Konfiguracja Apache:</h3>
<p>Plik konfiguracyjny Apache (<strong>httpd.conf</strong>) powinien zawierać między innymi takie ustawienia:</p>
<textarea name="code" class="general:nogutter" cols="50" rows="10">
LoadModule suexec_module modules/mod_suexec.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule fastcgi_module modules/mod_fastcgi.so

&lt;IfModule mod_fastcgi.c&gt;
FastCgiWrapper /usr/sbin/suexec
FastCgiConfig \
-initial-env PHP_FCGI_CHILDREN=1 \
-initial-env PHP_FCGI_MAX_REQUESTS=5000 \
-singleThreshold 90 \
-killInterval 300 \
-autoUpdate \
-idle-timeout 240 \
-pass-header HTTP_AUTHORIZATION
&lt;/IfModule&gt;
</textarea>
<h4>Opis parametrów:</h4>
<ul>
<li><strong>FastCgiWrapper</strong>: w tym miejscu deklarujemy wrapper dla FastCGI. Zamiast suexec możemy użyć np. cgiwrap albo sbox. Jeżeli chcemy użyć tego samego wrapper co Apache możemy ustawić tą opcję na &#8220;On&#8221;</li>
<li><strong>FastCgiConfig</strong>: deklarujemy w jaki sposób ma się zachowywać FastCGI</li>
<li><strong>-initial-env PHP_FCGI_CHILDREN=1</strong>: Ustawia zmienną środowiskową PHP_FCGI_CHILDREN która poprzez wrapper (np.: suexec) przekazujemy do PHP. Jeżeli nie zmodyfikowali byśmy źródeł suexec , zmienna ta została by wycięta. PHP_FCGI_CHILDREN określa ile procesów potomnych ma obsługiwać żądania PHP dla jednego virtualhosta</li>
<li><strong>-initial-env PHP_FCGI_MAX_REQUEST=5000</strong>: Zmienna ta określa maksymalną ilość żądań po których dany proces zostanie zakończony i uruchomiony w razie potrzeby od nowa</li>
<li><strong>-singleThreshold 90</strong>: Parametr przyjmuje wartości liczbowe od 0 do 100. FastCGI na tej podstawie określa czy dany proces ma być utrzymywany (wartość bliższa 1) czy zabity (bliżej 100) jeżeli nie jest już wykorzystywany. Jeżeli zależy Ci się na oszczędności pamięci ustaw ten parametr bliżej 100. Ustawienie na 0 zapobiegnie wyłączaniu ostatniego procesu potomnego</li>
<li><strong>-killInterval 300</strong>: Wartość parametru w sekundach, określa po jakim czasie bezczynności proces ma zostać zabity</li>
<li><strong>-autoUpdate</strong>: Powoduje sprawdzanie daty skryptów FastCGI. Jeżeli któryś z nich zostanie zaktualizowany, FastCGI zabije proces i uruchomi go od nowa</li>
<li><strong>-idle-timeout 240</strong>: Czas w sekundach który ma skrypt PHP na uruchomienie i rozpoczęcie zwracania wyników użytkownikowi</li>
<li><strong>-pass-header HTTP_AUTHORIZATION</strong>: Przekazania nagłówków uwierzytelniania HTTP do CGI. Standardowo nagłówki te nie są przekazywane</li>
</ul>
<p>Przyjąłem, że każdy virtualhost posiada swój katalog w /var/www.  Struktura prezentuje się następująco:<br />
/var/www/host1.example.com<br />
/var/www/host1.example.com/htdocs – główny folder dostępny przez http<br />
/var/www/host1.example.com/htdocs/fcgi – folder ze skryptami FastCGI<br />
/var/www/host1.example.com/tmp – folder przeznaczony na pliki sesji i pliki tymczasowe</p>
<h3>Konfiguracja virtualhosta:</h3>
<textarea name="code" class="general:nogutter" cols="50" rows="10">
&lt;VirtualHost *:80&gt;
SuexecUserGroup v1 v1

&lt;Location /fcgi/php4&gt;
SetHandler fastcgi-script
Options +ExecCGI
&lt;/Location&gt;

&lt;Location /fcgi/php5&gt;
SetHandler fastcgi-script
Options +ExecCGI
&lt;/Location&gt;

&lt;Directory /var/www/host1.example.com/htdocs/fcgi &gt;
AllowOverride None
Options None
Order allow,deny
Allow from all
&lt;/Directory&gt;

AddHandler php5-fastcgi .php
Action php5-fastcgi /fcgi/php5
Action php4-fastcgi /fcgi/php4

AddType application/x-httpd-php .php

DocumentRoot /var/www/host1.example.com /htdocs/
ServerName host1.example.com
ErrorLog /var/log/httpd/host1.example.com-error_log
CustomLog /var/log/httpd/host1.example.com-access_log common
&lt;/VirtualHost&gt;
</textarea>
<h4>Opis parametrów:</h4>
<ul>
<li><strong>SuexecUserGroup v1 v1</strong>: określa systemowego użytkownika i grupę na którą suexec ma przenieść uprawnienia</li>
<li><strong>&lt;Location /fcgi/php5&gt;&#8230;&lt;/Location&gt;</strong>: Zarejestrowanie pliku /fcgi/php5 jako skryptu FastCGI</li>
<li><strong>&lt;Location /fcgi/php4&gt;&#8230;&lt;/Location&gt;</strong>: Jw. tylko, że dla pliku /fcgi/php4</li>
<li><strong>&lt;Directory&gt;…&lt;/Directory&gt;</strong>: Ustawienia katalogu fcgi. Należy tutaj szczególną uwagę zwrócić na &#8220;Options None&#8221;. Zabezpiecza to przed możliwością uruchamiania programów niż zadeklarowane w &lt;Location &#8230;&gt;. Dodatkowo opcja &#8220;AllowOverride None&#8221; zabezpiecza przed możliwością zmiany tych ustawień z poziomu pliku .htaccess</li>
<li><strong>AddHandler php5-fastcgi .php</strong>: Ustawia domyślny interpretator dla plików .php na PHP 5. Gdyby użytkownik chciał zmienić wersje PHP na inna wystarczy, że sam we własnym zakresie stworzy plik .htaccess i wpisze do niego AddHandler php4-fastcgi .php</li>
<li><strong>Action php5-fastcgi /fcgi/php5</strong>: Deklaracja skryptu FastCGI dla PHP 5</li>
<li><strong>Action php4-fastcgi /fcgi/php4</strong>: Deklaracja skryptu FastCGI na PHP 5</li>
</ul>
<p>Trzy opisane na końcu parametry można <strong>umieścić poza sekcją</strong> &lt;VirtualHost&gt;&#8230;&lt;/VirtualHost&gt; czyniąc  z nich <strong>ustawienia globalne</strong> dla serwera.</p>
<p>Teraz utworzymy skrypty FastCGI zadeklarowane w konfiguracji Apache. Skrypty te musimy utworzyć <strong>dla każdego virtualhosta</strong> w katalogu htdocs/fcgi.<br />
Dla PHP 5 tworzymy plik htdocs/fcgi/php5:</p>
<textarea name="code" class="general:nogutter" cols="50" rows="10">
#!/bin/bash
exec /usr/local/php5/bin/php-cgi -c php5.ini
</textarea>
<p>Dla PHP tworzymy plik htdocs/fcgi/php4:</p>
<textarea name="code" class="general:nogutter" cols="50" rows="10">
#!/bin/bash
exec /usr/local/php4/bin/php -c php4.ini
</textarea>
<p>Niektórzy zadadzą sobie teraz pytanie &#8220;Po co dodawać każdemu katalog fcgi razem ze skryptami skoro mogę zrobić jeden katalog i podlinkować go każdemu?&#8221;.</p>
<p>Odpowiedź leży w źródłach suexec, które edytowaliśmy na początku. Model bezpieczeństwa suexec jest bardzo restrykcyjny i dokładnie porównuje uprawnienia uruchamianych programów razem z folderami virtualhosta. Jeżeli chodź jeden z testów nie będzie zgodny, skrypt nie zostanie uruchomiony. Rozwiązaniem jest modyfikacja źródeł suexec albo rozwiązanie problemu poprzez kopiowanie skryptów FastCGI do każdego virtualhosta. <strong>Pamiętaj o zmianie właściciela</strong> plików php4 i php5.</p>
<p>W tym miejscu powinienem powrócić jeszcze do modyfikacji suexec, którą wykonaliśmy na początku. Nic nie stało na przeszkodzie żebyśmy dopisali do utworzonych przed chwilą skryptów export zmiennych globalnych np.:</p>
<textarea name="code" class="general:nogutter" cols="50" rows="10">
#!/bin/bash
export PHP_FCGI_CHILDREN 1
export PHP_FCGI_MAX_REQUESTS 5000
exec /usr/local/php5/bin/php-cgi -c php5.ini
</textarea>
<p>Modyfikację tą wprowadzaliśmy jednak, żeby istniała możliwość <strong>ustawienia tych parametrów globalnie</strong>. Jeżeli jeden z virtualhostow wymaga innej konfiguracji to możemy zmodyfikować te wartości właśnie poprzez export jak na ww. przykładzie.</p>
<h3>Pliki konfiguracyjne php.ini:</h3>
<p>Żeby cała ta konfiguracja zdała egzamin musimy w przygotować indywidualne pliki php.ini dla każdego virtualhosta. W przypadku PHP 5 sprawa jest odrobinę ułatwiona. Temat ten opisałem w artykule &#8220;<a href="/2007/12/29/uproszczenie-w-konfiguracji-php-5-per-virtualhost/">Uproszczenie w konfiguracji PHP 5 per virtualhost</a>&#8220;.W pliku konfiguracyjnym obu wersji PHP <strong>powinny</strong> się znaleźć:</p>
<textarea name="code" class="general:nogutter" cols="50" rows="10">
open_basedir = "/var/www/host1.example.com:/usr/local/php5"
disable_functions = proc_open, popen, disk_free_space, diskfreespace, leak, exec, system, shell_exec, passthru, dl
expose_php = Off
log_errors = On
error_log = "/var/www/host1.example.com /php_error"
register_globals = Off
enable_dl = Off
upload_tmp_dir = "/var/www/host1.example.com /tmp"
sendmail_path = "/usr/sibn/sendmail -t -i -f info@host1.example.com"
session.save_path = "/var/www/host1.example.com /tmp"
</textarea>
<h3>Finalizacja:</h3>
<p>Na koniec pozostaje nam kilka <strong>problemów do rozwiązania</strong>, a mianowicie:</p>
<ul>
<li>użytkownik może zmodyfikować zawartość skryptów znajdujących się w htdocs/fcgi, a co za tym idzie, dajemy mu dostęp do powłoki systemu, czego z pewnością większość z Was wolała by uniknąć</li>
<li>użytkownik może zmienić/skasować plik php.ini. Ma wtedy dostęp do modyfikacji spersonalizowanych wartości open_basedir, error_log, session.save_path, disable_functions itp.</li>
</ul>
<p>Żeby rozwiązać te problemy, należało by <strong>zabrać użytkownikowi możliwość edycji plików</strong> w katalogu htdocs/fcgi. Gdy zabierzemy mu uprawnienia poprzez zmianę właściciela, suexec bardzo szybko przypomni nam o tym fakcie. Rozwiązanie jakie znalazłem niestety nie jest eleganckie, ale za to jest skuteczne.</p>
<p>Użytkownicy systemu plików ext2/3 mogą nadać atrybut +i dla katalogu <strong>htdocs/fcgi</strong> poprzez <strong>chattr +i fcgi</strong>. Uniemożliwi to wprowadzanie zmian na folderze fcgi (razem z jego zawartością) dla wszystkich użytkowników systemu. Tak założone atrybut +i zdejmuje tylko i wyłącznie root.</p>
<h3>Change log artykułu:</h3>
<p>Będę się starał uaktualniać ten artykuł, a więc w tym miejscu opisze przyszłe zmiany.<br />
25/02/2008 19:38 &#8211; Usunięcie niepoprawnych spacji z konfiguracji VirtualHost.<br />
04/02/2008 17:41 &#8211; Zmieniłem nazwę &#8220;apache2.conf&#8221; na &#8220;httpd.conf&#8221; celem poprawienia zgodności z domyślną konfiguracją Apache.<br />
30/01/2008 20:28 &#8211; Zmiana &lt;IfModule&gt; na &lt;/IfModule&gt; w konfiguracji Apache.<br />
25/01/2008 12:26 &#8211; Poprawka związana z błędną nazwa foldera w przykładowej konfiguracji Apache. Zamienione &#8220;fcgi-bin&#8221; na &#8220;fcgi&#8221;.<br />
30/12/2007 16:45 &#8211; Publikacja pierwszej wersji</p>
]]></content:encoded>
	    			<wfw:commentRss>http://aiv-dev.info/2007/12/30/konfiguracja-apache-fastcgi-suexec-php-4-5-kilka-innych-rozwiazan/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Uproszczenie w konfiguracji PHP 5 per virtualhost</title>
		<link>http://aiv-dev.info/2007/12/29/uproszczenie-w-konfiguracji-php-5-per-virtualhost/</link>
		<comments>http://aiv-dev.info/2007/12/29/uproszczenie-w-konfiguracji-php-5-per-virtualhost/#comments</comments>
		<pubDate>Sat, 29 Dec 2007 16:27:16 +0000</pubDate>
		<dc:creator>Mariusz Dalewski</dc:creator>
				<category><![CDATA[Administracja]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php.ini]]></category>

		<guid isPermaLink="false">http://aiv-dev.info/2007/12/29/uproszczenie-w-konfiguracji-php-5-per-virtualhost/</guid>
		<description><![CDATA[W PHP 5 wprowadzono pewne uproszczenie w tworzeniu plików php.ini np.: dla każdego virtualhosta oddzielnie. Zakładając, że mamy swój ulubiony plik php.ini, umieszczamy w nim na początku coś takiego:

main_domain = "host1.example.com"
main_root_dir = "/var/www/"${main_domain}

Poniżej opisanych dyrektyw, możemy posługiwać się zmiennymi ${main_domain} i ${main_root_dir} np.: w taki sposób:

open_basedir = ${main_root_dir}":/usr/local/php5"
error_log = ${main_root_dir}"/error_log"
upload_tmp_dir = ${main_root_dir}"/tmp"
sendmail_path = "/usr/sbin/sendmail -t [...]]]></description>
		    		<content:encoded><![CDATA[<p>W PHP 5 wprowadzono pewne uproszczenie w tworzeniu plików php.ini np.: dla każdego virtualhosta oddzielnie. Zakładając, że mamy swój ulubiony plik php.ini, umieszczamy w nim na początku coś takiego:<!--feed--></p>
<textarea name="code" class="general:nogutter" cols="50" rows="10">
main_domain = "host1.example.com"
main_root_dir = "/var/www/"${main_domain}
</textarea>
<p>Poniżej opisanych dyrektyw, możemy posługiwać się zmiennymi ${main_domain} i ${main_root_dir} np.: w taki sposób:</p>
<textarea name="code" class="general:nogutter" cols="50" rows="10">
open_basedir = ${main_root_dir}":/usr/local/php5"
error_log = ${main_root_dir}"/error_log"
upload_tmp_dir = ${main_root_dir}"/tmp"
sendmail_path = "/usr/sbin/sendmail -t -i -f info@"${main_domain}
session.save_path = ${main_root_dir]"/tmp"
</textarea>
<p>Niestety opcja ta nie jest dostępna w PHP 4 i w związku z zamknięciem rozwoju tej wersji, nie zostanie już dodana.</p>
]]></content:encoded>
	    			<wfw:commentRss>http://aiv-dev.info/2007/12/29/uproszczenie-w-konfiguracji-php-5-per-virtualhost/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kolejność wczytywania plików php.ini</title>
		<link>http://aiv-dev.info/2007/12/29/kolejnosc-wczytywania-plikow-phpini/</link>
		<comments>http://aiv-dev.info/2007/12/29/kolejnosc-wczytywania-plikow-phpini/#comments</comments>
		<pubDate>Fri, 28 Dec 2007 23:37:30 +0000</pubDate>
		<dc:creator>Mariusz Dalewski</dc:creator>
				<category><![CDATA[Administracja]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php.ini]]></category>

		<guid isPermaLink="false">http://aiv-dev.info/2007/12/29/kolejnosc-wczytywania-plikow-phpini/</guid>
		<description><![CDATA[Chciałem sprawdzić czy można użyć kilku plików php.ini zakładając, że każdy kolejny plik nadpisuje ustawienia z plików poprzednich. Testowałem PHP w wersji 4.4.7 i 5.2.5 skompilowane jako CGI ze wsparciem dla FastCGI. Podczas konfiguracji użyłem między innymi parametrów:

--sysconfdir=/etc/php5/cgi
--prefix=/usr/local/php5
--enable-fastcgi

Po krótkim debugowaniu aplikacji okazało się w jakiej kolejności PHP poszukuje plików ini:

./php-cgi-fcgi.ini
/usr/local/php5/bin/php-cgi-fcgi.ini
/etc/php5/cgi/php-cgi-fcgi.ini
./php.ini
/usr/local/php5/bin/php.ini
/etc/php5/cgi/php.ini

Wyżej wymieniona kolejność jest taka sama [...]]]></description>
		    		<content:encoded><![CDATA[<p>Chciałem sprawdzić czy można użyć kilku plików php.ini zakładając, że każdy kolejny plik nadpisuje ustawienia z plików poprzednich. Testowałem PHP w wersji <strong>4.4.7</strong> i <strong>5.2.5</strong> skompilowane jako CGI ze wsparciem dla FastCGI. Podczas konfiguracji użyłem między innymi parametrów:<!--feed--></p>
<textarea name="code" class="general:nogutter" cols="50" rows="10">
--sysconfdir=/etc/php5/cgi
--prefix=/usr/local/php5
--enable-fastcgi
</textarea>
<p>Po krótkim debugowaniu aplikacji okazało się w jakiej kolejności PHP poszukuje plików ini:</p>
<textarea name="code" class="general:none" cols="50" rows="10">
./php-cgi-fcgi.ini
/usr/local/php5/bin/php-cgi-fcgi.ini
/etc/php5/cgi/php-cgi-fcgi.ini
./php.ini
/usr/local/php5/bin/php.ini
/etc/php5/cgi/php.ini
</textarea>
<p>Wyżej wymieniona kolejność jest taka sama dla PHP uruchamianego z poziomu FastCGI/CGI. W przypadku pominięcia parametru <code>--enable-fastcgi</code> zmianie ulega <strong>nazwa pliku php-cgi-fcgi.ini na php-cgi.ini</strong>.</p>
<p>W przypadku PHP uruchomionego jako moduł Apache sprawa ma się trochę inaczej:</p>
<textarea name="code" class="general:none" cols="50" rows="10">
./php-apache.ini
/etc/php5/apache/php-apache.ini
./php.ini
/etc/php5/apache/php.ini
</textarea>
<p>(PHP było skompilowane z opcją <code>--sysconfdir=/etc/php5/apache</code>.)</p>
<p>Niestety testy które przeprowadziłem wykazały, że PHP po znalezieniu pierwszego pliku ini pomija dalsze lokalizacje. Planowałem na podstawie tego mechanizmu dać użytkownikom możliwość posiadania własnego pliku php.ini z gwarancją, iż niektóre parametry były by zawsze globalnie nadpisywane (np: open_basedir, czy disable_functions).</p>
]]></content:encoded>
	    			<wfw:commentRss>http://aiv-dev.info/2007/12/29/kolejnosc-wczytywania-plikow-phpini/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problemy z getTextExtent()</title>
		<link>http://aiv-dev.info/2007/12/26/problemy-z-gettextextent/</link>
		<comments>http://aiv-dev.info/2007/12/26/problemy-z-gettextextent/#comments</comments>
		<pubDate>Wed, 26 Dec 2007 19:28:41 +0000</pubDate>
		<dc:creator>Mariusz Dalewski</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://aiv-dev.info/2007/12/26/problemy-z-gettextextent/</guid>
		<description><![CDATA[Podczas realizacji ostatniego projektu we flashu napotkałem ciekawy problem który zabrał mi dużo więcej czasu niż powinien.
W projekcie zastosowałem pobieranie danych do tworzenia menu z zewnętrznego pliku XML. Plik XML wyglądał tak:

&#60;mainmenu&#62;
&#60;menuitem font="Font1" pagetemplate="1"&#62;Menu 1&#60;/menuitem&#62;
&#60;menuitem font="Font1" pagetemplate="2"&#62;Menu 2&#60;/menuitem&#62;
&#60;menuitem font="Font1" pagetemplate="3"&#62;Menu 3&#60;/menuitem&#62;
&#60;/mainmenu&#62;

Jako, że menu było w jednej linii to obliczałem przy użyciu metody TextFormat.getTextExtent() jakich rozmiarów [...]]]></description>
		    		<content:encoded><![CDATA[<p>Podczas realizacji ostatniego projektu we flashu napotkałem ciekawy problem który zabrał mi dużo więcej czasu niż powinien.</p>
<p>W projekcie zastosowałem pobieranie danych do tworzenia menu z zewnętrznego pliku XML. Plik XML wyglądał tak:</p>
<textarea name="code" class="xml:showcolumns" cols="50" rows="10">
&lt;mainmenu&gt;
&lt;menuitem font="Font1" pagetemplate="1"&gt;Menu 1&lt;/menuitem&gt;
&lt;menuitem font="Font1" pagetemplate="2"&gt;Menu 2&lt;/menuitem&gt;
&lt;menuitem font="Font1" pagetemplate="3"&gt;Menu 3&lt;/menuitem&gt;
&lt;/mainmenu&gt;
</textarea>
<p>Jako, że menu było w jednej linii to obliczałem przy użyciu metody <strong>TextFormat.getTextExtent()</strong> jakich rozmiarów powinno być pole tekstowe, żeby pomieścić tekst. Wszystko działało idealnie do momentu kiedy nie zrobiłem zewnętrznego pliku spełniającego funkcje <strong>loadera</strong>. Po załadowaniu strony z loadera całe menu się rozjechało &#8211; teksty nachodziły na siebie, pola były za małe.</p>
<p>Okazało się, że flash (sprawdzałem na wersji CS3) ma wspaniałą przypadłość:<br />
Jeżeli używasz TextFormat.getTextExtent() na czcionkach dołączonych do animacji, to te same czcionki <strong>musisz dołączyć do loadera</strong> (nawet jak ich tam nie używasz). W przeciwnym wypadku flash nie będzie potrafił poprawnie policzyć rozmiaru dla pola tekstowego.</p>
]]></content:encoded>
	    			<wfw:commentRss>http://aiv-dev.info/2007/12/26/problemy-z-gettextextent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
