یوشا آل ایوب

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

یوشا آل ایوب

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

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

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

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

 

نکاتی راجب 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);
}

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

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

 

مقایسه سرعت بین توابع is_array / is_string / is_integer... در مقابل تابع getype

سرعت بیشتر:

$variable = array(1, 2, 3, 4, 5);

if (is_array($variable))
{
    # ...
}

0.00079393386840820
0.00079488754272461
0.00080204010009766
0.00080204010009766
0.00080204010009766
0.00080204010009766
0.00081205368041992
0.00093293190002441
0.00111198425292970
0.00123190879821780

سرعت کمتر:

$variable = array(1, 2, 3, 4, 5);

if (gettype($variable) == 'array')
{
    # ...
}

0.0013110637664795
0.0013110637664795
0.0013139247894287
0.0013139247894287
0.0013179779052734
0.0013198852539062
0.0013239383697510
0.0013329982757568
0.0014750957489014
0.0018458366394043

 

x64 Hardware
32bit OS
PHP 5.4 CLI

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

می دونستید وقتی متغیری رو برابر مقدار "" یا '' تعریف می کنید 2 بایت از Memory رو اشغال می کنید؟
در صورتی که فقط قصد تعریف اولیه(موجودیت) اون رو دارید...

ولی با قراردادن همون متغیر/ثابت برابر NULL می تونید این مقدار رو به 0 کاهش بدید enlightened
این در مورد بیشتر زبانهای برنامه نویسی(بجز C/Cpp) صدق می کنه.

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

 

1- هرگز فایل های ضمیمه شده رو با پسوند inc. ذخیره نکنید. یعنی name.class.inc رو به name.class.php تغییر بدید. و یا از .HTAccess یا HT برای تعیین سطح دسترسی inc. استفاده کنید.

با اینکار از دسترسی مستقیم و خوندن محتوای فایل توسط URL/Address bar جلوگیری می کنید.

 

2- حتاًالمکان تگ های اضافی و فضاهای خالی رو حذف و از باز و بسته کردن بیش از حد تگهای <?php ?> سرور خودداری کنید. (مخصوصاً در پروژه های سنگین)

اینکار به مقدار قابل توجهی در سرعت پردازش سورس PHP تون تاثیر میزاره.

 

3-  کلاس را با متد __construct یا نام کلاس شروع کنید و با متد __destruct پایان بدید. همچنین تمامی فیلدهای داخل کلاس رو در درون متد __destrunt با دستور unset نابود کنید. اگر هم از ارث بری کلاس استفاده نمی کنید، کلاس و متدها رو با کلمه کلیدی final آغاز کنید.

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

 

سرعت بیشتر با تابع StrToLower:

0.000250101089478
0.000252008438110
0.000259160995483
0.000259160995483
0.000261068344116
0.000263929367065
0.000263929367065
0.000265121459961
0.000269174575806
0.000270128250122

سرعت کمتر با StrIStr:

0.000537157058716
0.000538110733032
0.000538110733032
0.000538110733032
0.000540018081665
0.000542163848877
0.000542163848877
0.000543117523193
0.000550985336304
0.000910043716431

در مواردی مثل:

if (strtolower(&$_SERVER['HTTPS']) == 'on' || @$_SERVER['HTTPS'] == 1 || @$_SERVER['SERVER_PORT'] == 443): return(true);
endif;
و
if (stristr(&$_SERVER['HTTPS']) == 'on' || @$_SERVER['HTTPS'] == 1 || @$_SERVER['SERVER_PORT'] == 443): return(true);
endif;

 

x64 Hardware
32bit OS
PHP 5.4 CLI

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

مقایسه سرعت بین متغیر عدد و متغیر رشته عدد...
برای افرادی که اعداد رو هم داخل ' یا " قرار میدن!

 

صحیح:
سرعت بیشتر در استفاده و تعریف متغیر عدد:

$intTest = 1234567890;
$dblTest = 123.45;

0.000204086303711
0.000205993652344
0.000207185745239
0.000207185745239
0.000208139419556
0.000208139419556
0.000210046768188
0.000285148620605
0.000363111495972
0.000482082366943

غلط:
سرعت کمتر در استفاده و تعریف متغیر رشته عدد:

$strInteger = '1234567890';
$strDouble = "123.45";

0.000639200210571
0.000640153884888
0.000641107559204
0.000646114349365
0.000653028488159
0.000655174255371
0.000657081604004
0.000658988952637
0.000684976577759
0.000693798065186

 

x64 Hardware
32bit OS
PHP 5.4 CLI

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

مقایسه سرعت بین * count و count FIELD در MySQL با موتور MyISAM:
در مواقعی که قصد شمارش رکورد ها/سطر رو دارید. (در اینجا fld_test از نوع عدد هستش و ایندکس نشده.)

 

سرعت بیشتر:

"select count(`fld_test`) from `tbl_data`;"

0.0561680068970
0.0578269958496
0.0581769943237
0.0587110519409
0.0590591430664
0.0594940185547
0.0598769953438

 

سرعت کمتر:

"select count(*) from `tbl_data`;"

0.0602030754089
0.0607211589813
0.0607681274414
0.0608351230621
0.0610001087189
0.0623991489410
0.0629029273987

 

x64 Hardware
32bit OS
PHP 5.4 CLI

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

 

مقایسه سرعت دستور settype با Type-Casting...

سرعت کمتر با دستور settype:

$variable = settype($variable, 'string');
$variable = settype($variable, 'integer');
...

0.000537157058716
0.000538110733032
0.000538110733032
0.000538110733032
0.000540018081665
0.000542163848877
0.000542163848877
0.000543117523193
0.000550985336304
0.000910043716431

سرعت بیشتر با Type-Casting:

$variable = (string)$variable;
$variable = (int)$variable;
...

0.000250101089478
0.000252008438110
0.000259160995483
0.000259160995483
0.000261068344116
0.000263929367065
0.000263929367065
0.000265121459961
0.000269174575806
0.000270128250122

 

x64 Hardware
32bit OS
PHP 5.5 CLI

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