نکات کاربردی در پی اچ پی پارت 2


11. از gzip برای بهینه سازی انتقال داده ها بین سرویس دهنده و سرویس گیرنده استفاده نکنید / توصیه نمی شود با استفاده از gzip خروجی را در اپلیکیشن فشرده سازی نمایید و بهتر است آن را به apache بسپارید:

توصیه نمی شود که از ob_gzhandler استفاده نمایید. وظیفه ی php این است که اپلیکیشن های تحت وب شما بنویسد. لازم نیست شما نگران بهینه سازی مکانیزم انتقال داده ها بین سرویس دهنده و مرورگر در php باشید. بهتر است برای نیل به این هدف، داخل فایل .htaccess، از mod_gzip/mod_deflate برای فشرده سازی محتوای مورد نظر استفاده نمایید.

12. به هنگام چاپ (echo) کد javascript از اسکپریت php، از تابع json_encode استفاده نمایید:

گاهی کد جاوا اسکریپت به صورت داینامیک و در زمان اجرا از اسکریپت های php تولید می شود.

$images = array(   'myself.png' , 'friends.png' , 'colleagues.png'  );  $js_code = '';  foreach($images as $image)  {  $js_code .= "'$image' ,";  }  $js_code = 'var images = [' . $js_code . ']; ';  echo $js_code;  //Output is var images = ['myself.png' ,'friends.png' ,'colleagues.png' ,];  

در این شرایط بهتر است از json_encode جهت تبدیل آرایه PHP به فرمت JSON استفاده نمایید:

$images = array(   'myself.png' , 'friends.png' , 'colleagues.png'  );  $js_code = 'var images = ' . json_encode($images);  echo $js_code;  //Output is : var images = ["myself.png","friends.png","colleagues.png"]  

همان طور که مشاهده می کنید کد بهینه سازی شد.

13. قبل از درج اطلاعات در فایل، بررسی کنید آیا پوشه (directory) مجوز write را دارد یا خیر:

توصیه می کنیم قبل از انجام عملیات درج و ذخیره ی داده در فایل، بررسی کنید که آیا پوشه writable هست یا خیر و نیز چنانچه مجوز لازم برای نوشتن وجود نداشت یک پیغام خطا در صفحه نمایش دهید (falsh). با این کار دیگر لازم نیست زمان طولانی را صرف خطایابی و اشکال زدایی نمایید (debugging time کاهش می یابد). چنانچه در محیط لینوکس کار می کنید، مجوزهای لازم را باید مدیریت نمایید در غیر این صورت به هنگام کار با پوشه ها (directory) مشکلات متعددی نظیر عدم دسترسی به پوشه ها جهت خواندن محتوا یا درج داده در آن و غیره … مشاهده می کنید.

لازم است اپلیکیشن خود را طوری طراحی کرده باشید که بسیار هوشمند بوده و نیز تمامی اطلاعات مهم را در کوتاه ترین زمان ممکن گزارش کند.

$contents = "All the content";  $file_path = "/var/www/project/content.txt";  file_put_contents($file_path , $contents);  

این روش کاملا صحیح است، با این وجود ممکن است تعدادی مشکل غیر مستقیم ایجاد کند. file_put_contents ممکن است به دلایل متعددی با شکست مواجه شود:

  • • ممکن است پوشه ی میزبان (parent directory) وجود نداشته باشد.
  • • پوشه وجود دارد، اما مجوز درج داده در آن اعطا نشده باشد (writable نباشد).
  • • بر روی فایل مورد نظر قفل اعمال شده و امکان درج داده در آن وجود ندارد.

بنابراین بهتر است قبل از درج داده در فایل، همه چیز را دقیقا روشن نمایید.

$contents = "All the content";  $dir = '/var/www/project';  $file_path = $dir . "/content.txt";  if(is_writable($dir))  {      file_put_contents($file_path , $contents);  }  else  {      die("Directory $dir is not writable, or does not exist. Please check");  }  

