یوشا

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

یوشا

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

یوشا

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

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

 

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

 

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

3- همیشه از تابع mysqli_fetch_assoc بجای mysqli_fetch_array استفاده کنید. (این نکته هزاران بار گفته شده)

 

4- نکته جزیی: زمانی که عملیات با شکست یا error یا exception یا مشکل مواجه میشه، اگر قراره از exit استفاده بشه اصولش اینه که از exit(1) استفاده بشه، نه exit یا exit(0)
0 یعنی عملیات با موفقیت/بدون خطا/success انجام شد.

1 یا مقادیر دیگه یعنی عملیات با شکست/خطا/fail انجام شد.

 

5- برای تست error و exception در PHPUnit باید از تگ @expectedException استفاده کنید و نه Hardcoding:

/**
* @expectedException InvalidArgumentException
*/
public function testEmailVerificationException()
{
   // Codes
}
یا
/**
* @expectedException PHPUnit_Framework_Error
*/
public function testEmailVerificationException()
{
   // Codes
}

 

6- تنها تفاوت بین دستور set_time_limit() و ini_set('max_execution_time', 60) در این هست که set_time_limit هنگام مشکل خطا برمیگردونه اما max_execution_time فقط FALSE برمیگردونه.

نکته: در وضعیت safe mode این دستورات عمل نمی کنن.

 

7- در بیشتر موارد پیاده سازی Exception/throw() اصولی تر و کاملتر از trigger_error() میتونه باشه.

 

8- با فعالسازی اکستنشن کش OpCache در فایل php.ini، سرعت بارگذاری فایلهای PHP رو افزایش بدید:

این اکستنشن با یکبار ذخیره OpCode تولید شده اسکریپت های PHP در حافظه shared memory از تفسیر و تولید مجدد OpCode جلوگیری میکنه، و همیشه همون OpCode ذخیره شده رو مصرف میکنه. در نتیجه اسکریپت با سرعت بیشتری پردازش میشه.

ویندوز
zend_extension=php_opcache.dll
opcache.enable=1
opcache.cli_enable=1
opcache.memory_consumption=128 # MB
opcache.max_accelerated_files=10000 # maximum = 100000
opcache.max_wasted_percentage=10
opcache.validate_timestamps=0

لینوکس
zend_extension=php_opcache.so
opcache.enable=1
opcache.cli_enable=1
opcache.memory_consumption=128 # MB
opcache.max_accelerated_files=10000 # maximum = 100000
opcache.max_wasted_percentage=10
opcache.validate_timestamps=0

این اکستنشن داخل پکیج PHP 5.5 و جدیدتر موجوده اما برای PHP 5.4 و قدیمی تر باید دانلودش کنید: 

http://windows.php.net/downloads/pecl/releases/opcache/7.0.3/

https://pecl.php.net/package/ZendOpcache

نکته: از اکستنشن OpCache بهتره فقط در محیط production (سرور واقعی) استفاده بشه، و نه در محیط development/برنامه نویسی.

توجه: درصورتی که از اکستنشن xdebug استفاده می کنید، اکستنشن opcache باید قبل از اکستنشن xdebug قرار بگیره.

توجه 2: اگر از دیگر سیستمهای کش مثل APC, XCache, Eaccelerator استفاده می کنید، باید برای همیشه اونها رو غیر فعال کنید!

توجه 3: اگر از وبسرور IIS استفاده می کنید بهتره از اکستنشن WinCache استفاده کنید و نه OpCache.

 

9- برای کار با رشته های Unicode(فارسی و غیره) توسط توابع استاندارد PHP، کافیه فایل مورد نظر رو UTF-8 و مقدار تنظیم mbstring.func_overload در فایل php.ini رو 0 قرار بدید.

نکته: توابع موجود در اسکتنشن mbString با کاراکترها کار میکنن اما توابع استاندارد PHP با بایت کار میکنن.

 

