الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

بدأه Abd Allatif في 22 مارس 2013 · 1 رد · 3,361 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله وبركاته .
هذا الدرس من سلسلة الدروس التالية لتعلم لغة 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 items
for($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 comment
this 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.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).....done


Server Software: Apache/2.4.3
Server Hostname: localhost
Server Port: 80

Document Path: /index.php
Document Length: 28808 bytes

Concurrency Level: 2
Time taken for tests: 0.449 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 2898700 bytes
HTML transferred: 2880800 bytes
Requests 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] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 5 9 3.5 8 35
Waiting: 0 4 3.1 4 18
Total: 5 9 3.6 8 35

Percentage of the requests served within a certain time (ms)
50% 8
66% 10
75% 10
80% 10
90% 11
95% 15
98% 21
99% 35
100% 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.php
This 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 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software: Apache/2.4.3
Server Hostname: localhost
Server Port: 80

Document Path: /test/echo.php
Document Length: 4300000 bytes

Concurrency Level: 10
Time taken for tests: 29.205 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 4300179000 bytes
HTML transferred: 4300000000 bytes
Requests 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] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 1.7 0 17
Processing: 125 290 26.5 287 483
Waiting: 0 8 29.4 2 237
Total: 126 291 26.9 288 483

Percentage of the requests served within a certain time (ms)
50% 288
66% 290
75% 292
80% 294
90% 309
95% 324
98% 374
99% 407
100% 483 (longest request)

ملف print.php :

$ ./ab -n 1000 -c 10 localhost/test/print.php
This 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 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software: Apache/2.4.3
Server Hostname: localhost
Server Port: 80

Document Path: /test/print.php
Document Length: 4300000 bytes

Concurrency Level: 10
Time taken for tests: 30.511 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 4300179000 bytes
HTML transferred: 4300000000 bytes
Requests 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] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 1.8 0 15
Processing: 96 303 22.1 301 508
Waiting: 0 4 5.1 2 37
Total: 96 304 22.0 302 511

Percentage of the requests served within a certain time (ms)
50% 302
66% 304
75% 306
80% 307
90% 321
95% 326
98% 335
99% 420
100% 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 line

for($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.php
This 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 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software: Apache/2.4.3
Server Hostname: localhost
Server Port: 80

Document Path: /test/repalce_str.php
Document Length: 0 bytes

Concurrency Level: 10
Time taken for tests: 3.903 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 198000 bytes
HTML transferred: 0 bytes
Requests 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] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 5.3 0 48
Processing: 6 37 15.3 37 121
Waiting: 0 32 15.7 32 121
Total: 7 39 15.3 38 121

Percentage of the requests served within a certain time (ms)
50% 38
66% 44
75% 47
80% 50
90% 57
95% 64
98% 76
99% 82
100% 121 (longest request)

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

$ ./ab -n 1000 -c 10 localhost/test/repalce_reg.php
This 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 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software: Apache/2.4.3
Server Hostname: localhost
Server Port: 80

Document Path: /test/repalce_reg.php
Document Length: 0 bytes

Concurrency Level: 10
Time taken for tests: 6.306 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 198000 bytes
HTML transferred: 0 bytes
Requests 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] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 5.1 0 45
Processing: 11 61 26.3 60 220
Waiting: 0 54 25.6 52 195
Total: 11 63 26.1 61 220

Percentage of the requests served within a certain time (ms)
50% 61
66% 71
75% 78
80% 82
90% 96
95% 106
98% 122
99% 136
100% 220 (longest request)
Time taken for tests: 3.903 seconds //str_repalce
Time 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
#2

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

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

لا إله إلا الله محمد رسول الله عليه الصلاة والسلام

سبحانك اللهم وبحمدك اشهد ان لا إله إلا انت استغفرك واتوب اليك

EIR8Q.jpg

 

بإذن الله سأتعلم python و php ولو نصف كل لغة

 

 

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…