یوشا آل ایوب

وبگاه دست نوشته ها و تجربیات شخصی

یوشا آل ایوب

وبگاه دست نوشته ها و تجربیات شخصی

یوشا آل ایوب

دکتر مصطفی چمران: می گویند تقوا از تخصص لازمتر است، آنرا می پذیرم، اما می گویم: آنکس که تخصص ندارد و کاری را می پذیرد، بی تقواست!

بایگانی
تبلیغات
Blog.ir بلاگ، رسانه متخصصین و اهل قلم، استفاده آسان از امکانات وبلاگ نویسی حرفه‌ای، در محیطی نوین، امن و پایدار bayanbox.ir صندوق بیان - تجربه‌ای متفاوت در نشر و نگهداری فایل‌ها، ۳ گیگا بایت فضای پیشرفته رایگان Bayan.ir - بیان، پیشرو در فناوری‌های فضای مجازی ایران

۱۹ مطلب با موضوع «کامپیوتر :: نرم افزار :: برنامه نویسی :: PHP» ثبت شده است

 

در ادامه مقاله قبلیم که شماره یک "نکات و اصول مهم در برنامه نویسی PHP" بود، در این مقاله شماره دو همین موضوع رو ارائه میدم...

 

1- هنگام Multi-thread کردن کدهاتون فراموش نکنید برای دسترسی به اشیاء lazy-initialize(یا همون load on demand) وضعیت نهایی شی باید synchronize باشه تا با مشکل race condition مواجه نشید.

 

2- برای نرمال سازی ستونها و جلوگیری از افزونگی/redundancy داده باید از اصول زیر پیروی کنید:

- هیچ ستونی نباید بیشتر از یک نوع/type داده رو نگهداری کنه. (مثل int + char + float...)

- هیچ ستونی نباید داده های تکراری/مشابه به دیگر ستون ها رو در خودش نگهداری کنه.

- داده هارو در جداول مختلف نگهداری کنید و درصورت لزوم اونهارو توسط کلید خارجی/foreign key بهم متصل کنید.

 

3- جهت افزایش پرفورمنس، همیشه کلاس والد و اینترفیس رو در خطوط قبل از کلاس ارث بر تعریف کنید. در غیراینصورت موتور PHP برای پیدا و پردازش کردن کلاس والد مجبور به انجام عملیات های اضافی خواهد شد. (بر اساس OpCode تولید شده)

interface IData 
{
}

class MyClass implements IData
{
}

نکته: حتی اگر در فایلهای جداگانه تعریفشون می کنید این قائده باز هم باید رعایت بشه.

 

4- یادتون باشه که Dependency Injection نه تنها از طریق Constructor، بلکه از طریق Setter, Interface و Property هم قابل انجامه.

نکته: زمانی از نوع Constructor استفاده کنید که کل کلاس نیازمند به اون dependency هستش یا شی dependency نباید در طول life time تغییر بکنه.

 

5- آیا می دونید تابع runkit_function_remove علاوه بر حذف قید تابع(function table)، مقدار حافظه اشغال شده توسط تابع رو هم آزاد می کنه؟

۴ نظر ۹۶/۱۰/۲۱
یوشا آل ایوب

 

این تصویر رو درست کردم تا روند(internals) تفسیر، کامپایل و اجرای سورس های PHP رو نشون بده:
 

برای بزرگنمایی کلیک کنید

php-internals

لینک Stackoverflow.com

 

کاملترین و دقیق ترین چارت PHP internals موجود در اینترنت! heart

۱ نظر ۹۶/۰۹/۰۸
یوشا آل ایوب

 

ظاهراً در PHP هرچیزی بعد از دستور exit بصورت ناقص(؟) پردازش میشه ولی بصورت کامل حافظه مورد نیازش رو allocate میکنه...

 

خروجی یک صفحه ساده:

<?php

echo memory_get_usage();

// 217992

 

خروجی یک صفحه متغیر دار ولی exit شده:

<?php

echo memory_get_usage();

// 220552

exit; // <---------- !!

$simpleVar = 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabc​dabcdabcdabcdabcdabcd';
$simpleVar .= '​abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabc​dabcdabcdabcdabcdabcd';
$simpleVar .= '​abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabc​dabcdabcdabcdabcdabcd';
$simpleVar .= '​abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabc​dabcdabcdabcdabcdabcd';
$simpleVar .= '​abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabc​dabcdabcdabcdabcdabcd';
echo $simpleVar; 