10- تفاوت دستور __DIR__ با دستور getcwd() در این هست که دستور __DIR__ به دایرکتوری فایل درحال اجرا اشاره میکنه اما دستور getcwd() به دایرکتوری شروع کل اسکریپت درحال اجرا اشاره میکنه.

نکته: دستور __DIR__ برابر دستور dirname(__FILE__) هستش.

 

11- دستور array_map() بهترین تابع جهت اعمال تغییرات روی آرایه ها هستش:

$myArray = array_map('trim', $myArray);

 

12- حتاالمکان آدرس URL سایت رو در تگ HTML base قرار بدید تا از تکرار آدرس(برای تصاویر و فایل های ایستای external مثل CSS JS) و شلوغی سورس جلوگیری بشه:

<base href="http://domain/">

 

13- نصب و راه اندازی اکستنشن pThread در ویندوز:

   1- به آدرس http://windows.php.net/downloads/pecl/releases/pthreads برید و نسخه مرتبط با نسخه PHP نصب شده روی سیستم رو انتخاب کنید.

نکته: نسخه های pThread قبل از 2.0.9 برای PHP 5 طراحی شدن و نسخه های pThread بعد از 3.0.0 برای PHP 7 طراحی شدن.

   2- بعد فایل مناسب با معماری سیستم عاملتون(x86 یا x64) رو دانلود کنید.

   3- سپس از داخل آرشیو دانلود شده، فایل pthreadVC2 رو در دایرکتوری ریشه/اصلی php کپی کنید و فایل php_pthreads رو هم در دایرکتوری ext کپی کنید.

   4- حالا فایل php.ini رو باز کنید و عبارت extension=php_pthreads.dll رو در زیر دیگر extension ها اضافه و فایل رو save کنید.

   5- نهایتا سرور وبتون رو restart کنید... تست:

class AsyncOperation extends Thread
{
   public function __construct($arg)
   {
      $this->arg = $arg;
   }

   public function run()
   {
      if ($this->arg)
      {
         printf("Hello %s\n", $this->arg);
      }
   }
}

$thread = new AsyncOperation('world');

if ($thread->start()) $thread->join();

 

14- ویندوز: برای حل مشکل timeout هنگام استفاده از آدرس localhost، کافیه قابلیت IPv6 در فایل hosts ویندوز رو غیرفعال کنید.

 

15- با نصب و فعالسازی اکستنشن xDebug میتونید امکان remote debugging، آنالیز کد و code profiling رو در PHP فراهم کنید. برای اینکار:

- ابتدا پکیج اکستنشن xDebug متناسب با PHP تون رو دانلود کنید.

توجه: هنگام دانلود اکستنشن xDebug دقت کنید که نسخه و معماری هماهنگ با PHP تون دانلود کنید! (نسخه 5.6 یا 7 با معماری 64bit یا 32bit)

- سپس فایل اکستنشن DLL یا SO دانلود شده رو داخل دایرکتوری ext پی اچ پی تون بریزید و تنظیمات زیر رو در آخرین خط فایل php.ini تون کپی کنید:

zend_extension = "C:/PHP/ext/php_xdebug.dll"
xdebug.default_enable = 1
xdebug.max_nesting_level = 256
xdebug.max_stack_frame = -1
xdebug.force_display_errors = 1
xdebug.force_error_reporting = 1

بجای مسیر بالا در zend_extension، مسیر سیستم خودتون که اکستنشن xDebug داخلش قرار داره رو بنویسید.

توجه: در صورتی که از اکستنشن OpCache استفاده می کنید، باید اکستنشن xDebug بعد از اکستنشن OpCache لود و فعال بشه.

توجه 2: اکستنشن xDebug با دیگر اکستنشن هایی مثل Zend Optimizer, DBG, APD سازگار نیست و نباید در کنار هم نصب و فعال باشن!

نکته: اگر از این اکستنشن در PHP 5.3 به قبل استفاده می کنید، درصورت ThreadSafe بودن PHP باید واژه zend_extension رو به zend_extension_ts تغییر بدید.

