این دیاگرام رو درست کردم تا روند(internals) تفسیر، کامپایل و اجرای سورس های PHP رو نشون بده:
برای بزرگنمایی کلیک کنید
php internals diagram
یکی از کاملترین و دقیق ترین دیاگرامهای PHP internals موجود در اینترنت هستش
این دیاگرام رو درست کردم تا روند(internals) تفسیر، کامپایل و اجرای سورس های PHP رو نشون بده:
برای بزرگنمایی کلیک کنید
php internals diagram
یکی از کاملترین و دقیق ترین دیاگرامهای PHP internals موجود در اینترنت هستش
💡 مقایسه سرعت الگوریتم binary search مقابل الگوریتم linear search برای آرایه های مرتب شده(sorted)
(برای آرایه های عددی سنگین)
$needle = range(1, 500000);
❌ Linear search algorithm
function search(array $numbers, $needle) { $_totalItems = count($numbers); for ($i = 0; $i < $_totalItems; $i ++) { if ($numbers[$i] === $needle) { return TRUE; } } return FALSE; }
📊 نتیجه(ms)
0.031199932098389
0.031199932098389
0.031199932098389
0.031199932098389
0.031199932098389
0.031199932098389
0.031200170516968
0.031200170516968
0.046799898147583
0.046800851821899
✅ Binary search algorithm
function search(array $numbers, $needle) { $_low = 0; $_high = count($numbers) - 1; while ($_low <= $_high) { $_middle = (int) (($_low + $_high) / 2); if ($numbers[$_middle] > $needle) { $_high = $_middle - 1; } else if ($numbers[$_middle] < $needle) { $_low = $_middle + 1; } else { return TRUE; } } return FALSE; }
📊 نتیجه(ms)
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
x64 Hardware
32bit OS
PHP 5.6 CLI
کد از کتاب "PHP 7 Data Structures and Algorithms"
ظاهراً در PHP هرچیزی بعد از دستور exit
بصورت ناقص(؟) پردازش میشه ولی بصورت کامل حافظه مورد نیازش رو allocate میکنه...
خروجی یک صفحه ساده:
<?php echo memory_get_usage(); // 217992
خروجی یک صفحه متغیر دار ولی exit
شده:
<?php echo memory_get_usage(); // 220552 exit; // <---------- !! $simpleVar = 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabcdabcdabcdabcdabcdabcd'; $simpleVar .= 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabcdabcdabcdabcdabcdabcd'; $simpleVar .= 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabcdabcdabcdabcdabcdabcd'; $simpleVar .= 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabcdabcdabcdabcdabcdabcd'; $simpleVar .= 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabcdabcdabcdabcdabcdabcd'; echo $simpleVar;
<?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
:
البته این یه نکته ریزه که هنوز خیلی از برنامه نویس ها ازش مطلع نیستن
من هم بعد از 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
x64 Hardware
32bit OS
PHP 5.5 CLI
مقایسه سرعت بین دستورات شرطی 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
x64 Hardware
32bit OS
PHP 5.5 CLI
نکاتی راجب error_reporting
و set_error_handler
و register_shutdown_function
:
برخلاف تصور خیلی ها که فکر می کنند این دستور خطاها رو "نمایش" میده، این دستور موتور دریافت خطاها هستش. (نه حتی Log کردن خطا)
میشه گفت دستوری برای ثبت تابع customize کننده رفتار خطا هستش (مثلاً برای کادر بندی متون خطا، ایمیل کردن خطا، دادن راه حل به کاربر و...)
دستوری برای ثبت تابع 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
!
سرعت بیشتر با تابع 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
چند نمونه از توابعی که در 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 رو غیرفعال کنید.