enlightened

۲ نظر ۹۶/۰۳/۱۵
یوشا آل ایوب
<?php

switch (1)
{
    case 1:
        $var = 'Test';
        echo ' in case 1 ';
    break;

    case 2:
        if (isset($var)) echo '($var is set)';
        echo ' in case 2 ';
    break;

    case 3:
        echo ' in case 3 ';
    break;
}
// Result: in case 1

switch (1)
{
    case 1:
    {
        $var = 'Test';
        echo ' in case 1 ';
    }

    case 2:
        if (isset($var)) echo '($var is set)';
        echo ' in case 2 ';
    break;

    case 3:
        if (isset($var)) echo '($var is set)';
        echo ' in case 3 ';
    break;
}
// Result:  in case 1 ($var is set) in case 2

switch (1)
{
    case 1:
        $var = 'Test';
        echo ' in case 1 ';

    case 2:
        if (isset($var)) echo '($var is set)';
        echo ' in case 2 ';
    break;

    case 3:
        if (isset($var)) echo '($var is set)';
        echo ' in case 3 ';
    break;
}
// Result:  in case 1 ($var is set) in case 2

switch (1)
{
    case 1:
        $var = 'Test';
        echo ' in case 1 ';

    case 2:
    {
        if (isset($var)) echo '($var is set)';
        echo ' in case 2 ';
    }

    case 3:
        if (isset($var)) echo '($var is set)';
        echo ' in case 3 ';
    break;
}
// Result:  in case 1 ($var is set) in case 2 ($var is set) in case 3

در PHP، ظاهراً بودن یا نبودن اون گیومه ها {} هیچ تاثیری در روند اجرای برنامه نداره، بلکه این break هستش که تعیین کنندست... در حالی که در بیشتر زبانها (مثل java, pawn, c++ و...) می تونه حوزه/scope متغیر ها رو داخل هر case تعیین کنه.

توضیح رسمی C99 درباره دستور Switch:

CASE: Case statements are only 'labels'. This means the compiler will interpret this as a JUMP DIRECTLY to the label.
BREAK: A break statement terminates execution of the smallest enclosing switch or iteration statement.

البته این یه نکته ریزه که هنوز خیلی از برنامه نویس ها ازش مطلع نیستن!
من هم بعد از 1-2 ساعت تحقیق متوجه این موضوع شدم، چراکه مستندات خودشون هم به این نکته اشاره نکردن. (تا جایی که گشتم)

۰ نظر ۹۴/۱۲/۱۸
یوشا آل ایوب

اینها چیزی نیستند جز software bundle! که توسط شرکت ها و گروه های نرم افزاری برای یک هدف جمع آوری شدن. و اون هم فراهم کردن بستری سریع و آسون برای برنامه نویسی.

مفهوم ساده Software bundle یعنی تعدادی نرم افزار مستقل  که در یک پکیج گردآوری شدن و توسط یک برنامه واحد مدیریت میشن.


۱ نظر ۹۴/۱۱/۲۱
یوشا آل ایوب

 

سرعت بیشتر get_magic_quotes_runtime و get_magic_quotes_gpc برای گرفتن مقدار Magic quotes:

if (get_magic_quotes_gpc() || get_magic_quotes_runtime())
{
    #...
}

0.0123500823970
0.0124192237854
0.0124502182007
0.0128602981567
0.0129485130310
0.0129580497742
0.0129580497742
0.0129890441895
0.0129985809326
0.0130105018616
0.0130105018616
0.0130200386047
0.0130295753479
0.0130391120911
0.0141811370850

سرعت کمتر ini_get برای گرفتن مقدار Magic quotes:

if (ini_get('magic_quotes_gpc') || ini_get('magic_quotes_runtime'))
{
    #...
}

0.0201392173767
0.0201511383057
0.0201606750488
0.0201988220215
0.0202012062073
0.0202107429504
0.0202202796936
0.0202417373657
0.0202584266663
0.0203299522400
0.0219893455505
0.0220894813538
0.0238800048828
0.0250506401062
0.0255298614502
۰ نظر ۹۳/۰۸/۰۸
یوشا آل ایوب

مقایسه سرعت بین دستورات شرطی If Else و Ternary(سه تایی)...

سرعت بیشتر:

if x: ...
else: ...
endif;