با این کار زمانی که عملیات درج داده در یک فایل با موفقیت انجام نمی شود، شما می دانید که مشکل دقیقا کجا رخ داده است.

14. مجوز و سطح دسترسی به فایل هایی را که اپلیکیشن تولید می کند، تغییر دهید:

به هنگام کار در محیط لینوکس، ممکن است مدیریت مجوزها بخش قابل توجهی از زمان شما را تلف کند. از این جهت زمانی که اپلیکیشن php تعدادی فایل را در خروجی تولید می کند، لازم است با استفاده از تابع chmod سطوح دسترسی این فایل ها را تنظیم (قابل دسترسی) نمایید. در غیر این صورت، ممکن است فایل هایی توسط یک کاربر “php” ایجاد شده و در این حین شما با حساب کاربری دیگر کار می کنید. سیستم به شما اجازه نمی دهد به فایل دسترسی داشته یا آن فایل را باز کنید و در نتیجه مجبور می شوید مجوزهایی در سطح root کسب کرده، سطوح دسترسی را تغییر دهید و غیره …

// Read and write for owner, read for everybody else  chmod("/somedir/somefile", 0644);  // Everything for owner, read and execute for others  chmod("/somedir/somefile", 0755);  

15. برای بررسی تحویل فرم به سرویس دهنده، صرفا مقدار دکمه ی submit را بررسی نکنید:

if($_POST['submit'] == 'Save')  {      //Save the things  }  

روش فوق در بیشتر مواقع کارا می باشد. اما زمانی که اپلیکیشن شما از چند زبان مختلف پشتیبانی می کند، این روش دیگر پاسخگو نخواهد بود. اطلاعاتی که ذخیره می شوند، “Save”، می تواند هر چیزی باشد. چطور آن ها را مقایسه خواهید کرد. از این رو نمی توان روی مقدار دکمه ی submit تکیه کرد. بهتر است از این روش استفاده می کنید:

if( $_SERVER['REQUEST_METHOD'] == 'POST' and isset($_POST['submit']) )  {      //Save the things  }  

16. اگر مطمئن هستید که مقدار تغییر نخواهد کرد، از متغیرهای static در تابع استفاده نمایید:

//Delay for some time  function delay()  {      $sync_delay = get_option('sync_delay');           echo "
Delaying for $sync_delay seconds..."; sleep($sync_delay); echo "Done
"; }

بهتر است از از متغیرهای static به صورت زیر استفاده کنید:

//Delay for some time  function delay()  {      static $sync_delay = null;      if($sync_delay == null)      {      $sync_delay = get_option('sync_delay');      }      echo "
Delaying for $sync_delay seconds..."; sleep($sync_delay); echo "Done
"; }

17. از متغیر $_SESSION به طور مستقیم استفاده نکنید:

در زیر تعدادی مثال ساده را مشاهده می کنید:

$_SESSION['username'] = $username;  $username = $_SESSION['username'];  

این کد یک مشکل دارد. اگر شما چندین اپلیکیشن را بر روی دامنه ی واحد اجرا کنید، متغیرهای session با یکدیگر تداخل پیدا خواهند کرد. در چنین شرایطی دو اپلیکیشن متفاوت ممکن است هر دو یک (جفت کلید و مقدار) key name را در متغیر session قرار دهند. برای مثال، یک درگاه (سمت کاربر) frontend و اپلیکیشن مدیریت (سمت سرور) backend که هر دو در یک دامنه فعال هستند.

با توجه به توضیحات ذکر شده، بهتر است از کلیدهای مجزا و مختص به هر اپلیکیشن همراه با توابع wrapper (متغیر session را داخل یک تابع میزبان یا دربرگیرنده) استفاده نمایید:

define('APP_ID' , 'abc_corp_ecommerce');  //Function to get a session variable  function session_get($key)  {      $k = APP_ID . '.' . $key;      if(isset($_SESSION[$k]))      {          return $_SESSION[$k];      }        return false;  }  //Function set the session variable  function session_set($key , $value)  {      $k = APP_ID . '.' . $key;      $_SESSION[$k] = $value;      return true;  }  

18. توابع کمکی (utility function) را داخل کلاس بگنجانید:

فرض کنید شما تعداد زیادی تابع کمکی مانند زیر در یک فایل php دارید:

function utility_a()  {      //This function does a utility thing like string processing  }  function utility_b()  {      //This function does nother utility thing like database processing  }  function utility_c()  {      //This function is ...  }  

و شما می خواهید تابع مورد نظر را در اپلیکیشن خود آزادانه بکار ببرید. بد نیست آن ها را داخل یک کلاس به صورت توابع static قرار دهید (wrap):

class Utility  {      public static function utility_a()      {      }      public static function utility_b()      {      }      public static function utility_c()      {      }  }  //and call them as   $a = Utility::utility_a();  $b = Utility::utility_b();  

یکی از محاسن استفاده از این روش، زمانی معلوم می شود که php تعدادی تابع درون ساخته با اسم یکسان داشته باشد که اسم این ها بایکدیگر تداخل پیدا می کنند. شما با قرار دادن این توابع داخل کلاس ها، از تداخل اسم توابع با یکدیگر جلوگیری می کنید.

مزیت دیگری که این روش برای شما به ارمغان می آورد این است که می توانید چندین ورژن از یک کلاس در اپلیکیشن جاری داشته باشید، بدون اینکه تداخلی بین آن ها رخ دهد. این روش در واقع همان کپسوله سازی (encapsulation) است.

19. تعدادی نکته ی آموزشی کاربردی:

  • بجای دستور print از echo استفاده نمایید.
  • بجای فراخوانی تابع preg_replace از str_replace استفاده نمایید، مگر اینکه استفاده از تابع اول با توجه به شرایط ضروری باشد.
  • از قابلیت short tags استفاده نکنید.
  • رشته های ساده را بجای دابل کوتیشن، داخل تک کوتیشن محصور نمایید.
  • همیشه پس از فراخوانی تابع header جهت هدایت کاربر به صفحه ی دیگر، توصیه می شود تابع exit() را نیز فراخوانی نموده و اجرای اسکریپت را متوقف نمایید.
  • هیچگاه یک تابع را داخل حلقه ی for فراخوانی نکنید.
  • isset سریع و بهینه تر از strlen می باشد.
  • کد خود را به طور صحیح و با یک فرمت ثابت قالب دهی نمایید.
  • هیچگاه کاراکتر {} را از ساختمان حلقه ها یا دستورات شرطی if-else حذف نکنید.
  • مانند زیر کدنویسی نکنید:
if($a == true) $a_count++;

این روش بسیار نارکارامد است. کد فوق را به صورت زیر بازنویسی کنید:

if($a == true)  {      $a_count++;  }  
  • سعی نکنید با حذف بخش های ضروری از سینتکس، کد خود را کوتاه نمایید. بلکه بهتر است منطق برنامه ی خود را بهینه تر طراحی کنید.
  • از یک text editor مناسب با قابلیت هایلایت کدها استفاده کنید. هایلایت کردن کدها سبب می شود تعداد خطاهای شما در کدنویسی کاهش یابد.

20. آرایه ها را با استفاده از array_map سریع تر پردازش نمایید:

فرض کنید می خواهید تمامی فضاهای اضافی موجود در آرایه (قبل یا بعد از المان های آرایه) را با استفاده از trim حذف نمایید. برنامه نویسان مبتدی php معمولا این کار را به صورت زیر انجام می دهند:

foreach($arr as $c => $v)  {      $arr[$c] = trim($v);  }  

همین کد را می توانید با استفاده از تابع array_map بهینه سازی کنید:

$arr = array_map('trim' , $arr);

این کد تابع trim را بر روی تمامی المان های آرایه $arr اعمال می کند. تابع دیگری که کاربردی مشابه دارد array_walk می باشد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *