فايل پيکربندي PHP

قبل از شروع مطالب نگاهي اجمالي بـه ويژگيهاي فايل پيکربندي PHP منطقي بـه نظر مي رسد. چگونه کسی که مارا بلاک کرده در واتی اپ خارج شویم نام اين فايل php.ini مي باشد و به دلايلي از ساختار کلي فايلهاي ini کـه بيشتر درون برنامـه هاي کاربردي ويندوز استفاده مي شود، چگونه کسی که مارا بلاک کرده در واتی اپ خارج شویم پيروي مي کند. چگونه کسی که مارا بلاک کرده در واتی اپ خارج شویم اين فايل متني بـه صورت ASCII مي باشد کـه به بخشـهايي (session) تقسيم مي شود. هر بخش متغيرهايي را کـه مربوط بـه آن بخش مي شوند، درون بر مي گيرد. هر بخش چيزي شبيه زير مي باشد:

[MySection]
variable=\"value\"
anothervariable=\"anothervalue\"

نام بخش درون يک جفت براکت"[]" درون بالا قرار مي گيرد. و زير آن درون هر سطر يک متغير با مقدارش قرار مي گيرد. متغيرها بـه حروف حساس (case sensitive) هستند و نمي توانند شامل فاصله (space) باشند، درون حالي کـه مقادير متناظر آنـها مي توانند اعداد، رشته کاراکتري (string) و يا Boolean باشند.

سمي کالن ";" درون ابتداي هر سطر بـه عنوان نشانگر درج توضيحات (comment) مي باشد. اين راهي ساده براي فعال يا غيرفعال ويژگيهاي PHP مي باشد، بـه جاي حذف يک سطر مي توانيد بـه اين روش آن را بـه توضيح تبديل کرده کـه در پردازش فايل ها شرکت نخواهد کرد. درون صورتي کـه فکر مي کنيد ممکن هست بعد ها بخواهيد از ويژگي کـه اکنون بـه کارتان نمي آيد، استفاده کنيد بهتر هست آن را پاک نکنيد.

براي اينکه PHP بتواند فايل php.ini را تشخيص بدهد بايد آن را درون دايرکتوري جاري، دايرکتوري کـه در متغير $PHPRC تعريف شده، يا دايرکتوري کـه هنگام کامپايل مشخص شده است(براي ويندوز اين همان دايرکتوري اصلي PHP است) نگهداريد.

بعد از اينکه شما تغييراتي درون فايل php.ini داديد براي آنکه تغييرات اعمال شوند بايد سرور خود را مجددا راه اندازي نماييد (سرور را restart کنيد). البته فرض بر اين هست که شما قبلا درون حال استفاده PHP بر سرور خود بوده ايد. براي استفاده هاي command-line از PHP فايل پيکربندي php.ini درون هرباري کـه برنامـه PHP احضار مي شود خوانده و چک مي شود.

تنظيم ويژگيهاي مفسر

اولين مرحله درون اين مقاله از مـهمترين گامـهاي آن مي باشد، ويژگيهايي کـه به مفسر زبان PHP مربوط مي شود. اولين مورد درون اينجا engine variable مي باشد کـه چک مي کند کـه PHP engine بايد فعال "on" يا غير فعال "off" باشد. Off اين متغير بـه معني اين هست که کدهاي PHP توسط سرور تفسير نشوند.معمولاً نيازي بـه اين تغيير حس نمي شود، بعد اين متغير را بـه صورت on رها کنيد.

engine=On

متغير short_open_tag کنترل مي کند کـه آيا مفسر بايد تگهاي کوتاه را همانند تگ استاندارد تشخيص دهد يا نـه.در صورتي کـه تشخيص مي دهيد اين نمونـه تگها باعث ناسازگاري با ديگر زبانـها مي شوند يا اينکه تصميم بـه استفاده از قوانين syntax مختص PHP داريد مي توانيد آن را off کنيد.

short_open_tag = On

معمولاً session, cookie و اطلاعات HTTP header درون يک اسکريپت PHP بايد قبل از توليد هرگونـه خروجي توسط آن اسکريپت فرستاده شوند. درون صورتي کـه اين درون برنامـه شما امکان پذير نيست مي توانيد هر چه را کـه PHP بـه نام output buffering مي شناسد، توسط متغيرهاي output_buffering فعال کنيد.

با on بودن output buffering، زبان PHP خروجي اسکريپت شما را درون يک بافر مخصوص نگه مي دارد و هنگامي آنـها را مي فرستد کـه به طور مشخص بـه آن دستور داده شود. اين بـه شما امکان مي دهد کـه cookieها يا اطلاعات HTTP header را از وسط يا انتهاي کد اسکريپت خود بفرستيد. هرچند اين مي تواند کارآيي را درون حاشيه کاهش دهد.

output_buffering = Off

شما مي توانيد با يک عدد بـه عنوان مقدار براي متغير output_buffering اندازه بافر را تعيين کنيد.

output_buffering = 2048

هنگامي کـه PHP شروع بـه کار مي کند يک پيام حاوي شماره نسخه خود بـه هدر استاندارد سرور مي افزايد.براي غيرفعال آن مي توانيد متغير expose_PHP را off کنيد.اين مي تواند مفيد باشد، مثلا اگر بخواهيد امکانات وب سرور خود را از ديد هکرها پنـهان کنيد.

expose_PHP = On

تنظيم مسير جستجوي

شما مي توانيد مسير جستجويي را براي PHP با تنظيم متغير include_patch کـه ليستي از مسيرها را مي پذيرد، مشخص کنيد. PHP هنگامي کـه با فايلي کـه مسير آن مشخص نشده هست ، مواجه مي شود بـه طور اتوماتيک اين مسيرها را چک مي کند.

اگر شما کتابخانـه اي از توابع يا مجموعه اي از کلاسها داريد کـه زياد از آنـها استفاده مي کنيد مي توانيد دايرکتوري موقعيت آنـها را درون اين متغير قرار دهيد. همچنين اين متغير مکان مناسبي براي اضافه دايرکتوري PEAR خود PHP مي باشد، کـه مجموعه اي از کلاسهايي کـه بسيار استفاده مي شوند را شامل مي شود.

include_path = \".:/usr/local/lib/php/pear:\"

کاربران ويندوز براي مشخص چندين دايرکتوري بايد از سمي کالن";" بين آنـها استفاده کنند و کاربران unix از کالن ":".

دو متغير جالب درون اين زمينـه auto_prepend_file و auto_append_file مي باشند. اين متغيرها فايلهايي را مشخص مي کنند کـه PHP بـه ابتدا يا انتهاي هر سند PHP اضافه خواهد کرد. اين مورد بيشتر براي اضافه header و footer بـه صفحاتي هست که توسط PHP ايجاد مي شوند، بـه طوري کـه باعث مي شود تعدادي خط کد بـه هر سند PHP کـه شما مي نويسيد اضافه گردد.

اين فايلها هم مي توانند اسکريپتهاي PHP و هم html معمولي باشند، ولي کدهاي PHP براي اين امر بايد درون تگ استاندارد محصور شده باشند.

auto_prepend_file = /home/web/includes/header.php
auto_append_file = /home/web/includes/legal.php

چگونگي رفتار با خطاها

خطا ها درون PHP درون چهار دسته مي آيند: چگونه کسی که مارا بلاک کرده در واتی اپ خارج شویم parsing errors يا خطاي زمان تجزيه (کامپايل)، تذکرات درمورد خطاهاي موجود درون کد مثلا مقدار دهي ن يک متغير، warning يا هشدار و fatal error. معمولا هنگامي کـه PHP با يکي از خطاهاي parsing error يا warning يا fatal error مواجه مي شود، خطاها را نمايش مي دهد و اگر خطا از نوع fatal error باشد اجراي اسکريپت را درون همان نقطه متوقف مي کند. شما مي توانيد اين رفتار را با متغير error_reporting کـه چند فيلد خطا را مي گيرد و تنـها خطاهايي را کـه با آنـها سازگار باشند نمايش مي دهد، اصلاح کنيد.

error_reporting = E_ALL

براي غير فعال نمايش خطاها مقدار متغير display_errors را بـه نادرست تغيير دهيد و به جاي آن پيام خطاها را درون ثبات خطاها از طريق متغير log_errors بنويسيد.

انجام اين کار براي امنيت بيشتر مفيد است، با غيرفعال نمايش خطا شما اطلاعات ويژه سيستم خود را مخفي مي کنيد بدون توجه بـه اينکه آيا کاربران قصد خراب سايت شما را دارند يا فقط استفاده مي کنند.به جاي آن شما بايد خطاها را درون يک فايل دلخواه يا ثبات خطاي سيستم (system logger)، با تنظيم مقدار متغير error_log بـه مسير فايل انتخابي يا مقدار پيش فرض "syslog"، ثبت کنيد. فقط بـه ياد داشته باشيد کـه مرتبا بـه اين فايل سربزنيد که تا ببينيد کـه در برنامـه شما چه خطاهايي وجود دارد.

display_errors = Off
log_errors = On
error_log = \"error.log\"

فعال توسعه ها

توسعه هاي متعددي براي PHP موجود است. درون سيستمـهاي يونيلازم هست که اين توسعه ها درون زمان کامپايل ساخته شوند. درون ويندوز، dll هاي باينري وجود دارند کـه بايد ضميمـه شوند. متغير extension_dir محتوي نام شاخه اي هست که PHP درون آن بـه دنبال اين توسعه ها مي گردد. مثلا:

extension_dir = \"C:\Program Files\Internet Tools\Apache\bin\php4\extensions\"

نسخه ويندوز PHP بـه همراه ۲۰ توسعه منتشر مي شود کـه تمامي آنـها درون فايل php.ini ليست شده اند. براي فعال هر توسعه، علامت سمي کالن جلوي آن را حذف کرده و سرور خود را از نو راه اندازي کنيد. براي غير فعال يک توسعه نيز مي توانيد جلوي آن علامت سمي کالن رو اضافه کنيد.

اگر توسعه مورد نظرتان درون ليست توسعه ها درون فايل php.ini نيست از متغير extension استفاده کرده و نام dll مورد نظر را بـه آن نسبت دهيد. مثلا:

extension=php_domxml.dll
extension=php_dbase.dll

تنظيم متغيرهاي مربوط بـه توسعه ها

متغير هاي مربوط بـه توسعه ها، درون بخش جداگانـه اي از فايل پيکربندي (php.ini) ذخيره مي شوند. براي مثال تمام متغيرهايي کـه به توسعه هاي MySQL مربوط مي شوند بايد درون قسمت [MySQL] درون فايل php.ini، قرار بگيرند.

اگر قصد استفاده از تابع mail درون PHP را داريد، 3 متغير وجود دارد کـه بايد آنـها را تنظيم کنيد. متغيرهاي SMTP و sendmail_from (در ويندوز) يا sendmail_path (در يونيکس) درون هنگام ارسال e-mail از طريق تابع mail مورد استفاده قرار مي گيرند. درون ويندوز اين متغير ها براي تنظيم SMTP Server و همچنين براي تعيين آدرس From درون ساختار e-mail بـه کار مي روند. درون يونيمتغير sendmail_path مسير MTA يا Mail Transfer Agent را براي ارسال mail تنظيم مي کند.

SMTP = myserver.localnet.com
sendmail_from = me@localhost.com
sendmail_path = /usr/sbin/sendmail

متغيرهاي java.class.path ، java.home، java.library و java.library.path همگي آدرس کلاس ها و کتابخانـه هاي جاوا را تنظيم ميکنند. اين مقادير بـه وسيله توسعه هاي جاوا مورد استفاده قرار مي گيرند. بنابراين اگر مي خواهيد PHP بتواند ارتباط صحيحي با برنامـه هاي جاواي شما برقرار کند از درستي و معتبر بودن مقادير اين متغير ها اطمينان حاصل کنيد.

java.class.path = .\php_java.jar
java.home = c:\jdk
java.library = c:\jdk\jre\bin\hotspot\jvm.dll
java.library.path = .\

متغير session.save_path مشخص کننده آدرس شاخه موقتي هست که براي ذخيره اطلاعات session ها بکار مي رود. معمولا اين متغير بـه طور پيش فرض مقدار /tmp را دارد، اما از آنجا کـه اين شاخه درون ويندوز وجود ندارد بايد آن را با آدرس درست شاخه موقت ويندوز تصحيح کنيد درون غير اين صورت هنگام فراخواني دستور session_start با خطا مواجه مي شويد. همچنين مي توانيد با تنظيم متغير session.cookie_lifetime مدت اعتبار cookie هاي session را بر حسب ثانيه مشخص کنيد.

session.save_path = c:\windows\temp
session.cookie_lifetime = 1800

تنظيمات مربوط بـه امنيت

تعدادي متغير درون php.ini وجود دارد کـه به امنيت PHP نصب شده بر روي سيستم شما مريوط مي شوند. مـهمترين آنـها متغير safe_mode مي باشد کـه به طور مثال استفاده از آن براي محدود آنچه کاربر مي تواند از طريق PHP انجام دهد بهISP ها توصيه ميشود.

safe_mode = Off

