مقالات مرتبط:
#2 - نکاتی برای افزایش امنیت وبسایت
1- مکانیزم و شیوه کار پروتوکل HTTP رو کامل فرا بگیرید.
2- همیشه کتابخانه ها و فریم ورکهای استفاده شده در وب اپلیکیشن رو بروز نگه دارید.
3- جهت جلوگیری از click-jacking مقدار هدر X-Frame-Options
رو DENY
قرار بدید:
Apache httpd.conf: Header always append X-Frame-Options DENY Apache .htaccess: Header append X-FRAME-OPTIONS "DENY" Nginx: add_header X-Frame-Options "DENY"; PHP: header('X-Frame-Options: DENY');
4- بصورت هفتگی یا ماهیانه کل سایت رو توسط نرم افزارها و سایتهای اسکنر امنیتی چک کنید:
https://observatory.mozilla.org
https://virustotal.com
https://immuniweb.com/websec
https://detectify.com
http://amn.bayan.ir
https://ssllabs.com/ssltest/index.html
http://isithacked.com
https://app.upguard.com/webscan
https://app.webinspector.com/online_scan
https://suip.biz/?act=sqlmap
https://pentest-tools.com/home
https://sitecheck.sucuri.net
https://quttera.com
https://siteguarding.com
https://transparencyreport.google.com/safe-browsing/search
5- داده های ورودی توسط کاربر را بدقت بررسی، برش و فیلترسازی کنید.
6- برای اپلیکیشن، قابلیت debug mode درست کنید تا در مواقع لزوم بتونید فعالیت های اپلیکیشن رو مانیتور و خطازدایی کنید.
1- جهت پشتیبانی از ارث بری چندگانه در PHP میتونید توسط trait
ها اون رو شبیه سازی کنید.
trait PHP { public function printPHP() { echo 'PHP '; } } trait Java { public function printJava() { echo 'Java '; } } trait PHPJava { use PHP, Java; } class ProgrammingLanguages { use PHPJava; }
2- اگر در حین کار با Composer یا PHPUnit با خطای module openssl is already installed on Unknown in line 0 مواجه شدید، کافیه اکستنشن openssl رو در PHP.ini غیرفعال کنید:
ویندوز ;extension=php_openssl.dll لینوکس ;extension=php_openssl.so
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 تغییر بکنه.
این دیاگرام رو درست کردم تا روند(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 یعنی تعدادی نرم افزار مستقل که در یک پکیج گردآوری شدن و توسط یک برنامه واحد مدیریت میشن.
نرمافزار | شامل | سیستم عامل | ویژگیهای کلیدی |
---|---|---|---|
XAMPP | Apache، MySQL، PHP، Perl | چند-پلتفرم | Apache، MySQL، PHP، Perl، SSL، ماژولهای اضافی مثل WordPress، phpMyAdmin |
WAMP | Apache، MySQL، PHP/Perl/Python | ویندوز | Apache، MySQL، PHP/Perl/Python، نصب آسان، رابط کاربری دوستانه |
MAMP | Apache، MySQL، PHP | مک | Apache، MySQL، PHP، مشابه XAMPP اما برای مک |
DAMP | Apache، MySQL، PHP | Debian | Apache، MySQL، PHP، مشابه LAMP اما برای سیستمهای مبتنی بر دبیان |
UniformServer | Apache، MySQL، PHP | ویندوز | Apache، MySQL، PHP، Perl، سبک، نصب آسان |
EasyPHP | Apache, MySQL/PostgreSQL, PHP, Ruby, Python, MongoDb | ویندوز | Apache، MySQL، PHP، Perl، رابط کاربری دوستانه، ابزارها و ماژولهای اضافی |