0.0336170196533
0.0337123870850
0.0337123870850
0.0338077545166
0.0338077545166
0.0339031219482
0.0339031219482
0.0339984893799
0.0339984893799
0.0339984893799
0.0343084335327
0.0343084335327
0.0344038009644
0.0346183776855
0.0608921051025

سرعت کمتر:

x ? ... : ...;

0.0385999679565
0.0389099121094
0.0390052795410
0.0390052795410
0.0392198562622
0.0392198562622
0.0392913818359
0.0393867492676
0.0394105911255
0.0395059585571
0.0395059585571
0.0395059585571
0.0396013259888
0.0405073165894
0.0436067581177
۱ نظر ۹۳/۰۵/۰۳
یوشا آل ایوب

 

نکاتی راجب error_reporting و set_error_handler و register_shutdown_function:

 

  • دستور error_reporting

برخلاف تصور خیلی ها که فکر می کنند این دستور خطاها رو "نمایش" میده، این دستور برای دریافت خطاها هستش (نه حتی Log کردن خطا)

  • دستور set_error_handler

میشه گفت دستوری برای ثبت تابع customize کننده خطا هستش (مثلاً برای کادر بندی خطا، ایمیل کردن خطا، دادن راه حل به کاربر و...)

  • دستور register_shutdown_function

دستوری برای ثبت تابع callback هستش که هنگام متوقف شدن و پایان یافتن پردازش اسکریپت، اون تابع callback اجرا بشه (همچنین زمانی که exit / die صدا زده میشه)
اصول نامگذاری: onScriptShutdown یا onScriptEnd یا onShutdown....
نکته: توسط این دستور میشه خطاهای نوع E_ERROR , E_PARSE , E_CORE_ERROR , E_COMPILE_ERROR رو هم جذب کرد

 

  • دستور ini_set('display_errors', TRUE); 

دستوری برای نمایش خطا هستش. اگر error_reporting خاموش باشه این دستور هم کار نمی کنه. اگر error_reporting روشن باشه ولی این دستور false باشه، اسکریپت کماکان خطاها رو دریافت می کنه اما نمایش نمیده!

 

  • دستور ini_set('log_errors', TRUE); 

دستوری برای ذخیره خطا در فایل هستش. اگر error_reporting خاموش باشه این دستور هم کار نمی کنه. اگر error_reporting روشن باشه ولی این دستور false باشه، اسکریپت کماکان خطاها رو دریافت می کنه اما ذخیره نمی کنه.

 

بنابراین برای نوع development همه باید فعال و true باشن و برای نوع production(تحویل به مشتری) همه باید فعال و true باشن بجز display_errors!

۰ نظر ۹۲/۱۱/۲۲
یوشا آل ایوب

 

چند نمونه از توابعی که در php.ini بهتره Disable بشن:

apache_child_terminate,
apache_reset_timeout,
unregister_tick_function,
rpc,
exec,
dl,
show_source,
apache_note,
apache_setenv,
closelog,
debugger_off,
debugger_on,
define_syslog_variables,
escapeshellarg,
escapeshellcmd,
ini_restore,
openlog,
passthru,
pclose,
pcntl_exec,
popen,
proc_close,
proc_get_status,
proc_nice,
proc_open,
proc_terminate,
shell_exec,
syslog,
system,
url_exec

 

نکته: این توابع باید در قسمت disable_functions در فایل php.ini قرار بگیرن.

توجه: در سیستم های local اگر از برنامه Composer یا pickle استفاده می کنید نباید توابع escapeshellarg, exec, passthru رو غیرفعال کنید. اگر از برنامه PHPMD استفاده می کنید نباید تابع proc_open و ini_restore رو غیرفعال کنید. و اگر از برنامه PHPCS استفاده می کنید نباید تابع proc_get_status و proc_close رو غیرفعال کنید.

۰ نظر ۹۲/۰۶/۱۱
یوشا آل ایوب

/**
 * A hack to support __construct() on PHP 4
 * Hint: descendant classes have no PHP4 class_name() constructors,
 * so this constructor gets called first and calls the top-layer __construct()
 * which (if present) should call parent::__construct()
 *
 * @return Object
 */
function Object()
{
    $arguments = func_get_args();

    if (method_exists($this, '__destruct')) register_shutdown_function(array(&$this, '__destruct'));

    call_user_func_array(array(&$this, '__construct'), $arguments);
    return;
}

https://github.com/felixge/raleigh-workshop-08/blob/master/application/cake/libs/object.php

۱ نظر ۹۲/۰۵/۰۲
یوشا آل ایوب