• 0
linux web man

الدرس الثالث عشر : معايير كتابة الأكواد و تحسين أداء برامج php

سؤال

السلام عليكم و رحمة الله وبركاته .
هذا الدرس من سلسلة الدروس التالية لتعلم لغة php .

معايير كتابة الأكواد و تحسين أداء برامج php .

معايير كتابة الأكواد :
من السهل جدا ً في البرمجة كتابة أكواد صحيحة لكن غير واضحة و غير مفهومة و صعبة القراءة و التطوير . فلا يهم مدى معرفتك بتراكيب لغة php و حفظك لدوالها وتعابيرها ; فإن كتابة اكواد صعبة القراءة هو افتقار للإحترافية . فعند قراءتك لأحد البرامج التي قام بكتابتها مبرمج غيرك -وكان هذا المبرمج يتبع أحد معايير كتابة الأكواد - فستحتاج الى وقت لا بأس به لفهم آلية عمل البرنامج , فماذا لو لم يكن يتبع احد المعايير !! .
لا يوجد معيار مُوحد و شامل لكتابة الأكواد في php (بعض لغات البرمجة كلغة python تُجبرك لاتباع قواعد مُحددة) , ففي الفقرت التالية سأوضح مُختلف المعايير واترك لك حرية الاختيار بما يناسبك وليس من الضروري الالتزام بها جميعا ً لكن هناك قواعد اساسية لابُد منها (استخدام الأقواس , كيفية تسمية المُتغيرات عدم إنشاء نسخ متعددة من متغير وحيد ...الخ ) .

الفراغات و المسافات البادئة :
من القواعد الهامة لتحسين قابلية قراءة كود برمجي هي استخدام الفراغات استخداما ً صحيحا ً (عادة ً اقوم بالاشارة الى tab بـ"المسافة البادئة") لتنظيم الأكواد . فمثلا ً يجب استخدام مسافة بادئة في حلقات الدوران و عند استخدام الشروط ... الخ , المثال التالي يوضح طريقة سيئة في كتابة الأكواد بسبب عدم استخدام المسافات البادئة :

<?php$name='name';if($name=='name'){echo $name;} else {echo 'no match';}?>

فيكمن باستخدام المسافات البادئة جعل الكود السابق أسهل قراءة ً :

<?php$name = 'name'if($name = 'name'){    echo $name;}else{    echo 'no match';}?>

ويوجد نوعين من tabs , الأول يُسمى Hard tab وهو المسافة البادئة العادية , و الثاني يُسمى Soft tab وهو ليس بمسافة بادئة حقيقية لكنها عبارة عن عدد من الفراغات يُحدد عددها في المُحرر (في غالب الأمر 4 فراغات) , ميزة استخدام Soft tabs هي ان الكود يظهر بشكل مُوحد على جميع المُحررات مهما كانت اعدادات المسافات البدائة الخاصة بها .
وبشكل عام تُستخدم مسافة بادئة واحدة عند كل مرحلة مُتشعبة , لإزالة الغموض دقق في المثال التالي :

<?php$array = array('ahmad', 'samer', ); //this array contain 10 itemsfor($i = 0; $i < 10; $i++){    if($array[$i] == 'name')    {        // something        if(strlen($array[$i]) > 1)        {            // do a thing        }    }else{    // something else}}?>

ملاحظة : المثال السابق فقط للتوضيح ولا فائدة عملية منه .
وكما لاحظت , أقوم بوضع مسافة بادئة tab في كل مرحلة من مراحل الكود (مسافة بادئة وحيدة داخل حلقة for , مسافتين داخل الدالة الشرطية if و ثلاث مسافات في الدالة الشرطية الموجودة داخل الدالة الشرطية الاولى ... الخ) .

وعادة يتم وضع فراغ بعد الفاصلة و الفاصلة المنقوطة وليس قبلها ; كما في الأمثلة السابقة . و عند تعريف المُتغيرات واضافة قيم لها , يُفضل إضافة مسافات حتى تزداد قابلية قراءة الكود :

