<?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>وبلاگ شخصی علی فرهادی &#187; php</title>
	<atom:link href="http://farhadi.ir/blog/category/webdev/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://farhadi.ir/blog</link>
	<description>The daily thoughts and work experiences of a web developer</description>
	<lastBuildDate>Fri, 04 Mar 2011 11:42:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>fa</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>تقویم فارسی برای php 5.3</title>
		<link>http://farhadi.ir/blog/1389/02/10/persian-calendar-for-php-53/</link>
		<comments>http://farhadi.ir/blog/1389/02/10/persian-calendar-for-php-53/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 20:30:03 +0000</pubDate>
		<dc:creator>علی</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://farhadi.ir/blog/?p=211</guid>
		<description><![CDATA[شش ماه پیش امید متقی توی وبلاگش در مورد پشتیبانی php 5.3 از تقویم فارسی نوشته بود. این امکان با اضافه شدن اکستنشن Intl به اکستنشن های پیشفرض php در نسخه 5.3 به بعد فراهم شده. این اکستنشن در واقع امکان کار با کتابخونه ICU رو برای php فراهم میکنه.  دیدم کار با این توابع [...]]]></description>
			<content:encoded><![CDATA[<p>شش ماه پیش <a href="http://oxygenws.com/blog" target="_blank">امید متقی</a> توی وبلاگش در مورد <a href="http://oxygenws.com/blog/archives/72-..-..html" target="_blank">پشتیبانی php 5.3 از تقویم فارسی</a> نوشته بود. این امکان با اضافه شدن <a href="http://pecl.php.net/package/intl" target="_blank">اکستنشن Intl</a> به اکستنشن های پیشفرض php در نسخه 5.3 به بعد فراهم شده. این اکستنشن در واقع امکان کار با کتابخونه <a href="http://www.icu-project.org/" target="_blank">ICU</a> رو برای php فراهم میکنه.  دیدم کار با این توابع یک کمی مشکله تصمیم گرفتم با این توابع یک توسعه برای کلاس DateTime بنویسم که کار باهاش آسون بشه. این شد که چهار ماه پیش این کلاس رو نوشتم (<a href="http://github.com/farhadi/IntlDateTime">اینجا</a>) ولی خوب به خاطر مشغله کاری و تنبلی وقت نکردم در موردش چیزی بنویسیم.</p>
<p>با این کلاس در واقع همون امکانات DateTime رو به اضافه پشتیبانی از تقویم‌ها و زبان‌های مختلف دارید. برای مثال:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000088;">$date</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> IntlDateTime<span style="color: #009900;">&#40;</span><span style="">'now'</span><span style="color: #339933;">,</span> <span style="">'Asia/Tehran'</span><span style="color: #339933;">,</span> <span style="">'persian'</span><span style="color: #339933;">,</span> <span style="">'fa'</span><span style="color: #009900;">&#41;</span>;
<span style="color: #990000;">echo</span> <span style="color: #000088;">$date</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span><span style="">'yyyy/MM/dd'</span><span style="color: #009900;">&#41;</span>; <span style="color: #666666; font-style: italic;">// ۱۳۸۹/۰۲/۱۰</span>
<span style="color: #990000;">echo</span> <span style="color: #000088;">$date</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span><span style="">'E dd LLL yyyy'</span><span style="color: #009900;">&#41;</span>; <span style="color: #666666; font-style: italic;">// جمعه ۱۰ اردیبهشت ۱۳۸۹</span></pre></div></div>

<p>نحوه کارش مشابه کلاس DateTime هست با تفاوت های زیر:</p>
<ol>
<li>پارامتر اول علاوه بر رشته میتونه timestamp و یا یک شی از نوع DateTime باشه.</li>
<li>در پارامتر اول کاراکترهای عددی به هر زبانی میتوانند باشند. یعنی اگر رشته شما شامل اعداد فارسی یا عربی یا ترکیبی از اونها و یا هر زبون دیگه ای که باشه با این کلاس بدون مشکل کار میکنه. (این قسمت رو به لطف کلاس NumberFormatter که یکی دیگه از امکانات intl هست نوشتم )</li>
<li>برای پارامتر دوم به جای شی DateTimeZone میشه از رشته هم استفاده کرد.</li>
<li>پارامتر سوم نوع تقویم رو مشخص میکنه که میتونه Buddhist, Chinese, Coptic, Ethiopic, Gregorian, Hebrew, Indian, Islamic, Islamic-Civil, Japanese, Persian, Taiwan باشه. (دم ICU گرم فکر کنم فقط تقویم مایاها رو یادشون رفته پیاده کنن!)</li>
<li>پارامتر چهارم زبانه برای مثال میتونه fa ، fa_IR ، en ، en_US ، en_UK و &#8230; باشه</li>
<li>یکی از سختی های کار با کلاس IntlDateFormatter اینه که باید حتما pattern تاریخ رو مشخص کنید ولی کلاس IntlDateTime در اکثر مواقع خودش میتونه pattern رو تشخیص بده و برای موارد خاص که pattern توسط کلاس قابل تشخیص نباشه باید خودتون pattern رو به عنوان پارامتر پنجم بدید.</li>
<li>برای استفاده از متد format باید pattern رو به <a href="http://userguide.icu-project.org/formatparse/datetime" target="_blank">فرمتی که ICU قبول میکنه</a> بدید. برای استفاده از فرمت خود php  از متد classicFormat استفاده کنید.</li>
<li>متد فرمت timezone هم به عنوان پارامتر دوم قبول میکنه (بدون تغییر timezone داخلی شی)</li>
<li>کلاس IntlDateFormatter با تایم زون هایی که DST دارن مشکل داره که من توی IntlDateTime رفعش کردم.</li>
<li><del datetime="2010-09-09T18:22:36+00:00">تنها اشکالش اینه که با تاریخ های خارج از محدوده timestamp کار نمیکنه که به عنوان باگ برای IntlDateFormatter گزارش دادم.</del> (<strong>آپدیت:</strong> این مشکل هم <a href="http://bugs.php.net/bug.php?id=50590" target="_blank">رفع شد</a>.)</li>
<li>متد modify تاریخ رو مطابق با تقویمی که ست شده ویرایش میکنه (مثلا برای تاریخ امروز +1 month رو اگر روی تقویم میلادی اجرا کنی 30 روز و اگر روی تقویم هجری شمسی اجرا کنی 31 روز تاریخ رو جلو میبره)</li>
<li>با متد setCalendar و setLocale تقویم و زبان رو میتونید عوض کنید که مثلا برای تبدیل تاریخ از میلادی به شمسی و بالعکس کاربرد داره.</li>
</ol>
<p>یک تعداد testcase هم براش نوشتم که برای آشنایی با طرز کار کلاس میتونین یک نگاهی بهش بندازین. البته هنوز تستهاش کامل نیست. بعدا اگه فرصت کنم کاملش میکنم.</p>
<p>همونطور که گفتم این کلاس فقط روی php 5.3 به بعد کار میکنه اگر دنبال کدی میگردید که روی php 5 هم کار کنه یک کلاس دیگه نوشتم (<a href="http://github.com/farhadi/ExtDateTime" target="_self">اینجا</a>) که البته محدودیت هایی نسبت به این کلاس داره (در حال حاضر فقط تقویم فارسی و میلادی رو ساپورت میکنه ولی قابل گسترش برای سایر تقویم ها هست. از الگوی factory استفاده میکنه و بعد از ایجاد شی دیگه تقویم قابل تغییر نیست.)</p>
]]></content:encoded>
			<wfw:commentRss>http://farhadi.ir/blog/1389/02/10/persian-calendar-for-php-53/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>ubuntu با آخرین نسخه‌ی php</title>
		<link>http://farhadi.ir/blog/1387/06/29/ubuntu-with-latest-php-version/</link>
		<comments>http://farhadi.ir/blog/1387/06/29/ubuntu-with-latest-php-version/#comments</comments>
		<pubDate>Fri, 19 Sep 2008 14:15:44 +0000</pubDate>
		<dc:creator>علی</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[اوبونتو]]></category>

		<guid isPermaLink="false">http://farhadi.ir/blog/1387/06/29/ubuntu-with-latest-php-version/</guid>
		<description><![CDATA[چند روز پیش به یک مشکل عجیب توی php برخوردم. یک کدی بود که وقتی اجراش میکردم پنجره دانلود می اومد. بررسی که کردم دیدم هیچ هدر و خروجی ارسال نمیشه و از اونجایی که هدر نداره پنجره دانلود میاد. ظاهرا یک جایی وسط کار php کرش میکنه. خلاصه trace کردم تا رسیدم به اون [...]]]></description>
			<content:encoded><![CDATA[<p>چند روز پیش به یک مشکل عجیب توی php برخوردم. یک کدی بود که وقتی اجراش میکردم پنجره دانلود می اومد. بررسی که کردم دیدم هیچ هدر و خروجی ارسال نمیشه و از اونجایی که هدر نداره پنجره دانلود میاد. ظاهرا یک جایی وسط کار php کرش میکنه. خلاصه trace کردم تا رسیدم به اون قسمتی که مشکل رو ایجاد کرده بود. اونقدر سر و ته کد ها رو زدم تا به خط مورد نظر رسیدم. و حدس زدم که باگ از php باشه. جالب اینجا بود که روی لوکال این مشکل رو نداشتم بعد فهمیدم که این مشکل فقط توی php 5.2.6 هست و از اونجایی که php که همراه ubuntu 8.04 هست php 5.2.4 هست، من متوجه این مشکل نشده بودم.<br />
توی قسمت باگ های php که سرچ کردم دیدم حدود 4 ماه پیش یک نفر <a href="http://bugs.php.net/bug.php?id=45038" target="_blank">این باگ</a> رو گزارش داده و حدود 2 ماه هم هست که توی CVS رفع شده.  فعلا تا اومدن نسخه جدید php مجبور شدم به یک روش سرخ پوستی این باگ رو دور بزنم.</p>
<p>همه‌ی اینها رو گفتم که بگم اگر نسخه‌ی php روی لوکال آپدیت بود زودتر متوجه مشکل می‌شدم و این همه وقت صرف پیدا کردنش نمی‌شد. البته دلایل دیگه ای هم میتونید برای آپگرید کردن php روی لوکال داشته باشید.</p>
<p>حال و حوصله نصب php از سورس رو نداشتم، تازه هر موقع نسخه جدید میومد باید دوباره کامپایل میکردم. این apt هم بد جوری ما رو بد عادت کرده.</p>
<p>یه سرچ کردم سایت <a href="http://www.dotdeb.org/instructions/" target="_blank">dotdeb.org</a> رو پیدا کردم. به لطف apt به سه سوت php آپگرید شد و هر موقع هم که آپدیت جدید بیاد به یک سوت میتونم آپگریدش کنم.</p>
<p>به قول <a href="http://freekeyboard.net/" target="_blank">جادی</a> به نظر شما این سیستم عامل زیبا نیست؟</p>
]]></content:encoded>
			<wfw:commentRss>http://farhadi.ir/blog/1387/06/29/ubuntu-with-latest-php-version/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>استفاده از gzip برای افزایش سرعت سایت</title>
		<link>http://farhadi.ir/blog/1386/07/03/speed-up-your-site-using-gzip/</link>
		<comments>http://farhadi.ir/blog/1386/07/03/speed-up-your-site-using-gzip/#comments</comments>
		<pubDate>Mon, 24 Sep 2007 22:45:23 +0000</pubDate>
		<dc:creator>علی</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://farhadi.ir/blog/1386/07/03/speed-up-your-site-using-gzip/</guid>
		<description><![CDATA[سرعت لود شدن سایت برای وبمسترها از اهمیت ویژه ای برخورداره و با توجه به پایین بودن میانگین سرعت اینترنت در ایران این اهمیت مضاعف میشه.
یکی از راهکارهای افزایش سرعت لود شدن سایت استفاده از فشرده سازی gzip هست که میتونه 60 الی 80 درصد حجم صفحات رو کاهش بده. البته استفاده ناصحیح از gzip [...]]]></description>
			<content:encoded><![CDATA[<p>سرعت لود شدن سایت برای وبمسترها از اهمیت ویژه ای برخورداره و با توجه به پایین بودن میانگین سرعت اینترنت در ایران این اهمیت مضاعف میشه.</p>
<p>یکی از راهکارهای افزایش سرعت لود شدن سایت استفاده از فشرده سازی gzip هست که میتونه 60 الی 80 درصد حجم صفحات رو کاهش بده. البته استفاده ناصحیح از gzip میتونه باعث بروز مشکلات و یا حتی کند شدن سایت بشه. چگونگی استفاده موثر از این راهکار موضوعیست که در ادامه این بحث به اون خواهیم پرداخت.</p>
<p><span id="more-26"></span></p>
<p>قبل از هر چیز از نصب بودن اکتنشن zlib روی php مطمئن بشید. این extension امکان استفاده از فشرده سازی gzip رو به php اضافه میکنه.</p>
<p>ساده ترین راه برای فشرده سازی صفحات سایت استفاده از گزینه ی output_compression هست. اکستنشن zlib این امکان رو به شما میده که با فعال کردن output_compression از طریق php.ini و یا .htaccess خروجی فایل های php خود رو فشرده کنید. برای مثال یک فایل .htaccess روی سرور خود می سازید و خط زیر رو درون این فایل ذخیره میکنید:</p>
<div class="code">php_flag zlib.output_compression on</div>
<p>مزیت این روش اینه که بدون نیاز به تغییر در برنامه در صورتی که مرورگر از gzip پشتیبانی کنه خروجی تمام صفحات php فشرده میشه. ولی این روش اشکالاتی داره از جمله اینکه فقط خروجی فایلهای php شما فشرده میشه و فایلهای دیگه نظیر html و css و js فشرده نمیشه. و اشکال دیگه ای که داره اینه که عملیات فشرده سازی هر بار که یک صفحه صدا زده میشه، انجام میشه و امکان کش کردن خروجی سمت سرور وجود نداره و چنانچه سرور ضعیف و سایت پر بازدیدی داشته باشید مقدار قابل توجهی بار پردازشی روی سرور اعمال میکنه.</p>
<p>روش دوم استفاده از ob_gzhandler به عنوان output_handler هست که همون مزایا و معایب روش فوق رو داره. البته ob_gzhandler رو هم از طریق htaccess یا php.ini و هم به عنوان callback برای ob_start در برنامه میشه استفاده کرد.</p>
<p>نحوه استفاده از ob_gzhandler در فایل .htaccess  :</p>

<div class="wp_syntax"><div class="code"><pre class="apache apache" style="font-family:monospace;">php_flag output_buffering <span style="color: #0000ff;">on</span>
<span style="color: #00007f;">php_value</span> output_handler ob_gzhandler</pre></div></div>

<p>نحوه استفاده از ob_gzhandler به عنوان callback برای ob_start :</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">ob_start</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ob_gzhandler&quot;</span><span style="color: #009900;">&#41;</span>; <span style="color: #666666; font-style: italic;">// place this line of code at the start of your files</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
…</pre></div></div>

<p>در صورت استفاده از htaccess و یا php.ini در هر یک از دو روش فوق، توجه داشته باشید که نباید در برنامه خروجی با انکدینگ gzip  ارسال نمایید در غیر این صورت محتوای صفحه دو بار انکد شده و فاتحه سایتتان خوانده می شود.</p>
<p>ضمنا همونطور که گفته شد از دو روش فوق فقط برای فشرده سازی خروجی فایلهای php میشه استفاده کرد و برای فشرده سازی فایلهای css و js و html باید خودمون دست به کار بشیم.</p>
<p>ابتدا از روش اولی که گفته شد برای فشرده سازی خروجی php استفاده میکنیم.<br />
حالا برای فایلهای css و js و html  باید کدی بنویسیم که نام یک فایل رو بگیره، محتوای فایل رو بخونه و به خروجی بفرسته. نیازی نیست ما فایل رو فشرده کنیم، بقیه کارها رو خود php انجام میده. برای این منظور فایلی به نام compressor.php در root سایت ایجاد می کنیم که نام فایلی که باید فشرده بشه رو از طریق GET دریافت کنه. ضمنا حتما باید پسوند فایل رو توی برناممون چک کنیم تا مشکل امنیتی پیش نیاد.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php 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: #339933;">!</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="">'/\.(js|css|html|htm)$/i'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'file'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="">'Access Denied'</span><span style="color: #009900;">&#41;</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;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'file'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="">'File Not Found'</span><span style="color: #009900;">&#41;</span>;
<span style="color: #990000;">readfile</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'file'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>حالا به نظر میرسه که این کد باید بدون مشکل کار کنه. اما در عمل ممکنه باعث بروز مشکلاتی از قبیل کاهش سرعت، افزایش مصرف پهنای باند و افزایش مصرف cpu هم بشه. و علتش هم اینه که بدون استفاده از این کد وقتی یک نفر از سایت شما دیدن میکنه تمام فایل های استاتیک در مرورگر کش شده و در مراجعات بعدی مادامی که تغییر نکرده باشند از کش خونده میشن. این در حالیست که با استفاده از این کد در واقع فایل های استاتیک شما به فایل های دینامیک تبدیل شده و هر بار از سرور لود میشن.</p>
<p>برای رفع این مشکل باید کدی بنویسیم که تاریخ آخرین تغییرات فایل رو هم به مرورگر بفرسته در این صورت دفعات بعد که مرورگر فایل رو از سرور درخواست کنه تاریخ آخرین نسخه موجود در کشِ خودش رو هم به سرور میفرسته و ما میتونیم این تاریخ رو با تاریخ فایل مقایسه کنیم و در صورت یکسان بودن به مرورگر بگیم که از همان نسخه موجود در کش استفاده کند.</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
</pre></td><td class="code"><pre class="php 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: #339933;">!</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="">'/\.(js|css|html|htm)$/i'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'file'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="">'Access Denied'</span><span style="color: #009900;">&#41;</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;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'file'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="">'File Not Found'</span><span style="color: #009900;">&#41;</span>;
&nbsp;
<span style="color: #000088;">$mtimestr</span> <span style="color: #339933;">=</span> <span style="color: #990000;">gmdate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;D, d M Y H:i:s&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">filemtime</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'file'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; GMT&quot;</span>;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">@</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="">'HTTP_IF_MODIFIED_SINCE'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$mtimestr</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="">'HTTP/1.1 304 Not Modified'</span><span style="color: #009900;">&#41;</span>;
<span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Last-Modified: &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$mtimestr</span><span style="color: #009900;">&#41;</span>;
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Cache-Control: must-revalidate&quot;</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span>;
<span style="color: #990000;">readfile</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'file'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>در نهایت برای اینکه از بار پردازشی سرور کم کنیم میتونیم از کش سمت سرور هم استفاده کنیم. یعنی فایل های فشرده شده رو روی سرور ذخیره کنیم و مادامی که فایل تغییر نکرده از کش استفاده کنیم. البته این کار پیچیدگی های خاص خودش رو داره. چون در این صورت باید فایل رو خودمون فشرده کنیم و فشرده سازی خودکار رو غیر فعال کنیم. که در این صورت باید قبل از gzip کردن بررسی کنیم که آیا مرورگر از gzip پشتیبانی میکنه یا نه. شاید فکر کنید که این کار لزومی نداشته باشه، چون تقریبا اکثر مرورگر ها از gzip پشتیبانی میکنند، ولی اینطور نیست. به عنوان مثال IE به صورت پیش فرض در صورت استفاده از proxy از HTTP 1.0 استفاده میکنه و gzip رو پشتیبانی نمیکنه.</p>
<p>و البته یک راه دیگه هم برای فشرده تر کردن فایل های js و css وجود داره و اون حذف کامنت ها و فاصله های اضافی از درون کد هست.</p>
<p>در رابطه با این دو مورد آخر برای مشاهده نمونه کد میتونید به سورس <a href="http://farhadi.ir/jsmart.html" target="_blank">jsmart compressor</a> مراجعه کنید.</p>
<p>خوب حالا برنامه ما آماده هست، باید تمام لینک هایی که در سایت به فایل های css و js و html هست رو تغییر بدیم و به جاش لینکی به فایل compressor.php قرار بدیم که نام فایل مورد نظر هم به صورت پارامتر بهش پاس شده باشه. کاره طاقت فرسایی هست و شاید غیر ممکن.</p>
<p>برای اینکه نیاز به تغییر در کدهای فعلی سایتتون نداشته باشید از ماژول mod_rewrite آپاچی کمک می گیریم. یعنی با استفاده از یک rewrite rule تمام request هایی که به فایل های css و js و html ارسال میشه رو به فایل compressor.php می فرستیم.<br />
با این حساب محتوای فایل .htaccess یه چیزی شبیه به این میشه :</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="apache apache" style="font-family:monospace;">php_flag zlib.output_compression <span style="color: #0000ff;">on</span>
&lt;<span style="color: #000000; font-weight:bold;">IfModule</span> mod_rewrite.c&gt;
<span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">On</span>
<span style="color: #00007f;">RewriteCond</span> %{REQUEST_FILENAME} -f
<span style="color: #00007f;">RewriteRule</span> ^(.*\.(js|css|htm|html))$ compressor.php/?file=$<span style="color: #ff0000;">1</span>
&lt;/<span style="color: #000000; font-weight:bold;">IfModule</span>&gt;</pre></td></tr></table></div>

<p>البته برای اینکه این rule با rule های دیگه ای که در برنامه ها برای تبدیل لینک های php به html استفاده میشه تداخل پیدا نکنه یک condition هم بهش اضافه کردیم تا فقط درمورد فایل هایی که وجود خارجی دارند این rule عمل کنه.</p>
<p>تموم شد.<br />
امیدوارم مفید بوده باشه <img src='http://farhadi.ir/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://farhadi.ir/blog/1386/07/03/speed-up-your-site-using-gzip/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>سازگار کردن کد با ورژن های جدید php</title>
		<link>http://farhadi.ir/blog/1386/06/28/migrating-to-new-php-versions/</link>
		<comments>http://farhadi.ir/blog/1386/06/28/migrating-to-new-php-versions/#comments</comments>
		<pubDate>Tue, 18 Sep 2007 21:43:25 +0000</pubDate>
		<dc:creator>علی</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://farhadi.ir/blog/1386/06/28/%d8%b3%d8%a7%d8%b2%da%af%d8%a7%d8%b1-%da%a9%d8%b1%d8%af%d9%86-%da%a9%d8%af-%d8%a8%d8%a7-%d9%88%d8%b1%da%98%d9%86-%d9%87%d8%a7%db%8c-%d8%ac%d8%af%db%8c%d8%af-php/</guid>
		<description><![CDATA[هر بار با بروز رسانی php ممکنه تغییرات جدیدی در php ایجاد بشه که برای برنامه نویس ها درد سر ساز بشه. البته معمولا این دردسر ها زیاد جدی نیستند و با تغییر مختصری در کد مشکل حل میشه. ولی share کردن تجربیات در این زمینه میتونه پیدا کردن و رفع مشکلات رو راحت تر [...]]]></description>
			<content:encoded><![CDATA[<p>هر بار با بروز رسانی php ممکنه تغییرات جدیدی در php ایجاد بشه که برای برنامه نویس ها درد سر ساز بشه. البته معمولا این دردسر ها زیاد جدی نیستند و با تغییر مختصری در کد مشکل حل میشه. ولی share کردن تجربیات در این زمینه میتونه پیدا کردن و رفع مشکلات رو راحت تر کنه.</p>
<p>عمده ترین مشکل در بروز رسانی از نسخه 4 به 5 تداخل شناسه های برنامه شما با شناسه ها و یا کلمات کلیدی جدید در php5 هست که با تغییر نام دادن اون شناسه مشکل حل میشه. برای مثال تداخل نام کلاس soapclient در nusoap با کلاس soapclient در php5.<br />
بهترین راه برای پیشگیری از وقوع اینگونه تداخل ها استفاده از namespace در نام گذاری کلاس ها و توابع است. یعنی از انتخاب نام های عمومی برای شناسه ها خودداری کنید و مثلا حروف اختصاری نام خودتون یا شرکتتون رو به عنوان پیشوند یا پسوند در نام گذاری شناسه استفاده کنید. مثلا بهتر بود که به جای نام soapclient از نام nu_soapclient استفاده میشد.</p>
<p>و اما مشکل دیگه ای که من برخورد داشتم این بود که در php5 در حالت CLI (خط دستور) دایرکتوری جاری با مسیر فایل php یکسان نیست و اگر بخواهید فایلی رو include کنید و یا با فایل ها کار کنید باید حتما قبلش chdir کنید به مسیر مورد نظر. جالب اینجاست که این تغییر در php5.2.4 مجددا به حالت قبل برگشته است.</p>
<p>مشکل دیگه ای هم که من بعد از بروز کردن به php 5.2 داشتم و ساعت ها وقت من رو گرفت این بود که در صورت استفاده از ob_start با callback چنانچه output buffering بدون استفاده از توابع مربوطه خاتمه یابد درون تابع callback نمیتوان از یک آبجکت که قبلا تعریف شده استفاده کرد.<br />
این مشکل بیشتر شبیه به یک باگ هست تا تغییر ورژن. لذا من بعد از کلی کلنجار رفتن با این مشکل به قسمت گزارش باگ در سایت php رفتم و با یک سرچ متوجه شدم که این مشکل ناشی از اینه که در ورژن جدید بعد از خاتمه کد اول آبجکت ها destroy میشن بعد بافر خالی میشه. پس برای رفع این مشکل تنها راه اینه که قبل از خاتمه برنامه خودمون بافر رو خالی کنیم. برای اطلاعات بیشتر در مورد این مشکل <a href="http://bugs.php.net/bug.php?id=39546" target="_blank">اینجا</a> رو کلیک کنید.</p>
<p>و اما مشکلی که در آخرین بروز رسانی به php 5.2.4 پیش اومد. اینکه در حالت CLI عنصر SCRIPT_FILENAME از آرایه سراسری $_SERVER مقدار نداره. (در مورد سایر عناصر تست نکردم شاید اونها هم تغییر کرده باشه)<br />
و اما تغییر دیگه ای که تو این نسخه بود و قبلا بهش اشاره کردم اینکه در حالت CLI دایرکتوری جاری مجددا در این ورژن با مسیر فایل php یکسان شده.</p>
<p>البته این ها فقط مواردی بود که من برخورد داشتم و تغییرات بیشتر از این حرفهاست.</p>
<p>معمولا خود سایت php برای تغییرات در نسخه های ماژور، سرفصلی در php manual  باز میکنه. که موارد زیر از آن جمله اند:</p>
<p><a href="http://www.php.net/manual/en/faq.migration5.php" target="_blank">http://www.php.net/manual/en/faq.migration5.php</a><br />
<a href="http://www.php.net/manual/en/migration5.php" target="_blank">http://www.php.net/manual/en/migration5.php<br />
</a><a href="http://www.php.net/manual/en/migration51.php" target="_blank">http://www.php.net/manual/en/migration51.php</a><br />
<a href="http://www.php.net/manual/en/migration52.php" target="_blank">http://www.php.net/manual/en/migration52.php</a></p>
<p>برای نسخه های مینور هم میتونید به <a href="http://www.php.net/ChangeLog-5.php" target="_blank">ChangeLog</a> مراجعه کنید.</p>
]]></content:encoded>
			<wfw:commentRss>http://farhadi.ir/blog/1386/06/28/migrating-to-new-php-versions/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

