باسمه تعالی

مسئله : بررسی warning  زیر به هنگام استفاده از توابع Session در php :

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent

بخش اول : آشنایی با UTF-8 ( Unicode Transformation Format 8-bit ) و کاراکتر BOM

utf-8 یک روش کدگذاری برای نمایش کاراکترهای Unicode  می باشد . طول کاراکترهایی که بوسیله ی utf-8 کدگذاری می شوند ، از 1 تا 4 بایت متغیر است . utf-8  کدگذاری پیش فرض در XML بوده و از سال 2010 به عنوان کدگذاری غالب در وب در نظر گرفته شده است.

BOM  یا Byte Order Mark ترکیبی است از چند کاراکتر ویژه که قرارگیری آن در ابتدای یک فایل متنی، نوع کدگذاری کارکترهای موجود در آن فایل را مشخص می‌کند. BOM بخشی از متن فایل به حساب نمی‌آید و وجود آن تنها برای رفع ابهام از نوع و شیوه‌ی کدگذاری یک فایلی متنی ضروری است. وقتي فایلی به صورت utf-8 ذخيره شود بعضي از ويرايشگرهای متنی مثل notepad++ براي اينكه مشخص كنند كه اين فايل به صورت utf-8 کدگذاری شده است رشته ی کاراکتری BOM را به ابتدای فایل اضافه می کنند که البته در ویرایشگرهای متنی قابل رؤیت نیست . به عنوان مثال برای کدگذاری UTF-8 مقدار رشته ی BOM برابر با 0xEF,0xBB,0xBF خواهد بود که در مرورگرها با استاندارد CP1252 و به شکل  دیده می شود.

مقدار رشته ی BOM برای کدگذاری های مختلف در جدول زیر نمایش داده شده است :

 

بخش دوم : HTTP Header و توابع SESSION در php

هر درخواست و پاسخ در وب شامل یک هدر HTTP می باشد که در شکل زیر قابل رؤیت می باشد :

http://d2o0t5hpnwv4c1.cloudfront.net/511_http/http_diagram.png

زمانی که کاربر در مرورگر خود یک آدرس را وارد می کند ، مرورگر یک درخواست HTTP به شکل زیر را به سمت سرور می فرستد :

و سپس مرورگر پاسخ خود را به همراه یک هدر HTTP به شکل زیر دریافت می کند :

توابع HTTP  در php به مجموعه توابعی می گویند که به برنامه نویس اجازه ی تغییر در اطلاعات هدر HTTP مربوط به یک صفحه ی html را می دهند. این توابع عبارتند از :

یکی از متغیر هایی که در هدر HTTP تعبیه می شود ، مقادیر متغییرهای کوکی می باشد که این عمل  بوسیله ی تابع setcookie() انجام می شود .

مثال

توضیح

نام فیلد

Set-Cookie: UserID = JohnDoe; Max-Age = 3600; Version = 1

 

An HTTP cookie

 

Set-Cookie

 

 

به هنگام استفاده از Session ها و تعریف یک متغیر به عنوان Session ، خود متغیر در سمت سرور ذخیره شده و یک SESSION-ID که ارجاعی به متغیر است به روش کوکی به سمت مشتری فرستاده می شود. به شکل زیر دقت کنید :

 

بنابراین به هنگام استفاده از Session ها نیاز به تغییر هدر HTTP و set کردن متغیر SESSION-ID به عنوان یک کوکی داریم .

 

بخش سوم : دلیل بوجود آمدن warning معرفی شده در ابتدای آموزش :

هنگامی که یک فایل php یا html را در یک ویرایشگر متنی با کدگذاری utf-8 ذخیره سازی می کنید و بنابراین کارکترهای BOM را به ابتدای فایل اضافه می کنید . به هنگام پردازش فایل بوسیله ی مفسر php ، بخش هدر HTTP ی پاسخ (HTTP Response) به سمت مشتری فرستاده می شود و بنابراین زمانی که به دستورات Session می رسید و قصد ایجاد تغییر در هدر HTTP را دارید ، با این هشدار مواجه می شوید . به این معنی که بخش هدر صفحه ی پاسخ به مشتری قبلا فرستاده شده است.

بخش چهارم : راهکارهای ارائه شده

روش اول : برای حل این مشکل باید فایل های خود را در قالب utf-8 بدون اضافه کردن کاراکترهای BOM ذخیره کنیم.

که در دو ویرایشگر Notepad++ و Dreamweaver روش کار به صورت زیر است :

Notepad++ :

Dreamweaver : که گزینه ی مشخص شده نباید انتخاب شود.

BOM preferences on a dialog panel.

بعد از انجام این کار اگر خروجی صفحات را در مرورگر خود مشاهده کنید ، خواهید دید که کاراکتر های زبان فارسی به صورت نامفهوم (علامت  ؟ ) دیده می شوند ، دلیل این امر این است که فایل فرستاده شده به سمت مشتری حاوی کاراکترهای BOM که مشخص کننده ی نوع کاراکترهای موجود در فایل هستند ، نمی باشد و بنابراین برای مرورگر قابل درک نیستند. برای رفع این مشکل باید به نوعی برای مرورگر مشخص کنیم که کاراکتر های فایل از نوع utf-8 هستند و تگ زیر را در تگ <head> صفحه ی html اضافه می کنیم .

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

روش دوم : ایجاد تغییر در فایل httpd.conf

در این روش به جای اضافه کردن تگ روش قبل در فایل تنظیمات وب سرور آپاچی خط زیر را اضافه می کنیم و یا اگر وجود دارد به شکل زیر تغییر می دهیم :

AddDefaultCharset utf-8

روش سوم : استفاده از تابع mb_internal_encoding('UTF-8')

روش چهارم : استفاده از توابع ob_start() و ob_end_flush()

 

ضمیمه :

  1. برای عدم نمایش پیغام های خطای تولید شده در PHP در فایل php.ini مقدار display_errors را از On به Off تغییر می دهیم.

display_errors = On                                                   display_errors = Off

 

  1. برای تغییر کدگذاری جریان داده بین صفحات و پایگاه داده به utf-8 از کد زیر استفاده می شود :

 

  •  

ویا کد SQL زیر را اجرا می کنیم :

 

  mysql_query("SET NAMES 'utf8'");