<?php$date = date("H : i : s");$username = $_POST['username'];$query = "select name , age from users where name = 'abd allatif' and age = 17";?>

المثال السابق يُمكن كتابته بشكل افضل كالتالي :

<?php$date          = date("H : i : s");$username      = $_POST['username'];$query           = "select name , age from users where name = 'abd allatif' and age = 17";?>


طول السطر :
عادة يُفضل أن لا يتجاوز طول السطر 80 محرف , فدالة imagecopyresized التالية تتجاوز 80 محرف لذا يُفضل جعلها مُقسمة على عدة أسطر :

imagecopyresampled($tmp_image, $image, 0, 0, 0, 0, imagesx($image) * $percent / 100, imagesy($image) * $percent / 100, imagesx($image), imagesy($image));

الطريقة الأصح :

imagecopyresampled($tmp_image, $image, 0, 0, 0, 0,imagesx($image) * $percent / 100,imagesy($image) * $percent / 100,imagesx($image), imagesy($image));

تعليمات SQL :
يجب ايضا الاهتمام بتنسيق تعليمات SQL , فمثلا ً تعليمة SQL التالية غير واضحة وتحتاج الى التركيز لكي تستطيع فهمها :

$query = "select name , age from users where name = 'abd allatif' and age = 17";

اما عند جعل الكلمات المفتاحية (select , from , where) بأحرف كبيرة و فصل التعليمة الى عدة اسطر ستصبح قراءتها سهلة للغاية :

$query = "SELECT name ,                  age           FROM users           WHERE name = 'abd allatif'           AND age = 17";

استخدام الأقواس في جمل التحكم :
يمكن في لغة php كما في c استخدام الأداة الشرطية if أو حلقة التكرار for .. دون استخدام أقواس كما يلي :

if ($username == 'ahmad')    echo "Hi ahmad";

الطريقة السابقة صحيحة تماما ً لكن من الصعب تعديل الكود السابق دون الوقوع في بعض الاخطاء :

if ($username == 'ahmad')    echo "Hi ahmad";    $admin = true;

في المثال السابق ستكون قيمة admin دائما ً true مما قد يُسبب مشاكل .

ويوجد ثلاثة تنسيقات لكتابة الأقواس .
تنسيق الخاص بأولمان Allman (تجاوزا ً BSD) : تُوضع في هذا التنسيق الأقواس في السطر التالية لبنية التحكم (if , for ...الخ ) وتكون الأقواس في نفس محاذاة البنية .