اگر safe mode فعال باشد (safe_mode = on) مي توانيد با تنظيم متغير safe_mode_include_dir مشخص کنيد کـه کدام شاخه ها براي فايل ها مورد جستجو قرار بگيرند. همچنين ميتوانيد نوع برنامـه هايي کـه کدهاي PHP مي توانند از طريق فرمان exec آنـها را اجرا کنند، را محدود کنيد. بدين منظور بايد اين برنامـه هاي مجاز را درون يک شاخه مخصوص قرار دهيد و از طريق متغير safe_mode_include_dir بـه PHP بگوييد کـه تنـها درون آن شاخه بـه دنبال آنـها بگردد.بدين ترتيب تنـها برنامـه هاي درون اين شاخه توسط فرمان exec قابل دسترس خواهند بود.

safe_mode_include_dir = /usr/local/lib/php/safe-include
safe_mode_exec_dir = /usr/local/lib/php/safe-bin

شما مي توانيد اعمال مربوط بـه فايل ها را از طريق متغير open_basedir محدود کنيد. آدرس نسبت داده شده بـه اين متغير بـه عنوان ريشـه اصلي (root) براي اعمال مربوط بـه فايل ها بـه کار مي رود. وقتي کـه اين متغير مقدار مي گيرد فايلهايي کـه در ساختار درختي اين ريشـه نباشند براي PHP غير قابل دسترس خواهند بود. اين روش مناسبي براي محدود کاربران يک سيستم اشتراکي مي باشد که تا آنـها تنـها بـه آدرسهاي مربوط بـه خودشان دسترسي داشته باشند.

open_basedir = /home/web/

متغير max_execution_time تعيين ميکند کـه PHP حداکثر چند ثانيه منتظر پايان يافتن يک کد باشد قبل از آنکه بـه اجبار آن را خاتمـه دهد. وقتي کد شما گرفتار حلقه هاي بينـهايت ميشود اين متغير بکار مي آيد.اگر چه ممکن هست اين موضوع گاهي مزاحمت ايجاد کند مثلا زماني کـه کد نوشته شده نياز بـه انجام اعمال زمانبري دارد، مثلا upload يک فايل حجيم. درون اين مواقع بايد مواظب باشيد کـه اين مقدار را افزايش دهيد که تا مانع آن شويد کـه PHP اجراي کد شما را درون وسط يک کار مـهم خاتمـه دهد.

max_execution_time = 90

تنظيمات مربوط بـه upload فايل ها و متغير هاي فرمـها

اگر پيکربندي هاي امنيتي کـه تاکنون ذکر شد کافي نيست باز هم مي توانيد با غير فعال قابليت upload فايل از طريق متغير file_uploads، يا با محدود حداکثر حجم قابل upload از طريق متغير upload_max_filesize سيستم خود را از اين هم امن تر کنيد. اغلب تمايل خواهيد داشت کـه فضاي کوچکي را براي upload فايلها اختصاص دهيد مگر اينکه برنامـه اي داشته باشيد کـه قرار باشد فايل هايي نظير يک گالري عيا يک FTP Service را پذيرا باشد.

file_uploads = On
upload_max_filesize = 2M

اگر تمايلي بـه upload فايلها نداريد اما از تعداد زيادي فرم درون صفحات PHP تان استفاده ميکنيد، 2 متغير ديگر وجود دارد کـه بايد برايتان جالب باشد. اول متغير register_globals، علت بيشترين سردردهاي برنامـه نويسان با سابقهPHP درون PHP 3.x اين متغير بـه طور پيش فرض فعال بود (on) کـه موجب ميشد وقتي يک فرم submit مي شد متغيرهاي آن بطور اتوماتيک بـه متغيرهاي PHP تبديل شوند.

مسايل امنيتي موجب شد کـه در PHP 4.x اين متغير بطور پيش فرض غير فعال باشد. (off). درون نتيجه متغيرهاي فرم تنـها بـه کمک آرايه هاي ويژه $_GET و $_POST قابل دسترس باشند. اين امر خيلي از کدهاي نوشته شده با PHP 3.x را با مشکل مواجه ساخت. مثلا مقداري کـه در يک فيلد وارد شده بود درون PHP 3.x با $email قابل دسترس بود درون حالي کـه در PHP 4.x با $_POST[email] يا $_GET[email] ميتوان بـه آن رجوع کرد.

ميتوانيد اين متغير را غير فعال کنيد (off) که تا امنيت بيشتري را درون برابر حملاتي کـه از طريق فرمـها صورت مي گيرند برقرار کنيد. بـه منظور سازگاري با کدهاي نوشته شده با PHP 3.x آن را فعال کنيد:

register_globals = on

متغير ديگري کـه به کار با فرم ها مربوط ميشود post_max_size هست که کنترل مي کند حداکثر چه حجم داده اي توسط متد POST يک فرم پذيرفته شود. بـه نظر نمي آيد کـه زماني لازم شود اين مقدار را از 8 MB افزايش دهيد. درون عوض احتمال دارد بخواهيد آن را بـه يک مقدار واقعي تر تغيير دهيد. بـه هر حال اگر قصد داريد از امکانات upload فايل درون PHP استفاده کنيد اين مقدار را بيشتر از مقدار متغير upload_max_size قرار دهيد.

post_max_size = 8M

يک متغير جديد هم درون PHP 5 معرفي شده است: max_input_time. کـه حداکثر زمان بر حسب ثانيه کـه عمل دريافت داده هاي ورودي از طريق POST ،GET و PUT مي تواند طول بکشد را مشخص مي کند. اگر برنامـه شما تحت يک اتصال کند اجرا مي شود بهتر هست اين مقدار را افزايش دهيد که تا به برنامـه اجازه دهيد مدت بيشتري را بـه دريافت داده هاي ورودي اختصاص دهد.

max_input_time = 90

افزايش کارآيي

هنوز مقادير ديگري هم وجود دارد کـه با دستکاري آنـها مي توانيد کارايي مفسر PHP را بالا ببريد. بـه منظور جلوگيري از اجراي کدهايي کـه ممکن هست تمام حافظه موجود سيستم را اشغال کنند، PHP بـه شما اجازه مي دهد کـه براي استفاده از حافظه محدوديتي معين کنيد. اين کار از طريق متغير memory_limit قابل انجام هست که حداکثر ميزان حافظه قابل استفاده توسط يک برنامـه واحد را مشخص مي کند.

memory_limit = 8M

مقدار متغير memory_limit اغلب بايد از مقدار متغير post_max_size بيشتر باشد.

مساله ديگري کـه با دانستن آن مي توانيد کارايي را افزايش دهيد غير فعال متغيرهاي $argc و $argv هست که تعداد و محتواي آرگومان هاي خط فرمان کـه به يک برنامـه ارسال شده اند، را مشخص مي کنند.

register_argc_argv = false

همينطور غير فعال آرايه هاي $HTTP_GET_VARS , $HTTP_POST_VARS . چرا کـه به احتمال زياد درون دنياي جديد $_GET , $_POST ديگر نيازي بـه آنـها نيست. غير فعال اين اجزا باعث بهبود کارآيي مي شود البته فقط درون PHP 5 و از طريق متغيرregister_long_arrays قابل انجام است.

register_long_arrays = false

تابع ini_set

و درون آخر نکاتي درون مورد تابع ini_set. درون حالي کهPHP تمام تنظيمات اش را درون هنگام بالا آمدن، از فايل php.ini مي خواند، اين اجازه را بـه شما مي دهد کـه اين تنظيمات را بـه کمک تابع جالب ini_set و در برنامـه خود انجام دهيد. البته اين تغييرات فقط براي همان برنامـه اي کـه در آن از تابع ini_set استفاده کرده ايد اعمال مي شوند .اين تابع 2 آرگومان مي گيرد: نام متغير پيکربندي اي کـه مي خواهيد مقدارش را تغيير دهيد و مقدار جديد آن. اين هم يک مثال کـه حداکثر زمان اجراي مجاز براي برنامـه اي کـه اين کد درون داخل آن نوشته شده هست را افزايش مي دهد.

ini_set('max_execution_time', 600);

// more code

?>

باز هم يادآوري مي شود کـه اين تنظيمات درون داخل هر برنامـه اي کـه نوشته شود فقط همان برنامـه را تحت الشعاع قرار مي دهد. وقتي کـه برنامـه خاتمـه پيدا کند مقدار متغير بـه طور اتوماتيک بـه مقدار اوليه تغيير خواهد کرد.

اگر برنامـه هايPHP شما بر روي يک سرور مشترک (Shared Server) اجرا مي شوند احتمالا شما دسترسي بـه فايل پيکربندي php.ini نخواهيد داشت. درون اين موارد تابع ini_set کمک شاياني مي کند. چرا کـه اجازه مي دهد تنظيمات مورد نظرتان را براي برنامـه هاي خودتان اعمال کنيد




[بدو علم چگونه کسی که مارا بلاک کرده در واتی اپ خارج شویم]

نویسنده و منبع | تاریخ انتشار: Mon, 03 Sep 2018 10:15:00 +0000