نکته 2: ویندوز: برای استفاده از این اکستنشن در PHP 5 نیاز به نصب پکیج VC++ Runtime 2012 دارید اما در PHP 7 نیاز به نصب پکیج VC++ Runtime 2015 دارید.

 

16- نکته لینوکسی: توسط برنامه های sysprof، Perf، oprofile و gprof میتونید پرفورمنس پروسس PHP کامپایل شده رو profile و analyse کنید.

 

17- نوعی دیگری Meta Programming در PHP.

البته استفاده از Reflection هم نوعی دیگری Meta Programming محسوب میشه.

 

18- توسط اکستنشن VLDVulcan Logic Disassembler میتونید opcode کدهاتون رو تولید کنید.

https://pecl.php.net/package/vld

 

19- نکته جزیی: وظیفه نوشتن کدهای تست برای Unit Testing بعهده فرد برنامه نویس هستش نه فرد Tester! زیرا:

- بدلیل حفظ مالکیت کدها/پروژه، Tester نباید به سورس پروژه دسترسی داشته باشه.

- بدلیل مسایل امنیتی و کاهش تهدیدها، Tester نباید به داخل کدها و مکانیزم سیستم دسترسی داشته باشه.

- همچنین Tester قادر نیست به همه ابزارها، سبکها و زبانهای مختلفی که در پروژه استفاده شده مسلط بشه و test case طراحی کنه.

- تنها برنامه نویس هستش به کدهایی که پیاده سازی کرده مسلطه و test case رو در کمترین زمان با بالاترین کیفیت تولید میکنه.

 

20- مفهوم Loose Coupling و Tight Coupling:

- مفهوم Loose Coupling یعنی عدم وجود وابستگی در دسته ای از کلاس متصل به هم. یعنی اتصالات مستقل. یعنی افزایش flexibility و re-usability کد. یعنی استقلال در حین وابستگی. یعنی استقلال در روابط بین کلاس ها.

- مفهوم Tight Coupling یعنی وجود وابستگی سخت/تودرتو در دسته ای از کلاس. یعنی اتصالات به هم وابسته. یعنی کاهش flexibility و re-usability کد. یعنی وابستگی در روابط بین کلاسها.

 

21- نکاتی کوتاه درباره TIMESTAMP و DATETIME در MySQL:

- اول اینکه قطعاً TIMESTAMP که از نوع Integer عدد هستش کمی پرفومنس بالاتری نسبت به DATETIME داره و حتی در بسیاری موارد مزایای بیشتری نسبت به DATETIME داره، اما:

- بازه DATETIME از 1000-01-01 00:00:00 هستش تا 9999-12-31 23:59:59 ولی بازه TIMESTAMP از 1970-01-01 00:00:01 هستش تا 2038-01-09 03:14:07.

- نوع TIMESTAMP چهار بایت هستش، اما DATETIME هشت بایت.

- کوئری های حاوی TIMESTAMP کش میشن، اما native DATETIME خیر.

- زمان در TIMESTAMP توسط time_zone تنظیم میشه، اما در DATETIME ثابت هستش.

- نوع TIMESTAMP تریگر های زیادی رو میتونه هندل کنه، اما DATETIME خیر.

- انجام محاسبات بر روی TIMESTAMP خیلی راحت تر و گسترده تر انجام میشه، اما روی DATETIME خیر.

- نوع TIMESTAMP سبک تر هستش و سریعتر ایندکس میشه، اما DATETIME خیر.
و...

 

22- مفهوم اصلی Test Driven Development(یا test-first programming) بمعنی تولید test-case برای کد، قبل از پیاده سازی کد هستش.(نه چیز دیگه!)

درواقع قبل از اینکه کلاس/کد واقعی نوشته بشه، ابتدا test های کلاس/کد نوشتن میشن.

 

23- با استفاده از use میتونید:

1. در توابع Anonymous متغیرهای خارج از حوزه تابع رو به داخل تابع Inherit کنید.

2. در کلاس ها trait ها رو فراخوانی کنید. 

نکته: این عمل ارتباطی با متغیر نوع global نداره.

 

24- فقط زمانی از تابع is_null() استفاده کنید که لازمه در callback تابع دیگری قرار بگیره، درغیراینصورت استفاده از $var === NULL بهترین گزینست.

 

25- جهت افزایش پرفورمنس کدها، حتاالمکان توابع رو بصورت static (عادی) فراخوانی کنید و نه dynamic. (مثل $myFunction())

 

26- در حال حاضر سریعترین، کاملترین و قوی ترین سیستم cache اکستنشن OpCache هستش که هم optimization و هم caching رو فراهم میکنه.

 

27- برای رفع مشکل Fatal Error Unable to create file mapping با OpCache باید مقدار تنظیم opcache.memory_consumption در فایل php.ini رو کاهش بدید.

 

28- برای رفع خطای PHP Startup: Invalid library (appears to be a Zend Extension, try loading using zend_extension=php_x.x from php.ini) in Unknown on line 0 باید اکستنشن مورد نظر رو به شکل zend_extension=php_x.x در فایل php.ini فعال کنید.

 

29- نکته جزیی: فراموش نکنید که دستور unset فقط متغیر وارد شده رو نابود می کنه، و نه رفرنس به اون متغیر. و برای نابودی رفرنس باید برابرNULL قرارش بدید.

 

30- شیوه اضافه کردن API فریم ورک YaF به برنامه Eclipse:

- ابتدا به آدرس https://github.com/elad-yosifon/php-yaf-doc مراجعه و کل پروژه رو دانلود یا Clone کنید... سپس برنامه Eclipse رو باز و به مسیر Menu -> Window -> Preferences برید، بعد گزینه PHP رو انتخاب و بخش Library رو باز کنید. حالا دکمه New رو زده و در قسمت User library name بنویسید: PHP-YaF و Ok کنید. سپس گزینه PHP-Yaf ساخته شده رو انتخاب و دکمه Add external folder یا دکمه Add zip file رو بزنید. بعد فایل یا پوشه php-yad-doc دانلود شده رو انتخاب و Ok کنید. نهایتاً کافیه در پروژه جدید به مسیر Project -> Properties -> PHP Include Path -> Add library برید و از گزینه User library، گزینه PHP-Yaf رو تیک زده و Finish کنید.

نکته: برای استفاده از این فریم ورک به PHP 5.2.1 به بعد نیاز دارید.

نکته 2: برای 5 PHP و قدیمیتر باید از YaF 2 استفاده کنید و برای PHP 7 و جدیدتر باید از YaF 3 استفاده کنید.

نکته 3: درحال حاضری این فریم ورک سریعترین فریم ورک PHP دنیا هستش. (حتی سریعتر از Phalcon)

 

31- توسط اسکریپتهای OpCacheGUI و opcache-gui و opcache-status می تونید آمار و گزارش وضعیت OpCache سیستم رو بدست بیارید.

https://github.com/PeeHaa/OpCacheGUI
https://github.com/amnuts/opcache-gui

https://github.com/rlerdorf/opcache-status

 

32- اگر در my.ini نرم افزار MySQL پارامتر log-bin رو فعال کرده باشین، در پوشه MySQL و معمولا در data فایلهایی ایجاد میشن به این شکل mysql-bin.000001 

این فایلها در واقع Binary log بوده و برای replication و یا point in time recovery مورد استفاده قرار میگیرن. با داشتن این فایلها و Backup موجود میشه اطلاعات رو به هر نقطه ای که خواستید برگردونید.
برای این کار از ابزار mysqlbinlog که در پوشه bin موجود هست استفاده میشه. ابتدا Backup رو برگردونده و سپس با استفاده از mysqlbinlog اطلاعات رو به نقطه مورد نظر بر میگردونیم... نکته اینکه فایلهای mysql-bin.000001 بصورت باینری هستن، پس برای دیدن محتویاتشون:
mysqlbinlog mysql-bin.000001 > c:\test.sql
تبدیلش میکنه به فرمت تکست تا بشه محتویاتش رو دید.
در ابتدای خطوط یک at 6565 وجود داره که یک at و بعد یک شماره هست. که این شماره —stop-position هستش و میشه تا اون نقطه ریکاوری رو انجام داد. نویسنده: https://telegram.me/anouri

 

33- نکاتی درباره دستور isset و دستور empty:

isset: اگر متغیر تعریف نشده باشه یا NULL باشه، این دستور مقدار FALSE رو برمی گردونه. همچنین اگر متغیری رفرنس شده باشه و unset شده باشه، باز هم این دستور FALSE برمیگردنه(در صورتی که متغیر کماکان در حافظه وجود داره و فقط از variable table پی اچ پی حذف شده).  اما اگر مقدار متغیر 0 باشه یا ""، یا ''، یا 0.0، یا FALSE، یا array() یا [] این دستور TRUE برمیگردونه. 

empty: اگر متغیر تعریف نشده باشه، یا NULL باشه، یا 0، یا ""، یا ''، یا 0.0، یا FALSE، یا array() یا [] باشه این دستور TRUE برمیگردونه.

 

34- تا زمانی که این باگ OpCache رفع نشده، مقدار تنظیم opcache.fast_shutdown در فایل php.ini رو 0 کنید!

 

35- برای حل مشکل phar "\PHP\go-pear.phar" has a broken signature در حین کار با PHAr ها یکی از راه های زیر رو دنبال کنید:

- عبارت phar.require_hash در فایل php.ini رو از حالت کامنت خارج و مقدارش رو Off قرار بدید.

- یا PHAr رو توسط فرمان زیر اجرا کنید:

php -d phar.require_hash=0 go-pear.phar

این عبارت یعنی اجرای PHAr مورد نظر با آپشن خاموش phar.require_hash.

 

36- مقدار تنظیم opcache.max_wasted_percentage در فایل php.ini تعیین کننده حداکثر درصد کش/داده waste شده در حافظه shared memory از کل مقدار opcache.memory_consumption هستش که هنگام رسیدن به اون درصد، سیستم OpCache رو برای تخلیه حافظه ریستارت کنه.

 

37- تفاوت های کلاس Abstract با Interface

-  هر دو در پیاده سازی الگوی polymorphism استفاده می شن.

- هر دو برای پیروی از یک شِمای و اسکلت ثابت هستند.

- هردو گزینه خوبی برای استاندارد سازی API داخلی هستن.

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

- هر دو قوانین استفاده از کلاس رو برای توسعه دهنده اجبار می کنن.

- هر دو میتونن تعیین کنن که چه چیز باید پیاده سازی بشه بی توجه به اینکه چطور پیاده سازی بشه.

اما:
- متدهای کلاس Abstract میتونن حاوی کد/محتوا باشن تا یک عملیات رو برای همه کلاس های مصرف کننده فراهم کنن. ولی Interface ها نمی تونن.

- کلاس Abstract میتونه متد private داشته باشه(غیر abstract)، اما Interface نمی تونه.

- کلاس Abstract در واقع ترکیبی از Interface و کلاس هستش ولی Interface یک کلاس مجازی.

- کلاس Abstract قابلیت instantiation یا همون new شدن رو نداره. فقط میشه inheritance/extend بشه. و درطرف دیگر Interface  رو فقط میشه  implement کرد.

- یک کلاس فقط از یک کلاس Abstract می تونه extend بشه. ولی یک کلاس میتونه از 100,000 عدد interface مختلف implement بگیره.

- یک Interface می تونه از چندین Interface مختلف extend بشه. اما  کلاس Abstract نمی تونه(مگر توسط Trait)

- اینترفیس معمولاً در طراحی Listener ها، Callback ها و سازگارسازی کلاس های غیرمرتبط استفاده داره، اما abstract در همه جا.

- کلاس Abstract میتونه فیلد، const و متد داشته باشه. اما Interface فقط می تونه متد(خالی) و const داشته باشه.

- یک کلاس معمولی(concrete) باید همه متدهای interface رو implement کنه، اما در کلاس Abstract اجباری نیست.

- سطوح دسترسی متدها و فیلدها در Abstract میتونه public, private, protected باشه. اما در Interface فقط public میتونه باشه.

زمانی از abstract class استفاده کنید که بدنه متد هم لازمه از قبل کدنویسی بشه، و زمانی از interface استفاده کنید که لازم نیست بدنه متد از قبل کدنویسی بشه یا کلاس نیاز داره که چندین interface رو پیاده سازی کنه.

 نکته: از PHP 5.3 به بعد مجاز به استفاده از static abstract هستید.

 نکته 2: هنگام طراحی کلاسهای utility یا full static، استفاده از کلاس Abstract گزینه مناسبیه.

 نکته 3: معمولاً هنگام طراحی متدهای خالی(stubs)، استفاده از Interface گزینه مناسب تری نسبت به Abstract هست.

 نکته 4: برای موتور PHP، همه class, interface و trait ها یک نوع opcode دارن و به یک شکل(zend_class_entry) مدیریت میشن.

 

38- مفهوم و تفاوت Concurrency(همزمانی) و Parallel(موازی):

- پردازش Parallel نوعی از Concurrent هستش. درواقع Parallel زیرمجموعه Concurrency هستش.

- نوع Concurrent میتونه با یک پردازنده اعمال بشه (single/multi thread). اما نوع Parallel باید در چند پردازنده اعمال بشه. یعنی یک پردازنده به ازای هر پروسس.

نکته: عمل multi-threading در اصل زیر مجموعه parallelism محسوب میشه(اما Parallel programming نیست) و میتونه توسط یک یا چند پردازنده انجام بشه.

 

39- اگر هنگام اجرای برنامه WAMP با خطای The code execution cannot proceed because msvcr110.dll was not found یا The program can't start because MSVCR110.dll is missing مواجه شدید، کافیه کتابخانه VC++ Runtime 2012 رو دانلود و نصب کنید.

 

40- نکاتی درباره دستورات incude_once, require_once, incude, require:

- دستورات incude_once, require_once محتوا شون رو کش میکنن. اگر فایل هدف از قبل ضمیمه شده باشه، مجدداً ضمیمه نمیشه.

- دستوارت incude, require محتواشون رو کش نمیکنن. اگر فایل هدف از قبل ضمیمه شده باشه، مجدداً ضمیمه میشه (duplicate)

- دستورات include_once, include میشه از مقدار return موجود در فایل هدف استفاده کرد. در صورت نبود فایل هدف یا نداشتن دسترسی، PHP اجرای اسکریپت رو متوقف نمیکنه و  E_WARNING میده. مناسب برای template های HTML و صفحات static

- دستورات require_once, require میشه از مقدار return موجود در فایل هدف استفاده کرد. در صورت نبود فایل هدف یا نداشتن دسترسی، PHP اجرای اسکریپت رو متوقف میکنه و E_ERROR میده و کالبک موجود در register_shutdown_function رو هم فعال میکنه. مناسب برای کدهای PHP/کتابخانه ها

 

نظرات (۱)

۱۹ آبان ۹۷ ، ۲۰:۵۰ دانلود سریال گیم اف ترونز
سلام من از طریق بلاگ های بروز شده با وبلاگتون اشنا شدم خوشحال میشم شما هم به بلاگ ما سر بزنید و نظرتون رو درباره فن گات بگید 
کاربران بیان میتوانند بدون نیاز به تأیید، نظرات خود را ارسال کنند.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">