if (true){    //something}else{    //something else}

التنسيق الخاص بجنو GNU : هذا التنسيق شبيه بتنسيق BSD لكن الاختلاف هو ان الاقواس تتم مُحاذاتها بمقدار نصف tab :

if (true)  {    //something  }else  {    //something else  }

تنسيق K&R : الذي يضع قوس البداية في نفس سطر الكلمة المحجوزة وهو من أشهر التنسيقات المُستخدمة :

if (true){    //something}else{    //something else}

كما قُلت سابقا ً اختيار أحد الأشكال السابقة هو مجرد اختيار شخصي , ولمزيد من المعلومات يمكن مراجعة صفحة wikipeada التالية .

استخدام break و continue في حلقات التكرار : لتجنب تعقيد الأكواد أكثر من اللازم .

تسمية المُتغيرات :
تتيح لغة php تسمية المتغيرات بالاحرف الانكليزية بالاضافة الى "_" و الارقام (ناقشنا قواعد انشاء المتغيرات في الدرس الاول) .
لكن يجب استخدام معاني مناسبة لأسماء المُتغيرات تدل على قيمتها وليس فقط اسماء و احرف غير مفهومة , وتجنب تسمية المتغيرات المؤقتة اسماء طويلة (المتغيرات المؤقتة هي المغيرات التي تُستخدم في جزء مُحدد من الكود كالمتغيرات التي تُستخدم في حلقات التكرار) :

<?php$array = array();$number_of_array_values = count($array);for($currnet_array_value = 0; $currnet_array_value < $number_of_array_values; $currnet_array_value++){    echo $array[$currnet_array_value];}?>

لا داعي لكل هذه الاسماء الطويلة , حيث سنقوم باستخدام $i بدلا ً من $currnet_array_value وتعريف متغير يحوي عدد عناصر المصفوفة مباشرة ضمن حلقة التكرار :

<?php$array = array();for($i = 0 , $num = count($array); $i < $num; $i++){    echo $array[$i];}?>

وعند استخدام أكثر من كلمة لأسماء للمتغيرات يتم استخدام أما الشرطة السفلية "_" للفصل بين الكلمتين أو بجعل أو حرف من الكلمة الثانية كبيرا ً :

$long_var_name;$longVarName;

بالنسبة لي استخدم الشرطة السفلية لأنني اجدها اسهل في القراءة من النمط الثاني .

تجنب استخدام الوسوم القصيرة للإعلان عن بدء سكربت php :
حيث تُتيح لغة php الوسوم القصيرة <? ?> لبدء كود php لكن لا يُنصح باستخدامه نتيجة تداخله مع اكواد xml لانها تبدأ بالسطر التالي :

<?xml version="1.0"?>

عدم استخدام echo لكتابة أكواد HTML :
بالطبع يمكنك استخدام php لكتابة اكواد HTML لكن هذه الطريقة غير مُحبذة ويُفضل فصل HTML عن php , وفي حال عدم التمكن من فصل HTML عن php قم باستخدام php داخل HTML وليس العكس , المثال التالي يوضح هذه الفكرة :

<?php$name = 'name';?><span style="color: #800;padding: 2px;"><?php echo $name;?></span>

استخدام التعليقات :
من المُفيد جدا ً استخدام التعليقات عند كتابة الاكواد كي نستطيع شرح آلية عمل البرنامج لكل من يقرأ الأكواد التي نكتبها , ويُفضل ان تكون التعليقات قصيرة و مفيدة أي لا داعي لوضع تعليق قبل استخدام الكلمة المحجوزة echo لتوضيح انك ستقوم بطباعة جملة ما ! .
و تدعم لغة php ثلاث انواع من التعليقات : التعليقات الطويلة باسلوب c حيث يبدأ التعليق بالرمز /* وينتهي بالرمز */ , واسلوب تعليقات c++ الاحادية السطر حيث يبدأ التعليق بالرمز // وينتهي بنهاية السطر , ولا ننسى اسلوب التعليقات التي تستخدمها perl python shell الشبيه بتنسيق c++ لكن مع استبدال الرمز // بالرمز # .

/*this is multi-line C like commentthis is the 2nd line*/// this is one-line comment kil c++#and what about shell , perl , python

و ليس اجباريا ً ان تكون التعليقات في اول السطر كما في المثال التالي :

$date = date("H : i : s"); //this is a comment not in the beginning of the line

التوثيق :
إن أحد اشهر البرمجيات التي تُستخدم في توثيق أكواد php يُسمى phpDocumenter الذي يستخدم معايير تُشبه الى حد كبير معايير التوثيق التي تستخدمها لغة الجافا . يبدأ التوثيق - كما في التعليقات من نمط لغة c - بالرمز /* وينتهي بالرمز */ ويكون في كل سطر مسافة بادئة ومن ثم رمز النجمة * كما يلي :

/** Short Description** Long Description* @tags*/

ويكون "Short Description" عبارة عن شرح بسيط وبسطر وحيد عن وظيفة الدالة أو الكود , وأما " Long Description" فيمكن ان يكون مُتعدد الأسطر و يحوي أكواد HTML , و الكلمات الدليلية tags تُوفر معلومات عن الكود , وهذا جدول بأهم تلك الكلمات الدليلية :

/** Short Description** Long Description* @package [package name] اسم البرنامج الذي يحوي هذه الدالة أو المتغير* @param [type [description]] احد وسائط الدالة ويُذكر اسمه ومن ثم نوعه وشرح بسيط عنه* @author [author name] اسم مؤلف هذا الكود* @var [type] نوع المُتغير الذي يلي التعليق* @return [type [description]] نوع القيمة المُعادة من الدالة و شرح بسيط عنها*/


تحسين أداء برامج php :

ان سرعة معالجة البرنامج للبيانات تُعد احد أهم العوامل في المشاريع و المواقع الضخمة , حيث يؤدي توفير 100 ملي ثانية خلال تنفيذ كود ما الى زيادة سرعة التطبيق عدة مرات , في القسم التالي سنناقش ما هي الفروق بين عدد من الدوال و نصائح حول زيادة سرعة السكربتات المكتوبة بلغة php .
في البداية يجب علينا التعرف على أداة Apache Benchmark أو اختصارا ً ab الموجودة في مجلد bin في مكان تنصيب الخادم (يختلف الرابط حسب نظام التشغيل المُستخدم و طريقة تنصيب الخادم) وسيتم تجربة تعليمات ab على نظام تشغيل ubuntu 32 bit تم تنصيب سيرفر Apache/2.4.3 و نسخة php 5.4.7 عليه بمواصفات جهاز عادية (معالج intel 3200 , الذاكرة 4096 ) و طبعا ً الامثلة التالية لا علاقة لها بنظام التشغيل إلا ببعض الاختلافات البسيطة .
تُستخدم أداة Apache Benchmark من مُوجه الطرفية (terminal) وذلك بالانتقال الى المجلد الخاص به (عن طريق التعليمة cd في اللينوكس أو dir في windows ) و من ثم نقوم بتشغيله ويكون شكل استدعاءه :

ab [options] [full path to web document] 

و لتحديد عدد الطلبات التي سنقوم بارسالها للصفحة نُحدد قيمة الخيار n (حيث تكون القيمة الافتراضية له تساوي 1 ) و الخيار c يُمثل قيمة concurrency اي عدد الطلبات التي تُرسل الى الخادم في آن واحد , و من ثم نقوم بتحديد رابط الصفحة , فمثلا ً التعليمة التالية ستقوم بارسال 10 طلبات الى الصفحة localhost/index.php :

$ ./ab -n 100 -c 2 http://localhost/index.php

الذي سيعرض نتيجة مشابهة للتالي (بالطبع تختلف النتائج باختلاف الكود و مواصفات الجهاز ... ) :

This is ApacheBench, Version 2.3Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking localhost (be patient).....doneServer Software: Apache/2.4.3Server Hostname: localhostServer Port: 80Document Path: /index.phpDocument Length: 28808 bytesConcurrency Level: 2Time taken for tests: 0.449 secondsComplete requests: 100Failed requests: 0Write errors: 0Total transferred: 2898700 bytesHTML transferred: 2880800 bytesRequests per second: 222.67 [#/sec] (mean)Time per request: 8.982 [ms] (mean)Time per request: 4.491 [ms] (mean, across all concurrent requests)Transfer rate: 6303.15 [Kbytes/sec] receivedConnection Times (ms)min mean[+/-sd] median maxConnect: 0 0 0.0 0 0Processing: 5 9 3.5 8 35Waiting: 0 4 3.1 4 18Total: 5 9 3.6 8 35Percentage of the requests served within a certain time (ms)50% 866% 1075% 1080% 1090% 1195% 1598% 2199% 35100% 35 (longest request)

والتالي أهم الاسطر في مخرجات التعيلمة السابقة مع شرحها :
Concurrency Level عدد الطلبات التي تجري في وقت واحد .
Time taken for tests: الزمن الذي تم فيه اختبار الصفحة مقدرا ً بالثانية .
Total transferred , HTML transferred مقدار البيانات التي تم نقلها من الخادم بشكل كلي أو أكواد HTML فقط .
Requests per second عدد الطلبات التي تمت مُعالجتها من قبل الخادم في الثانية الواحد .

الفرق بين استخدام echo و print :
إن استخدام الكلمة المحجوزة echo أسرع لكن بشكل بسيط من استخدام الدالة print لان الدالة print تُعيد احدى القيمتين true أو false بينما الكلمة المحجوزة echo لا تُعيد أي قيمة , وسنقوم باستخدام داة Apache Benchmark لقييم اداء الطريقتين كما في المثالين التاليين , ملف echo.php :

<?php//this is echo.php file that we will Benchmark it .for($i = 0; $i < 1000; $i++){    echo 'This is a long string printed with "echo" keyword';}?>

ملف print.php :

<?php//this is print.php file that we will Benchmark it .for($i = 0; $i < 1000; $i++){    print ('This is a long string printed with "print" function');}?>

حيث سيكون ناتح برنامج Apache Benchmark كالتالي :
ملف echo.php :

$ ./ab -n 1000 -c 10 localhost/test/echo.phpThis is ApacheBench, Version 2.3 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking localhost (be patient)Completed 100 requestsCompleted 200 requestsCompleted 300 requestsCompleted 400 requestsCompleted 500 requestsCompleted 600 requestsCompleted 700 requestsCompleted 800 requestsCompleted 900 requestsCompleted 1000 requestsFinished 1000 requestsServer Software: Apache/2.4.3Server Hostname: localhostServer Port: 80Document Path: /test/echo.phpDocument Length: 4300000 bytesConcurrency Level: 10Time taken for tests: 29.205 secondsComplete requests: 1000Failed requests: 0Write errors: 0Total transferred: 4300179000 bytesHTML transferred: 4300000000 bytesRequests per second: 34.24 [#/sec] (mean)Time per request: 292.053 [ms] (mean)Time per request: 29.205 [ms] (mean, across all concurrent requests)Transfer rate: 143788.85 [Kbytes/sec] receivedConnection Times (ms)min mean[+/-sd] median maxConnect: 0 1 1.7 0 17Processing: 125 290 26.5 287 483Waiting: 0 8 29.4 2 237Total: 126 291 26.9 288 483Percentage of the requests served within a certain time (ms)50% 28866% 29075% 29280% 29490% 30995% 32498% 37499% 407100% 483 (longest request)

ملف print.php :

$ ./ab -n 1000 -c 10 localhost/test/print.phpThis is ApacheBench, Version 2.3 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking localhost (be patient)Completed 100 requestsCompleted 200 requestsCompleted 300 requestsCompleted 400 requestsCompleted 500 requestsCompleted 600 requestsCompleted 700 requestsCompleted 800 requestsCompleted 900 requestsCompleted 1000 requestsFinished 1000 requestsServer Software: Apache/2.4.3Server Hostname: localhostServer Port: 80Document Path: /test/print.phpDocument Length: 4300000 bytesConcurrency Level: 10Time taken for tests: 30.511 secondsComplete requests: 1000Failed requests: 0Write errors: 0Total transferred: 4300179000 bytesHTML transferred: 4300000000 bytesRequests per second: 32.78 [#/sec] (mean)Time per request: 305.110 [ms] (mean)Time per request: 30.511 [ms] (mean, across all concurrent requests)Transfer rate: 137635.20 [Kbytes/sec] receivedConnection Times (ms)min mean[+/-sd] median maxConnect: 0 1 1.8 0 15Processing: 96 303 22.1 301 508Waiting: 0 4 5.1 2 37Total: 96 304 22.0 302 511Percentage of the requests served within a certain time (ms)50% 30266% 30475% 30680% 30790% 32195% 32698% 33599% 420100% 511 (longest request)

الفرق بسيط نوعا ً ما .
استخدام علامات التنصيص المفردة و المُزدوجة :
كما تعلم فإن هناك عدد من الفروق بين استخدام العلامات التنصيص المُفردة و المُزدوجة , حيث الفارق الاساسي هو بإمكانية الوصول الى قيم المُتغيرات مباشرة عند استخدام علامات التنصيص المُزدوجة ولكن هذه الميزة تقلل بشكل ملحوظ من الاداء (جرب استخدام Apache Benchmark في مثال بسيط لمعرفة مدى تأثر الأداء بعلامات التنصيص) .

تعريف المُتغيرات التي تستخدم كأحد حدود التكرار قبل استخدامها : فإذا اردنا المرور على عناصر مصفوفة ما باستخدام حلقة for فمن المُفضل تعريف مُتغير عوضا ً عن استخدام الدالة count في كل مرة نقوم فيها بالتكرار :

for($i = 0; $i < count($array); $i++) //wrong !!$count = count($array);for($i = 0; $i < $count; $i++) //good but you can make it just in one linefor($i = 0, $count = count($array); $i < $count; $i++) //Great

استخدام الدالة str_repalce بدلا ً من preg_repalce عند استبدال كلمات بسيطة : وهنا أيضا ً سنستخدم ab للمقارنة بين كودين لإستبدال عدة كلمات (قُمت بدمج الكودين سوية) :

<?php$string = 'wot are you doin , let\'s repacel some mistakes';for($i = 0; $i < 1000; $i++){//عندما تريد تجربة preg_replace قم بازالة التعليق للسطر الخاص بها و وضع تعليق للسطر التالي    $new_string = str_replace(array('wot', 'doin', 'repacel'),                                                    array('what', 'doing', 'replace'), $string);    //$new_string = preg_replace(array('/wot/', '/doin/', '/repacel/'),    //                                                     array('what', 'doing', 'replace'), $string);}?>

ويكون ناتج تنفيذ تعليمة ab على الكود السابق عند استخدام دالة str_replace :

$ ./ab -n 1000 -c 10 localhost/test/repalce_str.phpThis is ApacheBench, Version 2.3 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking localhost (be patient)Completed 100 requestsCompleted 200 requestsCompleted 300 requestsCompleted 400 requestsCompleted 500 requestsCompleted 600 requestsCompleted 700 requestsCompleted 800 requestsCompleted 900 requestsCompleted 1000 requestsFinished 1000 requestsServer Software: Apache/2.4.3Server Hostname: localhostServer Port: 80Document Path: /test/repalce_str.phpDocument Length: 0 bytesConcurrency Level: 10Time taken for tests: 3.903 secondsComplete requests: 1000Failed requests: 0Write errors: 0Total transferred: 198000 bytesHTML transferred: 0 bytesRequests per second: 256.22 [#/sec] (mean)Time per request: 39.029 [ms] (mean)Time per request: 3.903 [ms] (mean, across all concurrent requests)Transfer rate: 49.54 [Kbytes/sec] receivedConnection Times (ms)min mean[+/-sd] median maxConnect: 0 1 5.3 0 48Processing: 6 37 15.3 37 121Waiting: 0 32 15.7 32 121Total: 7 39 15.3 38 121Percentage of the requests served within a certain time (ms)50% 3866% 4475% 4780% 5090% 5795% 6498% 7699% 82100% 121 (longest request)

ناتج تنفيذ تعليمة ab على الكود السابق عند استخدام دالة preg_replace :

$ ./ab -n 1000 -c 10 localhost/test/repalce_reg.phpThis is ApacheBench, Version 2.3 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking localhost (be patient)Completed 100 requestsCompleted 200 requestsCompleted 300 requestsCompleted 400 requestsCompleted 500 requestsCompleted 600 requestsCompleted 700 requestsCompleted 800 requestsCompleted 900 requestsCompleted 1000 requestsFinished 1000 requestsServer Software: Apache/2.4.3Server Hostname: localhostServer Port: 80Document Path: /test/repalce_reg.phpDocument Length: 0 bytesConcurrency Level: 10Time taken for tests: 6.306 secondsComplete requests: 1000Failed requests: 0Write errors: 0Total transferred: 198000 bytesHTML transferred: 0 bytesRequests per second: 158.57 [#/sec] (mean)Time per request: 63.062 [ms] (mean)Time per request: 6.306 [ms] (mean, across all concurrent requests)Transfer rate: 30.66 [Kbytes/sec] receivedConnection Times (ms)min mean[+/-sd] median maxConnect: 0 1 5.1 0 45Processing: 11 61 26.3 60 220Waiting: 0 54 25.6 52 195Total: 11 63 26.1 61 220Percentage of the requests served within a certain time (ms)50% 6166% 7175% 7880% 8290% 9695% 10698% 12299% 136100% 220 (longest request)
Time taken for tests: 3.903 seconds //str_repalceTime taken for tests: 6.306 seconds //preg_replace

ضعف المدة تقريبا ً !!

عدم تخزين قيمة مُتغير ما في عدد من المُتغيرات : (قد يبدو العنوان غريبا ً نوعا ً ما)
يقوم عدد من المبتدئين بتخزين المُتغيرات ذات الاسم الطويل بمُتغيرات ذات اسم أٌقصر لجعل الاكواد "سهلة القراءة" (لكنها تصبح عكس ذلك تماما ً) أو بعد القيام بعمليات بسيطة عليها . فمثلا ً الكود التالي الذي يأخذ قيمة اسم المُستخدم و يقوم بازالة الفراغات منها ومن ثم تغيير حالة جميع احرف اللغة الانكليزية الى الاحرف الصغيرة :

<?php$name = $_GET['name'];$nospace = trim($name);$n = strtolower($nospace);echo $n;?>

لنعيد كتابة المثال السابق لكن بدون هذا العدد الكبير من المُتغيرات التي لا عمل لها :

<?phpecho strtolower(trim($_GET['name']));?>

هذه الطريقة لا تجعل الكود اسهل في القراءة فحسب وإنما تُوفر قدر كبير من الذاكرة .

تحديد الحجم الأقصى لرفع الملفات في ملف الإعدادات php.ini :
ليس من المُفيد اختبار حجم الملف المرفوع باستخدام القيمة $_FILES['file_name']['size'] لأن هذه القيمة لا تتوفر إلا بعد رفع الملف الى الخادم مهما كان حجمه (طبعا يجب أن يكون اقل من القيمة المُحددة في ملف php.ini) , وبعض هجمات الحرمان من الخدمة DoS تقوم باغراق الخادم بسيل من الملفات الكبيرة مما يؤدي الى بطئ شديد في اداء الخادم و في بعض الاحيان توقفه عن العمل , فيفضل تحديد الرايتين "post_max_size" (ذات القيمة الافتراضية 8 ميغابايت) و الراية "upload_max_filesize" (ذات القيمة الافتراضية 2 ميغابايت) بما يتوافق مع مُتطلبات البرنامج .
طبعا ً في حال كان هناك عدد من مُستخدمي الموقع ولكل منهم له صلاحيات مُختلفة ويُمكنه رفع ملفات باحجام مُختلفة , يُفضل وضع قيمة الرايتين السابقتين للقيمة العُظمى لحجم الملفات ومن ثم تقليلها لباقي المُستخدمين (عن طريق التحقق من قيمة $_FILES['file_name']['size'] ) .

هدم مقابض الاتصال بقواعد البيانات و الملفات و الصور : فمثلا ً بعد انشاء صورة باستخدام دالة imagecreatetruecolor يلزمنا استدعاء الدالة imagedestroy بعد الانتهاء من العمليات عليها لتحرير الذاكرة (تم شرح كيفية تحرير الذاكرة لكل نوع من انواع المقابض في الدرس الموافق لها ) .
 

الدرس السابق | الإنتقال للموضوع الأساسي

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

1 إجابات على هذا السؤال .

  • 0

جزاك الله خيرا

وننتظر جديدك يا بطل

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .