
توی دوره رایگان PHP، هر چیزی که برای حرفهای شدن نیاز داری رو یاد میگیری! از مفاهیم پایه تا پیشرفته، همراه با یه پروژه واقعی برای ساخت یه سایت مثل آپارات.
مشاهده بیشتر
توی این دوره با هم یه وبسایت خبری واقعی رو از صفر میسازیم! از طراحی دیتابیس و احراز هویت تا ساخت API و یه پنل مدیریت حرفهای، همه رو یاد میگیریم و آماده پروژههای واقعی میشی!
مشاهده بیشترمشخصات مقاله
40 نکته ی مفید و کاربردی در PHP برای برنامه نویسی تحت وب در سطح مقدماتی قسمت پایانی
31. مدیریت گزارش خطاها (error reporting):
error_reporting تابعی است که به وسیله ی آن شدت و نوع خطا را به منظور ارسال به سرویس دهنده تنظیم می نمایید. به عبارتی دیگر توسعه دهنده می تواند با استفاده از این تابع سطح خطاهای روی داده را مشخص و تنها آن دسته از خطاهایی که مورد نظر وی است را به سرویس دهنده گزارش و ارسال کند. در دستگاه توسعه ی اپلیکیشن می توان با استفاده از روش زیر اعلانیه ها و پیغام های strtict را غیرفعال کرد:
1 2 3 | ini_set('display_errors', 1); error_reporting(~E_NOTICE & ~E_STRICT); < button ></ button > |
در دستگاه نصب و اجرای اپلیکیشن (production)، نمایش خطاها باید غیرفعال شود.
1 2 3 | ini_set('display_errors', 0); error_reporting(~E_WARNING & ~E_NOTICE & ~E_STRICT); < button ></ button > |
لازم به ذکر است که مقدار error_reporting را نباید هیچگاه در دستگاه نصب و اجرای اپلیکیشن (production) بر روی 0 تنظیم نمایید. خطاهایی که شدت آن ها در سطح E_FATALs می باشد حتما باید به سرویس دهنده گزارش شوند. برای غیرفعال کردن diplay خطاها، کافی است از دستور display_errors استفاده نمایید. چنانچه پارامتر error_reporting بر 0 تنظیم شده باشد، آنگاه خطایی صادر نشده و هیچ گزارشی به سرویس دهنده ارسال نمی شود.
اگر display غیرفعال شده باشد، در آن صورت لازم است خطاها برای تحلیل در آینده داخل یک فایل ثبت شوند. برای انجام این کار کافی است تابع ini_set را به صورت زیر فراخوانی نمایید.
1 2 3 4 5 | ini_set('log_errors' , '1'); ini_set('error_log' , '/path/to/errors.txt'); ini_set('display_errors' , 0); error_reporting(~E_WARNING & ~E_NOTICE & ~E_STRICT); < button ></ button > |
- لازم است اجازه ی درج اطلاعات در آدرس (path) '/path/to/errors.txt' به سرویس دهنده داده شده باشد، تا سرور بتواند خطاها را در آدرس مزبور ثبت نماید.
- یک فایل ویژه ی خطاها مشخص نمایید چرا که در غیر این صورت تمامی گزارشات در پوشه ی ذخیره خطاها apache/web server error log درج شده و با دیگر خطاهای مربوط به apache اشتباه گرفته می شوند.
- علاوه بر این از آنجایی که داخل اپلیکیشن جاری تنظیم می شود، پوشه های حاوی گزارش خطاها (error log) تنها خطاهای مربوط به اپلیکیشن جاری را دربرمی گیرد (چرا که ممکن است در وب سرور اپلیکیشن های دیگری در حال اجرا باشند).
- path یا آدرس مورد نظر می تواند جایی داخل پوشه ی اپلیکیشن جاری نیز قرار داشته باشد، از اینرو دیگر لازم نیست پوشه های مربوط به سیستم نظیر /var/log جستجو شوند.
- error_reporting را بر روی 0 تنظیم نکنید چرا که در این صورت هیچ خطایی ثبت نخواهد شد.
در صورت نیاز می توانید بجای روش فوق، با استفاده از set_error_handler یک تابع اختصاصی تنظیم نمایید که مدیریت خطاها را بر عهده گیرد. آن تابع می تواند، به عنوان مثال، کلیه ی خطاها را داخل یک فایل ثبت نماید.
توصیه می شود در دستگاه توسعه ی اپلیکیشن (development machine)، داخل فایل php.ini، مقدار display_errors را برابر On قرار دهید.
در دستگاه توسعه ی اپلیکیشن، لازم است پارامتر display_errors را داخل فایل php.ini تنظیم نموده و صرفا به ini_set اکتفا نکنید.
در شرح علت آن باید گفت که تمامی خطاهای مهلک زمان اجرا (compile time) حال سبب می شوند که تابع ini_set اجرا شده و از این جهت هیچ خطایی display نشده و در عوض یک صفحه ی سفید نمایش داده می شود. همچنین زمانی که display_error را داخل php.ini برابر On قرار داده باشید، غیرفعال کردن آن در اسکریپتی که خطاهای مهلک دارد اصلا عمل نخواهد کرد.
در دستگاه نصب و اجرای اپلیکیشن (production)، مقدار display_errors را برابر Off قرار دهید. شما نباید صرفا به دستور init_set('display_errors' , 0); اکتفا کنید چرا که در صورت بروز خطای مهلک زمان اجرا در اسکریپت، متد مزبور اجرا نشده و خطاها بلافاصله برای کاربر نمایش داده می شوند.
32. لازم است از معماری بستر اجرای اپلیکیشن (platform) آگاه باشید:
طول اعداد صحیح (integer length) در معماری های 32 و 64 بیت متفاوت است. به همین جهت توابعی نظیر strtotime در هر بستر اجرا نتیجه ی متفاوتی تولید می کند.
در دستگاهی با معماری 64 بیتی خروجی معمولا بدین صورت خواهد بود:
1 2 3 4 5 6 7 8 9 | $ php -a Interactive shell php > echo strtotime("0000-00-00 00:00:00"); -62170005200 php > echo strtotime('1000-01-30'); -30607739600 php > echo strtotime('2100-01-30'); 4104930600 < button ></ button > |
این درحالی است که در دستگاهی با معماری 32 بیتی، خروجی تمامی دستورهای فوق، bool(false) خواهد بود. به نظر شما اگر یک عدد صحیح بیش از 32 بیت به چپ رانده شود (left shifted)، چه نتیجه ای در پی خواهد داشت؟ خروجی در دستگاه های مختلف متفاوت خواهد بود.
33. توصیه نمی شود خیلی به اجرا و خروجی تابع set_time_limit تکیه کنید:
اگر حداکثر زمان اجرای یک اسکریپت را به صورت زیر محدود نمایید:
1 2 3 | set_time_limit(30); //Rest of the code < button ></ button > |
در آن صورت ممکن است کد همیشه طبق انتظار عمل نکند. در واقع هر عملیاتی که توسط توابع سیستم عامل یا فراخوانی های سیستم (system calls/os functions) خارج از اسکریپت اپلیکیشن، نظیر عملیات مربوط به سوکت، دیتابیس و غیره ... اجرا شود تحت کنترل set_time_limit نخواهد بود.
بنابراین اگر عملیات مربوط به دیتابیس زمان قابل توجهی را به خود تخصیص داده یا به هر علتی هنگ کرد، در آن صورت اسکریپت اجرا را متوقف نخواهد کرد. لازم است برای چنین شرایطی، جهت مدیریت خطاهای زمان اجرا، استراتژی مناسب درنظر گرفته و تدبیر لازم را بیاندیشید.
34. یک تابع portable و قابل اجرا در چندین محیط جهت اجرای دستورات خط فرمان (shell command) تعریف نمایید:
شما می توانید از چهار تابع system، exec، passthru، shell_exec برای اجرای دستورات سیستمی استفاده نمایید. هر یک رفتار و قابلیت متفاوتی دارد، اما مشکل اینجا است که اگر اپلیکیشن بر روی محیط یا بسترهای مشترک (hosting environment) اجرا شود، برخی از توابع به صورت گزینشی غیرفعال می شوند. اغلب توسعه دهندگان تازه وارد، ابتدا توابعی که فعال و قابل استفاده است را پیدا می کنند و سپس از آن استفاده می نمایند.
یک راه حل بهینه تر این است که:
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | /** Method to execute a command in the terminal Uses : 1. system 2. passthru 3. exec 4. shell_exec */ function terminal($command) { //system if(function_exists('system')) { ob_start(); system($command , $return_var); $output = ob_get_contents(); ob_end_clean(); } //passthru else if(function_exists('passthru')) { ob_start(); passthru($command , $return_var); $output = ob_get_contents(); ob_end_clean(); } //exec else if(function_exists('exec')) { exec($command , $output , $return_var); $output = implode("n" , $output); } //shell_exec else if(function_exists('shell_exec')) { $output = shell_exec($command) ; } else { $output = 'Command execution not possible on this system'; $return_var = 1; } return array('output' => $output , 'status' => $return_var); } terminal('ls'); < button ></ button > |
تابعی که در کد فوق مشاهده می کنید، دستور خط فرمان (shell command) را به وسیله ی هر تابعی که در دسترس است، اجرا می کند که این سبب ثبات و هم خوانی کد اپلیکیشن شما می شود.
35. اپلیکیشن خود را مطابق محل زندگی (منطقه ی زمانی) کاربر تنظیم کنید (localize):
توصیه می شود که اپلیکیشن php خود را مطابق با محلی که کاربر در آن استقرار دارد، تنظیم نمایید. به عنوان مثال تاریخ و اعداد را با کاما و نقطه ی ممیز فرمت دهی نمایید و زمان را با توجه به منطقه ی زمانی کاربر به صورت اختصاصی تنظیم کرده و نمایش دهید.
36. در صورت نیاز، حتما از یک profiler نظیر xdebug (جهت سنجش و بهینه سازی کارایی اپلیکیشن) استفاده نمایید:
Profiler ابزاری است که توسعه دهنده با استفاده از آن می تواند اطلاعاتی نظیر مقدار زمان مورد نیاز برای اجرای اسکریپت یا کدهای مختلف اپلیکیشن را سنجیده و نمایش دهد. به هنگام توسعه ی اپلیکیشن بزرگ و در شرایطی که تعداد زیادی کتابخانه و دیگر منابع با هم کار می کنند تا عملیات خاصی انجام گیرد، سرعت اپلیکیشن حائز اهمیت بالایی بوده و می بایست جهت بهبود تجربه کاربری تا حد امکان افزایش یابد.
شما می توانید با استفاده از profiler ها بررسی کنید کد اپلیکیشن شما از نظر سرعت اجرا در چه سطحی قرار دارد. برای این منظور ما دو ابزار xdebug و webgrind را توصیه می کنیم.
37. کتابخانه های خارجی می توانند نقش مهمی در توسعه ی اپلیکیشن کارا ایفا بکنند:
یک اپلیکیشن کاملا کارامد با قابلیت های متعدد و بسیار کاربردی را به طور قطع نمی توان صرفا با کد ساده ی php نوشت. به طور مثال، تولید فایل های pdf، پردازش فایل های تصویری، ارسال ایمیل، تولید نمودار و فایل ها (سندها) می توانند در زمره ی عملیات و قابلیت هایی باشند که به راحتی با استفاده از کتابخانه های خارجی قابل پیاده سازی و ضمیمه به اپلیکیشن هستند.
در زیر به تعدادی از کتابخانه های پرکاربرد اشاره خواهیم کرد:
- mPDF - این کتابخانه قادر است به زیبایی فایل html را به pdf تبدیل کرده و در خروجی فایل pdf دلخواه شما را تولید نماید.
- PHPExcel – این کتابخانه می تواند فایل هایی با فرمت Excel را خوانده و محتوای جدید در آن درج نماید.
- PhpMailer – به وسیله ی این کتابخانه می توانید به راحتی ایمیل هایی با فرمت html را به همراه فایل های الصاق شده ارسال نمایید.
- pChart – کتابخانه ی جاری به توسعه دهنده این امکان را می دهد در اپلیکیشن تحت وب خود، نمودار (graph) تولید نماید.
38. آماره ها و اطلاعات سایت phpbench را بررسی کرده و تفاوت سرعت اجرا و کارایی سینتکس های مختلف را عینا مشاهده کنید:
اگر می خواهید در اپلیکیشن خود سرعت را افزایش داده و تجربه ی کاربری را تا حد امکان بالا ببرید، بد نیست نگاهی به آماره ها و اطلاعات سایت phpbench بیاندازید. این سایت معیارهای برای سنجش کارایی سینتکس و دستورهای مختلف php در اختیار شما قرار می دهد که در صورت رعایت کردن آن ها می توانید تفاوت چشم گیری در سرعت پردازش اپلیکیشن خود رقم بزنید.
39. اپلیکیشن خود را بر پایه ی معماری MVC طراحی کرده و توسعه دهید:
توصیه می کنیم برای توسعه ی اپلیکیشن کارا از یک چارچوب کاری (FRAMEWORK) نظیر codeigniter استفاده نموده و برنامه ی تحت وب خود را بر پایه ی معماری MVC جلو ببرید. معماری mvc کد شما را بالافاصله شی گرا نمی کند. در واقع اولین کاری که معماری MVC انجام می دهد، جداسازی کد HTML از اسکریپت PHP می باشد.
- استفاده از معماری mvc سبب می شود که کد html و php برنامه ی شما از هم جدا شوند. بهترین گزینه برای پروژه های تیمی می باشد که در آن طراحان ظاهر اپلیکیشن با برنامه نویسان در کنار هم کار می کنند.
- سبب می شود توابع و قابلیت های برنامه داخل کلاس های مجزا سازمان دهی شده که این امر نگهداشت، سرویس دهی و پشتیبانی آتی از اپلیکیشن را آسان می سازد.
- توابع و کتابخانه های درون ساخته برای ایمیل سازی، پردازش رشته و فایل تصویری یا بارگذاری فایل در سایت را به صورت آماده در اختیار توسعه دهنده قرار می دهد.
- در توسعه ی اپلیکیشن های بزرگ تجاری کمک شایانی به توسعه دهندگان می کند.
- نکات کاربردی، تکنیک های بهینه و هک ها قبلا در چارچوب نرم افزاری نام برده پیاده سازی شده است و شما از این جهت دیگر نگرانی نخواهید داشت.
40. کامنت و توضیحاتی که درباره ی کد اپلیکیشن های php در وب سایت های دیگر عنوان شده را بخوانید:
توضیحات زبان php در سایت رسمی آن، آیتم های آموزشی متعددی در خصوص شرح هر تابع، کلاس و متدهای آن در اختیار توسعه دهنده قرار می دهد. تمامی صفحات این وب سایت توضیحات مختلفی از جانب کاربران php دارد که حاوی اطلاعات مفیدی جهت بهینه سازی اپلیکیشن می باشد.
توضیحات کاربران نظرات، نکات مفید و تکه کدهای بسیار پرکاربردی را در اختیار شما قرار می دهند. حتما آن ها را مطالعه نمایید.
41. برای طرح سوال های خود به کانال IRC مراجعه نمایید:
بهترین مکان برای طرح سوال های برنامه نویسی و مشکلاتی که در اپلیکیشن های تحت وب PHP خود با آن ها مواجه می شوید، مراجعه به کانال IRC #PHP می باشد. اگرچه بلاگ ها و انجمن های متعددی در فضای اینترنت وجود دارد که با مراجعه با آن ها نکات مفیدی دستگیر شما می شود، با این حال گاهی مشکلات اختصاصی در اپلیکیشن رخ می دهد که نیاز به پاسخ اختصاصی دارند. IRC مکان مناسبی برای طرح اینگونه سوال ها می باشد.
42. مطالعه ی کد اپلیکیشن های رایگان و پروژه های open source:
مطالعه ی کد اپلیکیشن های متن باز دیگر به شما کمک می کند تا روش های بهتر کدنویسی را آموخته و مهارت های خود را در توسعه برنامه های تحت وب بالا ببرید. در طی مطالعه ی کد برنامه های دیگر شما بایستی سعی کنید، تکنیک های کدنویسی بهینه را بیاموزید و از دیگران ایده بگیرید. برای مثال روش های برنامه نویسی، استایل کدنویسی، سازمان دهی کد، نام گذاری فایل ها و غیره ... .
به شما توصیه می کنیم کد اپلیکیشن های زیر را مطالعه کنید:
- Codeigniter
- WordPress
- Joomla CMS
43. توصیه می شود بجای محیط ویندوز، سعی کنید اپلیکیشن خود را بر روی بستر لینوکس توسعه دهید:
سعی کنید علاوه بر توسعه ی اپلیکیشن و کدنویسی در محیط ویندوز، حداقل یکبار برنامه ی تحت وب خود را بر روی لینوکس توسعه دهید. توصیه ی ما بر ubuntu می باشد. لینوکس می تواند در مقایسه با مایکروسافت ویندوز، بستر بهتری برای ساخت و توسعه ی اپلیکیشن باشد.
همان طور که می دانید، اپلیکیشن های php اغلب بر روی محیط های linux (LAMP) نصب (مستقر) می شوند. از این رو، توسعه ی اپلیکیشن در محیطی که قرار است بعده ها در آن مستقر و اجرا شود، به شما کمک می کند تا برنامه ی کارا و قدرتمندتری طراحی نمایید.
بیشتر ابزارهای توسعه را می توان به راحتی از synaptic package manager در محیط Ubuntu نصب کرد. علاوه بر آن، برای نصب و راه اندازی به تنظیمات زیادی احتیاج نیست. از آنجایی که همگی ابزار متن باز و open source هستند، می توان رایگان از آن ها استفاده کرد.