220

ناریا رد - · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

  • Upload
    vanlien

  • View
    320

  • Download
    42

Embed Size (px)

Citation preview

Page 1: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن
Page 2: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

ایران در php همایش اولین مقاالت کتابچه

4931 مرداد

Page 3: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

فهرست

1 PHP در گذشته، حال و آینده

PHP های جدیدنگاهی به تغییرات اتفاق افتاده در نسخه 5

کد یساز نهیو به یممور یبا تمرکز بر رو PHP یساختار درون یبررس 22

یپاچیدر پ یمواز یسینونامهاز بر یگزارش 22

با کامپوزر PHP هایمدیریت پکیج 33

44 Domain-Driven Design in PHP

کدام فریمورک؟ 51

11 Phalcon

11 HHVM

21 PHP یاHack مسئله این است؟ ،

111 Dockerمحیط از development تا nproductio

PHPچند زبانه در یبرنامه ها یساز ادهیمختلف پ یها وهیش 123

راهکار 21 ،یپاچیچالش پ 11 131

کد منبع و روند توسعه آنها تیفی، کPHPیهاتست برنامه 141

PHPپسورد به صورت امن در رهیذخ 153

PHP یسیداده متعامل با زبان برنامه نو یها گاهیپا یاجمال یبررس 112

میکن کپارچهی 1در دروپال Rulesچگونه ماژول خود را با ماژول 112

PHPهای تیمی با محوریت تیم و فعالیت 111

آیا ما حرفه ای هستیم؟ 115

محور سینرم افزار با نگاه برنامه نو دیتول نهیهز 111

Page 4: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

1 1314 مرداد PHP همایش

PHP آینده و گذشته، حال در

همت آرش

ها نویسی وب است. سادگی، تعدد، گستردگی و بازمتن بودن سیستمترین زبانهای برنامهترین و محبوبز پر استفادهیکی ا PHPزبان برنامه نویسی

ها حتی اند باعث شده است در بسیاری پروژهساخته شده 21و ابزارهایی که با استفاده از این زبان در دوره رشد و شکوفایی اینترنت در دهه اول قرن

اده از زبانی دیگر برای اجرای پروژه با سرعت و سهولت کافی ممکن نباشد.اندیشیدن به استف

نویسی نویسی داشته باعث کوتاه شدن روند آموزش این زبان برنامههای برنامههای سایر زبانساختار ساده این زبان که سعی در حذف برخی پیچیدگی

ها ترجیح میدهند.تفاده از این زبان را به سایر زبانها گشته و در نتیجه بسیاری از مردم اسنسبت به سایر زبان

نویسی و شیوه مدیریت و توسعه آن و مسائلی که باعث ایجاد تغییرات اساسی در در این مقاله نگاهی خواهیم داشت بر روند توسعه این زبان برنامه

روند توسعه و مدیریت این پروژه بازمتن شده است.

برمیگردد زمانی که راسموس لردورف پروژه 1114به سال PHPنویسی ندگان این مقاله میدانند تاریخچه زبان برنامههمانطور که بسیاری از خوان

راسموس کد متن زبان را منتشر کرد، استقبال از این پروژه به 1115را برای استفاده شخصی خود بنیان گذاشت، در سال PHPنویسی زبان برنامه

اسموس گفت:حدی بود که در این سال ر

کهاین مورد در ایایده هیچ من …نویسی را نداشتم من نمیدانم چطور این روند را متوقف کنم، من هرگز قصد نوشتن یک زبان برنامه»

«میکنم هاضاف را میرسیدند بنظر منطقی که را هاییقسمت پیوسته بصورت تنها من نداشتم، نوشت نویسیبرنامه زبان یک باید چطور

مند شدند و شروع به کمک به توسعه این اندی گاتمنز و زییو سوراسکی که در حال نوشتن پایان نامه خود بودند به این پروژه عالقه 1111 در سال

ترین اعضای این پروژه هستند.سال همچنان این سه نفر جزو کلیدی 21منتشر شد. پس از گذشت 2نسخه PHPپروژه کردند و

ها منتشر شد. در زمانی که اکثر وبسایت 3ها نسخه ز این پروژه بیشتر شد و اعضای جدیدی به پروژه پیوستند با کمک آناستقبال ا 1112در سال

.میکردند استفاده زبان این از اینترنت ٪1هزار دامنه اینترنتی یعنی حدود 11تشکیل شده بودند، حدود HTMLتنها از چند فایل

بسیار ساده و قابل فهم بود، کدهای آن زمان چنین شکلی داشتند: PHPاز منطق استفاده شده در این نسخه

Page 5: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

2 1314 مرداد PHP همایش

HTML

<form target=”test.php” method=”post”>

<input name=”test” value=“HELLO!” />

</form>

PHP 3 (test.php)

<?php echo $test; ?>

RESULT:

HELLO!

بوجود 1114که در سال 4اند. در نسخه تر شدهتر و مرتبی نداشته اما ساختارها پیشرفتهتغییر چندان PHPزبان Syntaxاز آن زمان تاکنون

ها و ارورها داشته باشد و همچنین امکانات ها و خروجینویس کنترل بیشتری بر ورودیهای ساختار کم شود و برنامهنظمیآمد سعی شد قدری از بی

نویس قرار گیرد.ها در اختیار برنامهها و آرایهازی و کار با رشتهبیشتری برای انجام امور اولیه مانند مرتب س

یک زبان ناشناخته نبود و در مرکز توجه وب که در دوران رشد سریع خود بود قرار داشت و PHPدیگر 2114الی 2111در حدود سالهای

در اوج قدرت و محبوبیت خود قرار داشت و PHPNUKEهای بزرگی بر اساس این زبان نوشته شده بودند، سیستم مدیریت محتوای برنامه

Wordpress های تجاری بر اساس هم به آرامی پیشرفت میکرد، انواع سیستمهای فروشگاه آنالین، انجمن، مدیریت کاربران و سیستمPHP

یت های هاستینگ اشتراکی و ارزان باعث محبوبمتوسعه پیدا میکرد. متن باز بودن، ساده بودن، رایگان بودن و قابلیت استفاده از این زبان در سیست

روزافزون آن میشد.

های متن باز تبدیل شده بود و افراد زیادی مایل بودند به طرق گوناگون به پیشرفت پروژه کمک به یکی از مهمترین پروژه PHPدر این دوران

وری بودند که بایستی بستری برای ام …های جدید و ارایه افزونه های مختلف،کنند، کمکهایی از جمله گزارش مشکالت، ترجمه راهنما به زبان

آمد. مدیریت پروژه که همواره از طریق یک لیست پستی انجام میشد دیگر بیش از اندازه شلوغ شده بود ها بوجود میمدیریت و استفاده مفید از آن

تر های متعددی برای امور گوناگون بوجود آمد تا مدیریت کارها سادهلیست های متفاوت برای امور گوناگون احساس میشد، بنابراینو نیاز به لیست

شود.

را برای امور PHPهای با کیفیت باال با زبان بوجود آمد که وظیفه ایجاد کتابخانه PHPبه عنوان بخشی از پروژه PEARپروژه 2111در سال

پایه بعهده داشت.

هایی که قابلیت یا اولویت قرار گرفتن در بوجود آمد تا امکانی را برای کتابخانه PHPخشی از پروژه نیز به عنوان ب PECLپروژه 2113در سال

ایجاد و به بدنه اصلی زبان متصل Cهایی با سرعت اجرای باال را با زبان هسته اصلی زبان را نداشتند ایجاد کند تا توسعه دهندگان بتوانند افزونه

کنند.

ی پروژه و افزایش روزافزون محبوبیت پروژه، نیاز به ابزارهایی برای کنترل دسترسی اعضای پروژه به بخشهای مختلف، و ایجاد با افزایش تعداد اعضا

مدیریت خود این وبسایت php.netابزارهایی برای مدیریت و کنترل کیفیت کدها نیاز میشد، همچنین با افزایش تعداد بازدیدکنندگان از وبسایت

به هک بود اموری جزو نیز …ترین و زمانبرترین امور تبدیل شد. ایجاد ابزارهایی برای ترجمه راهنماها، مدیریت محتوای وبسایت و به یکی از مهم

.میداد اختصاص بخود را تیم زمان و انرژی از بخشی و میشد انجام بایستی سرعت

Page 6: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

3 1314 مرداد PHP همایش

را داشتند Cتری مانند جاوا و ++های پیشرفتهای که سابقه کار با زباناتجربهافزار بمعماران و مهندسان نرم PHPبه مرور زمان با افزایش محبوبیت

PHPتر پرداختند، این افراد با اینکه از سادگی و سهولت نصب و استفاده از های تجاری پیشرفتههم به استفاده از این زبان برای ساخت سیستم

علمی سازی ساختارهایری زبان در پشتیبانی از سیستمهای شی گرا پی بردند و در پیادهلذت میبردند اما بالفاصله به ایرادات و کمبودهای ساختا

سازی بود به مشکالت اساسی برخوردند.ها بسادگی قابل پیادههایی که در سایر زبانDesign Patternو

خبری نبود، همچنین عدم protectedو privateو publicمانند متدهای Encapsulationاز ساختارهای کنترلی PHPدر آن دوران

ها را سخت یا ناممکن میساخت. همچنین عدم وجود Design Patternسازی بسیاری از پیاده abstractو interfaceوجود کالسهای

به هدر رفت حافظه در برخی ساختارها دامن میزد. staticکالسهای

های شی گرا را به پروژه شد تا به سرعت امکانات اولیه الزم برای نوشتن برنامه PHPوژه این ایرادات جدی باعث بوجود آمدن جنبشی در اعضای پر

امکانات بسیاری را به زبان افزود که ضعفهای اساسی 5منتشر کنند. نسخه 2114در سال 5نسخه PHPاضافه کنند و این تغییرات را در قالب

PHP ن تغییراتی در برخی را پوشش میداد، البته افزودن این امکانات بدوsyntax ممکن نبود 4ها و عدم پشتیبانی از برخی ساختارهای نسخه

هایی که صدها هزار خط کد داشتند مشکل شد.برای برنامه 5به نسخه 4و در نتیجه مهاجرت از نسخه

بودند به بزرگترین مشکل در پیشرفت PHPیت های اشتراکی که یکی از مهمترین دالیل افزایش محبوبهاستینگ 5در دوران پس از انتشار نسخه

PHP امتناع میکردند 5کار میکرد و از مهاجرت به نسخه 4ها مشتریان بسیاری داشتند که کدهایشان تنها در نسخه تبدیل شدند، هاستینگ

الت فراوانی را بوجود آورد. از یک طرف مهاجرت نکنند که این امر مشک 5بنابراین بسیاری از شرکتهای هاستینگ ترجیح دادند تا سالها به نسخه

پشتیبانی میکردند. در این 4بیتاب بودند و از طرفی با سرورهای هاستینگی مواجه بودند که تنها از نسخه 5نویسان برای استفاده از نسخه برنامه

را پشتیبانی 5و هم نسخه 4نسخه PHPهم ها هزار خط کد دوران سیستمهایی بوجود آمد که با تحمل سختیهای فراوان و با استفاده از ده

میکردند.

4دهندگان زبان با تحمل مشکالت فراوان راهی برای نصب هر دو نسخه این مقاومت شرکتهای هاستینگ تا سالها ادامه پیدا کرد و باعث شد توسعه

بصورت همزمان بر روی یک سرور ارائه کنند. 5و

رنت دیگر تقریباً به همه نقاط کره زمین رسیده بود و اکثر کشورها فعاالنه از اینترنت استفاده میکردند و اینت 5در دوران پس از انتشار نسخه

های بومی با زبان خودشان روی آورده بودند و در این راه مشکالت فراوانی داشتند، مشکالت موجود نویسانی در اقصی نقاط دنیا به نوشتن برنامهبرنامه

حلهایی ساده مانند مشکل مرتب سازی بر اساس ترتیب حروف الفبای آن زبان یا فرمت نند زبانهای التین تنها به مشکالتی با راهبرای برخی زبانها ما

اتبزمان و تاریخ یا فرمت ارز محدود میشد ولی در مورد برخی زبانها مانند زبانهای فارسی، عربی و زبانهای آسیای شرقی مشکالت موجود به مر

PHPای کردند که پایه و اساس دهنده زبان برای رفع این مشکالت شروع به طراحی پروژهتعدادی از اعضای توسعه 2115در سال بیشتر بود.

قرار گرفت. 1نسخه

ز، رمشکالت جهانی سازی زبان به دو قسمت عمده تقسیم میشد، اول تفاوت زبانها و کشورهای مختلف در مواردی مانند فرمت زمان و تاریخ، فرمت ا

به عنوان Cدر زبان ICU کتابخانه قدم اولین در. یونیکد از گسترده پشتیبانی دوم …فرمت مرتب سازی، نحوه بزرگ یا کوچک کردن حروف و

ستوانمیت میگرفت قرار دسترس در که صورتی در که بود …پایه و اساس کار انتخاب شد که حاوی ابزارهایی برای فرمت زمان و تاریخ و فرمت ارز و

های در نسخه Intlبه نام PECLابتدا به صورت یک افزونه ICUل کند، پس از مباحث فراوان قرار شد تا کتابخانه ح را مشکالت از بزرگی گستره

PHP6=PHP5+Unicodeواقع برداری برسد. دربه بهره 1در دسترس قرار گیرد و پشتیبانی از یونیکد در نسخه 5آتی

Page 7: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

4 1314 مرداد PHP همایش

منتشر شد که باعث حل بسیاری از مشکالت شد اما پروژه Intlبسیار خوب پیش رفت و افزونه ICUپشتیبانی از کتابخانه در سالهای بعد پروژه

بعنوان فرمت اصلی انتخاب شد و پشتیبانی میبایستی در خود UTF11پشتیبانی از یونیکد به این سادگی نبود، بر اساس طراحی انجام شده

engine بعالوهAPI و همچنین extension ها انجام میشد و این به معنی بازنویسی بخش اعظمی از کل پروژه بود، کدهایی که به درستی کار

میکردند و بایستی از نو بازنویسی، تست و منتشر میشدند. چنین کاری ممکن است برای یک شرکت تجاری کاری روتین باشد اما برای یک پروژه

ستمزدی و تنها از روی عالقه کار میکنند بسیار مشکل و طاقت فرسا بود.بازمتن که اکثر اعضای آن بدون هیچ د

های یعنی حدود پنج سال این روند بازنویسی کدها به کندی پیش میرفت، در این فاصله امکانات و نوآوری 2111تا سال 2115در فاصله سال

موکول 1ها را به پس از انتشار نسخه ه شد اما تیم مدیریتی انتشار آنها از طرف برخی اعضای تیم توسعه هم ارائفراوان دیگری در سایر زمینه

جایگاه خود را به عنوان تنها زبان متن باز، ساده و بی رقیب در وب در خطر دید، در این دوره زبانهایی مانند PHPمیکردند. در همین فاصله زبان

Ruby وPython مانند طرفداران بیشتری یافتند، و زبانهای بسیار د( یگری بوجود آمدندscala وnodejs همچنین شرکتهای معظمی که )

بنیان گذارده بودند از کند بودن آن ناراضی بودند و تالشهایی را برای بهبود سرعت زبان خارج از تیم توسعه PHPکل ساختار خود را بر اساس

.شد …و HippyVMو HACKو HHVMهایی مانند اصلی شروع کردند که حاصل آن پروژه

تیم توسعه به این نتیجه رسیدند که پشتیبانی از یونیکد به سادگی امکانپذیر نیست و تمام کدهای مربوط به آنرا از مخزن اصلی کد 2111در سال

بودند به مرور 1سخه هایی که معطل انتشار نجدا کردند و به یک شاخه دیگر در مخزن کد منتقل کردند. پس از این تاریخ بود که امکانات و نوآوری

منتشر شدند. 5.5تا 5.2های در نسخه

ده ادر سالهای اخیر تغییراتی هم در شیوه مدیریت پروژه بوجود آمده است، در روند قبلی یک امکان جدید توسط یک نفر در لیست پستی پیشنهاد د

ز با آن موافق بودند به مخزن کد اضافه میشد سپس اگر این میشد و در صورتی که مخالفی نداشت و حداقل یکی از سه نفر عضو اصلی پروژه نی

آمد خبر انتشار آن صادر میشد، بدون اینکه توضیحات و مستندات کافی در مورد آن امکان جدید و زمانبندی ها نیز سربلند بیرون میامکان از تست

ه اضافه شده است و هر امکان یا ویژگی جدید بایستی ابتدا به صورت به پروژ wikiانتشار آن وجود داشته باشد، اما در سالهای اخیر بخشی به نام

سازی و زمانبندی اجرا و نحوه ها و نحوه پیادهثبت شود که حاوی اطالعات کاملی در مورد نحوه کارکرد و تأثیر آن بر سایر قسمت RFCیک

ه ته میشود. این روند بگذاش رأی به سپس میپذیرد نجاما هفته دو مدت به آن روی بر بحثهایی پستی لیست در سپس است، …پشتیبانی و

شوند ها منبعی میRFCکمک بزرگی کرده و به روشن شدن ابعاد مختلف هر قسمت کمک میکند و این PHPدموکراتیزه شدن پروژه توسعه زبان

برای مراجعات بعدی سایر اعضای پروژه.

رفت کمی داشت و امیدی به اتمام آن نبود، بنابراین تیم توسعه تصمیم گرفتند که این همچنان پیش 1نسخه PHPشاخه مربوط به 2115در سال

با یشاخه را فعالً کنار بگذارند و بر روی امور مهمتری مانند بهینه سازی سرعت و افزودن امکانات جدید به زبان تمرکز کنند. طی یک رأی گیر

بعنوان یک نسخه مطابق با یونیکد شناخته میشد و بسیاری از ناشران نیز کتبی با عنوان PHPزبان 1همواره نسخه 2115توجه به اینکه از سال

PHP1 منتشر کرده بودند تصمیم براین شد که نسخه بعدیPHP پیدا کند، بنابراین نسخه آینده با عنوان 1به 1بجایPHP 1 منتشر خواهد

شد.

ود ولی روند افزوده شدن امکانات جدید سریعتر پیش خواهد رفت و تمرکز زیادی بر روی دیگر خبری از پشتیبانی یونیکد نخواهد ب 1در نسخه

بوده استفاده خواهد شد که HHVMکه در تستهای سرعت حداقل به خوبی PHPNGافزایش سرعت وجود خواهد داشت. موتور جدیدی به نام

جزو اهداف تعیین شده است و عالوه بر آن JIT Compilerجاد یک مشکل پایین بودن سرعت را تا حد زیادی بهبود خواهد داد، همچنین ای

را ازبین خواهد برد. در صورتی xCacheیا APCبا کیفیت باالتر نیاز به ابزارهایی همچون OpCache integrationپشتیبانی داخلی از

ر نویسی وب دبهترین )و شاید سریعترین( زبان برنامه بتواند به این اهداف دست پیدا کند ممکن است جایگاه خود را به عنوان PHPکه پروژه

جهان بازیابد.

Page 8: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

5 1314 مرداد PHP همایش

PHP جدید هاینسخه در افتاده اتفاق تغییرات به نگاهی

فرمانی رامین

PHP آینده و گذشته، حال

ها، ی با امکاناتی نظیر فضای نامبه یک زبان مدرن اسکریپت PHPتا کنون چندین رنسانس را در زندگی خود تجربه کرده است. امروزه PHPزبان

کمتر به PHPدهندگان نیز رشد و نمو یافته. توسعه PHPکد کش درونسازی شده تبدیل شده است. اکوسیستم جدید ها، بستارها و آپخصیصه

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

ریت کنند. مدیها عمل میتر و بهتر از کدهای مشابه در فریمورکها به یک موضوع خاص، معموالً با کیفیتدهندگان آندلیل تمرکز بیشتر توسعه

ها فراتر ده فریمورکدهد از محدوبوجود آورده و به ما اجازه می PHPهای تحول عظیمی را در روش توسعه اپلیکیشن Composerوابستگی

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

شد.نیز میسر نمی PHPهای توسط جامعه توسعه دهندگان و گروه همکاری فریمورک

آشنا کنیم. PHPآخرین تغییرات در این مقاله قصد داریم تا شما را با

گذشته

یک زبان اسکریپتی سمت PHPباید کمی در مورد گذشته آن بدانیم. PHPهای برای بیان تغییرات و امکانات بوجود آمده در جدیدترین نسخه

نمایند. تولید محتوی پویا می( اقدام به Nginxیا Apacheبرروی یک وب سرور )به طور معمول PHPسرور است که کدهای نوشته شده به زبان

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

PHP ن هستند و یا استفاده چندانی از آاطالع دهندگان از این قابلیت بیهای خط فرمان را نیز دارد که بسیاری از توسعهامکان تولید اپلیکیشن

تواند باشد.برند در صورتی که در بسیاری مواقع این امکان راه گشای مشکالت زیادی مینمی

حال

شود. روش توسعه و اجرای کدهای به سرعت در حال تغییر است و توسط یک دوجین توسعه دهنده در سراسر دنیا توسعه داده می PHPامروز،

بر روی سرور FTPشد و پس از ارسال از طریق دهندگان نوشته میغییر کرده است. در گذشته کدها بر روی سیستم توسعهنوشته شده نیز ت

افزارهای اند. نرمرا گرفته FTPجای Gitهایی مانند رود کار کنند. امروزه کنترل نسخهطور که انتظار میشد به امید آنکه کدها آنسازی میپیاده

های ها، کپی برداری و تلفیق کدها بهره برند. ماشینتوانند از شاخهاند که میکان نگهداری تاریخچه کد را به مخاطبین خود دادهکنترل نسخه ام

Page 9: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

1 1314 مرداد PHP همایش

دقیقاً به Puppetو Ansible، Chefسازی مانند و ابزارهای شرطی Vagrantسازی مانند توسعه محلی نیز با استفاده از ابزارهای مجازی

ایم. کدهای بهرمند شده Composerکنند. از قدرت اجزای نوشته شده توسط دیگر توسعه دهندگان با استفاده از نهایی عمل می مانند سرورهای

PHP ما از استانداردهایPSR کند. ما کدهایمان را با استفاده از پیروی میPHPUnit کنیم. کدهای نوشته شده توسط مدیریت آزمایش می

opcode cacheشوند. و کارایی کدهای خود را توسط سازی میپیاده nginxدر پشت وب سرورهایی شبیه PHPدر FastCGIهای پروسه

ایم.بهبود بخشیده

آینده

ست. این اخیراً به شکل غیرقابل تصوری در حال بهتر شدن با افزودن امکانات جدید و بهبود کارایی PHPتنها موتور مفسر زبان Zendموتور

است. Hackنویسی شرکت فیسبوک و زبان برنامه HipHop Virtual Machineالخصوص شر مرحون رقبای جدید، علیها بیپیشرفت

Hack نویسی جدید است که بر مبنای یک زبان برنامهPHP نوشته شده. این زبان با ارائه انواع ثابت، ساختار داده و افزودنinterface های

PHPدهندگانی را مورد هدف قرار داده که به دنبال توسه سریع کدهای ادامه کار با انواع دینامیک توسعهجدید ضمن پشتیبانی از نسخ پیشین و

ای ثابت هستند.بینی پذیری انواع دادهو استفاده از پایداری و پیش

HHVM یک مفسرPHP وHack است که از مترجمJIT دهای به منظور ارتقا کارایی و کاهش مصرف حافظه برای اجرای کPHP بهره

برد.می

های اخیر فیسبوک در ارائه مفسر جدید شوند اما مشارکت PHPدر Zendجایگزین موتور Hackو HHVMرسد که اینطور به نظر نمی

به ارائه را وادار Zendباعث شده است. باال گرفتن این رقابت تیم توسعه موتور PHPدهندگان ای را در جامعه توسعهتغییرات عمده PHPبرای

PHP کرد که با افزایش بسیار زیاد کارایی همراه بود و به عنوان رقیبی برای 1نسخهHHVM .مطرح است

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

ه سرگرم کننده، خالقانه، پرانرژی و اصولی شده است.امروز PHPاند. کدنویسی به زبان نبوده

امکانات

کامالً جدیداند PHPدهندگان قبلی امکانات هیجان انگیز زیادی به آن افزوده است. برخی از این تغییرات برای توسعه PHPتحوالت جدید در زبان

را به سکویی قدرتمند و PHPاند غافلگیر کننده. این امکانات همهاجرت کرد PHPنویسی به های مدرن برنامهو برای کسانی که از دیگر زبان

ها و ابزارهای خط فرمان بدل کرده است.خوشایند برای توسعه وب اپلکیشن

کنند. و برخی دیگر نیز کامالًنویس را تسهیل میها زندگی یک برنامهاگرچه برخی از این امکانات حیاتی نیستند اما همچنان استفاده از آن

نمایم و سعی هستند. در اینجا این امکانات جدید را تشریح می PHPها اساس و بنیان استانداردهای نوین در اند. به عنوان مثال فضای نامضروری

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

Page 10: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

1 1314 مرداد PHP همایش

(Namespaces) هانام فضای

ها نویسی اضافه شدند، فضای نامبه این زبان برنامه 5.3ها هستند که در نسخه نام فضای PHPمترین امکان افزوده شده و تحول آفرین به زبان مه

کنند، چیزی مشابه ساختار دایرکتوری در دهی میمراتبیِ مجازی نظمرا با ساختار سلسله PHPابزار مفید و مهمی هستند که کدهای

ها.عاملهای سیستمستمسیفایل

کند، بنابراین از دهی میکدهای خود را در زیر فضای نام سراسریِ یکتای خود سازمان PHPها و اجزای نوشته شده با هر یک از فریمورک

شود.میها اجتناب دهندگان در دیگر اجزا یا فریمورکهای توسعه داده شده توسط دیگر توسعههای مشابه برای کالسناسزگاری نام

ها اجزای مختلفی دارد یکی از آن Symfonyبگذارید در یک مثال عملی کمی بیشتر در این مورد صحبت کنیم. فریمورک

httpfoundation های نام دارد که وظیفه ارسال و دریافت درخواستHTTP دهندگان مورد دار است و به طور گسترده توسط توسعهرا عهده

برای Cookieو Request، Responseاز اسامی متداولی مانند symfony/httpfoundation همتر اینکه جزگیرد. ماستفاده قرار می

هایشان گذاری کالسها هم از همین اسامی برای نامهای خود استفاده کرده است. به طور قطع بسیاری از دیگر اجزا و کتابخانهگذاری کالسنام

ها که از همین اسامی برای کالسهایشان های این جز در پروژهایمان به طور همزمان با دیگر کتابخانهتوانیم از کالساند. پس چطور میاستفاده کرده

نام، ما را قادر عنوان تولیدکننده فضایبه Symfonyدر زیر نام یکتای ها ها با قرار دادن کدهای این کالساند بهره ببریم. فضای ناماستفاده کرده

ها استفاده نماییم.سازند به شکلی مطمئن از آنمی

شوید.ی با قطعه کد زیر مواجه میبیاندازید در خطوط ابتدای Response.php چنانچه نگاهی به فایل

namespace Symfony\Component\HttpFoundation;

گیرد. این تعریف فضای قرار می PHPاست که همیشه در خطی جدید درست پس از تگ آغازین PHPنام در این در حقیقت تعریف فضای

حضور دارد )اولین سطح از فضای Symfonyزیر فضای نام کمپانی در Responseنماید. اول آنکه کالس نام چند چیز را برای ما تبیین می

کند. همچنین زندگی می Componentنامِ در زیرِ زیرفضای Responseدانیم کالس نام به فضای نام کمپانی شهرت دارد(. همچنین می

توانید دیگر فایلهای مجاور گرفته است. شما میقرار HttpFoundationنام دیگری با عنوان در زیرِ زیرفضای Responseبینیم که کالس می

Response.php نام کالسهای نام یا زیرفضایرا نیز بررسی کنید و خواهید دید که فضای نام مشابهی دارند. یک فضایPHP را به شکلی منظم

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

مجازی است و نیازی نیست یک تطابق نظیر به نظیر بین فضای نام و محل PHP نام در ها، فضایبرخالف فایل سیستم در سیستم عامل

خوان برای پشتیبانی از فرا PHPهای های مورد استفاده وجود داشته باشد. اگرچه که بیشتر اجزا و فریمورکقرارگیری فایل و دایرکتوری کالس

دهند و شما نیز بهتر است به عنوان یک استاندارد و همچنین تسهیل استفاده از کد از چنین تناظری را مورد استفاده قرار می PSR-4خودکار

چنین استانداردی بهره ببرید.

نامفضای کردن تعریف

اقدام به تعریف یک namespaceده از کلمه کلیدی با استفا PHPچنانچه در باال مشاهده شده برای تعریف فضای نام پس از تگ بازگشایی

ر یک ها که در زیها و ثابتها، اینترفیسنماییم. تمامی کالساستفاده می \نام از کاراکتر نام و زیرفضایکنیم برای جداسازی فضایفضای نام می

کنند.نام زندگی میاند تحت همان فضایفضای نام تعریف شده

Page 11: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

2 1314 مرداد PHP همایش

ذخیره شود در واقع این امکان وجود دارد )و البته تاکید به آن نیز هست( که PHPنام نیازی نیست در یک فایل ایهای یک فضتمامی کالس

نام مشابه نوشته شوند.نام در فایلهای مختلف با فضایهای یک فضایکالس

های زیرفضای نام اهمیت کمتریباشد بخشباشد که یک برند یا نام کمپانی شماست و باید یکتا می vendorنام قسمت مهمترین بخش فضای

گیرند.داشته و برای سازماندهی کدهای پروژه مورد استفاده قرار می

مستعارها و کردن وارد

ها حل کرده بودند. که روش برای نامگذاری کالس Zendها را با استفاده از شیوه مشکل تداخل نام PHPدهندگان ها، توسعهنامپیش از فضای

گرفت. به طور مثال کالسی با مورد استفاده قرار می Zendای بود که توسط فریمورک نامگذاری

واقع در PHPدر فایل Zend_Cloud_DocumentService_Adapter_WindowsA zure_Queryنام

Zend/Cloud/DocumentService/Adapter/ WindowsAzure/Query.php نوشته شده بود. طبیعی است که طوالنی بودن

ها نیز برای استفاده کردن از یک کالس تا حدی مشکل همچنان باقی بود که با نامم کالس یکی از مشکالت این روش بود اما با استفاده از فضاینا

شود.استفاده از وارد کردن و مستعارها این مشکل نیز برطرف می

استفاده PHPهایی در هر فایل ها، توابع و ثابتها، اینترفیسکالس ها،ناماست که از چه فضای PHPمنظور از وارد کردن اعالم این موضوع به

نام نیست.شده است و با استفاده از این نیاز به تایپ کامل فضای

تر است که وارد کردن یک کالس، اینترفیس، فانکشن و یا ثابت با ارجاع دادن به یک نام کوتاه PHPمنظور از مستعارها، اعالم این موضوع به

عار میسر شود.مست

ای نشده:استفاده aliasو importبه قطعه کد زیر توجه کنید در این کد از

<?php

$response = new \Symfony\Component\HttpFoundation\Response('Oops', 400);

$response->send();

استفاده کنیم بهتر است از Responseبخواهیم مکرراً از کالس اگرچه یکبار استفاده از این روش چندان فاجعه آمیز نیست اما در حالتی که

import سازی امور استفاده نماییم.برای ساده

<?php

use Symfony\Component\HttpFoundation\Response;

$response = new Response('Oops', 400);

$response->send();

شود. همچنین مستعار در این حالت همان نام کالس است. استفاده می useنام از کلیدواژه شود برای وارد کردن یک فضایچنانچه مشاهده می

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

<?php

use Symfony\Component\HttpFoundation\Response as Res;

$r = new Res('Oops', 400);

$r->send();

Page 12: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

1 1314 مرداد PHP همایش

انتخاب شده است. Responseبرای کالس Resشود در این مثال نام مستعار که می همانطور

ها کنید که این امر با یک تغییر کوچک در آنچه تاکنون مشاهده توانید اقدام به وارد کردن توابع و ثابتشما همچنان می PHP 5.1در نسخه

کردید میسر است.

<?php

use func Namespace\functionName;

functionName();

هاو برای ثابت

<?php

use constant Namespace\CONST_NAME;

echo CONST_NAME;

ها قابل استفاده است.نام مستعارها همچون گذشته برای توابع و ثابت

وارد کرده باشید یا نام useنام را با فضاینام فعلی باید یا آن نام دیگر در فضاینکته: دقت داشته باشید که برای استفاده از کدهای یک فضای

گردد همچنین چنانچه از نام فعلی به دنبال آن کالس، اینترفیس، تابع یا ثابت میدر فضای PHPکالس مربوطه را با قید کامل ذکر کنید وگرنه

\برای فراخوانی آن استفاده کنید که با یک نام عمومیخواهید استفاده کنید که متعلق به هیچ فضای نامی نیست باید حتما از فضایکدی می

شود.پیش از نام آن کالس نشان داده می

<?php

namespace My\App;

class Foo {

public function doSomething() {

throw new \Exception();

}

}

هاواسط با نویسی کد

مانده است و برای تشریح موضوع بعدی به درک صحیحی از آن نیاز دهندگان همچنان مبهم باقیکه برای برخی توسعهیکی از امکانات قدیمی

دهند تا به شی دیگر وابسته نباشد اما به هستند که به یک شی اجازه می PHPها در حقیقت قراردادی بین دو شی ها هستند. واسطاست واسط

دهد وابسته است.متواند انجاآنچه که شی دیگر می

نماییم. فرض کنید قصد دارید یک اتومبیل کرایه کنید، برای انتخاب اتومبیل رسد اما با یک مثال آنرا تبیین میاین تعریف اگرچه گنگ به نظر می

و بوگاتی ویرون! 415شما چند گزینه دارید، پراید، پژو

فاوتی ندارد که کدام خودرو را انتخاب کند زیرا استفاده از هرسه آنها تحت یک واسط خواهد هر یک از این سه خودرو را براند تبرای کسی که می

.است متفاوت! تاحدی آنها عملکرد نحوه که است بریهی اما شودمی انجام …ها ومشترک مثل فرمان، پدال

Page 13: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

بنویسیم که متنی DocumentStoreس خواهیم یک کالسازی کنیم. فرض کنید میپیاده PHPخب بیاید این مفهوم را در یک مثل واقعی

یکتا دریافت و ID، از یک منبع جاری و از خروجی یک فرمان ترمینال با یک URLاز یک HTMLرا از منابع مختلف مثل یک فایل

سازی کند.ذخیره

class DocumentStore {

protected $data = [];

public function addDocument(Documentable $document) {

$key = $document->getId();

$value = $document->getContent();

$this->data[$key] = $value;

}

public function getDocuments() {

return $this->data;

}

}

نویسیم.را می Documentableحال قطعه کد مربوط به واسط

interface Documentable {

public function getId();

public function getContent();

}

خواهد getContentو getIdسازی شده است الزاماً دو متد عمومی دارد که هر شی که از روی آن پیادهاین نحوه تعریف واسط بیان می

های مختلفی را از روی آن شود که بخواهیم کالسنماید؟ مفید بودن این واسط زمانی مشخص میداشت. حال چگونه این واسط به ما کمک می

سازی کنیم.پیاده

نویسیمرا می HtmlDocumentابتدا کالس

class HtmlDocument implements Documentable {

protected $url;

public function __construct($url) {

$this->url = $url;

}

public function getId() {

return $this->url;

}

public function getContent() {

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $this->url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);

Page 14: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

curl_setopt($ch, CURLOPT_MAXREDIRS, 3);

$html = curl_exec($ch);

curl_close($ch);

return $html;

}

}

:StreamDocumentو کالس

class StreamDocument implements Documentable {

protected $resource; protected $buffer;

public function __construct($resource, $buffer = 4096) {

$this->resource = $resource;

$this->buffer = $buffer;

}

public function getId() {

return 'resource-' . (int)$this->resource;

}

public function getContent() {

$streamContent = ''; rewind($this->resource);

while (feof($this->resource) === false) {

$streamContent .= fread($this->resource, $this->buffer);

}

return $streamContent;

}

}

:CommandOutputDocumentو آخرین کالس مورد نظر

class CommandOutputDocument implements Documentable {

protected $command;

public function __construct($command) {

$this->command = $command;

}

public function getId() {

return $this->command;

}

public function getContent() {

return shell_exec($this->command);

}

}

Page 15: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

12 1314 مرداد PHP همایش

آوری متن کار کنیم.با هریک از این سه کالس جمع DocumentStoreکالس توانیم از حال ببینیم چطور می

<?php

$documentStore = new DocumentStore();

// Add HTML document

$htmlDoc = new HtmlDocument('https://php.net');

$documentStore->addDocument($htmlDoc);

// Add stream document

$streamDoc = new StreamDocument(fopen('stream.txt', 'rb'));

$documentStore->addDocument($streamDoc);

// Add terminal command document

$cmdDoc = new CommandOutputDocument('cat /etc/hosts');

$documentStore->addDocument($cmdDoc);

print_r($documentStore->getDocuments());

ها داده و دیگر نگران سازگاری کدها نخواهیم بود.پذیری بیشتری به آنها انعطافدر پایان نوشتن کدها با واسط

(Traits) هاخصیصه

ها رفتاری مشابه ، خصیصهtraitsبا مفهومی پر ابهام روبرو شدند با نام PHP 5.4دهندگان در سراسر دنیا در هنگام ارائه نسخه بسیاری از توسعه

ها کالس هستند یا واسط؟ و پاسخ این است که شود این است که خصیصهها هستند. سوالی که همواره مطرح میها دارند اما شبیه واسطالسک

هیچکدام و هردو!

ه دارند: از انای دوگها وظیفهتوانند با یک یا چند کالس دیگر تلفیق شوند. در حقیقت خصیصهها دارند که میسازی شبیه کالسها پیادهخصیصه

سازی ماژوالر دارند.تواند انجام دهد و از سوی دیگر به مانند یک کالس پیادهگویند یک کالس چه کارهایی میطرفی به مانند یک واسط می

ه با اید در ادامشده اند کمی سردرگمدهندگان که برای اولین بار با این امکان روبرو شدهبا این توضیحات نیز شما هم مانند دیگر توسعه احتماالً

توضیح یک مثال عملی پی به لزوم بوجود آمدن این امکان و نحوه استفاده از آن خواهید برد.

کنیم؟ استفاده هاخصیصه از چرا

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

گویند و یک الگوی متداول در بری میبرند. که به این سلسله مراتب ارثیابند که ساختار والدین خود را به ارث میتر از آنها گسترش میخاص

نویسی است.های برنامهبسیاری از زبان

باشند چه باید بکنیم؟ رفتار مشابهی داشته بخواهند PHPکند. اما اگر دو کالس غیرمرتبط بری در بیشتر مواقع به خوبی کار میمدل سنتی ارث

بریشان ندارند. اما هردو کالس نیاز متفاوت هستند و والدین یکسانی در سلسله مراتب ارث کامالً RetailStoreو Carبه طور مثال دو کالس

به استفاده از امکانات مختصات جغرافیایی برای نمایش برروی نقشه دارند.

Page 16: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

13 1314 مرداد PHP همایش

های نامرتبط تزریق شود. تواند به کالسسازی ماژوالر که میاند. به منظور قادر ساختن یک پیادههمین دلیل بوجود آمدهها دقیقًا به خصیصه

ها همچنین مشوق استفاده مجدد از کدها هستند.خصیصه

ردو کالس استفاده کنیم. این راه حل توانستیم یک والد یکسان برای ههایی وجود دارد. اول اینکه میبرای حل مشکل توصیف شده در باال راه حل

قرار ندارد همچنین دو کالس RetailStoreو Carبری هیچ یک از دو کالس در سلسله مراتب ارث Geocodableبد است زیرا کالس

بری کنند.نامرتبط فوق را وادار کردیم تا از والد یکسانی ارث

کدهای دقیقاً RetailStoreو Carل پیشین بهتر است اما هر دو کالس است که از راه ح Geocodableراه دیگر نوشتن یک واسط

کردن یک آدرس داریم( تا بتوانند واسط geo codeمشابهی را باید در داخل کالس خود قرار دهند )زیرا ما شیوه یکسانی برای

Geocodable سازی کنند. و این نیز یک راه حل را پیادهDRY .نیست

توانیم کند. ما میمی geocodableسازی متدهای است که اقدام به پیاده Geocodableحل نوشتن یک خصیصه بهترین و آخرین راه

ها دستخوش تغییری بری ذاتی آنتلفیق کنیم بدون آنکه سلسله مراتب ارث RetailStoreو Carهای را با کالس Geocodableخصیصه

شوند.

بنویسیم؟ خصیصه یک چگونه

سازی خصیصه آورده شده است.ل عملی برای پیادهدر ادامه یک مثا

<?php

trait Geocodable {

/** @var string */

protected $address;

/** @var \Geocoder\Geocoder */

protected $geocoder;

/** @var \Geocoder\Result\Geocoded */

protected $geocoderResult;

public function setGeocoder(\Geocoder\GeocoderInterface $geocoder) {

$this->geocoder = $geocoder;

}

public function setAddress($address) {

$this->address = $address;

}

public function getLatitude()

{

if (isset($this->geocoderResult) === false) {

$this->geocodeAddress();

}

return $this->geocoderResult->getLatitude();

}

Page 17: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

14 1314 مرداد PHP همایش

public function getLongitude() {

if (isset($this->geocoderResult) === false) {

$this->geocodeAddress();

}

return $this->geocoderResult->getLongitude();

}

protected function geocodeAddress() {

$this->geocoderResult = $this->geocoder->geocode($this->address);

return true;

}

}

?>

را در خود قرار داده geocodableشود این خصیصه تنها خصوصیات و متدهای مربوطه برای رفتار هده میهمانطور که در قطعه کد باال مشا

دهد.است و هیچ کار دیگری انجام نمی

از \Geocoder\Geocoder)یک نمونه geocoder، یک شی addressشامل خصوصیت: یک رشته Geocodableخصیصه

component ارزشمند willdurand/geocoder ایم( و یک شی نتیجه استفاده کردهgeocoder یک نمونه(Geo

coder\Result\Geocoded\ایم.( همچنین چهار متد عمومی و یک متد خصوصی تعریف کرده

کنیم؟ استفاده خصیصه یک از چگونه

در useها نیز کاربرد دارد با این تفاوت که استفاده از کلمه کلیدی ها گفتیم برای وارد کردن خصیصهنامکه در مورد وارد کردن فضایهمه آنچه

افتد.داخل تعریف کالس اتفاق می

<?php

class RetailStore {

use Geocodable;

// Class implementation goes here

}

استفاده نماید.Geocodableشده توسط تواند از خصوصیات و متدهای تامینمی RetailStoreحال کالس

<?php

$geocoderAdapter = new \Geocoder\HttpAdapter\CurlHttpAdapter();

$geocoderProvider = new \Geocoder\Provider\GoogleMapsProvider($geocoderAdapter);

$geocoder = new \Geocoder\Geocoder($geocoderProvider);

$store = new RetailStore();

$store->setAddress('420 9th Avenue, New York, NY 10001 USA');

$store->setGeocoder($geocoder);

$latitude = $store->getLatitude();

$longitude = $store->getLongitude();

echo $latitude . ':' . $longitude;

Page 18: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

15 1314 مرداد PHP همایش

های ممکن در انجام این اقدام کند و این رفتار در مقابل ناسازگاریکدهای داخل خصیصه را در زمان اجرا به داخل کالس کپی می PHPمفسر

مصون نیست. چنانچه خصیصه شما فرض بر موجود بودن یک خصوصیت یا متد در کالس استفاده کننده دارد که در خود خصیصه تعریف نشده

ها اطمینان حاصل کنید.ش از استفاده از حضور آناست، همواره پی

(Generators) تولیدگرها

عرضه شده است. احتماالً تعداد زیادی PHP 5.5هستند که در نسخه PHP ٔ العاده و البته کمتر شناخته شدهتولیدگرها یکی از امکانات خارق

هم شاید این باشد که هدف از اضافه شدن آن در یک ندارند دلیل آن PHPهای جدید دهندگان هنوز اطالعی از این امکان در نسخهاز توسعه

اند!عبارت چندان روشن نیست. تولیدگرها تکرارگرهایی ساده

، تولیدگرها نیاز ندارند تا به عنوان یک واسط تکرارگر در یک کالس سنگین به کار برده شوند. در عوض PHPبرخالف تکرارگرهای استاندارد

کنند.محاسبه و واگذار کردن مقادیر تکرار در هنگام درخواست عمل می تولیدگرها با

شود. برخالف تکرارگرهای استاندارد و این محاسبه و واگذاری در زمان درخواست )تقاضا( منجر به بهبود کارایی قابل مالحظه در اپلیکیشن می

دهند، که البته این روش مشخصاً ناکارا پردازش شده انجام میاز پیشکه معموالً تکرار را بر روی اطالعات موجود در حافظه و PHPمتداول

است، خصوصاً زمانی که با حجم عظیمی از اطالعات روبرو هستیم. به همین دلیل است که برای دیتاهای بزرگ خصوصاً زمانی که قرار است

.شودپردازشی بر روی آنها انجام شود قویاً استفاده از تولیدگرها پیشنهاد می

توانید به عقب بازگردید یا پرش نمایید. تولیدگرها همچنین یکی ها را ندارند و شما نمیالزم به ذکر است که تولیدگرها قابلیت حرکت بر روی داده

توانید بر روی یک تولیدگر بیش از یک بار تکرار نمایید.و تمام هستند لذا نمی

تولیدگر یک ساخت

کنند.گردانند و تنها یک یا چند مقدار را واگذار میتند که برخالف توابع متداول مقداری را برنمیهس PHPتولیدگرها یک تابع ساده

<?php

function myGenerator() {

yield 'value1';

yield 'value2';

yield 'value3';

}

تواند توسط یک گردانند. این شی میباز می Generatorیک شی متعلق به کالس PHPدهید زمانی که یک تابع تولیدگر را درخواست می

نماید. درخواست محاسبه و واگذاری مقدار تکرار بعدی را می Generatorاز نمونه PHPتکرار شود. در طی هر تکرار foreachحلقه

ام رسیدن تعریف تابع یا رسیدن به یک نماید و این توقف و ادامه را تا زمان به اتمتولیدگر وضعیت داخلی خود را تا درخواست بعدی حفظ می

دهد.خالی ادامه می return;عبارت

<?php

foreach (myGenerator() as $yieldedValue) {

echo $yieldedValue, PHP_EOL;

}

Page 19: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

خروجی کد باال چنین خواهد شد.

value1

value2

value3

تولیدگرها از استفاده

ها را در یک مثال مشاهده نماییم:بگذارید چرایی استفاده از تولیدگر

تا عدد مورد درخواست دارد به این شکل است: 1ای از اعداد را از ایده بد برای نوشتن تابعی که محدوده

<?php

function makeRange($length) {

$dataset = [];

for ($i = 0; $i < $length; $i++) {

$dataset[] = $i;

}

return $dataset;

}

$customRange = makeRange(1000000);

foreach ($customRange as $i) {

echo $i, PHP_EOL;

}

اند که به صورت پیش پردازش شده در یک آرایه ذخیره بدیهی است در این روش یک میلیون عدد صحیح حجم زیادی از حافظه را اشغال کرده

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

<?php

function makeRange($length) {

for ($i = 0; $i < $length; $i++) {

yield $i;

}

}

foreach (makeRange(1000000) as $i) {

echo $i, PHP_EOL;

}

تواند ارزشمندی همین مثال ساده را اثبات نماید اما تصور نمایید مثال کمی ساده انگارانه به نظر بیاید گرچه محاسبه دنباله فیبوناچی می شاید این

حافظه در دسترس پردازش نمایید. راه حل شما چیست؟ 512mbبا VPSگیگابایت را بر روی یک 4با سایز CSVخواهید یک فایل که می

<?php

function getRows($file) {

$handle = fopen($file, 'rb');

if ($handle === false) {

Page 20: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

throw new Exception();

}

while (feof($handle) === false) {

yield fgetcsv($handle);

}

fclose($handle);

}

foreach (getRows('data.csv') as $row) {

print_r($row);

}

بگوییم اما فراموش نکنید تولیدگرها PHPخب احتماالً با مشاهده قطعه کد باال دیگر الزم نیست چیزی در مورد ارزشمندی این امکان جدید در

اند و شما هر آنچه را که نیافزوده PHPکاره بودن و سادگی هستند. همچنین تولیدگرها امکان جدیدی به در حقیقت یک شمشیر دولبه بین همه

نماید. چنانچه نیاز به تر مینیز بنویسید اما این امکان کار شما را ساده PHPتوانستید با یک تولیدگر قادر به ساختن هستید پیش از این می با

استفاده Iteratorسازی کنید و از واسط حرکت و قدرت مانور بیشتری بر روی اطالعات هستید باید یک کالس اختصاصی برای تکرار پیاده

استفاده کنید. SPL ٔ ساختهیید و یا اینکه از یکی از تکرارگرهای پیشنما

نمایید. نوشته آنتونی فرارا را مطالعه What Generators Can Do For You توانید مقالهبرای مطالعه بیشتر در مورد تولیدگرها می

(Closures) بَستارها

هستند. اگرچه شاید PHPمعرفی شدند، و دو امکان پر استفاده از تغییرات جدید اعمال شده در PHP 5.3.1نام در نسخه بستارها و توابع بی

نظر آیند اما استفاده از آنها بسیار ساده است.در نگاه اول کمی ترسناک به

کند. حفظ شرایط موجود حتی که در زمان ساخته شدن وضعیتی را که احاطه کرده است در خود حفظ مییک بستار در حقیقت یک تابع است

ترین مفهومی باشد که در بستارها با آنها روبرو یابد. این حفظ وضعیت شاید پیچیدهدر زمان حیات بستار پس از خاتمه محیط اولیه آن ادامه می

هستیم و باید درک کنیم.

مورد استفاده قرار گیرند اما PHPتوانند به یک متغیر واگذار شوند و مانند دیگر اشیا ک تابع بدون تخصیص یک نام هستند که مینام یتوابع بی

تد توانند به عنوان یک منام مانند توابع معمولی مفید هستند و یا میتوانند مانند یک آرگومان ارسال شوند. توابع بیهمچنان تابع هستند و می

callback .مورد استفاده واقع شوند

به یک شکل و مشابه هم هستند لذا اینجا تنها از نام بستار برای هردو PHPنام دو مفهوم متفاوت هستند اما در نکته: در واقع بستارها و توابع بی

با یک مفهوم برای هردو آنها روبرو هستیم. PHPکنیم و در عمل هم در این مفاهیم استفاده می

اند. اگر آنها را بررسی کنید متوجه Closureتغییر شکل دادند و نمونه ای از کالس PHPدر واقع یک شی هستند که به شکل توابع بستارها

خواهید شد که به مانند مقادیر اولیه دیگر مثل اعداد صحیح یا رشته هستند.

ساخت

آنها ساده است. دارند لذا ساخت PHPنام یک شکل در چنانچه گفته شد بستار و توابع بی

Page 21: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

12 1314 مرداد PHP همایش

<?php

$closure = function ($name) {

return sprintf('Hello %s', $name);

};

echo $closure("Josh");

// Outputs --> "Hello Josh"

کنیم:استفاده می callbackبطور معمول از بستارها بعنوان توابع

<?php

$numbersPlusOne = array_map(function ($number) {

return $number + 1;

}, [1,2,3]);

print_r($numbersPlusOne);

// Outputs --> [2,3,4]

کردیم:برای نوشتن همین کد در گذشته باید چنین می

<?php

// Named callback implementation

function incrementNumber ($number) {

return $number + 1;

}

// Named callback usage

$numbersPlusOne = array_map('incrementNumber', [1,2,3]);

print_r($numbersPlusOne);

و استفاده از آنها جدایی می افتاد. callbackکه کمی کاهش کارایی داشت و از آن مهمتر این بود که بین تعریف توابع

(Attach State) وضعیت الصاق

وضعیت اپلیکیشن PHPدر زبان JavaScriptشوند زیر برخالف در اینجا احتماالً کمی دچار سردرگمی می JavaScriptدهندگان توسعه

useتر است که از کلیدواژه به بستار الصاق شود. که البته بسیار متداول useیا کلیدواژه bindToباید به صورت دستی با استفاده از تابع )(

استفاده شود.

<?php

function enclosePerson($name) {

return function ($doCommand) use ($name) {

return sprintf('%s, %s', $name, $doCommand);

};

}

// Enclose "Clay" string in closure

Page 22: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

$clay = enclosePerson('Clay');

// Invoke closure with command

echo $clay('get me sweet tea!');

// Outputs --> "Clay, get me sweet tea!"

کند و یک شی قبول می $nameیک آرگومان enclosePersonرسد اما بگذارید آنرا بررسی کنیم. تابع )(خب کمی گیج کننده به نظر می

درست در همین لحظه در بستار حفظ $nameگرداند. فراموش نکنید وضعیت متغیر را محصور کرده است برمی $nameبستار که آرگومان

شود.می

های بیشتر به یک بستار آنها را با کاما از هم جدا کنید.ال آرگوماننکته: برای ارس

قابل دسترسی است. $thisشی هستند. هر نمونه یک بستار وضعیت درونی خود را دارد و با کلیدواژه PHPفراموش نکنید بستارهای

وضعیت درونی یک شی بستار را به یک شی دیگر مقید کنید. توانیددهد. مثاًل شما میامکانات بیشتری را در اختیار ما قرار می bindToمتد )(

نماید. این امکان شی را که بستار به آن مقید شده است مشخص می PHPپذیرد که کالس این متد همچنین آرگومان دوم بسیار مهمی می

آورد.دسترسی بستار به اعضای متغیر محافظت شده و خصوصی شی مقید شده را فراهم می

از این PHPاین توضیحات برایتان بسیار نامفهوم بوده است بگذارید یک کاربرد عملی از این را بررسی کنیم. در بیشتر فریمورکهای احتماالً

پذیرد و آنرا مقید به یک شی نام مینام استفاده شده است. فریمورک یک تابع بیبه یک تابع بی URLها برای نقشه کردن یک امکان در مسیریاب

دسترسی داشته باشید. به مثال زیر $thisنامتان به شی اصلی اپلیکیشن با کلیدواژه دهد تا در تابع بینماید. این به شما امکان میشن میاپلیکی

توجه کنید.

<?php

class App

{

protected $routes = array();

protected $responseStatus = '200 OK';

protected $responseContentType = 'text/html';

protected $responseBody = 'Hello world';

public function addRoute($routePath, $routeCallback)

{

$this->routes[$routePath] = $routeCallback->bindTo($this, __CLASS__); // notice!

}

public function dispatch($currentPath)

{

foreach($this->routes as $routePath => $callback) {

if($routrPath === $currentPath) {

Page 23: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

21 1314 مرداد PHP همایش

$callback();

}

}

header('HTTP/1.1 ' . $this->responseStatus);

header('Content-type: ' . $this->responseContentType);

header('Content-length: ' . mb_strlen($this->responseBody));

echo $this->responseBody;

}

}

یر درخواست مس dispatchکند. تابع )(برای آن قبول می callbackدقت کنید. این متد یک آدرس مسیر و یک addRouteبه متد )(

افتد جایی که بستار با وضعیت نماید این اتفاق در خط نشان گذاری شده اتفاق میمتناظر آنرا احضار می callbackرا پذیرفته و HTTPجاری

کنیم: سازیرا در خود دارد پیاده Appکه وضعیت جاری نمونه callbackدهد یک تابع مقید شده است. این به ما اجازه می Appجاری نمونه

<?php

$app = new App();

$app->addRoute('/users/josh', function () {

$this->responseContentType = 'application/json;charset=utf8';

$this->responseBody = '{"name": "Josh"}';

});

$app->dispatch('/users/josh');

Zend OPcache کش کدبایت

، و APC، eAccelerator، ionCubeهای اختیاری مستقل زیادی همچون چیز جدیدی نیستند و افزونه PHPها در کد کشبایت

XCache سازی شده با پیش از این وجود داشتند. اما هیچیک از آنها تا پیش از این به صورت درونPHP شدند.توزیع نمی

PHP سازی شده تحت نام کد کش اختصاصی درونیتاقدام به ارائه یک با 5.5.1از نسخهZend OPcache کرد. پیش از توضیحات بیشتر

کد کش صحبت کنیم.کد کش اجازه دهید کمی درمورد مفهوم بایتدر مورد این بایت

PHP یک زبان تفسیری است بدین معنی که کدهایPHP در زمان درخواست توسط مفسر خوانده و به یک سریZend Opcode که ها

شود، بدیهی این پروسه تکرار می PHPشوند. با هربار درخواست یک فایل های زبان ماشین هستند ترجمه و نهایتًا اجرا میهمان دستورالعمل

و ترجمه را برای PHPعملیات خواند فایل PHPها را کش کنیم دیگر نیاز نبود تا Zend Opcodeشد به طریقی این است که اگر می

ای کاهش خواهد داد و عملکرد اپلیکیشن را به شکل آن فایل انجام دهیم. این کش زمان اجرای اپلیکیشن را به شکل قابل مالحظه هربار اجرای

دهد.چشمگیری افزایش می

Zend OPcache کردن فعال

از سورس کامپایل را PHPفعال نیست برای فعال کردن آن درصورتی که PHPفرض برروی بصورت پیش Zend OPcacheکد کش بایت

اید گزینهکرده

Page 24: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

21 1314 مرداد PHP همایش

--enable-opcache

این افزونه را فعال کنید. php.iniالزم است تا در فایل PHP. اضافه نمایید. پس از کامپایل \configureرا در هنگام اجرای دستور

zend_extension=/path/to/opcache.so

ستور زیر آن را بدست آورید:دانید می توانید با اجرای داگر مسیر افزونه را نمی

php-config --extension-dir

می توانید از فعال شدن افزونه اطمینان حاصل کنید. phpinfo)(;با استفاده از دستور

Zend OPcache کردن تنظیم

ل کردن افزونه اضافه نمایید. اینجا پس از فعا php.iniدهم به شرح زیر است. این تنظیمات را در فایل تنظیماتی که شخصاً مورد استفاده قرار می

بیابید. php.netتوانید اطالعات بیشتر را در سایت نماییم میها پرهیز میاز توضیحات کامل گزینه

opcache.validate_timestamps = 1 // "0" in production

opcache.revalidate_freq = 0

opcache.memory_consumption = 64

opcache.interned_strings_buffer = 16

opcache.max_accelerated_files = 4000

opcache.fast_shutdown = 1

opcache.use_cwd = true

ها اعالم نماییم که فایل Zend OPcacheتنها توضیح ضروری دو مورد اول هستند که برای غیرمعتبر سازی محتویات کش باید به طریقی به

شود بهبود کارایی را باعث می Productionاست که در محیط 1برابر validate_timestampsرض مقدار اند به صورت پیشفویرایش شده

های موجود را به صورت خودکار کند تا در هنگام اعمال تغییرات در کد کشهای مخصوص توسعه تنظیمات باال به شما کمک میاما در ماشین

غیرمعتبر نمایید.

Zend OPcache عیتوض نمایش گرافیکی هایرابط

اند.اند که برخی از آنها در اینجا آورده شدهنوشته شده Zend OPcacheهای گرافیکی مناسبی برای ها و حافظه اشغال شده رابطبرای نمایش وضعیت فایل

● Opcache Control Panel,

● opcache-status (Rasmus Lerdorf),

● OpCacheGUI (Pieter Hordijk),

● opcache-gui (Andrew Collington).

Page 25: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

22 1314 مرداد PHP همایش

با تمرکز بر روی مموری و بهینه سازی کد PHPبررسی ساختار درونی

علی ذوقی

بخش اول: آشنایی با حافظه

ازی یک س هر سیستمی در دنیا برای انجام کار و فعالیت نیاز به حافظه دارد. هر کار یا عملی برای تصور شدن و یا برنامه ریزی شدن نیاز به ذخیره

.سری اطالعات دارد

مثال مورچه ها بوی کلونی خود را در حافظه خود ثبت می کنند و توسط آن، کلونی خود را تشخیص می دهند.

له یانسان هم وقتی قصد انجام کاری را دارد در حافظه خود اطالعاتی را ذخیره می کند و سپس برای خود طرح هایی را تصویر می کند تا بدین وس

بدن که قرار است در انجام این کار شرکت داشته باشند، شرح دهد. کارِ خود را برای اعضاء مختلف

خب حاال یک رایانه که قرار است میلیون ها بار کاری را در ثانیه انجام دهد نیاز به حافظه ندارد؟

در رایانه وقتی صحبت از حافظه می شود معموال منظور همان رم یا حافظه موقت است.

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

ها برای اجرا شدن نیاز مبرم به حافظه موقت یا رم خواهند وقتی به حوزه برنامه نویسی رایانه وارد می شویم بیشتر متوجه این امر می شویم که برنامه

داشت.

موقت؛ های حافظه برخالف دارند پایینی نوشتن و خواندن سرعتِ … یادآوری: حافظه های دائم مثل هارد دیسک ها و

ی اجرا شده به چه نیاز به حافظه دارد. اینکه برنامه "طبق توضیحات فوق چون قصد انجام کاری را دارد"در رایانه هر برنامه ای که اجرا می شود

نامه نویس خواهد داشت.میزان حافظه نیاز دارد بستگی به نوع کار و همچنین نوع کدنویسی بر

یادآوری: سیستم عامل وظیفه تخصیص حافظه به یک برنامه را بر عهده دارد.

حافظه موقت شامل قسمت های مختلفی از حیث نوع و سرعت دسترسی است. همانطور که می دانید حافظه موقت سرعت دسترسی بسیار باالتری

ظه در خود، قسمت های مختلفی با عمکرد های متفاوتی را داراست.نسبت به انواع دیگر حافظه را دارد اما همین حاف

می توان گفت حافظه شامل قسمتهای زیر است:

ای را در این قسمت بایت ها: همان بیت هایی که اطالعات مشخصی را در خود نگه می دارند و بایت را تشکیل می دهند. وقتی ما داده ●

اندازی مجدد نشده در حافظه باقی می ماند.رایانه راهی ما تا زمانی که ذخیره می کنیم، داده

Page 26: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

23 1314 مرداد PHP همایش

( : این قسمت از حافظه معموال با داده هایی پر می شود که در طی اجرای برنامه ایجاد می شود. اصوال توابع به هنگام اجرا stackپشته ) ●

کر است که این قسمت از حافظه سرعت دسترسی در برنامه برای بازگشتن به مسیر اصلی برنامه از پشته ها استفاده می کنند. الزم به ذ

باالیی دارد. پشته ها در حین اجرای برنامه، دائم در حال قبض و بسط هستند. بدین معنا که به هنگام نیاز پر شده و به هنگام عدم نیاز

تیم.بطور خودکار آزاد می شوند. در استفاده از پشته ها از جهت میزان فضا با محدودیت بیشتری روبرو هس

(: هیپ ها اصوال دارای قاعده خاصی برای ذخیره سازی اطالعات نیستند. بدین معنا که اگر در پشته ها ما روند اجرای یک heapهیپ ) ●

تابع را در آن ذخیره می کردیم )البته سیستم عامل بطور خودکار آنرا مدیریت می کرد( در هیپ هرنوع داده ای را می توانیم ذخیره و

یم. ضمنا با محدودیت کمتری از جهت میزان فضای مورد استفاده روبرو هستیم. کلیه اعمال در هیپ برخالف پشته، توسط استفاده کن

برنامه نویس انجام می شود بنابراین ردیابی کردن داده در هیپ کار پیچیده تری است، همین پیچیدگی، سرعت دسترسی به آن را کاهش

می دهد.

می شویم و اینکه آیا می PHPتر وارد حوزه زبان ه و قسمت های تشکیل دهنده آن آشنا شدید. در ادامه کمی تخصصیخب تا اینجا کمی با حافظ

چه رفتاری در قبال هر یک از عناصر استفاده PHPتوان بطور مستقیم برای ذخیره سازی اطالعات در حافظه تعیین تکلیف کرد یا خیر ؟ و اصوال

نشان می دهد. شده در برنامه ها از خود

یک زبان سطح باال بر پایه زبان PHPنوشته شده است. این بدان معناست که زبان Cدر زیربنای خود با زبان سطح پایین PHPزبان سطح باالی

C یک یربنای خود را براست. اصوال تمام زبان های سطح باال در زیربنای خود از این اصل که چرخ را دوباره اختراع نکنیم استفاده می کنند. یعنی ز

زبان قدرتمند سطح پایین پایه گذاری می کنند.

سراغ داریم یافت می شود. ترتیب، انتخاب، تکرار اصول یک برنامه نویسی ساختاریافته هستند. Cهمان برنامه نویسی ساختاریافته که در PHPدر

هم رعایت می شود. PHPهمین اصول در

وقتی تابعی استفاده می شود آیا همان قواعدی که برای استفاده از پشته ها گفته شد در اینجا PHPاینکه در یک سوال ممکن است پیش بیایید:

هم هست یا به گونه ای دیگر عمل می شود؟

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

استفاده می شود ممکن است در زیربنا شامل دو یا چند تابع در زبان مرجع خود باشد.

در قبال داده ها می پردازیم. PHPدر مثال زیر به شرح چگونگی عملکرد

$a = str_repeat('x', 100000000); // Memory used ~ 100 MB

$b = $a; // Memory used ~ 100 MB

$b = $b . 'x'; // Memory used ~ 200 MB

مگابایت از حافظه را اشغال کرده ایم. 111را قرار دادیم. این یعنی ما "x"در یک متغیر صد میلیون عدد از کاراکتر PHPدر نمونه کد، ما به زبان

دیگر اختصاص می دهیم. همانطور که در کامنت جلوی متغیر دوم می بینید مقدار فضای اشغال در خط دوم ما این مقدار را به متغیر دیگری با نام

یک کاراکتر دیگر اضافه می کنیم و می بینیم که مقدار فضای اشغال شده دو "x"میلیون کاراکتر 111شده تغییری نکرد. در خط سوم ما به همان

تغیر دوم، گویا مقدار جدیدی را در حافظه نوشته ایم.برابر شد؛ یعنی به محض نوشتن کاراکتر جدید در م

استفاده می کند. در این الگو به محض تغییر در مقدار ذخیره شده قبلی، یک Copy on Writeاز الگوی PHPاتفاق فوق به ما می گوید که

قبلی مقداری اضافه نکرده ایم می توانیم از آن مقدار شود. پس تا هنگامی که ما به مقدار مقدار جدید و مجزا از مقدار قبلی در حافظه نوشته می

Page 27: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

24 1314 مرداد PHP همایش

ه قابل ک بارها استفاده کنیم بدون آنکه حافظه زیادی را اشغال کنیم. البته هر متغیری که ایجاد می شود مقدار مختصری از حافظه را اشغال می کند

مالحظه نیست.

ا دیتا؟؟به نظرتان متغیر در کجای حافظه ذخیره می شود؟ در هیپ، پشته ی

در قسمت هیپ حافظه zval( ذخیره می شود. zend value) مخخف zval، تمام متغیرها در ساختاری بنام Cیعنی زبان PHPدر الیه پایین

بطور محسوسی بهبود پیدا می کند. PHPاین مقدار در پشته ها ذخیره می شود که سرعت کدهای PHP1ذخیره می شود. البته در

فرایند خیلی سریعی نیست. PHPو بکارگیری متغیر در نتیجه: بازیابی

در قبال ایجاد متغیر از خود نشان PHPدر این بخش سعی شد آشنایی پایه ای و مختصری با حافظه موقت داشته باشیم. همچنین با رفتاری که

دهد آشنا شدید.می

زیربنای خود دارای چه قسمت هایی است. در PHPآشنا می شویم تا بدانیم PHPدر بخش بعدی کمی با هسته اصلی

PHPبخش دوم: آشنایی با هسته

:PHPساختار کلی

: Server APIالیه -1

کنترل می کند. PHPرا با دنیای بیرون PHPاین الیه در واقع ارتباط هسته

:PHPهسته اصلی -2

ست؛نام دارد. این هسته شامل دو بخش ا PHPاین قسمت یعنی هسته اصلی

PHPیکی موتور زند و دیگری اکستنشهای

Page 28: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

25 1314 مرداد PHP همایش

می گذاریم. PHPنداریم و تمرکز خود را بر روی هسته اصلی SAPIدر این مقاله ما کاری به الیه

موتور زند:

مورد استفاده قرار گرفته است. 2، موتور زند ورژن PHP5را بر عهده دارد. در PHPاین موتور در واقع تفسیر کردن کدهای

موتور شامل قسمت های مختلفی است: این

( می token(: این قسمت از موتور زند کاراکترها را به عالماتی خاص تبدیل می کند. این عالمات خاص را در اصطالح توکن )lexerلکسر ) -1

گویند.

تبدیل می کند. T_IFسیر کد، آنرا به استفاده کرده باشید، لکسر در هنگام تف ifبرای مثال اگر در کد برنامه نویسی خود از عبارت شرطی

(: پارسر در واقع قسمتی است که فقط قادر به خواندن توکن ها می باشد. بنابراین بعد از لکسر، کدهای تبدیل شده به توکن parserپارسر ) -2

توسط پارسر خوانده می شود و به ازای هر توکن دو عملیات انجام می شود:

+

رای آن توکن فراخوانی می شود. ب Cاول یک تابع کامپایلر

دوم فراخوانی توکن بعدی و تعیین وضعیت

نکته: پارسر امال یا سینتاکس کلی کدها را هم تعیین می کند.

در این قسمت شناسایی می شوند. PHPنکته: غلطهای نگارشی موجود در کد

ها در OPCodeها را تشکیل می دهد. OPCodeمت آرایه ای از (: کامپایلر توسط پارسر فراخوانی می شود. این قسcompilerکامپایلر ) -3

واقع عملگرهایی شبیه به عملگرهای زبان اسمبلی هستند. در ادامه بطور عملی آن ها را در بخش پارس کردن کد، در مثال زیر خواهید دید.

ر واقع بعد از مراحل قبلی به جایی میرسیم که بایست است. ما د PHP(: این بخش در واقع آخرین مرحله تفسیر کدهای executeاجراکننده ) -4

به کد ماشین برسیم. این قسمت سخت ترین قسمت در موتور زند است.

کنیم.برای اینکه بهتر متوجه موارد فوق شویم با یک مثال چگونگی کارکرد هر قسمت را مشاهده بررسی می

:PHPکد

<?php

$first = ‘php’;

$last = 'conf';

echo $first . $last;

آغاز عملیات کامپایل:

ابتدا لکسر وارد عمل می شود: -1

<?php => T_OPEN_TAG

$first => T_CONSTANT_ENCAPSED_STRING 'php'

$last => T_CONSTANT_ENCAPSED_STRING 'conf'

echo => T_ECHO

Page 29: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

21 1314 مرداد PHP همایش

شروع کار پارسر و کامپایلر: -2

هم گفتیم بخش پارسر و کامپایلر دو بخش در هم تنیده هستند و به هنگام اجرای پارسر، تابع کامپایلر مختص هر توکن فراخوانی همانطور که قبال

می شود.

خروجی مجموع این دو بخش بصورت زیر می باشد: )تقریبا خروجی این بخش شبیه کدهای اسمبلی است(

!0 = $first , !1 = $last

OPCodesبازگشت عملوندها

ASSIGN !0, ‘php’

ASSIGN !1, ‘conf’

CONCAT ~2 !0, !1

ECHO ~2

RETURN 1

( می شود. ~2نکته: همانطور که در بخش چسباندن دو متغیر مالحظه می نمایید، عملیات چسباندن این دو رشته موجب ایجاد یک متغیر موقت )

خود می توانیم به جای این کد، از کد دیگری استفاده کنیم که فرآیند کامپایل کمی سبک تر شود. PHPما در کد

کد بهینه شده:

<?php

$first = ‘php’;

$last = 'conf';

echo $first , $last;

عملوندها بازگشت

ASSIGN !0, ‘php’

ASSIGN !1, ‘conf’

ECHO !0

ECHO !1

RETURN 1

که حاوی عملیات های پیچیده تری بود توانستیم این پیچیدگی را به راحتی با تبدیل concatهمانطور که مالحظه می کنید ما به جای عملیات

از فرآیند کامپایل حذف کنیم. "."به "."

یم یک فرآیند سنگین همچون برای ساکت کردن نمایش خطا در خطی خاص استفاده می کنیم در واقع دار "@"نکته: وقتی در کد خود از

concat .به کامپایلر تحمیل می کنیم. پس در بکارگیری حتی کاراکترها هم بایست دقت کرد

یا همان اکستنشن ها: PHPهسته

ا بدان اشاره انجام می دهد و آنچه که م PHPیعنی موتور زند آشنا شدیم. موتور زند کارهای فراوانی در PHPتا بدین جا با قسمتی از هسته اصلی

.کردیم تقریبا کلیات وظایف آن بود. قسمت های مختلفی در موتور زند برای بهینه تر شدن کد و باال رفتن سرعت اجرا در نظر گرفته شده است

حاوی توابع و کالس هایی هستند که ما برای انجام اعمال مختلف به آن ها نیازمندیم. PHPاکستنشن ها در

Page 30: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

21 1314 مرداد PHP همایش

، آغاز به فعالیت می کند. در این لحظه اتفاقات زیادی صورت می گیرد. اکستنشن PHPی را اجرا می کنیم به تبعِ آن مفسر وقتی که سرویس آپاچ

( در مفسر فراخوانی می شوند و در حافظه MINITایم در این لحظه یک به یک توسط متودی )آن ها را فعال کرده PHPهایی که ما در کانفیگ

قرار می گیرند.

( برای هر اکستنشن فراخوانی می شود. RINITدرخواست یا ریکوئستی که به سرور می رسد متود دیگری )در هر

نکته: اگر به اکستنشنی نیاز ندارید حتما آن را غیر فعال کنید.

هم اینست که شما دارید از است. دلیل این اتفاق Cکار می کنید به هنگام فراخوانی حاوی چند تابع در PHPاصوال هر تابعی که با آن در فضای

ر دیک زبان برنامه نویسی سطح باال استفاده می کنید و این یعنی استفاده از کد کمتر برای انجام کارهای بیشتر؛ پس طبیعی است که هر عملی

باشد. Cشامل چندین عمل در فضای PHPفضای

ها و کدهای پارس شده همگی در حافظه و در قسمت کلی متغیرها، اکستنشن همانطور که گفتیم اکستنشن ها در حافظه )رم( قرار می گیرند. بطور

هیپ آن قرار می گیرند. پس در این سه قسمت بایست دقت زیادی کرد. چرا؟

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

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

نتیجه گیری:

دارای پیچیدگی PHPن آنچه که گفته شد برداشتی عملی و تجربی از مقاالت مختلفی بود که بخشی از آنها در منابع ذکر شده است. زیربنای زبا

ه ئهای بسیار زیادی است که هم به برنامه نویسان حوزه وب کمک شایانی کرده از این جهت که می توانند با صرف وقت کمتر کارهای بزرگتری ارا

کتر تِ حتی یک کارادهند و هم از جهت دیگر این پیچیدگی ممکن است باعث ساختِ برنامه های دردسرساز شود. توضیح دادیم که بکارگیری نادرس

صدمه وارد کند. PHPچقدر می تواند به فرآیند اجرای کد

منابع:

http://www.slideshare.net/jpauli/understanding-php-memory

http://www.slideshare.net/jpauli/help-im-leaking-memory-in-php

http://www.slideshare.net/jpauli/quick-tour-of-php-from-inside

http://jpauli.github.io/2014/07/02/php-memory.html

http://www.slideshare.net/ircmaxell/php-under-the-hood-dpc

http://php.net/manual/en/internals2.memory.php

http://php.net/manual/en/tokens.php

http://php.net/manual/en/function.token-get-all.php

Page 31: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

22 1314 مرداد PHP همایش

پیاچنویسی موازی در پیگزارشی از برنامه

عال عالم فلکی

:مقدمه. 1ترین وظایف ای و یا نصب چندین پردازنده بر روی سرورها یکی از مهمهای چند هستهبا قدرتمند شدن سرورها و موجود بودن پردازنده

افزار خود را حداکثر کنند، حداکثرکردن کاراییاست تا بتوانند کارایی نرمافزارهای سیستم افزار استفاده از ظرفیت کامل سختدهندگان نرمتوسعه

.باشددر این مقاله به معنی حداقل کردن زمان اجرای برنامه می

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

ن الکترونیکی تایید عضویت و همچنینام در یک سایت شامل ارسال پستدر فرآیندهایی به صورت همزمان اجرا نماییم، برای مثال اگر فرآیند ثبت

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

ها از توانیم به جای ارسال یک به یک پیامنویسی موازی استفاده نماییم، میالکترونیکی بخواهیم از برنامهیا اگر برای ارسال تعداد باالی پست

ها یا ضی از الگوریتمتوجه داشته باشید که بع. )طریق یک فرآیند ترتیبی، این فرآیند را به طور موازی انجام دهیم تا زمان کمتری صرف شود

ام را در نبرای درک بهتر قضیه مثال ثبت. باشدها ماهیت ترتیبی دارند و برای ادامه فعالیت، جواب هر مرحله وابسته به جواب مرحله قبل میبرنامه

ا داده است، پس این مراحل رگاهنام و ثبت موفق اطالعات در پایالکترونیکی وابسته به موفق بودن ثبتدر این مثال ارسال پست ؛نظر بگیرید

.( نویسی نمودتوان به صورت موازی برنامهنمی

های خود از قابلیت( آیدپی به حساب میاچبه نوعی اجرا کننده پی)پی را دارد اچسرور آپاچی که وظیفه ارسال درخواست کاربران به پیوب

اگر این قابلیت . )کنداز قابلیت چندنخی پشتیبانی می 5.2یز بعد از آپدیت رسمی پی ناچپی[. 1]کندپشتیبانی می 22و چندفرآیندی 11چندنخی

...(و 44، ضعیت رقابتی33بستآمد، برای مثال بنهای مشترک به وجود میپی پیشبینی نمیشد همواره مشکالتی در زمان دسترسی به دادهاچدر پی

نویسی موازی پی پیشبینی نشده است، دلیل نبود امکان برنامهاچنویسی موازی در هسته پیمهبا توجه به پیشبینی این امکانات متاسفانه امکان برنا

اجرا ( برای مثال آپاچی)ها سرویسدر محیط وب( به جای کامپایلر) 55پی یک زبان اسکریپتی بوده و توسط مفسراچدر این زبان این است که پی

1 Multi-threading

2 Multi-Processing

3 Death-Lock

4 Race Condition

5 interpreter

Page 32: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

21 1314 مرداد PHP همایش

شد اما با گذشت زمان و گسترش این زبان و افزایش محبوبیت آن، انتظارات از استفاده می HTMLی هادر ابتدا این زبان برای تولید تگ. شودمی

.های این زبان گسترش یافتاین زبان بیشتر شد و در نتیجه قابلیت

ا مزایا و معایب خود هشود که هرکدام از این روشهای مختلفی پیشنهاد میهای مختلف برنامه، روشبرای دستیابی به هدف اجرای همزمان بخش

.ها استها نبوده و هدف تنها معرفی این روشهدف از نگارش این مقاله آموزش این روش. را دارد

.شویمآشنا می 66توزیع فرآیندهاو چندفرآیندی، چندنخیهای های بعدی این مقاله با روشدر بخش

:چندنخی. 2مختص 1111و پشته 11، ثبات22گر دستورشوند و دارای اشارهد که در دل یک فرآیند اجرا میشوگفته می 11هاای از دستورالعملیک نخ به مجموعه

های مشترک توانند از دادهها به راحتی میهای موجود در یک فرآیند یکسان هستند، به همین دلیل نخنخ 1111فضای آدرس. باشندبه خود می

های موجود در سایر نخ) 1212ورت بروز خطا در یک نخ، باعث مختل شدن ادامه کل فرآینداستفاده نمایند اما این یکسان بودن فضای آدرس، در ص

.شودمی( آن فرآیند

سازی مزیت استفاده از روش چندنخی این هست که برای موازی. شودافزار چندنخی گفته میافزاری که توسط بیش از یک نخ اجرا شود، نرمبه نرم

عیب این روش در آزمایشی بودن این . از برنامه نیست( چند فرآیند برای اجرای یک برنامه)در حال اجرا 1313دستورات نیاز به اجرای چند کپی

.(درحال حاضر نسخه پایدار آن عرضه نشده است. )کتابخانه هست

ای است که که امن نسخهی نخنسخه .در آن فعال است، استفاده کرد 1414امنی ای که نخپی باید از نسخهاچبرای استفاده از قابلیت چندنخی در پی

.های مشترک را حل کرده استمشکالت احتمالی دسترسی به داده

pthreadsای به اسم توان از کتابخانهبرای اضافه کردن این قابلیت می. پی پیشبینی نشده استاچهمانطور که گفته شد ابزار چند نخی در پی

.استفاده کرد

ابخانه های این کتاز قابلیت. سازی نمایدنویس است تا بتواند فرآیند چندنخی را پیادهام ابزار مورد نیاز برای یک برنامهشامل تم Pthreadsکتابخانه

[2.]بینیددر زیر مثالی از نوشتن برنامه چندنخی می. اشاره کرد 1515گراییتوان به پشتیبانی کامل آن از شیمی

<?php class ChildThread extends Thread {

public $data;

public function run() {

/* Do some work */

$this->data = 'result';

6 Distributed Parallel Processing

7 Instructions

8 Instruction Pointer

9 Register

10 Stack

11 Address Space

12 Process

13 Instance

14 Z.T.S (zend thread safe)

15 Object Oriented

Page 33: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

31 1314 مرداد PHP همایش

}

}

$thread = new ChildThread();

if ($thread->start()) {

// Do some work here, while already doing other work in the child thread.

// wait until thread is finished

$thread->join();

// we can now even access $thread->data

}

و در نهایت بعد از اتمام کار ( ChildThreadنخ ایجاد شده توسط کالس +نخ اصلی برنامه)کنیمدر مثال باال وظیفه مورد نظر را بین دو نخ تقسیم می

تلف باشد، های مخمیان نخ( انتقال داده)اگر در زمان اجرای برنامه نیاز به برقراری ارتباط. کنیمها، جواب نهایی را در نخ اول پردازش مینخ

[ (3]های بیشتر در مثال.)چندنخی انتخاب بهتری نسبت به چندفرآیندی خواهد بود

:چندفرآیندی. 9د از توانهای کنونی آن است و با توجه به نوع سیستم عامل میباشد که شامل کدهای برنامه و فعالیتفرآیند یک نمونه از برنامه در حال اجرا می

پی فرآیند اصلی توانایی تولید فرآیندهای فرزند را دارد، به نحوی که هر فرآیند تولید شده به طور کامال اچدر پی[ 4.]چند نخ تشکیل شده باشد

.میان فرآیندهای در حال اجرا بسیار سخت باشد( انتقال داده)شود ارتباطشود و این استقالل باعث میمستقل از فرآیند اصلی اجرا می

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

توسط 1111سازی این روش است و عیب آن هزینه بر بودن تولید فرآیندهای جدید و تعویض کردن فرآیندهای در حال اجراپی برای پیادهاچپی

ها پی پیشبینی شده است، در ادامه به بررسی برخی از این روشاچتلفی برای تولید فرآیندهای جدید در پیهای مخروش. عامل استسیستم

.میپردازیم

4-9 .FORK : ند و شماره فرآی( PID)میتوانیم فرآیندهای فرزندی ایجاد نماییم که تنها تفاوت آنها با فرآیند اصلی در شماره فرآیند pcntl_forkبا استفاده از تابع

[1:]برای درک بهتر به مثال زیر توجه کنید[ 5.]است( برای مشخص کردن فرآیندی که آغازگر آن بوده( )PPID)والد

<?php

$workload = "some work load";

$processId = pcntlfork();

if ($processId < 0){

die('Fork failed!');

} else if ($processId == 0) {

// child starts working here

trim($workload);

} else {

// do other stuff in parent

16 Context Switching

Page 34: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

31 1314 مرداد PHP همایش

// and parent waits for child

pcntlwait($status);

}

. یمرآیند فرزند باشتوانیم ادامه کار را در فرآیند والد انجام داده و منتظر پاسخ از فدر این مثال یک فرآیند فرزند تولید میکنیم و بعد از آن می

.مراجعه کنید[ 5]توانید به های بیشتر میبرای مشاهده مثال

2-3 .Execute Command : . پی را به وسیله فرآیندهای مجزا اجرا نماییماچتوانیم دستورات پیتابع زیر می 3با استفاده از

Exec : آخرین خط نتیجه حاصل از فرآیند جدید را برمیگرداندتنها.

ec_shellex :(1111ای رشتهدر قالب نوع داده.)تمام نتایج حاصل از فرآیند جدید را برمیگرداند

passthru :(1212ای باینریبرای مثال در قالب نوع داده.)تمام نتایج خام حاصل از فرآیند جدید را برمیگرداند

وری سرور به خصوص در زمان باال رفتن تعداد فرآیندها بهره. زینه استپی توسط این توابع، عملیاتی پر هاچتوجه داشته باشید اجرای دستورات پی

.(عامل هزینه زیادی داردایجاد فرآیندها و تعویض فرآیندهای در حال اجرا توسط سیستم. )به طرز محسوسی کاهش پیدا خواهد کرد

9-9 .Piping : برای رفع این مشکل روشی به میان دو فرآیند در زمان اجرا است،( ل دادهانتقا) 1111مشکل اصلی دو روش گفته شده، عدم امکان برقراری ارتباط

که یک فرآیند جدید ایجاد کرده ) proc_openو تابع( STDIN/STDOUT)خروجی استاندارد /معرفی شده است که با استفاده از ورودی pipingاسم

[1.]ر مثالی از این روش میبینیددر زی. کنداین ارتباط را برقرار می( آن را برمیگرداند 2121دیو آی

// pipeclient.php, uses procopen() function to create the

// worker process, and send instructions to it

// 0 => stdin for worker 1 => stdout for worker

$descriptorspec = array( 0 => array("pipe", "r"), 1 => array("pipe", "w") );

$worker = procopen("php pipeworker.php", $descriptorspec, $pipes);

if ($worker) {

fwrite($pipes[0], "hello");

while (!feof($pipes[1])) {

echo fgets($pipes[1]). "\n";

}

proc_close($worker);

}

// pipe_worker.php, all it does is to read instructions

// from STDIN, and write response to STDOUT

$line = fread(STDIN,4096);

fwrite(STDOUT, "$line world");

:توزیع فرآیندها. 1

17 String data type

18 Binary data type

19 Communicate

20 Handle

Page 35: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

32 1314 مرداد PHP همایش

های CPUتوان تعداد ها میوری این سایتباشند، برای افزایش بهرههایی با یک سرور مناسب میسایتهایی که پیش از این گفته شد برای وبروش

ز به بیش از یک سرور های گفته شده جوابگو نخواهند بود، پس نیابا این حال بعد از حجیم شدن بیش از حد سایت، روش. سرور را افزایش داد

.توان از توزیع فرآیندها بین چند سرور استفاده کردوری میخواهیم داشت، و در این شرایط برای افزایش بهره

نویسی سوکت باید توجه داشت که استفاده کرد، در عین ساده بودن برنامه 2121نویسی سوکتتوان از برنامهبرای برقراری ارتباط بین فرآیندها می

برای مثال در صورت قطع شدن ارتباط میان دو سرور چه اتفاقی خواهد افتاد ؟ اگر فرآیندی که وظیفه .ط خاص مورد توجه قرار بگیرندشرای

افتد؟ اگر فرآیندی که وظیفه پردازش را دارد موجود نباشد چه اتفاقی پردازش را دارد در حین پردازش از دسترس خارج شود چه اتفاقی می

. موجود استفاده کرد 2222هایتوان از کتابخانهرایط مشابه زیادی که باید در زمان نوشتن کد به آنها توجه نماییم، در این شرایط میافتد؟ و شمی

(ZeroMQو Gearmanبرای مثال )

ها ابخانهنویسی این کتمههای برناباشد، به همین دلیل تکنیکنویسی سوکت میهای برنامههای ذکر شده از بین بردن پیچیدگیماهیت کتابخانه

هایی از برای مشاهده مثال. )ها اندکی دشوار است، با این حال ارزش نصب و استفاده را دارندتنها فرآیند نصب این کتابخانه. روان و ساده هست

.(مراجعه نمایید[ 2]به Gearmanهایی از کتابخانه و مثال[ 1]به ZeroMQکتابخانه

:منابع. ۵[4] ht t p: / / ht t pd. apac he. or g / doc s / 2. 2/ mod/ [ ۲] ht t p: / / www. mul l i e. eu/ par a l l e l - pr oc es s i ng - mul t i - t a s k i ng - php/ [ 9] ht t ps : / / g i t hub. c om/ k r ak j oe/ pt hr eads / t r ee/ mas t er / ex ampl es [ 1] ht t p: / / en. wi k i pedi a . or g / wi k i / Pr oc es s _%28c omput i ng%29 [ ۵] ht t p: / / php. net / manua l / en/ f unc t i on. pc nt l - f or k . php [ 6] ht t p: / / c ode. hoot s ui t e . c om/ par a l l e l - pr oc es s i ng - t a s k - di s t r i but i on- wi t h- php/ [ ۷] ht t ps : / / g i t hub. c om/ i mat i x / z gui de/ t r ee/ mas t er / ex ampl es / PHP [۸] http://gearman.org/examples/

21 Socket Programming

22 Libraries

Page 36: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

33 1314 مرداد PHP همایش

Composer با PHP در هاوابستگی و پکیج مدیریت

نژاد دبیری علیرضا

مقدمه

ها و قطعه کدهایی که توسط افراد دیگر برای انجام وظایف متفاوتی توسعه داده میشوند، در پروژه های برنامه نویسی ها، کالساستفاده از فریمورک

افزاری بجای ه نرمگرفته شده است. بدین معنی که در انجام پروژ« چرخ را دوباره اختراع نکن»ی معروف امری متداول است. این ایده از جمله

هایی که توسط افراد دیگر توسعه داده ها یا فریمورکتوسعه تمامی بخش ها و وظایف متفاوت آن توسط گروه توسعه پروژه، بهتر است از کالس

این تفکر در توسعه ی نرم افزاری مزایا و معایب متفاوتی دارد. از جمله مزایایشده است استفاده شود. اینگونه عملکرد در طی توسعه یک پروژه

های توسعه بر بخش های پروژه، امکان تمرکز گروهی آن کاهش زمان انجام پروژه و کاهش هزینهمیتوان به افزایش سرعت در توسعه و در نتیجه

ها مورکیریت این فریهای دیگر پروژه به گروه های توسعه دهنده دیگر اشاره نمود. بزرگترین عیب اینگونه تفکر مدی بخشکمتر و سپردن توسعه

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

بودیم و هیچ توسعه ی جدید آنو در هر پروژه PHP شاهد این بودیم که فرآیند اختراع دوباره چرخ بارها و بارها در جامعه PHP برای زبان

های سال باعث ی خود نداشت. این عیب عمده سالهای دیگر در کنار هم برای پروژهها و فریمورکی زیادی به استفاده از کالسدهنده ای عالقه

رف بازنویسی های متفاوت توسعه صعمال هیچگونه تبادل کدی صورت نگیرد و وقت و توان گروه PHP شده بود که در جامعه توسعه دهندگان

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

ا توسط آنه ان و بازنویسیهایشان بصورت عملی استفاده نکنند و تنها شاهد گرفتن ایده از کارهای دیگرهای دیگر افراد در پروژهای از کدهیچ گروه

.ایمهای توسعه مختلف بودهگروه

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

Page 37: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

34 1314 مرداد PHP همایش

(Dependency) و وابستگی (Package) پکیج

صی نمایید تا وظایف مشخه توسط فرد یا افراد دیگر توسعه یافته است در پروژه ی خود استفاده میهرگاه شما از فریمورک، کالس یا قطعه کدی ک

.نماییدرا با استفاده از آنها به انجام برسانید، در حقیقت دارید از یک پکیج در پروژه ی خود استفاده می

ه میتوان آنرا برای انجام وظیفه یا وظایف مورد نیاز در هر پروژه، بطور کلی پکیج را میتوان قطعه کدی با قابلیت استفاده مجدد معرفی کرد ک

.های ارایه شده برای استفاده از آن پکیج در اختیار شما قرار گرفته، اتفاق می افتد API استفاده کرد بدون نگرانی راجع به آنچه که در پشت

یج دیگر باشد. و آن چند پکیج دیگر نیز خود به چندین پکیج دیگر نیاز ممکن است پکیج مورد استفاده خود برای عملکرد نیاز به یک یا چند پک

.داشته باشد. به این نیازمندی یک پکیج برای انجام وظایفش وابستگی گفته میشود

.در نتیجه وابستگی را میتوان نیاز یک پکیج به یک یا چند پکیج دیگر برای انجام وظایفش تعریف نمود

بستگیتاریخچه مدیریت پکیج و وا

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

برنامه هایها متنفر هستند. در صورتیکه دیگر زباناز پکیج PHP ای طوالنی مدت و هزینه بر بود که گفته میشد توسعه دهندگانکارآمد، بگونه

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

یا دهها و بارها توسط خود تیم توسعه دهنکارآمد باعث شده بود که بخش زیادی از زمان انجام یک پروژه به توسعه مواردی صرف شود که قبال بار

.دیگر توسعه دهندگان انجام شده بود

راهکار اولیه برای انجام مدیریت پکیج، مدیریت دستی توسط تیم توسعه پروژه بود. این روش مشکالت زیادی داشت که در بخش بعدی مقاله به

.آن خواهیم پرداخت. این مشکالت باعث شده بود که به راهکاری فراموش شده تبدیل شود

ارایه شد. این سیستم قدم مهمی رو به جلو بود اما بخاطر مشکالت عدیده بازهم فراگیر نشد و فراموش PEAR م مدیریت پکیجدر نهایت سیست

.شد

ی مدیریت پکیج ، و تالش آن برای کمک به توسعه دهندگان برای توسعه سریعتر، مسئلهRuby برای زبان Ruby On Rails پس از ارایه

در سال CodeIgniter رو آوردند. با ارایه PHP هایشی سپرده شد و توسعه دهندگان به توسعه فریمورکبه فرامو PHP توسط جامعه

گان میتوانستند ها به سمت آن جلب شد. همه راجع به آن صحبت میکرند و به توسعه با آن میپرداختند. توسعه دهندهناگهان توجه 2115/2111

ها هایی توسعه دهند که تضمین کاملی برای عدم ایجاد مشکل از سمت کتابخانهبا استفاده از کتابخانه یک برنامه کاربردی را با تمام جوانب آن

معرفی شدند که به توسعه دهندگان Symfony و یا CackePHP های دیگری همچون، فریمورکCodeIgniter وجود داشت. در کنار

.رشان را مشغول کند به توسعه از صفر تا صد پروژه خود با فریمورک ها بپردازندهای آنها فکاجازه میداد بدون اینکه پکیج ها و وابستگی

هایی که توسط یک توسعه دهنده توسعه داده میشدند تا توسعه داده شدند. فریمورک PHP ها ناگهان صدها فریمورکاز زمان ارایه این فریمورک

یا خود یک فریمورک توسعه داد یا PHP یه میشدند. تقریبا هر توسعه دهندهها و جوامع متعددی توسعه دادفریمورک هایی که توسط کمپانی

ها توسعه داده شد. برای کار با هرکدام میبایست در توسعه فریمورک های دیگر همکاری نمود. اما هر فریمورک بصورت متفاوتی با دیگر فریمورک

Page 38: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

35 1314 مرداد PHP همایش

ای بود که شما برای کار با یکرا یاد میگرفتید. این تفاوت گاهی اوقات بگونههای کد نویسی متفاوت و مختص آن فریمورک ها و شیوهاستاندارد

.فریمورک جدید میبایست تمامی سبک کد نویسی گذشته خود را فراموش میکردید

بود، توسعه ها وجود داشت این بود که اگر یک فریمورک برای انجام وظیفه ای هیچ راهکاری ارایه نداده مشکلی اساسی که در مورد فریمورک

دهنده یا فریمورک خود را مینوشت یا فریمورک مد نظر را برای خودش توسعه میداد. این مشکل و روش حل آن آنچیزی نبود که در جهت هدف

ک رها، یعنی کد با قابلیت استفاده مجدد، باشد. همچنین هیچ تضمینی وجود نداشت که کتابخانه ای که برای یک فریمواساسی تمامی این تالش

.نوشته شده است، در فریمورک دیگر قابل استفاده باشد

توسعه دهیم. اما این جهت جدید بازگشت به native در نتیجه دوباره جهت جدیدی ایجاد شد. بجای استفاده از فریمورک، برنامه ها را بصورت

نشئت میگیرد که PHP ، Rasmus Lerdorfیی سازندهبود. یک عقبگرد اساسی. این جهت از گفته PHP هایمرحله قبل از فریمورک

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

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

SourceForge ،PHP های متعددی همچونهای متمادی از طریق جستجو در گوگل و سایتی خود استفاده کنند. سالسرعت در پروژه

Classes ،Google Code هایکتابخانه PHP با های خود استفاده کرده بودیم. این به معنی کنار آمدنرا دریافت کرده بودیم و در پروژه

های جدید کتابخانه ها وجود نداشت. و این جهت صدها روش کد نویسی متفاوت بود. به معنی این بود که هیچ روش مشخصی برای اطالع از نسخه

.جدید هیچ کمکی به رفع این مشکالت نمیکرد

هایش در ارتباط دیگر بخش ارایه شد. بدین معنی که بجای نوشتن یک فریمورک کامل که هر بخش آن با unFramework سپس مفهوم

های های متفاوتی برای هر وظیفه مشخص توسعه دهیم که با پیروی از یک استاندارد مشخص بدون نیاز به دیگر قطعه کداست، قطعه کد

ر ها دمشکل اساسی این فریمورک. Phrame و Flourish ،Spoonهایی همچونفریمورک بتوانیم در پروژه استفاده نماییم. فریمورک

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

Spoon ی نوشتن یکها بود. درحالیکه ایدهتوسط یک نفر توسعه داده میشود. این باعث کندی شدید در توسعه این فریمورک

unFramework یار جذاب و کاربردی استای بسایده.

توسعه داده میشد. اما PHP نبود. همواره پکیج های بسیار کاربردی و مناسبی توسط جامعه توسعه دهندگان PHP ها هیچگاه مشکلخود پکیج

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

ان ها نشهای دیگر گروهکه بدلیل عدم وجود یک روش مناسب و کارآمد برای مدیریت پکیج ها هیچ گروه توسعه ای عالقه ای به استفاده از پکیج

.یفه بودآورد بسیار بیشتر از خود مشکل توسعه وظهای دیگر بوجود مینمیداد. چون مشکالتی که نحوه پیاده سازی استفاده از پکیج

.ارایه شد. اما بازهم راهکاری غیرکاربردی و سرشار از محدودیت و مشکالت بود PEAR2 در این زمان بود که

Page 39: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

31 1314 مرداد PHP همایش

ها. بطوریکه هر فریمورک برای خود دارای روش متفاوت برای مدیریت ها هم باز مشکل اساسی وجود داشت. مدیریت پکیجاما با آمدن فریمورک

ی جالب این است که حتیایش بود. نکتهپکیج و منبعی برای پکیج ه

Framework Zend هم خود از PEAR هایش استفاده نمیکندبرای مدیریت پکیج.

به فکر ارایه یک روش اساسی و کارآمد برای مدیریت PHP ها ارایه دادند باعث شد که افراد جامعههای مدیریت پکیجی که این فریمورکروش

ارایه شد. راهکاری که به تمامی مناقشات گذشته در زمینه مدیریت پکیج در Composer راهکار جذاب و کارآمدها بیوفتند. در نهایت پکیج

PHP خاتمه میداد. یک راهکار استاندارد برای حل مشکل اساسی کد قابل استفاده مجدد.

های مدیریت پکیج و وابستگیروش

:شاره نمودبرای مدیریت پکیج و وابستگی میتوان به سه روش زیر ا

مدیریت دستی توسط توسعه دهندگان پروژه (4

های آن توسط افراد توسعه دهنده میبایست در اینترنت پیدا شوند و پس از دانلود هرکدام در در این روش، هر پکیج مورد نیاز به تمام وابستگی

:پروژه استفاده شوند. اما این روش دارای معایب همچون موارد زیر است

های آن که خود آن وابستگی ها ممکن است خود به چند افزاری فرایند دریافت پکیج و تمامی وابستگیشدن پروژه نرم یک اینکه بزرگ

پکیج دیگر وابسته باشند و بازهم آن پکیج های جدید هم ممکن است خود به چند پکیج دیگر وابسته باشند، به فرآیندی طاقت فرسا و

.تبدیل شودخارج از توان توسعه دهندگان پروژه

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

.ی خود پروژه استفاده شودتوسعه

در نهایت autoload و یا include زمانبر بود و در بعضی موارد های آنها نیز خود کردن تمامی پکیج ها در پروژه با تمامی وابستگی

ناممکن به نظر میرسد. چون ممکن است هر پکیج با توجه به استانداردی که براساس آن توسعه داده شده است دارای روش خاصی برای

.واحد میشد autoloader ها باشد که باعث سردرگمی در نوشتن یکها، توابع و فایلنام گذاری کالس

PEAR استفاده از (۲

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

.حذف شود. از جمله این معایب میتوان به موارد زیر اشاره نمود PHP یکامال از فرآیند توسعه پروژه

قراردادن یک پکیج جدید در PEAR ات مثبت مشخصی توسط افراد حاضر در کامیونیتینیاز به دریافت نظر PEAR بود. این نگرش

PEAR برای تضمین کیفیت پکیج مد نظر قرار گرفته بود، اما در نهایت باعث کاهش رغبت توسعه دهندگان برای ایجاد یک پکیج در

.شده بود

Page 40: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

31 1314 مرداد PHP همایش

های موجود دربسیاری از پکیج PEAR ند. همچنین بسیاری از آنها از فازقدیمی هستند و یا دیگر توسعه داده نمیشو Alpha نیز

.عبور نکرده اند و به حال خود رها شده اند

مشکل اساسی دیگر PEAR ای را با پکیجدر نصب پکیج بصورت سراسری بود. بدین صورت که اگر شما پروژه XYZ 2.1نسخه ی

این پکیج انجام دهید. هنگامی که این پکیج را 3.1ید از نسخه ی جدید خود میخواهژهانجام داده باشید و تمام شده باشد. اما در پرو

3.1از نسخه 2.1ی قبلی شما نیز بجای نسخه آپدیت نمایید، بدلیل اینکه پکیج بصورت سراسری نصب شده است، باعث میشد که پروژه

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

.آن بطورکلی تغییر کرده است API 3.1به 2.1

:Composer استفاده از (9

Composer هم اکنون به راهکار اصلی و پر استفاده جامعه PHP ها بدل شده است.از مزایایها و وابستگیبرای مدیریت پکیج

Composer رآمد کرده است میتوان به موارد زیر اشاره نمودکه آنرا تبدیل به یک راهکار کا:

کاهش زمان توسعه

دسترسی راحت به پکیج های متفاوت از طریق یک منبع واحد

هابه روزرسانی خودکار پکیج

هامدیریت خودکار وابستگی

هایک استاندار واحد برای تعامل با پکیج

ایجاد autoloader خودکار

Composer معرفی

به استفاده از PHP هایریخته شد. بطوریکه بسیاری از فریمورک PHP های جامعه توسعه دهندگانای به رگخون تازه Composer با ارایه

Composer رو آوردند. تعداد زیادی پکیج کاربردی با یک استاندارد واحد وارد منبع Composer هایی که بصورت روزانه به شد. پکیج

های توسعه متفاوت برای حل یک ها جسته و گریخته در تیماد آنها افزوده میشود. و این به معنی اتمام تمامی تالشروزرسانی میشوند و بر تعد

.مشکل واحد بود

Composer به حل مشکالت زیر میپردازد:

ها و وابستگی آنهامدیریت پکیج

انجام autoload خودکار

آنهاهای ها با تمام وابستگیبه روزرسانی خودکار پکیج

Page 41: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

32 1314 مرداد PHP همایش

Composer ههایاکنون میتوان با آسودگی خیال به استفاده از آن در پروژهبه خوبی از پس حل این مشکالت برآمده است و هم PHP

مراجعه www.packagist.org های آن به آدرسپرداخت. این راهکار بگونه ای سریع و کارآمد است که به راحتی کافیست در منبع پکیج

های مد نظر را مشاهده نمایید و با توجه به نیاز ی خود رفع کنید در آن جستجو کنید. فهرست پکیجی را که میخوایید در پروژهکنید. عنوان نیاز

تر از ی خود استفاده کنید. سادهبگویید که میخواهید از آن استفاده کنید. در نهایت از آن در پروژه Composer خود یکی را انتخاب نموده و به

.همیشه

Composer صبن

Composer یک راهکار چندسکویی میباشد و به راحتی میتوانید آنرا درWindows ،Linux ،UNIX و OSX نصب کرد.

Windows نصب در

دریافت کنید و اجرا کنید. پس از اجرا و نصب آن میتوانید در Composer برای نصب در ویندوز به راحتی میتوانید فایل نصاب آنرا از وبسایت

:پنجره ترمینال از آن با دستور زیر اجرا نمایید

OSX و Linux ،UNIXنصب در

Composer ،را میتوان به دو صورت محلی و سراسری نصب کرد. در نصب محلیComposer ی مد نظر شما نصب تنها در دایرکتوری پروژه

.عامل از آن استفاده نموددر هر جای سیستمای نصب میشود که میتوان بگونه Composerمیشود. اما در نصب سراسری،

.وارد کنید Shell ی خود رفته و دستور زیر را دربرای نصب محلی کافیست به دایرکتوری پروژه

:در صورت وجود هرگونه مشکل میتوانید از دستور زیر استفاده کنید

ی شما ایجاد میشود. این فایل باینریدر دایرکتوری پروژه composer.phar های زیر یک فایلدر نهایت با اجرای هرکدام از فایل

Composer میباشد.

:میتوانید از دستور زیر استفاده کنید Composer برای اجرای

composer

curl -sS https://getcomposer.org/installer | php

php -r "readfile('https://getcomposer.org/installer');" | php

php composer.phar

Page 42: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

31 1314 مرداد PHP همایش

usr/local/bin/composer/ آنرا به زیر شاخه composer.phar برای نصب بصورت سراسری کافیست پس از دریافت فایل باینری

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

در پروژه Composer استفاده از

ی خود ایجاد نمایید. پس از در دایرکتوری اصلی پروژه composer.json در پروژه ی خود کافیست فایلی با نام Composer برای استفاده از

.ایجاد آن میبایست در آن به تعریف پکیج ها و دیگر موارد مد نظر بپردازید

:بصورت زیر اضافه نمایید require ای که میخواهید در بخش کلیداضافه نمودن یک پکیج جدید به پروژه کافیست نام پکیج را با نسخه برای

را در آن log مراجعه نماییم و عنوان www.packagist.org ها را در فایل ذخیره نماییم. کافیست به وبسایتlog بطور مثال میخواهیم

برخورد میکنیم که این قابلیت مد نظر را در اختیار ما میگذارد. در نتیجه monolog/monolog یم. در لیست ارایه شده با پکیجسرچ کن

:این پکیج را اضافه نمایید. به شکل زیر require در بخش کلید composer.json کافیست در فایل

.میسپاریم Composer را به بقیه کاردر در دایرکتوری پروژه سپس با اجرای دستور زیر

curl -sS https://getcomposer.org/installer | php

mv composer.phar /usr/local/bin/composer

{ "require": {

"PACKAGE_NAME": "PACKAGE_VERSION"

} {

{ "require": {

"monolog/monolog": "1.0.*"

} {

Page 43: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

41 1314 مرداد PHP همایش

ویندوز

هاعاملدیگر سیستم

در دایرکتوری پروژه قرار vendor هایش دانلود مینماید. آنها را در فولدرپکیج را با تمامی وابستگی Composer پس از اجرای این دستور

میسازد. تنها کاری که باید انجام دهیم کافیست این خط vendor/autoload.php خودکار را در آدرس autoload میدهد و در نهایت فایل

.بسپاریم Composer کد را در فایل اصلی پروژه اضافه نماییم و بقیه کار را به

.استفاده نماییم monolog پس از انجام اینکار میتوانیم به راحتی از پکیج

.زیر آنهارا آپدیت نماییمها نیز میتوان به راحتی با اجرای دستور برای آپدیت پکیج

ویندوز

هاعاملسایر سیستم

composer install

php composer.phar install

require 'vendor/autoload.php';

composer update

$log = new Monolog\Logger('name'); $log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING)); $log->addWarning('Foo');

php composer.phar update

Page 44: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

41 1314 مرداد PHP همایش

Packagist.org ایجاد پکیج برای ارسال در منبع

ها و همچنین ها و فایلدر نام گذاری کالس PSR-0 و یا PSR-4 نوشته میشوند میبایست از استاندارد Composer هایی که برایپکیج

.ساختار دایرکتوری پشتیبانی نمایند

:تشکیل شده است در زیر امده است SayHello که از یک کالس HelloWorld یک نمونه پکیج ساده به نام

:قرار میدهیم. در نتیجه این فایل در آدرس زیر قرار میگیرد src این فایل را در دایرکتوری

پس

<?php namespace HelloWorld; class SayHello { public static function world() { return 'Hello World, Composer!'; } }

hello-world/src/HelloWorld/SayHello.php

Page 45: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

42 1314 مرداد PHP همایش

:ج ایجاد نماییم. محتوای این فایل بشکل زیر میباشدرا در دایرکتوری اصلی پکی composer.json از ایجاد پروژه کافیست فایل

آن نوع استاندارد و محل قرارگیری autoload میباشد. در نتیجه در بخش PSR-0 ی ساختار فایلی در این پروژه براساس استانداردنحوه

.نماییماست به آن معرفی می src ها را که در دایرکتوریکالس

بروید. در آن ثبت نام packagist.org به وبسایت Github قرار دهید. پس از قرار دادن در Github پکیج کافیست آنرا در پس از ایجاد

.را وارد نمایید Github ی خود بر رویکافیست آدرس پروژه Submit a Package نمایید و وارد شوید. سپس از بخش

.تمام

کافیست به اکانت خود در Github ساخته اید. پس از هربار آپدیت پکیج در Composer هایشما یک پکیج در منبع پیکج

packagist.org بروید و با استفاده از بخش Force Update آنرا آپدیت نمایید. همچنین Github از راهکاری برای آپدیت خودکار پکیج

مسیر زیر را دنبال Github ی خود درپروژه repository نیز برخوردار است. کافیست در صفحه commit پس از هر packagist.org در

:نمایید

{ "name": "ardn/hello-world", "description": "Hello World Composer Package", "authors": [ { "name": "Your Name", "email": "[email protected]" } ], "minimum-stability": "dev", "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": { "HelloWorld": "src/" } } }

Page 46: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

43 1314 مرداد PHP همایش

:سپس از شما اطالعات زیر را میخواهد

User: نام کاربری شما در packagist.org

Token:Token API ای که میتوانید در بخش تنظیمات در سایت packagist.org پیدا کنید.

Domain: افیست در آن packagist.org را وارد کنید.

.بصورت خودکار پکیج شما آپدیت میشود Github ی خود درکردن در پروژه Commit در نهایت از این به بعد با هربار

منابع

1) Dependency Manager for PHP

https://getcomposer.org

2) Composer: Part 1 – What & Why

http://nelm.io/blog/2011/12/composer-part-1-what-why

3) Composer: Part 2 – Impact

http://nelm.io/blog/2011/12/composer-part-2-impact

4) Packages: The Way Forward for PHP

https://philsturgeon.uk/blog/2012/03/packages-the-way-forward-for-php

5) Composer – Sounds Good!

http://blog.fortrabbit.com/handle-your-dependencies-with-php-composer

6) Packagist: The PHP Package Repository

https://packagist.org

7) Creating your first Composer/Packagist package

http://grossi.io/2013/creating-your-first-composer-packagist-package/

Page 47: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

44 1314 مرداد PHP همایش

DOMAIN-DRIVEN ESIGND IN PHP خلیلی رحمانی علیرضا

: مقدمه

بهتر شود. یدهو سازمان یشترباعث کارایی ب تواندیو همیشگی است. تحلیل پیچیدگی م انکاریرقابلافزار یک امر غپیچیدگی در فرآیند تولید نرم

معماری، ساختار کد، کامپوننت های سیستم، میزان ریسک، نحوه آزمودن و فرصت تولید و توسعه بهتر اشاره کرد. به توانیل مئازجمله این مسا

این مهم باعث شد تا دانشمندان و پژوهش گران به فکر ارائه رویکرد جدیدی در طراحی و تولید باشند. [1]

یحاًسازمانی )ترج یافزارهامن در تحقیقات خودم با کتابی آشنا شدم که معماری جدیدی با رویکرد کاهش پیچیدگی در طراحی و تولید نرم

ده بود که موردتوجه بسیاری از برنامه نویسان بزرگ، دانشمندان و محققان قرارگرفته است.هایی رو پیشنهاد کربزرگ( روش یهاپروژه

چیست؟ گرا دامنه نویسیبرنامه

معرفی شد. البته نظرات « 24افزارکاهش پیچیدگی نرم -نویسی دامنه گرابرنامه«در کتاب 23نویسی دامنه گرا برای اولین بار توسط اریک اوانسبرنامه

اشاره کرد. توانیم 25مارتین فاولر یهاکننده در این زمینه نیز توسط دیگران معرفی شد که ازجمله به کتابو کاملمشابه

دامنه برگرفته [2]افزار است.آن نرم 21؛ که این درواقع دامنهشودیکاربرانش طراحی م یها، عالیق و خواستههایتبا توجه به فعال یافزارهر پروژه نرم

قرار دارد. درواقع دامنه به اجزای اصلی یک گریلدامنه اصلی پروژه در ذهن تحل یتاًاست. ماه 21در هنگام مذاکره با مشتری گریلتحل یهااز برداشت

ء ایمیل )مانند جی میل( باشد ارسال ایمیل جز دهندهیس. برای مثال اگر بنا بر تولید یک سیستم ارسال ایمیل یک شرکت سروودشیپروژه اطالق م

عنوان دامنه پروژه نیست. اصلی پروژه و دامنه پروژه موردنظر است. اما برای یک سیستم رستوران ارسال ایمیل به مشتریان به

تولید تا هاییچیدگیاز پ تواندیزشمند ما باید یک تصور شفاف و درست از دامنه آن سیستم داشته باشم؛ که این تصور مافزار اربرای تولید یک نرم

مدل. یک نمودار [2].دارداشاره به شکل صحیح و دقیقی از دانش ما نسبت به آن پروژه 22افزار باشد. درواقع مدلدانش کافی برای تولید آن نرم

بخصوص از پروژه نیست بلکه ایده طراحی این نمودار است.

23 Eric Evans 24 Domain-Driven Design: Tackling Complexity in the Heart of Software 25 Martin fowler 26 Domain 27 Domain Expert 28 model

Page 48: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

45 1314 مرداد PHP همایش

کنیم؟ شروع کجا از

رتیقدق اتیهم و اساسی مربوط به دامنه با جزبه کسب اطالعات و نکات م یازاولین قدم درک دامنه پروژه است. در ادامه برای ساخت یک مدل ما ن

ندارید. برای مثال ینسبت به محصول درخواست دانشییچافزار هعنوان مهندس نرمکه شما به شودیاهمیت این موضوع ازآنجا ناشی م [3]داریم.

)اولیه( خود را برای مشتری شرح بدهید و از او بخواهید که اشکاالت شمارا شما باید ذهنیات جهتین. ازایبرسیستم الکترونیک یا کارگاه چوب

یهارسم کنید. در ادامه مقاله به شرح نحوه انجام کار در بخش 21در پایان یک طرح کلی از ذهنیات خود را در قالب یک پروتوتایپ ند.اصالح ک

.پردازمیمختلف م

زبان یکپارچه90:

یان کند؛ ها بو نحوه راه یماهاهواپ افزار مانند سیستم ترافیک هوایی شاید مشتری در قالب افراد مختلف توضیحاتی در مورد ارتفاع،برای درک یک نرم

31برای تولید روینازا [3]درک نباشد و نیاز به حضور اعضای مختلف گروه باشدطور کامل قابلکه در اکثر مواقع توسط یک تحلیل در یک شرکت به

وفقیت در م، . فراموش نکنیم که ارتباط یک بخش مهم یاوریممدل واحد درب کطور یمدل، ما باید بتوانیم نظرات مختلف تحلیل گران مختلف را به

ارتباط یدرستهب یکدیگرنتوانند با یفزارانظر دارند که اگر اعضای یک گروه نرماست. اکثر برنامه نویسان باتجربه بر این موضوع اتفاق یافزارپروژه نرم

قطعًا سیستم دچار اشکال خواهد شد. دبرقرار کنن

ته ها زمان نیاز داش. شاید این موضوع ماهکندیفهم برای تمام اعضای گروه فراهم مواحد و قابل شکلیکعنوان ها پروژه را بهتمام بخش یکپارچهزبان

[3]د.انشکار گردآرا ها باشد تا درستی و غلط بودن

معماری چندالیه9۲:

که ؛بندی، تصویری از یک کیک باشدیهالهای پیچیده است. شاید تصور اولیه شما از یستمسی سازسادهی پرکاربرد در هافنبندی یکی از یهال

ی پایینی هایهالهای باالیی از هیدارند )الطرفه های پایینی ارتباط یکیهالهای باالیی با یهال. در این شکل اندقرارگرفتههم یروهای مختلف بر یهال

[5]شود.یممعماری چندالیه بر پایه مدل ساخته [4]خبرند( یب

وض باالی کیک مفر درواقعداند( الیه نمایش یمهای اساسی یهالیکی از چهار الیه در سیستم دامنه گرا است. )مارتین فاولر سه الیه را 33الیه نمایش

ت.تر و نمایش اسیینپاهای یهالوظیفه این الیه دریافت اطالعات از معموالًاست. شدهگرفتهما است که جهت تعامل با کاربر در نظر

، 34هایتموجودبه ازجملهاین الیه شامل اطالعات مهمی درباره دامنه است. قلب پروژه است. درواقعین الیه و ترمهمحتم طوربه، الیه دامنه

یی که از هادرخواستوظیفه اصلی این الیه قرار گرفتن در برابر 31یه کاربردیال توان اشاره کرد.یم 31، خدمات و الزامات اصلی پروژه35ولیوآبجکها

ها مربوط تحویل دهد.یسسروسیستم درآورده و به قبولقابلرا در قالب هادرخواستشود. این الیه وظیفه دارد یمطریق کاربران ارسال

هاواستدرخکند که یکسری یمدر سیستم شما عمل APIگونه بیان کرد که الیه کاربردی مانند یک یناتوان یمبهترین تعریف از الیه کاربردی را

یک پاسخ آندریافت کرده و در قبال HTTPیک درخواست از PHPنویسی به زبان برای مثال در برنامه گرداند.یبرمرا دریافت و پاسخ مناسب را

JSON شود.یمگردانیم. این عملیات توسط کنترلر ما که در الیه کاربردی قرار دارد انجام یبرم

Commandرا نیز می توان در این الیه قرار داد. برای مثال 32ور شوید عملیات در برنامه نویسی رویدادگراباتوجه به این مطلب شاید شما متص

Bus .را نمی توان در این الیه قرار داد. زیرا فقط رویداد را اجرا می کند و پاسخی بر نمی گرداند

29 prototype 30 Ubiquitous Language 31 build 32 Layered Architecture 33 Presentation Layer 34 Entities 35 Value object 36 Business rules 37 Application Layer 38 Event Driven Programming

Page 49: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

41 1314 مرداد PHP همایش

وان از ارسال تیمدهد. برای مثال یمعملیاتی که جز اصلی دامنه نیستند را انجام های دیگر را دارد ویهالاین الیه وظیفه پشتیبانی از فراساختارالیه

ها،یهال شناخت از بعد پروژه را نام برد. 31توان مخازنیمگیرند یمی که در این الیه قرار هابخش ازجملهایمیل در یک سیستم رستوران یادکرد.

بررسی راضوع مو تریقطور دقبه کمی است بهتر بنابراین؛ است گرا دامنه نویسیبرنامه در مسائل ینترمهم از یکی مختلف هاییهال بین ارتباطنحوه

در. ستا ضروری بسیار ارتباط نوع این که است پایین به باال از طرفهیک ارتباط یک هایهال ارتباط نحوه. بینیدیم 1 شکل در کهگونه . همانکنیم

.کنندیم بررسی راها درخواست تریینپا هایهال و ادهفرست را درخواست کاربر اول مرحله

کهیاست. درصورت رمقدو پایینی الیه اینترفیس فراخوانی طریق از طرفهیک ارتباط این و باشند ارتباط در تریینپا هاییهالبا توانندیم باالیی هاییهال

در که ندک استفادهها بک کالازجمله خاصی یهاروش از باید کند برقرار ارتباط االییب هاییهال با تریینپا الیه از طریق هر به بخواهد یسنوبرنامه

.شودینم توصیه اوقات اکثرهاالیه ساختار 1

ها:موجودیت

تواند حاوی اطالعات یک دانشجو یمء یشاین [4]شود.یمی متفاوت در سیستم گفته هاشناسهموجودیت به یک شیء دارای خصوصیات مختلف با

شوند. وقتی یک شیء از یمیز یله شماره دانشجویی از هم متماوسبهباشد، برای مثال ممکن است نام و نام خانوادگی دانشجوها یکسان باشد اما

[3]ی است.دسترسقابلی آسانبهتوان نتیجه گرفت که یمیءها باشد، پس شیز از دیگر تماقابل 41شناسهطریق

Data Mapperو Active Recordبه ازجملهمختلف دارند انواعها ORMداریم. ORMبرای ایجاد یک موجودیت ما نیاز به استفاده از

است بهترین گزینه برای Data mapperکه از نوع Doctrine عنوانبهمعتبر ORMیک PHPنویسی کرد. برای زبان برنامه توان اشارهیم

سازی موجودیت و در ادامه مخازن ما خواهد بود. نمونه کد موجودیت کاربر:یادهپ

/** * @ORM\Entity

39 Repositories 40 ID

Page 50: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

41 1314 مرداد PHP همایش

* @ORM\Table(name="user") * @ORM\HasLifecycleCallbacks() */ class User { use Timestamps; use Authentication; /** * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") */ private $id; /** * @ORM\Column(type="string") */ private $email; /** * @ORM\Column(type="string") */ private $username; /** * @ORM\Column(type="string") */ private $first_name; * /** * @ORM\Column(type="string") */ private $last_name; /** * @ORM\Column(type="string") */ private $mobile; /** * @ORM\Column(type="string") */ private $last_login; /** * @ORM\Column(type="string") */ private $reset_password;

:ولیوآبجکها

خیر. گاهی اوقات–شود(. ینمدارای شناسه هستند که به بحث ما مربوط ءها در حافظه رمیشیءها باید یک شناسه داشته باشند؟)همه شآیا تمام

انجام اعتبار کافی برای موردنظرء یشنیاز بر این است که یکسری از صفات دامنه اعتبار سنجی شوند. این اعتبار سنجی به این معنا است که آیا

رح ه ششود که بء محتویات شیء مربوط دارای اهمیت است. ولیوآبجک به شیء ای اطالق مییشعملیات را دارد یا خیر. جدا از نوع شیء یا شناسه

[3]پردازد.اعتبار ثابت از یک دامنه می

خدمات:

اگر ما بخواهیم عملیات ؛ و(استء همان موجودیت یا ولیوآبجکت یشمنظور از ) یستدن متعلقیات در دامنه به هیچ شیء ای عملبعضی از رفتارها و

ی رفتارهای دهنسازماین اساس ما نیازمند بر ادهند. یمءها مفاهیم خود را از دست یششود و یمرا به این شیءها بسپاریم طراحی ما دچار اشکال

طوربهنکته مهم در مورد خدمات در دامنه این است که نباید صفاتی که [3]گوییم.یمبه این رفتارها خدمات که شده در دامنه هستیم.ییشناسا

Page 51: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

42 1314 مرداد PHP همایش

شوند را به خدمات نسبت دهیم و تنها برای عملیات بسیار مهم خدمات تعریف کنیم. برای درک بهتر مطلب خدمات را با یمعادی در دامنه تعریف

سه شرط زیر خواهیم شناخت:

باشد هایتموجود یا ولیوآبجکت به متعلق نباید عملیات -1

نباشد(. دامنه با ارتباط بدون) شودیم اجرا دامنه در دیگر ءهاییش به ارجاع با عملیات -2

[3]باشد( نداشته تداخل) باشد مستقل عملیات دیگر از باید عملیات -3

سیستم هک رفتارهایی به خدمات کاربردی الیه در شوند.یم تعریف خدمات نیز دیگر هاییهال در بلکه نیستند دامنه به متعلق خدمات که تنهانه

الیه در خدمات ازجمله .است کاربردی الیه در یفتعرقابل خدمات از یکی که 41هویت احراز خدمات مثال برای شود.یم اطالق دارد خارج با

دامنه در خدمات از مثال یک بخواهیم اگر نباشد(. پروژه اصلی جز ایمیل که شرطی به )البته برد نام را ایمیل ارسال خدمات توان،یم اساختارفر

ببریم نام را سیستم در نامثبت عملیات توانیمیم بزنیم

مجموع سازی42:

ترکیب درواقع [2]کرد. مشخص را آن محدود مرزهای و شیء کیتمال آن وسیلهبه توانیم که هستند 43دامنه الگو یک سازها، مجموع

[1]است. محدودکننده مرز یک ایجاد پایه ساز، مجموع یک در ها ولیوآبجکت و هایتموجود

UML 1 نمودار

رااج یکدیگر کنار در را مفاهیم یکسری تا دارید نیاز خود پروژه در شما اگر مثال یبرا بینید.می سازها مجموع UML نمودار یک نمونه باال در

زمان دانشجو کی تحصیلی سوابق مثل شوند اجرا راتدستو دیگر که کنندمی پیدا معنا زمانی فقط دستورات از بعضی اجرا بهتر بیان به یا کنید

.شود حذف دانشجو که بدهیم رازمانی تحصیلی سوابق حذف اجازه فقط باید ما همین برای .ندارند معنا دیگر سیستم از دانشجو یک حذف

تموجودی طریق از فقط هاقسمت باقی با ارتباط ولی .هستند ارتباط در دیگر موجودیت چند با که باشند موجودیت توانندمی سازها مجموع

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

41 Authentication Service 42 Aggregates 43 Domain pattern

Page 52: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

41 1314 مرداد PHP همایش

مرزهای محدودکننده44:

باشیم داشته بزرگ هپروژ اگر طبیعتاً است. ضمنی صورتبه مدل آن محتوای باشیم داشته مدل یک فقط اگر و ؛دارد 45محتوا یک ل مد هر

یک داشتن اما باشیم. داشته محتوا یک با مدل یک که برسد نظر به زیرکانه شاید [3]باشد. مختلف محتوا چندین است ممکن ما مدل محتوا

مختلف هایبخش بودن نامشخص دلیل به اشکال این رفع و شود. 41اشکال دچار سیستم است ممکن و شودمی پیچیدگی افزایش باعث محتوا

گزاری مرز ایجاد برای مدل هایحوزه تعریف ایده بهترین کرد. نصف را مدل بتوان که نیست موجود فرمولی هیچ [1]است. دشواری بسیار کار

باشند. متحد گذارها مرز همه که تالش این با البته است. محتوا

گروه بهتر درک و کار برای دامنه در را خاص مفهوم یک کنندمی گذاری مرز محدودکننده، مرزهای [3]نیستند. ماژول محدودکننده مرزهای

رسیم.می زبان سازییکپارچه همان به درواقع دهنده.توسعه

مارهش ازجمله کاربران کامل اطالعات افزارنرم این است. شده شرکت یک محصوالت فروش برای وب تحت پروژه ایجاد پیشنهاد ما به مثال برای

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

عالیق بتواند که انبار در هاجودیتمو و مختلف کاالها جهت کامل گذارش سیستم یک بعالوه بدهند. را سیستم در ناموجود کاال وجود جهت

کند. مشخص کاالها به نسبت را کارمندان

رزم دو پروژه هاینیازمندی به توجه با اول نگاه در است. آنالین فروش سیستم اطالعات همه شامل که کنیممی آغاز دامنه یک با شروع برای

چ)هی هستند جدا هم از هرکدام که ؛کنیممی تعریف را است گیریشگزار سیستم دیگری و فروش سیستم مرز اولی، که مجزا محدودکننده

را مبحث این مقاله این در من کرد. مرتبط هم به را محدودکننده مرزها این همه توانمی 41محتوا نقشه وسیلهبه [1] ندارند(. هم به وابستگی

کنم.می واگذار خواننده به

کند.شده که به درک بهتر مطالب فوق کمک میهای مختلف مشخصطور دقیق نحوه ارتباط بین مفهومبه باالدر شکل

44 Bounded Context 45 context 46 bug 47 Context map

Page 53: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

51 1314 مرداد PHP همایش

الگو یناست. ا 41ولیوآبجت ها داریم. یکی از پرکاربردترین الگو طراحی مورداستفاده در این بخش الگو مشخصات 42حصورسازیدر ادامه ما نیاز به م

برای مثال اگر ما قصد داریم برای ولیوآبجت ایمیل [1]وظیفه دارد تا نتیجه درست یا غلط را حاصل از درستی یک مفهوم را در سیستم را بازگرداند.

تا مقدار درست یا غلط را مشخص سازد. داریم شده است یا خیر نیاز به الگو مشخصاتبررسی کنیم که آیا این ایمیل قبالً در سیستم ثبت

کارخانهها۵0:

ساز مجموع چند اتصال برای پیچیدگی کاهش وظیفه گرا دامنه اریمعم در که است نویسیبرنامه در ۵4طراحی الگو یک درواقع کارخانه

ساز مجموع هر به جدا جدا، بخواهیم ما اگر . است غیره و زانتیا تیبا، پراید، ازجمله سازهایی مجموع شامل سازیماشین کارخانه مثالً [1].دارد

وسطت را موردنظر عملیات راحتیبه دارد رسی دست هاماشین همه به که کارخانه وسیلهبه حال بسازیم شیء هاآن تمام از باید کنیم پیدا دست

دهیم.می انجام(شیء چند بجای) شیء یک

رد بربگیرند در را پروژه کلی ماهیت به مربوط اعمال هاکارخانه اگر اینکه به توجه با گیرندمی قرار دامنه و فراساختار هایالیه در هاکارخانه

.گیرندمی قرار فراساختار در باشند اصلی ساختار غیر اگر و دامنه

گیری: نتیجه

ی کار بسیار سختی است که با بزرگتر شدن پروژه این کار سخت تر می شود. یکه سازی در پروژه های کوچک جواب گو است اما کاهش پیچیدگ

وقتی پروژه بزرگتر می شود این کار غیرممکن است و تنها افزودن الیه های مختلف باعث کاهش پیچیدگی می شود. همان طور که می دانید

ط به الیه الیه کردن کارها ختم نمی شود و مفاهیم مهم دیگری از جمله موجودیت ها ،مرزهای محدود کننده و ... قابل برنامه نویسی دامنه گرا فق

تعامل است.

منابع و مآخذ:

1. Lyu, M.R., Handbook of software reliability engineering. Vol. 222. 1996: IEEE computer society press CA. 2. Evans, E., Domain-driven design: tackling complexity in the heart of software. 2004: Addison-Wesley Professional. 3. Avram, A., Domain-driven design Quickly. 2007: Lulu. com. 4. Fowler, M., Patterns of enterprise application architecture. 2002: Addison-Wesley Longman Publishing Co., Inc. 5. Nilsson, J., Applying domain-driven design and patterns: with examples in C# and. NET. 2006: Pearson Education. 6. Vernon, V., Implementing domain-driven design. 2013: Addison-Wesley. 7. Saray, A., Professional PHP design patterns. 2009: Wrox Press Ltd.

48 Encapsulate 49 Specification Pattern 50 Factories 51 Design Pattern

Page 54: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

51 1314 مرداد PHP همایش

ورک؟پی فریماچکدام پی حمید رضا دبیری نژاد

مقدمه

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

ده ای بر کسی پوشیگرایی و محدودیت های توسعهجود توابع بسیار زیاد، کمبود ساختارهای شئورک در این زبان به دلیل ولزوم استفاده از فریم

شویم، تنها سوالی که مطرح می شود پی غرق میاچهای پیاده سازی شده برای پینیست؛ اما وقتی با یک جستجوی ساده در دریایی از فریم ورک

کدام فریم ورک؟این است:

واالت الزم است تا با تعاریف و پیش نیازهای مقایسه انواع فریم ورک ها آشنا شویم.پیش از پاسخ به این س

اب فریم خدر مقاله پیش رو ابتدا بستر مقایسه ای را فراهم می سازیم تا بتوانیم فریم ورک ها را با هم مقایسه نماییم و سپس راهکارهایی جهت انت

ورک مناسب را با هم مرور می کنیم.

چیست؟ فریم ورک

« زیرساخت نرم افزاری » ، «چارچوب کاری » ، « قالب کاری » می توان اصطالحاتی همچون (Framework)برای معنای لغوی فریم ورک

لیل در مین دو ... را بیان نمود؛ اما همچون بسیاری از لغات برنامه نویسی ترجمه ها و معادل ها نمی توانند بار معنایی کامل را انتقال دهند، به ه

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

تعریف فریم ورک را می توان به جامعیت زیر داشت:

ی توسعه و پیاده سازی، با هدف توسعه سریعتر ها به منظور ایجاد بسترِ پکپارچهای مجتمع از الگوها، ساختارها، راهکارها، ابزارها و رابطمجموعه }

{یاده سازی پایدارتر تر و پو منعطف

یا به سادگی زیر:

{ ابزاریست متشکل از توابع و کالس های از پیش نوشته شده، برای ساده سازی و سرعت بخشیدن به توسعه و تولید }

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

Page 55: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

52 1314 مرداد PHP همایش

اهداف و قابلیت های فریم ورک ها

تعاریف بخش پیشین در کنار بررسی فریم ورک ها، اهداف و قابلیت های زیر را برای فریم ورک ها متصور می شود:

سادگی نصب و دسترسی .1

سرعت بخشیدن به روند توسعه .2

برطرف سازی پیش نیازهای اولیه ایجاد و توسعه .3

های ذاتی زبان برنامه نویسیحذف پیچیدگی .4

ه و منعطفایجاد ساختار و الگوی یکپارچ .5

یادگیری سریع و آسان .1

حفظ پایداری در توسعه و پیاده سازی .1

ی قدرتمند و منعطفمدل های داده ای و رابط داده .2

امنیت درونی و ابزارهای امنیتی .1

گواهی استفاده و محدودیت ها .11

یز اشاره نمود:می توان به نباید هایی در رابطه با فریم ورک ها ن در کنار اهدف و قابلیت های کلی ذکر شده،

ایجاد سربار بیش از حد بر محصول نهایی .1

کند سازی عملکرد اجرایی و یا کاهش کارایی .2

پیچیده سازی تولید و توسعه .3

روند یادگیری طوالنی و پیچیده .4

بستر و معیار مقایسه فریم ورک ها

ی زیر را در نظر خواهیم گرفت:ارهای دوازده گانه مقایسهبا توجه به نکات گفته شده و به منظور ایجاد بستری برای مقایسه فریم ورک ها معیا

نصب و استفاده .1

روند ساده یا پیچیده نصب کامل فریم ورک و بستر استفاده

سادگی یادگیری .2

روند یادگیری استفاده از فریم ورک

مستندات .3

آموزش ها، راهنمایی ها و اطالعات فریم ورک

جامعه فعال استفاده کنندگان .4

جامعه فعالین و استفاده کنندگان از فریم ورکانجمن ها و

توسعه پایدار و قابلیت اطمینان .5

عدم ایجاد تغییرات کلی در نسخه های مختلف

تسریع در تولید .1

میزان سرعت بخشیدن به روند توسعه و تولید محصول نهایی

الگوهای طراحی .1

پیروی و استفاده از الگوهای طراحی و توسعه

Page 56: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

53 1314 مرداد PHP همایش

ایرابط داده .2

و رابط های اتصال به پایگاه های داده امکانات

امنیت و خطایابی .1

راهکارهای خطایابی، ایمنی ذاتی و ابزارهای امنیتی طراحی شده در فریم ورک

سربار و کارایی عملکردی .11

سربار ناشی از ساختار درونی فریم ورک و عدم کاهش کارایی یا کند سازی روند اجرایی محصول

امکانات .11

ت درون ساختقابلیت ها و امکانا

چشم انداز .12

آینده نگری و خط مشی پیش رو

سخنی با خوانندگان

پی الزم به توضیح است که امتیاز های داده شده به هرکدام از این فریم ورک ها با توجه به اچفریم ورک برتر پی 11پیش از شروع به مقایسه

مرجع مختلف جمع آوری شده است. 111ات کاربران آنها از بیش از مقایسه نسبی، مشاهدات عینی، تست های عملی و تجربیات و نظر

ها حذف CMS-Frameworkالزم به توضیح است که در میان فریم ورک های مورد مقایسه قرار گرفته، میکرو فریم ورک ها و همچنین

شده اند.

سال تجربه برنامه 15ه باشد، این مقاله حاصل بیش از بدیهی است که ممکن است نظر خوانندگان محترم نظری متفاوت از امتیازهای داده شد

فریم ورک متفاوت و مختلف است که با خواندن صدها صفحه و ده ها لیست آماده 23نویسی و بیش از یک ماه تحقیق و بررسی بر روی بیش از

شده است؛ ضمن احترام به نظر شما، این حق همه است که نظر خود را بیان کنند...

Zend Framework

پی ارائه داده است.اچبه عنوان شرکت توسعه دهنده موتور اجرایی پی Zendپی را شرکت اچمعروفترین فریم ورک پی

طراحی و توسعه داده شده است و به دلیل قدمت و بزرگی آن می فریم ورک با دیدی استاندارد و بر اساس اصول کلی مهندسی نرم افزار، این

پی را به آن داد.اچفریم ورک های پیتوان لقب پدربزرگ

خوب است، مگر اینکه Zend Frameworkانجام شده است، ZFاستفاده می کنند، کار تیمی زیادی توسط Zendسازمان های زیادی از

راه حل بهتری وجود داشته باشد.

Zend Framework 2

نصب و استفاده باالتر نیاز دارد.و 5.3.3 نسخه PHPبه Zend framework 2نصب

به سادگی دانلود کل فریم ورک، دانلود کامپوننت های آن و یا استفاده از ZFنصب

کامپوزر می باشد.9.60

سادگی یادگیری

یادگیری این فریم ورک را نمی توان ساده دانست، چه آنکه پیروی از استانداردهای

النی بودن اسامی مورد و یا حتی طو موجود در آن و یا پیچیدگی پیاده سازی آن

استفاده در آن بر یادگیری این فریم ورک سایه انداخته است.8.50

مستندات PHPگاهی به پیچیدگی ساختار آن و گاهی به سادگی ZFآموزش ها و مستندات

، راه را برای دریافت ZFاست، با این وجود، مستندات بسیار زیاد نوشته شده برای

ک باز گذاشته است.اطالعات از این فریم ور9.10

Page 57: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

54 1314 مرداد PHP همایش

جامعه فعال استفاده

کنندگان

به دلیل استفاده گسترده از این فریم ورک در پروژه های کوچک و بزرگ و عموما

9.40 را می توان فعال و کار آمد دید. ZFشرکتی، جامعه استفاده کنندگان از

توسعه پایدار و قابلیت

اطمینان

1غییرات بسیار کلی و افزایش پیچیدگی از نسخه را می توان ت ZFیکی از نقاط ضعف

این فریم ورک دانست. 2به نسخه

این فریم ورک از قابلیت اطمینان بسیار باالیی برخوردار است. 2با این حال نسخه 8.50

تسریع در تولیدپس از یادگیری این فریم ورک روند تولید و توسعه محصول نهایی سرعتی مطلوب

9.20 خواهد داشت.

الگوهای طراحینیز الزامی در نوع الگوی طراحی ندارد، با این Zendفریم ورک PHPهمچون خود

9.20 پشتیبانی بسیار خوبی به عمل می آورد. MVCحال از مدل

ایرابط داده

ZF رابط داده ایORM را به صورت بسیار مطلوب ارائه می دهد و درایور های درون

اه های داده ای از نوع های زیر را به آسانی فراهم نموده ساخت آن استفاده از پایگ

است:Relational

NoSQL

XML Database

File System

9.70

و خطایابی امنیت

CSRFدر حد بسیار مطلوبی است و امکانات بسیار خوبی همچون ZFایمنی

Validation, XSS Sanitization و ... نیز به کمک توسعه دهندگان می آیند.

های فراوان باعث سردرگمی ابتدایی توسعه دهندگان می شود اما Exceptionوجود

به مرور این ساختار خطایابی پیچیده انعطاف خود را به توسعه دهندگان نشان خواهد

داد.

9.40

سربار و کارایی

عملکردی

ZF تر شرا می توان دارای بیشترین سربار بر روی محصول نهایی دانست، این سربار بی

به دلیل ساختار پیچیده و تو در توی فریم ورک می باشد، به عنوان نمونه می توان به

include فایل برای اجرای یک اکشن کامال استاتیک از یک کنترلر 24شدن بیش از

در این فریم ورک اشاره نمود.

8.10

امکانات

ها یکی از این قابلیتقابلیت ها و امکانات این فریم ورک بسیار زیاد و چشم گیر است،

های متفاوت جهت دسترسی به وب سرویس های متعدد می باشد. APIوجود Caching, Authentication, Email, Template Engine, Validation,

Ajax و ... را می توان به عنوان امکانات و کامپوننت های درون ساخت این فریم ورک

در نظر گرفت.

9.30

چشم انداز

در توسعه فریم Zendهی به گذشته این فریم ورک و تعهد بسیار خوب شرکت با نگا

می توان چشم انداز این فریم ZF3ها و توسعه Roadmapورک خود و با توجه به

ورک را بسیار مناسب ارزیابی نمود.

ی این پروژه خواهد بود.با این حال تغییرات ساختاری مشکلی در آینده

8.90

جمع بندی

را به عنوان یک فریم ورک قدرتمند اما Zend Frameworkوع می توان در مجم

کمی پیچیده و سنگین ارزیابی نمود که می تواند در پروژه های بزرگ و کارهای تیمی

یاری رسان توسعه دهندگان باشد. و مشترک9.08

یت فریم ورک به نشانی زیر مراجعه نمایید.به منظور کسب اطالعات بیشتر، دریافت فریم ورک و راهنمایی های الزم به وب سا

http://framework.zend.com

Laravel

الراول فریم ورکی است مدرن با شعار تولید صنعتی که سعی بر سادگی روند توسعه و تولید نرم افزارهای مبتنی بر وب دارد.

Syntax عه دهندگان را پیرامون این فریم ورک جمع سازد.زیبا به همراه مستندات بسیار خوب توانسته است جامعه بزرگی از توس

Page 58: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

55 1314 مرداد PHP همایش

این فریم ورک را کمی سنگین Symfonyبا این حال دیپندنسی و استفاده الراول از کامپوننت ها و ابزارهای متعدد سایر فریم ورک ها همچون

و پیچیده نموده که توسعه دورنی آن با مشکالتی همراه است.

Laravel

نصب و استفاده و باالتر نیاز دارد. 5.5.9 نسخه PHPبه Laravelنصب

این نصب از طریق نصاب مخصوص الراول و یا کامپوزر امکان پذیر است و دانلود

سورس کد آن به دلیل وجود دیپندنسی ها و ارتباطات فراوان مشکل خواهد بود.9.00

سادگی یادگیری زمینه یادگیری دانست.الراول را می توان یکی از بهترین فریم ورک ها در

Syntax .9.70 بسیار ساده و روان آن دلیلی است محکم بر یادگیری سریع این فریم ورک

مستنداتهای رسمی الراول که با دید برنامه نویسی مدرن نوشته شده اند مستندات و آموزش

9.30 میتوانند راهنمای بسیار خوبی در زمینه کار با این فریم ورک باشند.

ه فعال استفاده جامع

کنندگان

جامعه فعاالن و توسعه دهندگان الراول با رشد بسیار سریع خود توانسته محیط

9.50 مناسبی جهت پاسخگویی به پرسش ها و نیازهای سایر توسعه دهندگان فراهم سازد.

توسعه پایدار و قابلیت

اطمینان

به توسعه کامپوننت های توسعه پایدار الراول به دلیل دیپندنسی های فراوان، منوط

ی آن است؛ با این حال الراول با ایجاد یک رابط مناسب با نام مورد استفاده

Illuminate .توانسته این ضعف را تا حدود بسیار زیادی جبران نماید 8.90

تسریع در تولیدپس از یادگیری این فریم ورک روند تولید و توسعه محصول نهایی سرعتی بسیار خوب

9.50 داشت. خواهد

الگوهای طراحیاست، اما هیچ اجباری بر رعایت MVCالگوی مناسب جهت توسعه محصالت با الراول

9.20 وجود نخواهد داشت. MVCاصول

ایرابط داده

با کمک ORMمی باشد که این Eloquent ORM رابط داده ای الرول مبتنی بر

ActiveRecord مدل های مختلف داده ای را درون ساخت خود توانایی کار با

خواهد داشت.

Migrationهمچنین دستکاری ساختارهای داده در الراول به سادگی از طریق رابط

آن امکان پذیر خواهد بود.

9.60

و خطایابی امنیت

الیه های امنیتی الراول با وجود سادگی پیاده سازی، امنیتی مطلوب را در اختیار تسعه

.دهندگان قرار می دهد

در الیه کنترلر XSS Sanitizationبا این حال برخی از ابزارهای امنیتی همچون

وجود ندارند و کاربر برای استفاده از آن ها ملزم به تولید مجدد کد خواهد بود.

ی الراول یکی از نقاط قوت این فریم ورک می باشد.خطایابی از پیش تنظیم شده

9.30

سربار و کارایی

عملکردی

ل از سرعت بسیار خوبی برخوردار است اما وجود رابط ها و کامپوننت های الراو

Third party .8.90 سرباری بر اجرای محصوالت تولید شده با آن خواهد داشت

امکانات

قابلیت ها و امکانات این فریم ورک مناسب و قابل اتکاست، باشد.Caching, Authentication, Email, Template Engine (Blade),

Validation, Ajax و ... را می توان به عنوان امکانات و کامپوننت های درون ساخت

این فریم ورک در نظر گرفت.

9.00

چشم اندازتوسعه این فریم ورک با رشد بسیار قابل مالحظه ای در حال پیگیری است اما

Roadmap ،گویی خاصی در برنامه ریزی آینده این فریم ورک به چشم نمی خورد

این فریم ورک تابع شرایط پیش روست.8.60

جمع بندیدانست که PHPالراول را شاید بتوان یکی از جدیدترین و مدرنترین فریم ورک های

9.21 می تواند تولید محصول نهایی را به طرز چشم گیری تسریع نماید.

م به وب سایت فریم ورک به نشانی زیر مراجعه نمایید.به منظور کسب اطالعات بیشتر، دریافت فریم ورک و راهنمایی های الز

Page 59: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

51 1314 مرداد PHP همایش

http://laravel.com

Phalcon

با آن نوشته شده و در حال توسعه Zephirو سپس همراه با توسعه زبان Cاست که ابتدا با زبان PHPبرای C Extension فالکون یک

می باشد.

تبدیل نموده است، و چارچوب سطح پایین کد های آن باعث بهینه سازی PHPو پیشرفته فالکون آن را به سریعترین فریم ورک معماری خالقانه

شده است. PHPحداکثری و در نتیجه کمترین سربار در میان فریم ورک های

کتابخانه ای ذخیره شده و به عنوان یک کالس ها و اشیاء مختلفی دارد که همگی در فایلی PHPفالکون همچون اکثر فریم ورک های

Extension در PHP.قابل نصب و استفاده است

Phalcon

نصب و استفاده

و باالتر نیاز دارد. 5.3.9 نسخه PHPبه Phalconنصب

است که در ویندوز به سادگی PHPدر Extensionنصب آن همانند نصب یک

در دایرکتوری مربوطه و در php_phalcon.dllدانلود و کپی کردن فایل

است. PHPلینوکس،کامپایل کردن آن به همراه

پس از نصب اکستنژن آن دیگر کاری نمی ماند و فالکون به صورت کامل در دسترس

خواهد بود.

9.70

سادگی یادگیریفالکون توسعه دهندگان را با معماری درونی خود درگیر نمی سازد و به دلیل استفاده

بسیار مناسب خود در تولید Syntaxهای گویا و Namespaceس ها و از کال

محصول نهایی از سادگی یادگیری بسیار باالیی بر خوردار است.9.60

مستندات

های رسمی فالکون بسیار گویا و همراه با مثال های فراوان یکی از مستندات و آموزش

است. PHPبهترین مستندات در میان فریم ورک های

های آموزشی برای آن نوشته شده و نیز Sheet Cheatچنین تعداد بسیار زیادیهم

وب سایت های زیادی در زمینه اطالع رسانی و آموزش فالکون فعالیت دارند.

9.50

جامعه فعال استفاده

کنندگان

جامعه توسعه دهندگانی که از فالکون استفاده می نمایند رو به افزایش است با این

امعه به دلیل جدید و مدرن بودن کار با فالکون در ابتدای امر، کمی درگیر حال این ج

مسائل ابتدایی کار با این فریم ورک است.9.10

توسعه پایدار و قابلیت

اطمینان

دانست به دلیل وجود PHPفالکون را می توان یکی از پایدارترین فریم ورک های

Cیجاد الگوی مناسب به کمک زبان و سعی در ا PHPدرک مناسب و مدرن از زبان

در آن. Zephir و

تغییرات ساختاری در فالکون بسیار کم بوده و تمرکز توسعه دهندگان آن بر افزودن

قابلیت ها و بهینه سازی آن می باشد.

9.70

تسریع در تولیدپس از یادگیری این فریم ورک روند تولید و توسعه محصول نهایی سرعتی بسیار عالی

9.60 اهد داشت.خو

الگوهای طراحی

را می توان در فریم ورک فالکون مشاده MVCیکی از بهترین پیاده سازی های مدل

به Cای که از زبان نمود، چه آنکه توسعه دهندگان آن با دید برنامه نویسی بسیار قوی

در حال توسعه آن می باشند. یادگار با خود دارند،9.60

ایرابط داده

ها و اشیاء داده ای Modelو بر روی ORMن رابط داده ای خود را مبتنی بر فالکو

نیز در آن در اختیار توسعه Active Recordاما امکان استفاده از قرار داده است،

دهندگان می باشد.9.50

و خطایابی امنیته ط باستفاده راحت و آسان از فالکون باعث شده است بسیاری از پیچیدگی های مربو

امنیت از دید برنامه نویس پنهان بماند و این مزیتی بزرگ برای این فریم ورک به شمار

می آید.9.40

Page 60: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

51 1314 مرداد PHP همایش

با این حال ابزارهای بسیار مناسبی جهت برقراری امنیت و ذخیره و نمایش ایمن داده

ها در فالکون وجود دارد.

سربار و کارایی

عملکردی

را برای C Extensionهتر و سریعتر از به عقیده بسیاری، نمی توان حالتی ب

در نظر گرفت، به همین دلیل فالکون را می توان بر PHPکامپوننت ها و بسط های

ی فریم ورک ها از نظر سرعت قرار داد. قله10.00

امکانات

یکی از معدود نقاط ضعف این فریم فرک کمبود امکانات و قابلیت های درون ساختی

و ... است. Authentication, Emailهمچون

Blade Templateبا این وجود امکانات و قابلیت های خوبی نیز همچون

Engine, Assets manager .و ... در فالکون در اختیار قرار دارند

8.50

چشم اندازتوسعه این فریم ورک با سرعت و دقت بسیار قابل مالحظه ای در حال پیگیری است

Roadmap شده . چشم انداز بسیار خوبی را می توان برای آن آن مشخصا نوشته

متصور بود.9.00

جمع بندی

ا امپی است، اچبی شک فالکون سردمدار سرعت و کارایی در میان فریک ورک های پی

ضعف امکانات درون ساخت باعث می شود که توسعه دهنده خود به ایجاد آنها اقدام

نماید.

9.43

یشتر، دریافت فریم ورک و راهنمایی های الزم به وب سایت فریم ورک به نشانی زیر مراجعه نمایید.به منظور کسب اطالعات ب

https://phalconphp.com

Symfony 2

سیمفونی را می توان مجموعه ای از کامپوننت ها و ابزارهای از پیش نوشته شده دانست که در قالب یک فریم ورک و در کنار هم و یا حتی به

تقل مورد استفاده قرار گیرند.صورت مس

مبه دلیل ساختار بسیار مناسب کامپوننت های آن و وجود کمترین وابستگی میان آن ها ، رد پای سیمفونی را می توان در بسیاری از دیگر فری

و ... مشاهده نمود. Laravel, Drupal, PhpBBپی همچون اچورک ها و برنامه های پی

.شود می برگزار امسال رکو فریم این سالگی 11 جشن

Symfony 2

نصب و استفاده

و باالتر نیاز دارد. 5.3.9 نسخه PHPبه Symfonyنصب

نصب سیمفونی را می توان به صورت یک فریم ورک و یا مجموعه ای از کامپوننت ها

انجام داد.

چه از طریق دانلود سورس کدها و یا استفاده از کامپوزر.

9.50

ریسادگی یادگیبه دلیل جدا بودن کامپوننت ها و اجزاء سیمفونی از یکدیگر، میتوان یادگیری آن را

منوط به یادگیری هر یک از کامپوننت های آن به صورت جداگانه دانست که یادگیری

آن را ساده تر اما کمی زمانبر می نماید.9.30

مستندات مثال های فراوان می باشد.های رسمی سیمفونی کامل و همراه با مستندات و آموزش

9.40 برای تمامی اجزاء آن مستندات به صورت مطلوبی در دسترس خواهد بود.

جامعه فعال استفاده

کنندگان

یکی از بزرگترین و قدیمی ترین جامعه های فریم ورکی پی اچ پی از آن سیمفونی

د گویای جامعه ی با آن، خواست، کنفرانس ها و کتاب های متعدد نوشته شده در رابطه

بسیار فعال این فریم ورک می باشد.9.80

توسعه پایدار و قابلیت

اطمینان

با تغییرات بسیاری روبرو شد، با این 1پس از گذر از نسخه ZFسیمفونی نیز همچون

9.00 حال سیمفونی رابط های بسیار مناسبی جهت توسعه پایدار خود ایجاد نموده است.

تسریع در تولیدز یادگیری این فریم ورک روند تولید و توسعه محصول نهایی سرعتی بسیار پس ا

9.50 مناسب خواهد داشت.

Page 61: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

52 1314 مرداد PHP همایش

الگوهای طراحی

سیمفونی به عنوان مجموعه ای از کامپوننت ها، الگوی خاصی را جهت پیاده سازی و

توسعه محصول نهایی در نظر نمی گیرد و آزادی عمل آن باعث سردرگمی توسعه

عدد خواهد شد.دهندگان مت

داده و اما به عنوان فریم ورک توانایی مناسبی در ایجاد ونگهداری الیه های منطق،

نمایش از خود نشان داده است.

9.10

ایرابط دادهمی باشد که یکی از قویترین و در عین حال Doctrineرابط داده ای سیمفونی

9.10 است. PHPهای موجود در ORMپیچیده ترین

و خطایابی یتامن

شاید بتوان کاملترین ابزارهای امنیتی را در سیمفونی مشاهده نمود. از این رو

سیمفونی یکی از امنترین هاست، اما به دلیل اینکه این مجموعه ابزار ها بایستی توسط

توسعه دهنده مورد استفاده قرار بگیرد و کمتر به صورت درون ساخت در سیمفونی

گرقته، کار با آن و امنیتی بخشی در سیمفونی را اندکی مشکل مورد استفاده قرار

ساخته است.

9.70

سربار و کارایی

عملکردی

سربار فریم ورک سیمفونی را می توان بیشتر در بخش هایی که مربوط به پیاده سازی

الگوی طراحی است مشاهده نمود.

د به همین منظور کامپوننت های مجموعه سیمفونی به خوبی از یکدیگر جدا شده ان

سربار کمتری بر محصول نهایی تحمیل می کنند.

8.90

امکاناتسیمفونی از لحاظ دارا بودن امکانات و قابلیت های درون ساخت یکی از کاملترین فریم

9.60 ورک های پی اچ پی است.

چشم انداز

مفونی تمرکز تیم توسعه سی این فریم ورک به نظر می رسد 2.7پس از تولید نسخه

این فریم ورک قرار گرفته است. 3بر روی نسخه

با این حال از لحاظ برنامه ریزی و پشتیبانی در آینده، نمی توان فریم ورکی را در حد و

اندازه سیمفونی به شمار آورد.

9.70

جمع بندی

مجموعه بسیار مناسب ابزار ها و کامپوننت ها ، جداسازی سیمفونی بسیار کامل است،

ر مناسب این کامپوننت ها از وابستگی ها و دیپندنسی های غیر ضروری و توسعه و بسیا

تبدیل PHPپشتیبانی مسئوالنه، این فریم ورک را به یکی از بهترین فریم ورک های

نموده است.

9.38

نی زیر مراجعه نمایید.به منظور کسب اطالعات بیشتر، دریافت فریم ورک و راهنمایی های الزم به وب سایت فریم ورک به نشا

https://symfony.com

Cake PHP پی است که در میان فریم ورک های برتر و قابل اتکاء قرار دارد.اچکیک یکی از قدیمیترین فریم ورک های پی

تمرکز فریم ورک کیک بر روی کد نویسی کمتر و همچنین تولید کد های مورد نیاز به صورت خودکار است.

سیار ساده از دیگر مزایای کیک می باشد که در کنار نصب آسان منجر به ایجاد محصوالت نهایی با سرعت بسیار زیاد می شود.پیکر بندی ب

Cake PHP

نصب و استفاده

و باالتر نیاز دارد. 5.4.0 نسخه PHPبه Cake PHPنصب

زر از کامپونصب کیک را می توان به سادگی از طریق دانلود سورس کدها و یا استفاده

انجام داد.

پیکربندی بسیار ساده آن از دیگر مزایای نصب این فریم ورک می باشد.

9.60

سادگی یادگیری مرحله تقسیم نمود. 2یادگیری کیک را می توان به

در مرحله اول یادگیری تولید اپلیکیشن ها با کمک کیک و در مرحله دوم یادگیری

API شت.های کیک را بایستی در نظر دا 9.20

Page 62: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

51 1314 مرداد PHP همایش

مستنداتهای رسمی کیک بسیار کامل و با مثال های مناسب و خوبی ارائه مستندات و آموزش

شده است.

کتاب هایی نیز جهت استفاده و راهنمایی بیشتر در دسترس توسعه دهندگان می باشد.9.60

جامعه فعال استفاده

کنندگان

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

مجموعه راه های دسترسی به جامعه فعالین کیک باعث شده که این فریم ورک جامعه

فعالی از توسعه دهندگان داشته باشد.9.60

توسعه پایدار و قابلیت

اطمینان

تمرکز توسعه دهندگان کیک بر روی سرعت تولید محصول نهایی باعث شده تا این

مجبور به ثجاد تغییرات مهم و اساسی شود. فریم ورک در برخی نقاط

با راه های مختلف و بعضا بسیار 3و 2و 1امکانات این فریم ورک در نسخه های

متفاوتی در اختیار قرار دارند.

8.90

تسریع در تولیدکیک را می توان از بهترین فریم ورک ها در زمینه سرعت بخشیدن به تولید محصول

هم به دلیل وجود ابزارهای دلیل ماهیت و الگوی ساختاری آن، نهایی دانست، هم به

تولید کد در آن.9.70

الگوهای طراحی

و سادگی خاصی در پیاده سازی این می باشد PMVCالگوی طراحی اصلی در کیک

الگو از سوی توسعه دهندگان آن در نظر گرفته شده است.

ارچه و منظم از نقاط ضعف این فریم با این حال کمبود الزامات طراحی به صورت یکپ

ورک می باشد.

9.00

ایرابط دادهقدرتمند جهت Table Objectدرون ساخت و همچنین یک ORMکیک از یک

9.40 کار با داده ها برخوردار است.

و خطایابی امنیتکیک ابزارهای بسیار مناسب و کاملی در جهت امنیت بخشی به محصوالت دارد اما

یمفونی این مجموعه ابزار ها بایستی توسط توسعه دهنده مورد استفاده قرار همچون س

بگیرد و کمتر به صورت درون ساخت مورد استفاده قرار گرفته اند.9.70

سربار و کارایی

عملکردی

بزرگی کتابخانه و تعداد فایل های این فریم ورک به دلیل استفاده مناسب و کم کردن

9.00 بر محصول نهایی تحمیل می کند. ارتباطات سربار کمی را

امکاناتکیک نیز همچون سیمفونی از لحاظ دارا بودن امکانات و قابلیت های درون 3نسخه

9.50 ساخت یکی از کاملترین فریم ورک های پی اچ پی است.

چشم اندازتفاوت های مشخص و بعضا بسیار فاحش نسخه های این فریم ورک با یکدیگر در کنار

شم اندازی که بیشتر بر سورس کد و استانداردهای مربوطه تمرکز دارد، ضعفی است چ

که توسعه دهندگان کیک را آزار می دهد.8.60

جمع بندیکیک قدیمی و استوار به نظر می رسد، پروژه های بسیاری را تولید کرده و تقریبا برای

9.32 هر نوع پروژه ای راه حل مناسبی به نظر می رسد.

به منظور کسب اطالعات بیشتر، دریافت فریم ورک و راهنمایی های الزم به وب سایت فریم ورک به نشانی زیر مراجعه نمایید.

http://cakephp.org

Yii Framework ده باشد.به نظر خوب می رسد زمانی که سریع باشد، حرفه ای باشد و از همه مهمتر کمک کنن Web 2.0فریم ورکی با شعار توسعه برای

Yii را می توان فریم ورکی برای تمام فصول نامید، قدرتمندی و سرعت آن تنها محدود به ابزارها و امکانات آن نمی باشد، بلکهYii می تواند

جای توسعه دهندگان نیز کد تولید کند.

بدست آمده است. Yiiشاید اغراق نباشد اگر بگوییم بهترین تجربه های نوشتن شبکه های اجتماعی با استفاده از

Page 63: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

Yii

نصب و استفاده

و باالتر نیاز دارد. 5.4.0 نسخه PHPبه Yii Frameworkنصب

Yii را می توان با کامپوزر نصب نمود و یا حتی آنرا از طریق آرشیوش دانلود و نصب

کرد.

پیکربندی یک دیتابیس باشد. Yiiشاید تنها تنظیمات الزم برای نصب

9.60

دگیریسادگی یاساده می شود زمانی که بتوانید از یک سرباالیی نسبتا شیب دار Yiiتولید و توسعه با

9.10 .آموزشی بگزرید

مستندات

کامل و با مثال های مناسب و خوبی ارائه شده Yiiهای رسمی مستندات و آموزش

م ورکاست، اما قدیمی بودن برخی از مثال ها و مستندات نمره ای منفی برای این فری

به حساب می آید.

بیش از هر فریم ورک دیگری کتاب نوشته شده است، بد نیست رتبه یک را Yiiبرای

بدهیم. Yiiدر مستندات غیر رسمی به

9.50

جامعه فعال استفاده

کنندگان

یکی از مشخصه های این فریم ورک می Yiiسرسختی فعاالنه استفاده کنندگان از

باشد.

را ترجیح داده و کوچ Pahlcon یا laravelستند کسانی که کار با با این حال، کم نی

کرده اند.

9.10

توسعه پایدار و قابلیت

اطمینان

Yii را می توان یکی از با ثبات ترین فریم ورک هایPHP دانست که تغییرات به

شکل حساس و با پیش بینی های الزم در آن انجام می شود.

بر می 2012به سال Yiiشده از سوی تیم توسعه دهنده آخرین چشم اندازهای ارائه

گردد که این یکی از نقاط مبهم و تاریک این فریم ورک بشمار می ورد.

8.60

تسریع در تولیدYii و توسعه دهندگانش سرسختانه معتقدند که روند توسعه محصول نهایی باYii به

این فریم ورک نیز با توجه شکل چشم گیری تسریع می شود، برخی از امکانات خوب

به همین نیاز توسعه داده شده است. 9.70

الگوهای طراحیبرای توسعه سریعتر یک حسن اما برای حفظ Yiiراحتی و آزادی الگوی طراحی در

8.90 یکپارچگی و توسعه محصوالت یک نقطه ضعف بشمار می رود.

ایرابط داده

Database Access Objectsو یا Active Recordاز طریق Yiiداده ها در

(DAO) که مختص خودYii .است

کار با داده ها خصوصا مدل ها را کمی مشکل می سازد. Yiiدر ORMنبود یک 9.10

و خطایابی امنیت

با آنکه خوب و قابل اتکاء می باشند، به نسبت سایر Yiiابزارهای امنیتی درون ساخت

حدودتر می باشد.فریم ورک ها بسیار کمتر و م

است، استثنائاتی که تعداد Exceptionمبتنی بر Yiiمکانیزم مدیریت خطا در

زیادشان همچون فریم ورک زند کمی گیج کننده خواهد بود.

8.90

سربار و کارایی

عملکردی

Loaderقرار داد و این به دلیل Phalconرا می توان پس از Yiiسرعت و کارایی

است که مکانیزم لود کردن را تنها در زمانهای مورد نیاز انجام خواهد بسیار مناسب آن

داد. 9.70

امکانات

Yii ... را می توان فریم ورکی دانست که ابزارهای جانبی آن همچون تولید کد و

بیشتر از امکانات درون ساخت آن می باشد.

کافی به نظر تا بزرک،با این حال امکانات این فریم ورک برای ایجاد پروژه های کوچک

می رسد.

9.20

چشم اندازبر می 2012به سال Yiiآخرین چشم اندازهای ارائه شده از سوی تیم توسعه دهنده

8.30 گردد که این یکی از نقاط مبهم و تاریک این فریم ورک بشمار می ورد.

مجموعYii .سریع است و روند تولید محصول را نیز سریع می سازد

ال کمی ضعف در اطالع رسانی دارد که توسعه دهندگان آنرا شاید به زحمت با این ح

بیاندازد.9.14

Page 64: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

به منظور کسب اطالعات بیشتر، دریافت فریم ورک و راهنمایی های الزم به وب سایت فریم ورک به نشانی زیر مراجعه نمایید.

http://yiiframework.com

CodeIgniter

CodeIgniter سریع با سعی در ایجاد کمترین رد پا بر روی محصول نهایی که خود منجر به کاهش سربار بر روی محصول فریم ورکی است

نهایی خواهد شد.

می دانند که در مواقع لزوم می تواند به کمک توسعه دهندگان بیاید. PHPبرخالف نظر توسعه دهندگانش، بسیاری آنرا تنها جعبه ابزاری برای

های موجود، این فریم ورک را برای توسعه دهندگانی که از این نوع Shared Hostingان این فریم ورک بر روی نصب بسیار راحت و آس

آل ساخته است.هاستینگ استفاده بیشتری می کنند، ایده

CodeIgniter

نصب و استفاده

و باالتر نیاز دارد. 5.4.0 نسخه PHPبه CodeIgniterنصب

توسعه دهندگان آن دانلود سورس کد را برای نصب ترجیح می با وجود فایل کامپوزر،

دهند.

CodeIgniter .بعد از تغییر یک فایل پیکربندی، آماده استفاده است

9.70

سادگی یادگیریرا نمی توان سخت و پیچیده دانست، اما نسبت به برخی از CodeIgniterیادگیری

9.00 از برنامه نویسی دارد.فریم ورک ها برای یادگیری نیاز به درک بهتری

مستنداتتعداد موضوعات و مستندات این فریم ورک به نظر کافی می رسد، اما زمانی که آنها را

9.00 مشاهده می کنید، با مطالبی نسبتا کم حجم و بعضا بی مثال مواجه می شوید.

جامعه فعال استفاده

کنندگان

از پویا ترین جامعه ها دانست که یاری را می توان یکی CodeIgniterجامعه فعالین

9.40 رسان بسیار خوبی در جهت حل مشکالت و ایجاد محتوای آموزشی بشمار می آیند.

توسعه پایدار و قابلیت

اطمینان

باعث شده است که توسعه این CodeIgniterساختار ساده و به دور از پیچیدگی

ت انجام شود.فریم ورک با شیبی بسیار مالیم اما تقریبا ثاب

نشان می دهد که قابل اعتماد است. CodeIgniterپروژه های قدیمی نوشته شده با 9.20

تسریع در تولیدمی تواند CodeIgniterدرک درست از محصول نهایی و چگونگی پیاده سازی آن با

9.50 کمک شایانی به سرعت بخشیدن به تولید و توسعه داشته باشد.

الگوهای طراحی

CodeIgniter ا ای رخود ترکیبی است از اشیاء و توابع، و تقریبا هیچ الگوی طراحی

نمی توان یافت که قابل پیاده سازی در آن نباشد.

با این حال ترکیب اشیاء و توابع، کمی الگوی طراحی را پیچیده و دور از استاندارد

خواهد ساخت.

8.80

ایرابط داده

CodeIgniter از نوعی خود ساختهActive Record را به همراه خود دارد که

را به خوبی پردازش و اجرا می کند. SQL دستورات

که با هدف کاهش سربار از آن صرفنظر شده است، کمی کار با ORMاما نبود یک

اشیاء داده ای را سخت تر خواهد نمود.

9.00

و خطایابی امنیت

ده توسعه دهنده خواهد بود و در این راه عمده کارهای امنیتی در این فریم ورک بر عه

تهیه و جمع آوری شده است. CodeIgniterابزارهای مناسبی توسط

همچون الگوی طراحی در آن کامال آزادانه قابل انتخاب CodeIgniterخطایابی در

خواهد.

8.80

سربار و کارایی

عملکردی

پی قرار اچم ورک برتر پیفری 3را می توان در میان CodeIgniterسرعت و کارایی

داد و این به دلیل تمرکز تیم توسعه دهنده آن بر ایجاد کمترین رد پا از فریم ورک بر

روی محصول نهایی است.9.60

Page 65: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

12 1314 مرداد PHP همایش

امکاناتHelper ها درCodeIgniter یکی از نقاط قوت این فریم ورک می باشد که ابزارها

9.40 عه دهندگان قرار می دهد.و قابلیت های بسیار مناسبی را در اختیار توس

چشم اندازرسمی و ایجاد برخی تغییرات بدون اطالع رسانی قبلی، Roadmapنبود یک

CodeIgniter و توسعه آنرا مبهم نموده تا جایی که هر از چند وقت، زمزمه ای مبنی

بر انحالل این پروژه به گوش می رسد.7.60

جمع بندیCodeIgniter ات است، تعداد زیادی توسعه دهنده دارد و تالشش بر قدیمی و با ثب

ایجاد سریع و یا کمترین سربار و ردپا ست.

ها محبوبیت زیادی برایش به ارمغان آورده. Shared Hostingنصب آسانش بر روی 9.08

انی زیر مراجعه نمایید.به منظور کسب اطالعات بیشتر، دریافت فریم ورک و راهنمایی های الزم به وب سایت فریم ورک به نش

http://codeigniter.com

Nette

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

به جایگاه بسیار خوبی در را Netteپشتیبانی از بسیاری از تکنولوژی های مدرن و به روز به همراه سرعت بخشی به روند توسعه محصول نهایی

رسانده است. PHPمیان فریم ورک های

در یکی از کاملترین بسته های امنیتی موجود است که به همراه خود دارد. Netteبا این حال نقطه قوت

Nette

نصب و استفاده

و باالتر نیاز دارد. 5.3.1 نسخه PHPبه Netteنصب

را به صورت آرشیو دانلود کنند اما Netteکه توسعه دهندگان بیشتر ترجیح می دهند

کامپوزر نیز در اختیار آنها خواهد بود.

می توان کامپوننت های آنرا نیز به صورت جداگانه Nette هاببا مراجعه به گیت

نصب نمود.

9.60

سادگی یادگیریبه منظور یادگیری هرچه بهتر ، شروع Netteدرون ساخت در Sandboxوجود یک

9.20 را بسیار آسان نموده است. Netteدگیری یا

مستنداتنسبتا کافی به نظر می رسد، اما زمانی که نیاز به مثال ها و Netteمستندات رسمی

اطالعات جامع تری دارید، بایستی در جوامع توسعه دهندگان به دنبال اطالعات مورد

نیاز خود باشید.8.60

جامعه فعال استفاده

کنندگان

عموما اروپایی هستند به همین دلیل جامعه چند زبانه ای Netteاده کنندگان از استف

9.00 پیرامون این فریم ورک شکل گرفته است که در نوع خود بسیار کامل به نظر می رسد.

توسعه پایدار و قابلیت

اطمینان

ی را بتوان دارا Netteوجود اجزاء مستقل و توسعه هماهنگ آنها باعث شده است که

9.20 پایداری و قابلیت بسیار زیاد دانست.

تسریع در تولید

میتوانید روند تولید محصول را بسیار Netteبا استفاده از کامپوننت های مناسب در

سرعت ببخشید.

Nette .کمک شایانی به ایجاد سایر اجزاء قابل استفاده خواهد کرد 9.40

الگوهای طراحی

سخت مسیر یابی و ایجاد دایرکتوری های تو در تو مشکلی اگر با ساختار نسبتا سفت و

دوست توسعه دهندگان Netteموجود در MVCوجود نداشته باشد، الگوی طراحی

خواهد بود و توسعه را برای آنها آسان خواهد ساخت.9.00

ایرابط داده

Query ها یا استفاده ازContext چیدگی این فریم ورک بسیار ساده و به دور از پی

به جای اشیاء مدل، کار با Model Layerاست اما استفاده از یک الیه به عنوان

ای را کم سخت و پیچیده می سازد.اشیاء داده8.90

Page 66: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

13 1314 مرداد PHP همایش

و خطایابی امنیت

به مطلوب ترین شکل ممکن قابل پیاده سازی است، نقطه قوتی که Netteامینت در

Nette .را از سایر رقبا متمایز می سازد

داد و خاصیت الگ کردن Netteید بتوان لقب زیباترین سیستم نمایش خطا را به شا

خودکار خطاها یکی دیگر از خصوصیات بارز این فریم ورک می باشد.

9.80

سربار و کارایی

عملکردی

به نحوی است که سربار ناشی از فریم ورک را به حداقل Netteجدا سازی اجزاء در

9.50 رسانده است.

ناتامکابسیار مناسب به Netteاگر محصول نهایی تکنولوژی هایی پیشرفته نیاز داشته باشد

و ... Authentication ،Imageنظر می رسد، اما برخی کاستی ها نیز همچون نبود

وجود دارد. Netteدر 9.00

چشم اندازرا به مثال زدنی است، اما نبود یک چشم انداز رسمی این فریم ورک Nette ثبات

8.10 چالش انداخته است.

جمع بندیخوب و جامع اند و می توانند در تولید سریع محصول نهایی Netteکامپوننت های

ساختار محصول نهایی را کمی Netteنقش بسزایی داشته باشند، اما فریم ورک

پیچیده خواهد ساخت.9.11

نمایی های الزم به وب سایت فریم ورک به نشانی زیر مراجعه نمایید.به منظور کسب اطالعات بیشتر، دریافت فریم ورک و راه

http://nette.org

Kohana

شعار فریم ورک کوهانا زیباست: فریم ورکی زیبا و با سلیقه با کامپوننت های غنی و قدرتمند برای تولید برنامه های وب.

کوهانا طرفداران زیادی برای خود دست و پا کند.این شعار زیبا در کنار کارایی مناسب این فریم ورک باعث شده

با این حال به دلیل کد نویسی ساده و کمتر مستند شده به زعم برخی، کوهانا را شبیه وردپرس غیر ساختیافته کرده است.

Kohana

نصب و استفاده

و باالتر نیاز دارد. 5.3.3 نسخه PHPبه Kohanaنصب

ود ندارد و کوهانا را تنها می توان دانلود نمود و از کامپوزری رسمی برای کوهانا وج

سورس کد آن استفاده کرد.

با این حال بر روی گیت هاب کوهانا و تمامی کامپوننت هایش قابل استفاده خواهد بود.

8.80

سادگی یادگیریروند یادگیری کوهانا در ابتدا ساده به نظر می رسد اما به مرور و استفاده از کامپوننت

8.90 های آن زمان بیشتری جهت درک معماری و استفاده از آن نیاز خواهد بود.

مستنداتنیز پیش PHPو گاهی تا آموزش زبان شفاف و گویاست Kohanaمستندات رسمی

می رود.

اما برخی مباحث پیشرفته نیاز به جستجو در منابع غیر رسمی را افزایش می دهد.8.80

جامعه فعال استفاده

دگانکنن

نشان از جامعه ای فعال از توسعه oDeskو Stack Overflowتاالر رسمی کوهانا ،

دهندگان پیرامون کوهانا دارد.

در این جامعه اتفاق افتاد کمی این فریم 2012با این حال کوچ بزرگی که در سال

ورک را از صدر لیست محبوبیت دور ساخت.

9.00

توسعه پایدار و قابلیت

اطمینان

امپوننت های کوهانا از بدو توسعه در بسیاری از پروژه های بزرگ و کوچک شرکت ک

کرده اند و تیم کوهانا موفق شده است با قدرت و حرفه ای گری کوهانا را به صورت

قابل اعتمادی پیشرفت دهند.

کمی سختگیرانه به نظر می آید اما تغییرات در کوهانا عموما بدون اطالع قبلی انجام

یرند و این برای توسعه دهندگان اصال دلخوش کننده نیست.می پذ

9.10

Page 67: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

14 1314 مرداد PHP همایش

تسریع در تولیدبدون شک این یکی از نقاط قوت این فریم ورک به شمار می آید تا جایی که کوهانا و

9.30 کامپوننت های آن را می توان در بسیاری از تولیدات مشاهده نمود.

الگوهای طراحی

می باشد که برای HMVCرای تولید محصوالت مدل و الگوی رسمی کوهانا ب

محصوالت بزرگ و پیچیده بسیار مناسب است.

با این حال انعطاف در سبک الگوهای طراحی کمتر در این فریم ورک مشاهده می

شود.

9.10

ایرابط داده

درون ساختی است که بسیاری از آپدیت های ORMکار با داده ها در کوهانا مبتنی بر

ن فریم ورک را به خود اختصاص داده بود.اولیه ای

و مدل مورد استفاده در کوهانا بسیار ساده شده و کار با داده ها را ORMامروزه این

آسان نموده است.

9.10

و خطایابی امنیت

متد های نسبتا کامل ایجاد امنیت در وردی ها، داده ها و اطالعات کوهانا را بسیار ایمن

از این متدها در اختیار توسعه دهنده خواهد بود.نموده اما استفاده

Exceptionو هم به صورت Error Handlingخطایابی در کوهانا هم به صورت

Handling .در اختیار توسعه دهندگان قرار دارد

9.30

سربار و کارایی

عملکردی

واهد سربار لود شدن فایل ها در کوهانا کمتر بر روی کارایی محصول نهایی تاثیر خ

9.50 داشت و این فریم فرک را می توان نسبتا سریع ارزیابی کرد.

امکانات

اگر با منطق برای هر کاری متدی در کالسی وجود دارد مشکلی وجود نداشته باشد،

ها عمل Helperابزارهای کوهانا مفید خواهند بود و کوهانا همچون مجموعه ای از

خواهد کرد.

ی کوهانا در پروژه های نسبتا بزرگ تا بزرگ نیاز به تغییر و اما بسیاری از قابلیت ها

توسعه توسط توسعه دهنده خواهد داشت.

8.90

چشم انداز کوهانا نیز همچون از نبود یک چشم انداز و دورنمای رسمی رنج می برد.

ابا این حال کاربران فعال تاالر کوهانا خود چشم اندازهایی را در برابر تیم توسعه کوهان

قرار می دهند.8.20

جمع بندیکوهانا به نظر پیر می رسد با این حال تجربه و قدمتش به کمک توسعه دهندگانی می

9.00 رود که می خواهند از کامپوننت ها و اجزاء خوب آن استفاده کنند.

ک به نشانی زیر مراجعه نمایید.به منظور کسب اطالعات بیشتر، دریافت فریم ورک و راهنمایی های الزم به وب سایت فریم ور

http://kohanaframework.org

FuelPHP یم ربه عنوان آخرین فریم ورک مورد بررسی قرار گرفته، فریم ورکی قرار دارد که ادعا می کند تمام خصوصیات و ایده های خوب و سودمند سایر ف

ورک ها را به عنوان پایه خود قرار داده است.

FuelPHP ست که توسعه دهندگانش بیشترین تمرکز را بر روی نظر و اجتماع استفاده کنندگانش قرار داده است، تا جایی که فریم ورکی ا

توسعه دهنده بر روی آن کار می کنند. 300نزدیک به

HHVMو PHP 7در نظر گرفت که دارد به سوی PHPرا می توان مدرنترین فریم ورک FuelPHPجدا از این توضیحات قانع کننده

حرکت می کند.

Page 68: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

15 1314 مرداد PHP همایش

FuelPHP

نصب و استفاده

و باالتر نیاز دارد. 5.3.3 نسخه PHPبه FuelPHPنصب

هم از طریق کامپوزر و هم دانلود سورس Git Hubهم از طریق FuelPHPنصب

کد ها امکانپذیر است.

نیاز به مطالعه بخش مربوطه در مستندات آن دارد و کمی به FuelPHPپیکر بندی

انش از محیط توسعه خواهد داشت.د

9.40

سادگی یادگیریآسان FuelPHPیادگیری کار کرده باشید، PHPاگر پیش از این با یک فریم ورک

با این حال وجود کالس ها و متدهای چند کاره می تواند به روند یادگیری خواهد بود،

پیچیدگی هایی بیافزاید.9.10

مستندات

راحتی بسیاری در Table of Contentsبه عنوان یک FuelPHPوجود مستندات

استفاده خواهد داشت.

برای آنها که خواهان مثال ها و توضیحات FuelPHPکلی نگری در مستندات

بیشتری هستند می تواند نقطه ای منفی باشد.

نوشته شده است که می توان از آنها استفاده FuelPHPکتاب های خوبی نیز برای

نمود.

9.00

جامعه فعال استفاده

کنندگان

FuelPHP را جامعه پیرامون آن هدایت و راهبری می کنند از همین روی می توان

9.40 جامعه آنرا بسیار فعال ارزیابی نمود.

توسعه پایدار و قابلیت

اطمینان

قابلیت اطمینان FuelPHPبه دلیل توسعه توسط توسعه دهندگانی از سراسر دنیا

اما به همین دلیل ثبات و پایداری آن تحت نظر همین توسعه دهندگان باالیی دارد،

ممکن است به خطر بیافتد.8.90

تسریع در تولیداین فریم ورک برای آنکه بتواند روند تولید محصول نهایی را سریع کند کمی پیچیدگی

وان تدارد، اگر با پیچیدگی های ساختاری و نام گذاری مشکلی وجود نداشته باشد، می

نهایت استفاده را در تولید محصول داشت. FuelPHPاز 9.00

الگوهای طراحی

می باشد HMVCو MVCبرای تولید محصوالت FuelPHPمدل و الگوی رسمی

که هم برای محصوات کوچک و هم برای محصوالت بزرگ و پیچیده مناسب است.

وند پیگیری الگو را کمی با ها می تواند ر Routاما برخی پیچیدگی ها در زمان اجرای

دردسر مواجه سازد.

9.10

ایرابط داده

مستقیم داده هاست. Queryمبتنی بر مدل و FuelPHPکار با داده ها در

ORM این فریم ورک نیز مبتنی بر مدل های از پیش تعیین شده است که کمی

انعطاف را در استفاده از اشیاء داده کاهش خواهد داد.9.00

و خطایابی امنیت

مربوط به فیلتر سازی داده ها و FuelPHPبیشترین امکانات امنیتی قرار گرفته در

ورودی هاست که آنها نیز بایستی توسط توسعه دهنده مورد استفاده قرار بگیرد.

خطایابی را بیشتر به عهده توسعه دهنده محصول FuelPHP توسعه دهندگان

رها Exceptionیت آنها را تنها به صورت یک گذاشته اند و بیشتر خطاها و مدیر

ساخته اند.

9.00

سربار و کارایی

عملکردی

را می توان وابسته به نوع FuelPHPدر زمینه کارایی و سربار ناشی از فریم ورک ،

پروژه ارزیابی کرد.

سربارهای متفاوتی را بر FuelPHPو مدل داده Routingبسته به الگوی طراحی،

ایی تحمیل خواهد کرد.محصول نه

با این حال این سربار آنچنان متفاوت از سایر فریم ورک ها نخواهد بود.

9.10

امکانات

وجود متدهای استاتیک بسیار در کالس های این فریم ورک، آنرا شبیه به مجموعه ای

از توابع و کتابخانه ای از متد ها ساخته است که در عین سادگی و کار آمدی، ساختار

د های این فریم ورک را پیچیده خواهد نمود.ک

را کامل ارزیابی نمود. FuelPHPبا این حال از لحاظ امکانات می توان

9.10

Page 69: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

چشم اندازFuelPHP را توسعه دهندگانی از سراسر دنیا توسعه می دهند که چشم انداز بسیار

9.50 خوبی برای آن ترسیم کرده اند.

جمع بندیFuelPHP و توسعه دهندگانی دارد که از سراسر دنیا کمک اش می مدرن است

کنند.

این هم نقطه قوتی است برای آن هم نقطه ضعف.9.13

به منظور کسب اطالعات بیشتر، دریافت فریم ورک و راهنمایی های الزم به وب سایت فریم ورک به نشانی زیر مراجعه نمایید.

http://fuelphp.com

جدول جامع مقایسه

جدول زیر جمع بندی مقایسه ها را مشاهده می نمایید:در

Page 70: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

چارت ها و نمودار ها

۲04۵به منظور انجام پروژه های کاری در سال PHPنمودار محبوبیت فریم ورک های

۲04۵به منظور انجام پروژه های شخصی در سال PHPنمودار محبوبیت فریم ورک های

Page 71: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

12 1314 مرداد PHP همایش

Site Pointبه نقل از ۲041ها در سال نمودار استفاده از فریم ورک

۲04۵در سال Site Pointبرترین فریم ورک ها از نظر کاربران

PHPنمودار تست کارایی فریم ورک های

Page 72: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

http://systemsarchitect.netانجام شده توسط :

جمع بندی و نتیجه گیری

ستفاده از فریم ورکی خاص نمی کند، یا می خواهید فریم ورک جدیدی انتخاب نمایید و یا اگر سازمانی که برای آن کار می کنید شما را ملزم به ا

پی نمایید؛ جدول زیر که نتایج این مقاله است شما را اچحتی اگر می خواهید از همین امروز شروع به یادگیری یک فریم ورک جدید در پی

راهنمایی خواهد نمود:

فریم ورک های پیشنهادی نیازمندی

سرعت باال و کمترین سربار ناشی از استفاده از فریم ورک1. Phalcon

2. CodeIgniter یاKohana

3. Yii Framework

سرعت یادگیری و مستندات قوی و حرفه ای1. Laravel

2. Phalcon

3. Symfony 2

سرعت بخشی به روند تولید و توسعه محصول نهایی1. Cake PHP

2. Yii Framework

3. Phalcon

ی امنیتیامنیت و ابزارها1. Nette

2. Symfony 2

3. Cake PHP

ابزارها، کامپوننت ها و امکانات درون ساخت 1. Symfony 2

2. Cake PHP

3. Zend Framework 2

ها Shared Hostingسادگی نصب و امکان استفاده بر روی 1. CodeIgniter

2. Phalcon

3. ZF 2 یاNette

Page 73: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

دارای آینده و چشم انداز بهتر1. Symfony 2

2. FuelPHP

3. Phalcon

پیشنهاد مقاله1. Phalcon

2. Symfony 2

3. Laravel

مراجعه PHPبخش مربوط به کنفرانس http://www.Hamiid.comبه منظور کسب اطالعات بیشتر به وب سایت نویسنده به آدرس

با نویسنده در تماس باشید. amiid.comMe@Hنموده و یا با پست الکترونیکی

منابع

stackoverflow.com

phpframeworks.com

sitepoint.com

beebom.com

webrevisions.com

en.wikipedia.org

symfony.com

laravel.com

cakephp.org

framework.zend.com

phalconphp.com

fuelphp.com

nette.org

kohanaframework.org

codeigniter.com

yiiframework.com

symfony.com

Page 74: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

PhalconPHP با ماه 6

سعیدی سینا

مقدمه

52phalcon 53 الگوی بر مبتنی چارچوبیMVC نویسی اسکریپت زبان با 54وب تحت افزارهای نرم توسعه برای php در بار نخستین که است

.شد منتشر github در BSD لیسانس تحت 2112سال

php 55افزونه یک قالب در کارایی بهبود و رساندن حداکثر به برای phalcon، فریمورکphp دنیای در مطرح های چارچوب سایر برخالف

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

اند.را به سمت طراحی چارچوبی جدید با مدل و معماری نوآورانه سوق داده phalconدهندگان توسعه

چیست؟ هدف

اند.سازی شده پیاده و طراحی php زبان با که ها چارچوب سایر از باالتر مراتب به نرخی با وب های درخواست به پاسخگویی

نخواهید C نویسی برنامه زبان یادگیری به نیازی چارچوب این با وب تحت هایافزاری نرم توسعه برای شما که اینجاست در جالب بسیار نکته

سرباری برای وب اپلیکیشن هیچگونه است و نه تنها شده آماده شما برای php زبان به هایی کالس صورت به امکانات تمامی که داشت، چرا

اهد داد.داشت بلکه کارایی برنامه شما را به طرز چشمگیری افزایش خو نخواهد شما

کمال به رسیدن دنبال به افزاری نرم تیم و پروژه دهنده، مدیرتوسعه که هر مفهاهیمی هستند 52SoCو 51DRY ، اصل51کد از مجدد استفاده

با مطابق که دهد می ما به را امکان این یعنی دارند 51Loosely Coupled ساختاری آن اجزای و phalconها است و خوشبختانه آن در

.کنیم استفاده هایی موردنیازو بخش اجزا از فقط پروژه نیاز

هدف! است بهتر خلق نشده کارایی برای فقط phalcon: ” کنند می یاد جمله این با از آن چارچوب این دهندگانتوسعه جالب است بدانید که

."است استفاده در سهولت مهمتر همه از و ها ویژگی و امکانات از انواعی با قدرتمند ما ایجاد چارچوبی

. بررسی و نگاهی مختصر به مزایا و معایب آن داشته باشیم را های مختلف این چارچوبکه جنبه کرد خواهیم سعی ادامه در ما نیز

52https://phalconphp.com 53https://en.wikipedia.org/wiki/Model–view–controller 54Web application 55Extension () 56https://en.wikipedia.org/wiki/Code_reuse 57Don't repeat yourself 58https://en.wikipedia.org/wiki/Separation_of_concerns 59https://en.wikipedia.org/wiki/Loose_coupling

Page 75: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

12 1314 مرداد PHP همایش

phalcon معماری و سازی پیاده

یک قالب در وب هایدرخواست به پاسخگویی نرخ و کارایی باالبردن هدف با phalcon کردیم، چارچوب اشاره مقاله مقدمه در که همانطور

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

.است میان در هم 11zephir نام به

Zephir

zephir 11 و باال سطح زبان یکDSL هایافزونه گهدارین و توسعه که است php با را خود افزونه بخواهید شما اگر. کندمی ترساده را

: باشید، مانند داشته مدنظر همیشه بایستی C نویس برنامه یک عنوان به شما که دارند وجود کنید، مواردی سازیپیاده C نویسی برنامه زبان

• Garbage collection

• Memory Safety

• Pointers and direct memory access

Zephir زبان به را خود کد افزونه چطور؟ شما کند، اما می مدیریت و کنترل شما برای را موارد این تمامی Zephir کامپایلر با و نوشته

Zephir کنید، می کامپایل Zephir ای به افزونه را شما کدphp باشید باال موارد نگران شما باشد نیاز اینکه بدون کند می تبدیل.

Zephir برای جایگزینی c یا php کد شبیه که را کدی دهد می امکان شما به فقط نیست php یک افزونه نهایتا و نوشته است

توانید می githubاست که با مراجعه به مخزن این پروژه در phalconاین زبان نیز محصول دیگری از تیم .بگیرید تحویل شده کامپایل

عاتی بیشتری در این رابطه کسب کنید.اطال

:شد خواهید مواجه زیر آمار با کنید مراجعه Phalcon پروژه گیتهاب به اگر

Cدرصد کد 25.5 •

PHP کد درصد 34.5 •

Zephir کد درصد 21.1 •

تبدیل C کد به Build فرآیند از بعد نهایتا که است Zephir باالی سطح زبان به phalcon کد از بزرگی بخش بینید می که همانطور

.شد خواهد

از که خود اختصاصی Cipher پروژه مانند پکیج یک از بخشی توانید می داشت، شما ای هوشمندانه های استقاده میتوان Zephir از

.کنید سازی پیاده Zephir با را است برخوردار خاصی اهمیت

:دارد مهم بسیار مزیت دو کار این

.کند می پیدا یشافزا اجرا سرعت (1

به راداف دسترسی صورت در هرچند)نیست مشاهده قابل دیگر آن کد و است افزونه و باینری یک فقط سرور روی پکیج این امنیتی نظر از (2

(. دارد وجود معکوس مهندسی امکان هنوز افزونه این

اطنق دهندگانتوسعه هاپروژه از بسیاری در دلیل همین به و دارند های مفسریکد در زبان هایفایل به نسبت زیادی هایبرتری 12اجرایی هایفایل

.کنندمی سازیپیاده کامپایلری هایزبان در را سیستم مهم و حساس

همچنین مواردی چون بروزرسانی فایل و .است یادگیری دوره یک و زمان صرف نیازمند یک افزونه توسعه برای C و zephir از استفاده اما

ممکن است منجر به بروز اخالل در کارکرد سرور شود. buildهای مرتبط به دلیل نیاز به فرآیند کتابخانه

60http://zephir-lang.com 61https://en.wikipedia.org/wiki/Domain-specific_language 62Binary

Page 76: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

13 1314 مرداد PHP همایش

دیگرهیچ و کارایی

شوند که در مقایسه با سایر زبان اجرا سپس و تفسیر بایستی هافایل کل درخواست هر برای است؛ یعنی آن بودن مفسری php از معایب یکی

کارایی برنامه خواهد شد.های برنامه نویسی باعث افت

در نهایت ما یک فایل buildطراحی شده است که پس از پروسه Zephirو زبان سطح باالی Cهمانطور که گفتیم با زبان phalconاما

اجرایی خواهیم داشت که نیازی به تفسیر ندارد و سرعت اجرای برنامه تا حد زیادی باال خواهد رفت.

مانند: دارد، وجود ها اپلیکیشن وب کارایی یا راندمان بردن باال برای مختلفی های روش php دنیای در

• 13opcode caching یا bytecode caching (فرآیند بار هر اینصورت غیر در syntax checking می انجام

(شود

in-memory های دیتابیس •

( Varnish) قدرتمند های HTTP Accelerator از استفاده •

زمینه پس در غیرضروری کارهای کردن postpone برای ها MQ از استفاده •

رسید؟ خواهید ال ایده کارایی به ابزارها این تمامی گیری بهره با شما آیا

دهد؟ نجات را شما تواند می روش این باشد سنگین ترافیک و پردازش از سنگینی حجم زیر شما اپلیکشین وب یا سایت اگر

5الراول که است حالی در این بدهد پاسخ را درخواست 1111هرثانیه در تواند می 1.3.4نسخه phalcon که دهد می نشان 14ها بنچمارک

!دارد را درخواست 11به پاسخگویی امکان فقط درهرثانیه

که گزارشی RAM حافظه مخصوصا و سیستم منابع از استفاده در

دهدمی ما به memory_get_peak_usage تابع

phalcon 1.5 ازای به را حافظه از مگابایت 2.15الراول و مگابایت

.کند می اشغال درخواست هر

63http://php.net/manual/en/book.opcache.php 64http://blog.a-way-out.net/blog/2015/03/27/php-framework-benchmark/

Page 77: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

14 1314 مرداد PHP همایش

زبان به اپلیکیشن وب توسعه چارچوب هر روی بر ساده بسیار hello world پروژه یک روی بر فقط هابنچمارک این که است الزم به ذکر(

php است گرفته صورت)

است؟ ممکن چطور

phalcon زبان به یک افزونه C خود مخصوص پلتفرم برای و دانلود آنرا تواند می شخصی هر که است build آن از پس و کند استفاده و

لود سرور وب تپروسه استار در php خود همراه به بار یک php هایافزونه .شد خواهد اجرا اجرایی افزونه فایل فقط درخواست هر ازای به

.شوند و این مزیت بزرگی به شمار می رود می

.اندشده طراحی C زبان و zephir با نیز چارچوب این اصلی هایکامپوننت حتی که است این phalcon باالی کارایی دالیل از دیگر یکی

• ORM

• PHQL

• Volt template engine

است ممکن ها فریمورک سایر که اضافی سرباری وجه هیچ به آنها سازی پیاده که هستند phalcon اجزای مهمترین فوق هایکامپوننت

.ندارد را باشند آن گرفتار

فاکتورهایی مهمترین درخواست هر در توابع و ها کالس متدها وجود ، بررسیphp فایل زیادی تعداد سازی، آماده php فایل صدها تفسیر

رقیب است. بی زمینه این در phalcon و آورند می ایینپ را ها فریمورک کارایی و سرعت که هستند

:دارد مانند پی در هم را مشکالتی phalcon بودن اما افزونه

ها shared hosting در مخصوصا نصب و build مشکالت •

کنم؟؟ دیباگ رو کدم میتونم چطور •

15phalcon در دیباگ کابوس

کنید؟ مرور را phalcon کالس یک از متد یک سورس بخواهید و دارد مشکلی امهبرن کنید حس شما اگر افتاد خواهد اتفاقی چه

65Debugging Nightmare

Page 78: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

15 1314 مرداد PHP همایش

اما کند می ارضاء را دهندگان توسعه کنجکاوی زیادی حد تا هم phalcon مستندات و است شده تست کامل phalcon کد چند هر

!حتی از روی کنجکاوی بداند را متد یک کار نحوه خواهد می دهنده توسعه یک که دارد وجود مواردی همیشه

چند هر شد روبرو با آن ما توسعه تیم که بود کابوسی بدترین این.کنید، دیباگ را خود کد خواهید می شما که افتد می اتفاق وقتی آن از بدتر

مترین نیاز ما، رسیدننداشت و مه وجود c در زبان کد دیباگ برای وقتی ولی داشتند را C تیم آشنایی کافی با زبان برنامه نویسی افراد

.بود اولیه پروژه دموی و 11MVP به سریعتر هرچه

باال بردن سرعت توسعه نرم افزار است و کارایی در اولویت دوم قرار دارد. همیشه راههای زیادی برای افزار نرم توسعه های چارچوب اصلی هدف

درخواست در ثانیه نیاز نیست. 1111پروژه به پاسخگویی با نرخ ارتقای کارایی وجود دارد و تقریبًا هرگز در نسخه های اولیه

پس چرا باید انقد سخت بگیریم موضوع رو؟

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

ای مختلف تا حدزیادی باال برد یا اینکه شما ممکن است بعدها حس کنید اگر قسمتی از برنامه را در قالب یک افزونه کارایی رو با روش ها و ابزاره

بنویسید کارایی باال خواهد رفت پس این کار را انجام بدهید. Goو یا یک زبان برنامه نویسی کامپایلری دیگر مثل Cبه زبان

Written by itself

تر خواهد بود و وسیع نیز دهندگان پروژهتوسعه دامنه شوندسازی میزبان پیاده زبان بوسیله همان یک هایو چارچوب هاکتابخانه ،ابزارها وقتی

دارند. phalconتمایل کمتری به سمت phpدهندگان به همین دلیل توسعه

بلی خود نوشته شود تا چه اندازه ممکن است در رشد و توسعه زبان و سازی قهای بعدی با پیادههم در نسخه 11حال فرض کنید اگر خود آن زبان

اکوسیستم آن تأثیر مثبت داشته باشد.

مستندات

phalcon مبتنی بر پلتفرم محبوب بهترین از یکی( مستنداتreadthedocs) هایدربین چارچوب php مثال ترمهم همه از و داشته

آرگومان و متدها از آن شما را کمی مأیوس خواهد کرد، در بسیاری api اما بخشند.را سرعت می ادگیریی پروسه زیادی حد تا که متنوعی های

شتیبانی راپ و نگهداری حتی موضوع این. پذیر نیستکد متد هم به دالیلی که در باال گفتیم به راحتی امکان مرور و ها توضیحات کاملی ارائه نشده

.و افرادی که در آینده به تیم ملحق خواهند شد درگیر این موضوع بوده و از آن گله خواهند کرد کندمی پیچیده و دشوار قدری هم

کاربری جامعه و دهنده توسعه تیم

phalcon آخرین نسخه نسخه منتشر شده و 21تا این لحظهphalcon نفر 122باشد.تعداد می 2.1.4لحظهcontributer در توسعه

phalcon کرده و نزدیک به هزار مورد سوال در مشارکتstackoverflow است. برای این چارچوب به ثبت رسیده

66https://en.wikipedia.org/wiki/Minimum_viable_product 67https://golang.org/

Page 79: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

2111به نزدیک و issue 2111از بیش توسعه است. حال در و جنب و جوش مناسبی فعالیت و پروژه با داشته قرار گیتهاب اصلی در مخزن

PR تاکنون برایphalcon ه است.در گیتهاب به ثبت رسیدphalcon کامیونیتی قدرتمند و وسیعی ندارد؛ انجمن کاربران هم به هیچ وجه

نیست. phpهای مطرح دنیای قابل مقایسه با سایر چارچوب

ها راباید رفع و خیلی از ویژگی را شخصا مشکالت از خیلی و توانید بیابیدنمی phalconزیادی برای آموزشی هایسری و کست ویدیو محتوا،

( ارائه می شود، همچنین هر Major releaseماه یک نسخه جدید) 1نیز کشف کنید. پروسه انتشار پس از نسخه دوم بدین شکل است که هر

( در گیتهاب منتشر Minor releaseهفته یک بار نسخه ای از همان نسخه ی فعلی که مشکالت امینتی و باگ های آن برطرف شده است) 5

شود.می

ها فریمورک سایر با مقایسه

های جنبه سایر کارایی افزایش این اما است آن العاده فوق کارایی php دهندگان توسعه جامعه در phalcon رشد فاکتور مهمترین

phalcon دیباگ امکان و توسعه سرعت: جمله از است داده قرار تاثیر تحت را.

. است سادگی و توسعه سرعت آن ویژگی ترینشاخص که است دهندگانسعهتو بین php های فریمورک ترین محبوب از دیگر یکی الراول

بوده و میزان حافظه مصرفی برای هردرخواست هم چندین برابر پایین ثانیه در ها درخواست به پاسخگویی نرخ موجود های بنچمارک در هرچند

ست.بخش تر ااست با این حال توسعه وب اپلیکیشن با الراول هم سریعتر و هم لذت

.است فریمورک این محبوبیت اصلی دالیل از یکی laracast مانند الراول متنوع آموزشی منابع

phalcon از استفاده نتیجه و تجربیات

اما داد خواهید خوبی نمره phalcon مستندات به و داشت خواهید باالیی نسبتا رضایت کنید می استفاده phalcon از شما بار اولین وقتی

شما نیاز به دیباگ کد یا درخواست کمک از انجمن نداشته باشید. که کند می پیدا ادامه جایی تا درون این

بروزرسانی افزونه را تفاوت زیادی با سایر فریمورک ها ندارد اما اگر نیاز به آپدیت داشته باشید بایستی در هر deploymentپروسه تست و

و آماده کنید. buildبرای سرور خود

ممکن است در هستید که ای پروژه درگیر اما اگر است انتخاب بهترین phalcon مطمئنا باال کارایی با ساده Api یک سازی پیاده یبرا

بایستی در زمانبندی پروژه تجدید نظر کنید. phalconدهندگان جدیدی به پروژه ملحق شوند با انتخاب فازهای بعدی توسعه

البق در را برنامه از قسمتی توانید می دارید ها گلوگاه این در بیشتری کارایی به نیاز کنید می احساس که دارید هاییگلوگاه برنامه در شما اگر

رسدست قابل دیگر قسمت آن کد اینکه هم یافت خواهد افزایش برنامه کلی کارایی هم ترتیب بدین کنید سازی پیاده zephir با یک افزونه

.نیست

برای باالبردن کارایی و راندمان پروژه استفاده کنید. MQو مکانیزم Goزبان قدرتمند تر مثل یک از توانید می شما که است این دیگر حالت

ها رفرنس

http://phalconphp.com/

http://forum.phalconphp.com/

http://systemsarchitect.net/is-phalcon-the-promised-land-for-php/

http://briananglin.me/2014/01/what-is-phalcon-php/

http://phalcon.io/interview-with-phalconphp-creator-andres-guitierrez

https://github.com/phalcon/zephir

http://www.sitepoint.com/php-fights-hhvm-zephir-phpng/

http://blog.a-way-out.net/blog/2015/03/27/php-framework-benchmark/

Page 80: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

HHVM

رهام دوستدارپ

HHVM چیست؟

HHVM اشین مجازی فرایند یک م(Process Virtual Machine) است که قابلیت اجرای کدPHP را دارد. بر خالف نام به ظاهر

زنیم.دقیقا چیست و چه کاری می کند، سری به گذشته آن می HHVMپیچیده آن، طرز کار آن بسیار ساده است. برای درک بهتر اینکه

HHVMتاریخچه

در اصل همان مفسری است Zend Engineبود. Zend Engineکرد، منظور او در اصل اشاره می PHPی به ، هر وقت کس1114از سال

در اصل همان کد شماست که به کد سطح پایین تر تبدیل Opcodeکند. تبدیل می opcodeخواند و آن را به شما را می PHPکه کد

کنند.خطاب می (compiled)همان کد ترجمه شده را به اشتباه Opcodeشده و آماده اجراست. خیلی ها

بود. اما در سال PHPتنها مفسر Zend Engineگفتند این بود که تا چند وقت پیش،می Zend Engine ،PHPدلیل اینکه همه به

را انتخاب کردند چون PHPن نمودند. آنها زبا PHPبا زبان Facebook، مارک زاکربرگ و دوستانش شروع به نوشتن برنامه ای به نام 2114

توانید به راحتی آن را روی سرورها بارگذاری کنید.کار با آن بسیار راحت است و زمانی که برنامه شما آماده ارائه باشد شما می

ر د که دیگیک شرکت بسیار بزرگ شده بود. زیرساختهای نرم افزاری و سخت افزاری عظیم آن آنقدر پیچیده بودن Facebookچند سال بعد،

Zend Engine از هر ده نفر، یک نفر کاربر 2111جوابگوی سیستم آنها نبود. در سال ،Facebook بود، و حال دیگر زمان آن رسیده بود

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

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

PHP، یا خط دستور اجرا شود.( در این لحظه، مفسر NGinXیا Apacheاز طریق درخواست وب )توسط وب سرورهایی مانند PHPمفسر

کند. قدم های به دست آمده را خط به خط اجرا میZend Engine ،Opcodeکند، و پس از آن، تبدیل می Zend Opcodeه کد شما را ب

معموال به سرعت کد ترجمه PHPبخش زمان گیر آن است و به همین دلیل است که کد (Opcodeبه PHPدوم این پروسه )یعنی تبدیل کد

شود.شده اجرا نمی

نمودند. HPHPcبه نام ++Cبه PHP، شروع به ساخت یک مترجم 2111نیز این مشکل را دریافتند و در سال Facebookمهندسان

HPHPc کدPHP را بهC++ کند. این کد کامپایل شده در سرورهای تبدیل و سپس آن را کامپایل میFacebook شد، و بارگذاری می

حل کند. اما مشکل آن این بود که عملکرد آن به نقطه ای رسید که دیگر قابل بهبود Facebookاین روش توانست مشکالت زیادی را برای

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

بسیار زمانبر بود. binaryو سپس ++Cبه PHPکد، از ندارند نیز غیر قابل استفاده بودند و فرایند ترجمه ی

Facebook یعنی بتواند کد -حال نیاز به سیستمی داشت که مجموعه این دو راهکار باشدPHP را، با همان ساختار پویا، با سرعتی که حتی

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

HPHPc به نام ،HHVM .شروع کرد

Page 81: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

12 1314 مرداد PHP همایش

تبدیل کند، و آن را در bytecodeرا به PHPکد در نظر داشت این بود که این سیستم HHVMبرای Facebookچشم اندازی که

cache ور وارد شده در خط فرمان به آن نیاز دارد، توسط یک نگه دارد. این کد کش شده سپس در زمانی که یک وب سرور یا دستjust-in-

time compiler (JIT) .به کد ماشین تبدیل شود و اجرا گرددFacebook ،امیدوار بود که از این روشHHVM بتواند عملکرد کد

PHP را بهبود دهد، به صورتی که حتی سریعتر از کدHPHPc .اجرا شود

را کنار گذاشت و در HPHPcجلو افتاد. در این نقطه بود که فیسبوک Zend Engine از HHVM، 2112در سال و همین گونه هم شد:

iنیز به این جمع پیوستند. Baiduو Wikipediaنمود. پس از گذشت زمان کوتاهی، HHVMسرورهای خود شروع به استفاده از

Zend Engineو HHVM مقایسه

HHVM یار سریعتر از در حال حاضر بسPHP 5.6 است. اماZend 1قول داده است که در نسخه PHP سرعتZend Engine را

منتشر خواهد شد و زمان زیادی 2115در اواخر سال PHP 7نیز باشد. با این حال، HHVMافزایش دهد، تا جایی که در شرایطی سریعتر از

دهند نیز از این نسخه استفاده کنند.را ارائه می PHP طول خواهد کشید تا شرکتهایی که امکانات میزبانی

HHVM در حال حاضر توسطFacebook توسعه دهی می شود. معنی این جمله این است که اگر تعداد کاربرانFacebook کم شود، یا

Facebook ،تصمیم بگیرد که از زبان دیگری استفاده کندHHVM افزار متن باز است، افراد خیلی کمی رها خواهد شد. با اینکه این نرم

با این سرعت و کیفیت را در خارج از زمان کاری خود داشته باشند. HHVMهستند که زمان و دانش کار کردن روی

یک Hackآن را معرفی کرده است دارید. Facebookبه این معناست که شما امکان استفاده از زبانی که HHVMاما در مقابل، استفاده از

نیست. به دلیل اینکه (dynamically-typed)است، اما با این تفاوت که امکاناتی را به شما می دهد که در زبانهای پویا PHPزبان شبیه به

Hack به شما اجازه می دهد که کدی دقیقا کپی کدPHP ات بنویسید، شما می توانید کد خود را در گذر زمان بهتر کنید. دسته ای از امکان

Hack:همراه با مثال را در زیر می بینید ،

شما می توانید نوع متغیرها، متودها، و خواص کالسهای خود را مشخص کنید: (1

<?hh

class AnnotatedClass {

public int $x;

private string $s;

protected array $arr;

public AnotherClass $ac;

function bar(string $str, bool $b): float {

if ($b && $str === "Hi") {

return 3.2;

}

return 0.3;

}

}

ها( نیز می توانند پارامتر داشته باشند:Typeکالسها ) (2

<?hh

// Testing generic methods in a non-generic class.

class Box<T> {

public T $value;

public function __construct(T $v) {

$this->value = $v;

}

}

Page 82: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

class FooGenMethod {

public function swap<T>(Box<T> $a, Box<T> $b) : void {

$temp = $a->value;

$a->value = $b->value;

$b->value = $temp;

}

}

function main_genmeth() {

$f = new FooGenMethod();

$y = new Box(3);

$z = new Box(4);

echo $y->value." ".$z->value;

$f->swap($y, $z);

echo $y->value." ".$z->value;

}

main_genmeth();

آنها را قابل (?)(، می توان با اضافه کردن عالمت سؤال intیا boolرا به عنوان مقدار قبول نمی کنند )مانند nullبرای انواعی که (3

null :بودن کرد

<?hh

class NullableTest {

public function mayReturnNull(int $x): ?int {

if ($x > 5) {

return 5;

} else {

return null;

}

}

public function nullableParameter(?int $x): int {

if (is_null($x)) {

return 100;

} else {

return -1;

}

}

}

function main_nt() {

$nt = new NullableTest();

$y = $nt->mayReturnNull(10);

var_dump($y);

$y = $nt->mayReturnNull(4);

var_dump($y);

$z = $nt->nullableParameter(10);

var_dump($z);

$z = $nt->nullableParameter(null);

var_dump($z);

}

main_nt();

خروجی این برنامه به صورت زیر است:

Page 83: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

21 1314 مرداد PHP همایش

int(5)

NULL

int(-1)

int(100)

)یک دیکشنری با ترکیب Map)یک لیست با ترکیب منظم(، Vectorها، شما می توانید به انواعی مانند Collectionبا استفاده از (4

دسترسی داشته باشید. )یک لیست با دقیقا دو المان( Pair)یک لیست با مقادیر یگانه(، و Setمنظم(،

Hackو HHVMنصب و آزمایش

خارج از Homesteadاست. طریقه نصب و راه اندازی Laravel Homesteadاز طریق Hackو HHVMسریعترین راه آزمایش

آن بسیار ساده است. 12محدوده این مقاله است، اما روش نصب

، vagrant provisionرا به سایت خود اضافه کنید و پس از اجرای دستور HHVM، طبق راهنمای آن، مقدار Homesteadپس از نصب

( مشخص کرده اید بسازید.document rootیا webrootریشه سایت خود ) در شاخه ای که آن را به عنوان test.phpیک فایل به نام

در این فایل، کد زیر را قرار دهید:<?hh

String $text = ‘hello world’;

Echo $text;

http://homestead.app/test.phpتوانید از آدرس را در مرورگر خود باز کنید. در حالت پیش فرض، شما می test.phpحال، فایل

استفاده نمایید.

68 http://laravel.com/docs/5.1/homestead

Page 84: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

21 1314 مرداد PHP همایش

PHP یاHack مسئله این است؟ ، معصومه حسین دوست ) شرکت شبدیز (

: مقدمه

گردد و کلیه این میلیارد درخواست به سمت سرورهای شبکه اجتماعی فیسبوک ارسال می 400ها برخی منابع، ماهیانه بیش از بنا به گزارش

ان ه زبها با استفاده از زبان برنامه نویسی محبوب پی اچ پی پاسخ داده می شوند. نیاز به توضیح نیست کRequestدرخواست ها یا بهتر بگوییم

شود و همین مسأله می تواند فشار زیادی را بر روی سرور وارد سازد. یکی از راه کارهایی که برخی برنامه نویسی پی اچ پی هنگام اجرا تفسیر می

جر به نشرکت ها برای رفع این معضل دنبال می کنند، افزایش قدرت سخت افزاری است اما توجه داشته باشیم که دنبال نمودن چنین سیاستی م

ها می گردد. اضافه شدن هزینه

مدیران شبکه اجتماعی فیسبوک وقتی متوجه شد که زبان برنامه نویسی پی اچ پی دیگر به خوبی پاسخگوی نیازهای این شبکه اجتماعی محبوب

برای خرید سرورهای بیشتر متحمل شوند، ی زیادی نخواهد بود و به نوعی در برابر درخواست های زیاد کاربران کم خواهد آورد، به جای اینکه هزینه

برابر افزایش یافته و 1کند که بعد از استفاده از چنین مبدلی، سرعت این سایت تا استفاده کردند. فیسبوک ادعا می HipHopاز یک مبدل به نام

ار پردازنده سرورهای این شرکت هم سبک های خرید سرورهای بیشتر به طرز قابل توجهی کاهش پیدا کرده است و این در حالی است که بهزینه

تر شده است.

ی های خود را به وب اپلیکیشن های واقعدر واقع فیسبوک در نظر دارد تا این امکان را به توسعه دهندگان بدهد تا به سادگی و به سرعت بتوانند ایده

(که یک زبان متن باز Hack Programming Languageمبدل سازند. چندی پیش شرکت فیسبوک به همین منظور زبان برنامه نویسی هَک )

دهد تا خیلی سریع و بدن تولید هیچ گونه باگی به برنامه نویسی بپردازند. زبان برنامه نویسی است را منتشر کرد که این امکان را به برنامه نویسان می

HACK ای برنامه ههای جدیدترین زبانز سوی دیگر بسیاری از قابلیتاز یک سو خصوصیات مفید زبان برنامه نویسی پی اچ پی را به ارث برده و ا

نویسی هم در آن گنجانده شده است.

Page 85: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

22 1314 مرداد PHP همایش

:HipHopتاریخچه مختصری از

سبوک در ابتدا شان را به HPHPcبود. ++Cبه PHPرا ایجاد کرد که کامپایلری برای تبدیل HPHPcفی ترجمه می کرد و ++Cکدهای حجیم

سان امپایل میسپس آنها را ک شد، تأثیر منفی آن بر روی برنامه نوی کرد. این پردازش به نظر طوالنی بود. در حالیکه بعضی از انتظارات برآورده می

به مراتب بیشتر بود.

هم ایجاد )یک دیباگر( را HPHPd)یک حالت برنامه نویسببی که به کامپایل هر بار همه کدها نیازی نداشببت( و HPHPiدر کنار آن، فیسبببوک،

کرد.

HPHPc کرد تا روی همان سببخت افزار الزم را برای آنها فراهم می 11در بعضببی از قسببمت ها، برای فیسبببوک موفقیت آمیز بود، کارآیی و عملکرد

از آن را پشتیبانی سازگار نبود و تنها بخشی PHP 5.2قبلی، توانایی بیشتر از حد تصور را برایشان فراهم کند. اما مشکلی که داشت این بود که با

پشتیبانی نمی کرد(. ()evalیا ()create_functionمی کرد)برای مثال، از توابع پویای ایجاد شده با استفاده از

یا HipHop، فیسبببوک اولین نسببخه عمومی از ماشببین مجازی 2111به منظور پیشببرفت در کار، چیزهای جدیدی نیاز بود. بنابراین در سببال

HHVM رد.را منتشر ک

و باالتر ادامه پیدا کرد. PHP 5.5سازگار بود و برای پشتیبانی از ویژگی های جدید PHP 5.4با HHVM 111%نسخه اولیه

ست کد کاملی از HHVMتیم سعی می کردند تا با ایجاد مجدد بعضی از قسمت های عجیب و PHPتوان ایجاد کند، اما این در حالیست که آنها

را ساده تر کنند. HACKجرت به زبان ، مهاPHPغریب زبان

HHVM در مقابلPHP.net

HHVM !!سریع است، سریع تر از خیلی از موارد. اما سرعت همه چیز نیست

توجه دارند. اما قطعاً چیزهای دیگری برای مقایسبببه این دو PHP.netبیش از HHVMبیشبببتر مردم، به عنوان تفاوت عمده، روی بهبود عملکرد

.وجود دارد

تأثیر محیطی

از تعداد قابل توجهی تواند می شدت به HHVMتعجب نکنید، این تحقیق، درمورد انتشار گازهای کربنی نیست ... . هرچند واقعیت این است که

ثیر آن بر تأ"، اما می توان نتیجه دیگری را هم برای آن مطرح کرد. دهد می کاهش را نیاز مورد برق نتیجه در و (هاserverدهنده) سرویس

استفاده PHP-fpmهم به آن اضافه شد. اگر در حال حاضر از FastCGI interface، پشتیبانی از HHVM 2.3. با انتشار "روی محیط فنی شما

از آن پشتیبانی نمی کند. HHVMمی کنید،

امکان پذیر FastCGIروکسببی های مختلف ، به سببادگی، با مسببیریابی برخی از درخواسببت ها به پHHVMو PHP.netبه عالوه، اجرای همزمان

است.

شما از sysadminsبرای ) ستفاده می کنید، Fedora 20یا Ubuntu 12.04/13.10, Debian 7(، اگر هایی وجود دارند که از طریق Packageا

مستقیماً قابل دسترسی هستند. HHVMتیم

ستاندارد حمایت عدم نقطه، این در کمبود بزرگترین شاید شما از extension PHP از ا ست. یعنی اگر ستفاده می کنید، PECL extensionا ا

های معمول و رایج را اجرایی کند. extensionفعاالنه در تالش است تا بیشتر Hackآن را پشتیبانی نمی کند. تیم HHVMاحتماالً

تأثیر اجتماعی

، به طور فعال درگیر برگشت HHVMاً این ممکن هست! در هر حال، تیم است، قطع PHPقسمتی از انجمن HHVMبعضی ها بر این باورند که

می باشد. PHP.netبه

اضافه شد. PHP5.5ها هستند که در Generatorاجرا شد، PHPو بعد در HHVMیک مثال از ویژگی ای که ابتدا در

69 -performance

Page 86: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

23 1314 مرداد PHP همایش

داشت. Genericsرد شده و همپوشانی زیادی با RFCاست که اخیراً توسط arrayofمثال دیگر

Extension ست، ابزاری مثل PHP extensionاخیراً تمایل زیادی برای شده ا شود. در HHVM، احتماالً باعث موفقیت PHP-CPPو Zephirها ایجاد می

HHVM تا زمانیکه ،extension ها به کتابخانهC/C++ تبدیل نمی شبببوند، می توانید آن را درPHP یا(HACK .بنویسبببید )HHVM ه وظیف

نباشد، کندتر نیست. ++Cکامپایل کدها به کد ماشین را دارد، اگر سریع تر از نوشتن همان کدها در

HHVM مجموعه ای ازAPI ها را آماده کرده تا با افزودن توابع توکار، امکان نوشبببتن کدهایPHP خالص، ترکیبی از کدهایPHP وC++ یا ،

، توسبببط خاصبببیتی با نام PHPدر میان کدهای ++Cجرا فراهم شبببود. قرار گرفتن کدهای برای ا JSON IDLبه همراه فایل ++Cکدهای

HNI(HHVM-Native Interface) درHHVM .فراهم شده است

HACK را دارد. HACKفیسبوک زبان مخصوص به خود و شناخته شده ی

HACK ستاندارد static analyzer HHVMزمانیکه با ابزار -بزار توسعه استپشتیبانی می شود، ویژگی اصلی آن یک ا PHP syntaxهمراه با ا

اجازه می دهد تا تصمیم گیری HHVM، دریافت کنید. بعالوه، به 11جفت می شود، شما می توانید اطالعات در لحظه ای را مانند عدم تطابق انواع

تری را در زمان کامپایل کد انجام دهد. آگاهانه

شیم تا در آینده، تعداد PHPن عالی برای آزمایش ویژگی های جدید یک مکا HHVMو HACKبه طور کلی شد و ما می توانیم امیدوار با می با

را ببینیم. PHP.netزیادی از ویژگی های جدید منتقل شده به

ستاندارد hh?> 11، با تگHACKکدهای شود، به جای ا شود. php?>شروع می ستفاده نمی سته ا با PHPانند نمی تواند م HACKو از تگ ب

کند.پشتیبانی می native XHTMLاز first-class syntaxآمیخته شود، اما به عنوان HTMLکدهای

HHVMو ویژگی PHP5 extensionیک Xhpاضافه شود. PHP.netبه xhp extensionمی تواند با استفاده از XHTML syntaxتوجه:

تبدیل می کند. PHPر را به عبارات معتب XMLاست که قطعات سند

و خروجی به صورت زیر خواهد بود:

70 - type mismatch 71- tag

<?hh

class Calculator {

public function add(int $left, int $right): int {

return $left + $right;

}

} $calc = new Calculator();

$calc->add(1, 3); // 4

$calc->add("one", "three"); // Fatal Error

Fatal error: Argument 1 passed to Calculator::add() must be an instance of int,

string given in <file> on line 5

Page 87: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

24 1314 مرداد PHP همایش

.، این خطا حتی بدون اجرای کد هم شناخته می شود static analyzer HHVMبا ابزار

HHVMنصب

:خود قرار دهید Vagrantfileاست، خیلی ساده، کدهای زیر را در Vagrant VM، راه اندازی HHVMساده ترین راه نصب

آماده شد، بسادگی دستورات اجرا می شوند، پس منتظر بمانید. VagrantFileزمانیکه

کار خواهید کرد. HHVMدسترسی خواهید داشت و با sshبه vagrant sshبا استفاده از بعد از اینکه سیستمتان مجدد راه اندازی شد، شما

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

# Use Ubuntu 12.04 LTS (64bit)

config.vm.box = "hashicorp/precise64"

config.vm.network "public_network" # Create a bridge network

# Install HHVM

config.vm.provision "shell", inline: <<-shell

apt-get update

apt-get install python-software-properties -y --force-yes

add-apt-repository ppa:mapnik/boost

wget -O - http://dl.hhvm.com/conf/hhvm.gpg.key | sudo apt-key add –

echo deb http://dl.hhvm.com/ubuntu precise main | sudo tee

/etc/apt/sources.list.d/hhvm.list

apt-get update

apt-get install hhvm-nightly -y --force-yes

apt-get install screen vim -y --force-yes

debconf-set-selections <<< 'mysql-server-5.5 mysql-server/root_password password

pa$$'

debconf-set-selections <<< 'mysql-server-5.5 mysql-server/root_password_again

password pa$$'

apt-get install mysql-server -y --force-yes

shell

end

Page 88: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

25 1314 مرداد PHP همایش

HHVMاجرای

به این صورت calc.phpدر Calculatorرا فراخوانی کرد. برای مثال برای اجرای کالس HHVMمی توان hhvm command با دستور زیر در

اجرا می شود:

بود تا HHVMاین تنها راه اجرای –در وب وجود دارد. اولی، سرور توکار HHVM، دو راه برای اجرای Command lineعالوه بر محیط ساده

اضافه شد. FastCGIاً، راه حل دوم، یعنی اینکه اخیر

. با دستورات زیر نصب می شود:php-fpmنیاز است، شبیه به nginx، به یک وب سرور مثل FactCGIبه عنوان HHVMبرای استفاده از

اضافه کنید: etc/nginx/sites-available/hhvm.conf/جدید به nginxسپس، فایل تنظیمات

و آن را در محل پیش فرض نصب کنید:

$ hhvm calc.php

$ sudo apt-get install nginx

$ sudo mkdir /var/www

$ sudo chown vagrant:daemon /var/www

server {

server_name hhvm.dev;

root /var/www;

index index.php;

location ~ \.(hh|php)$ {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;

include fastcgi_params;

}

}

$ sudo rm /etc/nginx/sites-enabled/default

$ sudo ln -s /etc/nginx/sites-available/hhvm.conf /etc/nginx/sites-enabled/hhvm.conf

$ sudo service nginx restart

Page 89: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

21 1314 مرداد PHP همایش

و یا فایل تنظیمات etc/hhvm/server.hdf(<= 2.4.*)/اجرا می کنیم، با به روز رسانی FastCGIرا به عنوان HHVMسپس،

/etc/hhvm/server.ini

server.hdf

server.ini

HHVM ا استارت( کنید:را ریستارت )ی

Server {

Port = 9000

Type = fastcgi

SourceRoot = /var/www

}

Log {

Level = Error

UseLogFile = true

File = /var/log/hhvm-error.log

Access {

* {

File = /var/log/hhvm-access.log

Format = %h %l %u %t \"%r\" %>s %b

}

}

}

Repo {

Central {

Path = /var/log/hhvm/.hhvm.hhbc

}

}

$ service hhvm restart

; php options

pid = /var/run/hhvm/pid

; hhvm specific

hhvm.server.port = 9000

hhvm.server.type = fastcgi

hhvm.server.source_root = /var/www

hhvm.server.default_document = index.php

hhvm.log.level = Error

hhvm.log.use_log_file = true

hhvm.log.file = /var/log/hhvm/error.log

hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc

Page 90: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

21 1314 مرداد PHP همایش

اضافه کنید، سپس به وب سرور دسترسی دارید: /webroot ،/var/wwwرا به ریشه index.phpسرانجام فایل

برای دستور باال به شکل زیر است: HHVMو خروجی

HHVMاستفاده از

Compser

و composerاست. این باعث سریع تر اجرا شدن composerبرای HHVM یکی از اولین چیزهائی که اکنون می توان نجام داد، استفاده از

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

میلی ثانیه است و ما می خواهیم آن را تغییر request timeout ،5111برای HHVMرا نصب می کنیم. چون پیش فرض composerابتدا،

با افزودن کد زیر،تنظیم کنید : server.hdfرا تنظیم نمائید. می توان آن را در فایل Http.SlowQueryThresholdباید دهیم. بدین منظور،

زیر تنظیم را انجام داد: command lineیا می توان از طریق

<?php

phpinfo();

?>

HipHop

Http {

SlowQueryThreshold = 30000

}

$ hhvm -v Http.SlowQueryThreshold=30000

or

$ hhvm --php -dHttp.SlowQueryThreshold=30000

Page 91: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

22 1314 مرداد PHP همایش

حاال الزم است تا مجموعه ای از پیش نیاز ها را نصب نمائیم:

نصب می کنیم: را Composerحاال

قرار بگیرد. حاال نوبت HHVMمستقیمأ درون Composerاستفاده کرده تا این امکان را فراهم سازد تا کدهای نصب php flag - -دستور باال از

مربوط به اتصاالت اجرا کنیم و برای کاهش مسائل HHVMانتخاب کنیم تا بتوانیم از طریق composerبرای 12به آن رسیده که یک نام مستعار

فقط برای پردازش های طوالنی JITرا تنظیم می کنیم تا Eval.Jit=falseکند شبکه، دو متغیر پیکربندی شبکه تنظیم کنیم. عالوه بر این،

کندتر راه ندازی شود. HHVM، باعث می شود composerاستفاده می شود. CLIمدت مفید باشد، زمانی که از

را اجرا کنید. bashrc./~و bashrc./~مسأله دائمی شود، باید خطهای باال را به برای اینکه این

نصب کنیم: Zend Framework 2 Skeletonرا اجرا کنیم و پروژه مان را با استفاده از composerسپس ما می توانیم

Zend framework 2راه اندازی وب سرورمان برای

(، به روز رسانی می var/www/zf2/public/) ZF2 document rootسرور را برای اشاره به HHVMو Nginx در مرحله بعد، ما تنظیمات

کنیم.

دو خط زیر را تغییر می دهیم: edit/etc/nginx/sites-available/hhvm.conf، در Nginxبرای

72 - alias

$ sudo apt-get install curl git unzip

$ curl -sS https://getcomposer.org/installer | sudo hhvm --php -

dHttp.SlowQueryThreshold=30000

$ sudo mv composer.phar /usr/local/bin/composer

alias composer="hhvm -v ResourceLimit.SocketDefaultTimeout=30 -v

Http.SlowQueryThreshold=30000 -v Eval.Jit=false /usr/local/bin/composer"

$ composer create-project --prefer-source zendframework/skeleton-application:dev-master

/var/www/zf2

root /var/www/zf2/public;

# Inside the location block

fastcgi_param SCRIPT_FILENAME /var/www/zf2/public$fastcgi_script_name;

Page 92: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

21 1314 مرداد PHP همایش

را تغییر می دهیم: Server.SourceRoot، تنظیم HHVMبرای

می کنیم: restartو سرویس را سپس، هر د

را خواهید دید: ZF2 Skeleton Applicationاگر دوباره وب سرور تان را در مرورگر باز کنید، به صورت پیش فرض

خود را شروع کنید. ZF2حاال می توانید پروژه

PHPUNIT است. 13بهبود می یابد، اجرای واحد آزمون HHVMیکی دیگر از کارهایی که با سوئیچ به

نصب می کنیم: Composerرا با PHPUnitبرای اجرای این، ابتدا

73 - unit test

SourceRoot = /var/www/zf2/public

$ sudo service nginx restart

$ sudo service hhvm restart

$ composer global require 'phpunit/phpunit=4.0.*'

Page 93: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

را اجرا کنید: bshrc./~اضافه کنید و bshrc./~برای کامل شدن نصب، خط زیر را به

alias phpunit='hhvm -v Eval.Jit=false /home/vagrant/.composer/vendor/bin/phpunit'

.Composerدرست مثل ;اجرا می شود HHVMطریق از phpunit commandحاال،

را اجرا کنیم، می توانیم با اجرای کد زیر آن را به انجام برسانیم. ZF2 test unitاگر بخواهیم

Unix Socketبا FastCGIاستفاده از

پشتیبانی می شود. Unix Socketتحت FastCGIاز HHVM، 3.0در ورژن

Unix Socket ری باید از در تئوTCP Socket بهتر و برای استفاده بسیار ساده باشد. اگر شما این تغییر را انتخاب می کنید، الزم است تا از

معیار قبل و بعد از انتخاب، اطمینان حاصل کنید تا شاهد افزایش عملکرد یا کاهش استفاده از منابع باشید.

مطابق کد etc/hhvm/server.ini/، فایل HHVMمان را تغییر دهیم. برای server config، مجددأ باید فایل Unix Socketبرای استفاده از

زیر، تغییر دهید:

مطابق کد زیر، تغییر دهید: etc/nginx/sites-available/hhvm.conf/، ، فایل Nginxبرای

$ cd /var/www/zf2/vendor/zendframework/zendframework

$ composer install

$ cd tests/

$ phpunit

; hhvm.server.port = 9000

hhvm.server.file_socket = /var/run/hhvm/server.sock

location ~ \.(hh|php)$ {

# fastcgi_pass 127.0.0.1:9000;

fastcgi_pass unix:/var/run/hhvm/server.sock;

...

}

Page 94: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

( مجدد می کنیم.restartسپس هر دو سرویس ها را راه اندازی)

؟Hackچرا

ستفاده از صلی ا اتفاق می افتد، نمی باشد، اما به جای آن ویژگی ها و ابزاریهایی جدید برای PHPهای کوچکی که در bug، کاهش Hackدلیل ا

توسعه دهندگان فراهم می کند.

Hackاستفاده از

تان را به همان شیوه Hackافی است که فایلهای ، کHHVM، با Hackمی باشد. برای استفاده از HHVMبصورت توکار، درون Hackپشتیبانی

استفاده می شود. Hackنشان دهنده این است که فایل به شکل hh?>باز شده 14را اجرا می کردید، اجرا کنید. برچسب PHPای که فایل

اجرت کدهای موجود، وجود دارد.و مه 15برای استفاده در طول توسعه Command line، چندین ابزار HHVMدر Hackعالوه بر اجرای فایلهای

( ببینید.ms 200~می باشد، تا گزارش خطاهای خود را بالفاصله) static analysisابزار اولیه،

(File Semanticsمعناشناسی فایل)

بدانید: Hackوجود دارد که شما باید درباره PHPچندین تغییر مهم در

برای ترویج بهترین شیوه، نمی توانید کدهایHack را با کدهایHTML .یا هر کد... دیگر( ادغام کنید(

تمام فایلهایHack باید)اجباری( با<?hh !شروع شوند

هیچ برچسب بسته ای برای فایلهایHack .وجود ندارد

Hack .چند حالته نیز می باشد

XHTML می تواند با استفاده ازXHP (جاسازی شود، که برچسبtag های)XHTML ار زبان می سازد.را درون ساخت

HACKحالتهای

نشان داده می شود. در ادامه توضیح خواهیم 11بعد از باز شدن برچسب commentوجود دارد که هر کدام توسط یک Hackحالت برای اجرای 3

داد:

حالت پیش فرض: -(Partial Modeحالت جزئی)

، به هر حال نیازی نیست تا برای هر چیزی نوعش مشخص شود. اطیمنان می یابد که همه انواع تبعیت می کنند Hackدر این حالت،

74- tag 75- development 76- tag

$ service hhvm restart

$ service nginx restart

Page 95: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

12 1314 مرداد PHP همایش

partial حالت پیش فرض است، پس"// partial" .می تواند از ابتدای فایل حذف شود

شامل کامنت Partial ،type checkerدر حالت سی می کند. حالت UNSAFE//، همه انواع دیگری را که شند، برر شتن ، اجازه Partialمی با نو

، به مهندسببین این اجازه را می دهد تا کدهایی که هنوز Strict Modeکالس، متد یا تابع را می دهد و هم چنین بر خالف partiallyبه صببورت

“Hack-ified” .نشده اند را فراخوانی کنند

<?hh // partial

// Annotated and type checked.

function foo_partial(int $x, int $y): int {

if ($x > $y) {

return 27;

}

return 34;

}

// Not annotated. Not type checked.

function bar_partial($a, $b) {

return $a + $b;

}

:(Strict Modeحالت سخت )

ست، و اجازه فراخوانی درون کدهای غ شده ا سی ها انجام شما نمی دهد. در حالت Hackیر این حالت اطمینان می یابد که همه برر ، strictرا به

شما باید)اجباراً( نوع همه کدها را بنویسید.

تعریف شده اند، فراخوانی کنید. Hackبه ویژه، شما نمی توانید کالس هایی را که در کد غیر

شید، به جز عبارت شته با سطح باالیی را دا سها یا توابع . این بدان”require“بعالوه، نمی توانید هیچ کد ست که همه کدها باید درون کال معنی ا

باشد. strictباشند. به طور ضمنی، یعنی اینکه کد ورودی شما نمی تواند

:فعال می شوند ،tagباز شدن از بعد comment یک کردن اضافه توسط ها حالت شد، گفته که همانطور

<?hh

// Code goes here

<?hh // strict

// Code goes here

Page 96: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

13 1314 مرداد PHP همایش

<?hh // strict

// Everything is annotated and type checked

class StrictClass {

private string $str;

// Need this constructor or the type checker

// will complain about uninitialized member

// variables

public function __construct() {

$this->str = "Hello";

}

public function foo(int $x, int $y): int {

if ($x < $y) {

return 27;

}

return 34;

}

public function bar(string $a, string $b): string {

return $a . $b;

}

}

ست، به hack دیگر های حالت از تر محدود strict حالت که این به با توجه شتری دقت ا شتن هنگام بی ست نو دقت ها، از ای نمونه. کد نیاز ا

:از عبارتند

o شده اند ولی در سهایی که در کد تعریف ستفاده از کال شده اند) باعث ایجاد خطای Hackتالش برای ا شته ن می Unbound Nameنو

شود(

o حالت های محدودیت از دیگر یکی .ستفاده از آرایه هاا strict ، ست این شخص نوع باید منظم آرایه که ا شد، آن م ستفاده با و با از ا

.شوند می داده ترجیح( چندتایی نقشه، ای، مجموعه بردار،) دیگر های مجموعه

o مشخص کردن همه انواع برگشتی، شامل توابعی مانندmain() .در کد تست

Page 97: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

14 1314 مرداد PHP همایش

(:Declaration Modeالت اعالمیه )ح

، به نوعی که زمان فراخوانی توابع مشخص می شود، اعتماد خواهد کرد، اما به آنها نیازی نخواهد داشت. type checkerدر این حالت،

File1.php

<?hh // decl

// Partial mode would catch this. Decl, though, allows // strict

// to call into this.

function bar_partial($a, $b): int {

return "Hello";

}

File2.php

<?hh // strict

function foo_strict(bool $b): int {

if ($b) {

return 4;

} else {

return bar_partial(3, 4);

}

}

( تعریف type checkerاعالم می شبببود، چک کننده نوع ) decl//حال زمانی که کد با را بر می گرداند، به هر intمقدار ()bar_partialدر اینجا،

را بدون ()bar_partial، می تواند Strictبرمی گرداند. حاال حالت stringمقدار ()bar_partialنوع را نادیده می گیرد و واقعیت این اسبببت که

، فراخوانی نماید. type checkerخطای

نکته:

در باالی هر تابع است. مثال زیر این قضیه را شرح می دهد: UNSAFE//معادل با قرار دادن Decl//استفاده از در عمل،

<?hh // decl

function foo(): int {

return "Hi";

}

function bar(): string {

return 3;

}

-----------------------------------------------------------------------

<?hh

Page 98: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

15 1314 مرداد PHP همایش

function foo(): int {

// UNSAFE

return "Hi";

}

function bar(): string {

// UNSAFE

return 3;

}

بیشتر از UNSAFE//اجازه انجام چیزهای ناامن روی تابع در یک زمان را می دهد. تا جائی که ممکن است سعی کنید از UNSAFE//بنابراین،

//Decl ده کنید ) به منظور محدود کردن کدی که نوعش چک نمی شود(.استفا

UNSAFE)نادیده گرفتن خطاها(

ستفاده از 11حالت، می توانید عمداً چک کننده نوع 3عالوه بر این در UNSAFE//غیرفعال کنید. این عمل، با افزودن کامنت UNSAFE//را با ا

گ نوشته شده باشد.باالی کد، انجام میشود. حتماً باید با حروف بزر

مشببخص شببده تا پایان بالک جاری کد، غیرفعال می شببود)اولین UNSAFE//(، از نقطه ای که با type checkerدر این حالت، چک کننده نوع)

ست که خطا) شود(. این برای زمانی مفید ا سته می دامه یابد. ( وجود دارد و کار باید اtype checker(ئی در چک کننده نوع)bugجائی که براکت ب

//UNSAFE حالت 3می تواند در هر کدام از//Partial ،//Strict و//Decl استفاده شود. البته نباید بدون احتیاط استفاده شود. از آنجائیکه کد

//UNSAFE ( از سبببمت چک کننده نوعtype checkerم ( نادیده گرفته می شبببود، امکان خطای زمان اجرا وجود خواهد داشبببت)به علت عد

اعتبارسنجی(.

است، نمایش داده شده است: UNSAFE//در اینجا، دو مثال که نشان دهنده چگونگی پوشش

<?hh

function unsafe_foo(int $x, int $y): int {

if ($x > $y) {

// UNSAFE

return "I am not checked by the type checker"; // Covered by UNSAFE

}

return 34; // NOT covered by UNSAFE

} -----------------------------------------------------------------------

<?hh

function unsafe_foo(int $x, int $y): int {

if ($x === 3) {

return 6; // NOT covered by the UNSAFE

}

// UNSAFE

if ($x > $y) {

return "I am not checked by the type checker"; // Covered by the UNSAFE

}

return true; // Covered by the UNSAFE

}

77 - type checker

Page 99: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

Type Hints

PHP 5 ،type hinting را معرفی کرد. حاال توابع قادر هستند تا اجبار کنند پارامترها به شکلobject باشند. تغییر اصلیHack ،Type-

Hinting آن است)از نظر تأثیر بر رفتار و تغییرات دستوری(. مهم است که بدانید همهtype-hint و این ها در زمان اجرا نادیده گرفته می شوند

.کند کمک کامپایل زمان در بهینه ماشین کد ایجاد در تواند می از نظر کارآیی تفاوتی ندارد، گرچه PHPا می رساند که در مقایسه با حقیقت ر

Hack استانداردهای همه انواعPHP :را پشتیبانی می کند، به اضافه چند مورد دیگر

نوع خاص دیگر هم وجود دارد که فقط برای مقادیر برگشتی استفاده می شود: 2عالوه بر اینها،

void :.برای توابعی که مقدار صریح برمی گردانند

:this برای متدهایی که یک نمونه از خودشان را برمیگردانند.

Type

bool Boolean true/false

int Integer numbers

float Floating Point numbers

string Strings

array Arrays (that can be typed)

resource Resources (e.g. file streams)

Class/Interface Name An object type-hint

mixed Any (not recommended)

Vector Numerical contiguously indexed Arrays

Map A typed (both keys and values) associative array

Set An unindexed collection of typed unique values

Tuple A fixed size set of typed values

Pair A fixed size set of typed values restricted to two values, indexed as 0 and 1.

Page 100: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

NULLS

DateTime\?یا int?مت سؤال قرار بگیرد، مثل متغیر باید عال typeاگر آرگومانی می تواند خالی باشد، قبل از

باشد. nullنیست، به این معنی است که مقدار آرگومان می تواند nullتوجه کنید که این به معنی مقدار پیش فرض

TYPES SOFT یا int@متغیر قرار دهید. مثل: typeش از پی @ارائه شده منجر به تولید باگ نمی شود، شما می بایست یک type-hintبه منظور اثبات اینکه

@\DateTime.

می بینید: warning، یک fatal errorارسالی برای تابع را اشتباه قرار دهید، به جای دیدن یک typeاگر شما

نتیجه به صورت زیر است:

<?hh

class DBAdapter {

public function connect(?string $dsn): ?\PDO

{

// $dsn may be null

// may return an instance of \PDO or null on error

}

}

<?hh

class Calculator {

public function add(@int $a, @int $b): @int

{

// Both $a and $b may not be ints

// May not return an int

}

}

$calc = new Calculator();

$calc->add("1", "2");

Warning: Argument 1 to Calc::add() must be of type @int, string given

Warning: Argument 2 to Calc::add() must be of type @int, string given

Page 101: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

12 1314 مرداد PHP همایش

و کالس های داخلی Strictحالت

hhiباشند، حتی کالس های داخلی هم از نوع معتبر نیستند مگر اینکه در یک فایل hackکدها در ، چون نیاز است همه Strictدر حالت

هستند )هر چند کامل نیستند، ولی می توانید مطابق نیاز خودتان آن را ایجاد کنید، یا آن را HHVMبارگذاری را انجام دهید. این فایلها همراه

کپی شوند. تغییر دهید( و باید در ریشه پروژه تان

usr/share/hhvm/hack/hhi/stdlib/builtins_pdo.idl.hhi/اجرا شود، باید فایل Strictدر حالت DBAdapterبرای مثال، برای اینکه کالس

را بارگذاری می کند. Hackدرون ریشه پروژه کپی شود. این فایل، تعاریف کالس سازگار با

(Constructor Argumant Promotion)سازنده آرگومان توسعه

خواص تعریف عملیات ترین رایج از ، سازنده آرگومان توسعه است. با این ویژگی، می توانیم یکیHackیکی از ساده ترین تغییرات اضافه شده به

(. Assigningرا به آنها انتساب دهیم) Constructorکنیم و آرگومانهای short-cutشیء را

انجام می شود و بسادگی آرگومانهای از پیش تعریف شده خود را، با کلمات کلیدی قابل (explicit declaration)این عمل با حذف اعالن صریح

مشاهده، استفاده می کند. مقادیر پاس داده می شوند، سپس به صورت خودکار با همان نام به یک شیء از پروژه انتساب داده می شوند.

و int، با کلمات کلیدی قابل مشاهده مخصوص به خودشان ، از جنس right$و left$د را با نامهای در مثال زیر، ما دو آرگومان سازنده خو

Protected .شده می آوریم

قابل دسترسی هستند. this->right$و this->left$(، با explicit assignmentمقادیر درون این دو بدون انتساب آشکار و واضح)

مجموعه ها

عالوه بر تالش برای کارآمدتر کردن آنها، به منظور تمامیت بیشتر داده ها، Hackبسیار خوب کار می کنند، PHPالیکه آرایه ها برای در ح

چندین نوع از مجموعه ها را معرفی کرد.

ند. همچنین آنها شبیهنیز در نظر گرفته شو object، می توانند به صورت APIاین مجموعه ها با یک -به جز چند مورد –به عالوه

هستند. pass-by-reference semanticهای منظم، (Object)شیء

باید برای همه آرگومانها و مقادیر بازگشتی Strictاستفاده کنید، اگرچه در حالت Hackدر PHPالبته هنوز هم می توانید از آرایه های استاندارد

ن کلیدهای مشخص ایجاد می کنید، همه مقادیر باید هم نوع باشند، در غیر اینصورت با خطا نوعشان مشخص شود. زمانی که یک آرایه جدید بدو

مواجهه خواهید شد. مطابق مثال زیر:

<?hh

class Adder {

public function __construct(protected int $left, protected int $right): void { }

public function get(): int {

return $this->left + $this->right;

}

}

$adder = new Adder(1, 3);

$result = $adder->get(); // 4

<?hh // strict

function createArray(): void {

$foo = array(1, 2, "3");

}

Page 102: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

11 1314 مرداد PHP همایش

است: stattic analyzerر از نتیجه، خطای زی

( باشند، این کد کار خواهد کرد.را پیشنهاد می کند، اگر انواع آرایه شما تغییرناپذیر)اندازه ثابت tupleدر حالی که این خطا یک

کنید، آرایه ها زمانی که نوع آنها به درستی مشخص شده باشد، می استفاده تر مناسب مجموعه نوع یک از شما که شود می توصیه که حالی در

استفاده شوند، آنوقت تنها یک نوع از داده را شامل می شود: Strictتوانند در حالت

ره به یک آرایه وجود دارد:راه برای اشا 3

array فقط در حالت( بدون نوع :partial )اجازه دارد

array[type] :[type] نوع و جنس مقادیر، با کلید عددی

array[type1][type2] :[type1] ،نوع و جنس کلید[type2] نوع و جنس مقادیر

استفاده کنید، اما این <array<mixed, mixed( type hintsد از نوع اشاره )تقلید کنید، می توانی PHPاگر می خواهید از آرایه استاندارد

پیشنهاد نمی شود.

Tuples )چند تایی(

Tuples درHack ،با آرایه های داخلی فرقی ندارد، و اگر بخواهید مقدار یا کلید نامعتبر وارد نمائید Hack static analyzer در زمان اجرا از

ی گیرد.آن خطا م

Tuples .بر اساس نمونه خود، اندازه ثابت دارند

<file>:3:5,16: Invalid assignment

<file>:3:12,16: This array has heterogeneous elements, you should use a tuple instead

<?hh // strict

function createArray(): array<int> {

return array(1, 2, 3);

}

<?hh // strict

function createArray(): void {

$foo = tuple(1, 2, "3");

// Do more with the tuple

}

Page 103: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

، یا هر 2( را به کلید non-stringانتساب دهید، یا یک غیر رشته ای ) 1یا 0( را به کلید non-integerدر کد باال، اگر سعی کنید یک غیر عددی )

چیزی را به هر کلید دیگری، با خطا مواجهه خواهید شد.

PAIRS ()جفت

نکته:

در ریشه پروژه تان کپی usr/share/hhvm/hack/hhi/Pair.hhi/باید فایل strictدر حالت Pairs: برای استفاده HHVM < 3.2فقط برای

نمائید.

Paires خطا برمی است. تالش برای دسترسی، یا انتساب مقدار به هر کلید دیگری 1و 0به صورت دوتائی است و کلید آنها از نوع عددی و

گرداند.

Paires شود اصالح توانند می کنید، ذخیره جفت یک در را تغییرپذیر اشیاء یا مجموعه شما تغییر ناپذیر است، ولی اگر.

اند در نمی تو Objectمی تواند اصالح شود، اما خود object propertiesرا در برمی گیرد، Objectدارید که یک Pairبرای مثال، اگر شما یک

Paires .پاک یا جایگزین شود

VECTORS )بردارها(

نکته:

در ریشه پروژه تان کپی usr/share/hhvm/hack/hhi/Vector.hhi/باید فایل strictدر حالت Pairs: برای استفاده HHVM < 3.2فقط برای

نمائید.

Vector شروع شوند. 0مه کلیدها باید پشت سر هم باشند و از ها می توانند فقط برای کلیدهای عددی استفاده شوند. هم چنین، ه

، کافیست نوع مقادیر مشخص شوند:Vectorها فقط می توانند کلید عددی داشته باشند، برای مشخص کردن نوع یک Vectorچون

<?hh // strict

function createArray(): (int, int, string) {

return tuple(1, 2, "3");

}

<?hh // strict

function getTask(): Pair<string, string> {

return Pair { "C039D17D", "checkPing" };

}

<?hh // strict

function getCommunityEngineers(): Vector<string> {

return Vector {"Davey", "PJ", "You?"};

}

Page 104: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

MAPS )نقشه ها(

نکته:

در ریشه پروژه تان کپی usr/share/hhvm/hack/hhi/Map.hhi/باید فایل strictدر حالت Maps: برای استفاده HHVM < 3.2فقط برای

نمائید.

Map ،ها می توانند برای کلیدstring یاinteger داشته باشند. چون کلیدها درMaps می توانند چند نوع داشته باشند، باید نوع کلید هم

مشخص شود.

SETS )مجموعه ها(

نکته:

در ریشه پروژه تان کپی usr/share/hhvm/hack/hhi/Set.hhi/باید فایل strictدر حالت Sets: برای استفاده HHVM < 3.2فقط برای

نمائید.

Sets .مجموعه ای نامرتی از مقادیر یکتا هستندSets کلید ندارد، بنابراین مانندVectors.فقط باید نوع مقادیر مشخص شود ،

ر با کلید دسترسی داشته باشید و نه می توانید ازکلید ندارد، نمی توانید به مقادی Setsبعالوه، چون

foreach ($set as $key => $value) .استفاده کنید

انواع سفارشی

Hack اجازه ایجاد انواع سفارشی را به شما می دهد. نکته مهم اینجاست که باید بدانیم اینها فقط توسطstatic analyzer در زمان اجرا قابل

و به شکل نوع اصلی دیده می شوند. استفاده هستند

Hack :دو روش مختلف برای تعریف انواع جدید داردaliases وopaque آنها با استفاده از کلمات کلیدی .type برای(aliases و )newtype

( تعریف می شوند.opaque)برای

اجازه استفاده از مقادیر این انواع را مثل Static analyzerهم می کند. امکان دادن نام ناسب تر به نوع موجود یا نوع پیچیده را فرا aliasesنوع

نوع زمینه ای)اصلی( اشان می دهد.

<?hh // strict

function getTags(): Map<string, string> {

return Map {"php" => "PHP", "hack" => "Hack"};

}

<?hh // strict

function getTags():Set<string> {

return Set { "php", "hack", "hhvm" };

}

Page 105: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

112 1314 مرداد PHP همایش

فقط در فایلی که تعریف opaque، نوع aliasesدارد. ولی یک اختالف اساسی با آن دارد. بر خالف نوع aliasesشباهتهایی با نوع opaqueنوع

است اجازه دسترسی دارد. برای مثال:شده

File1.php

<?hh

// File1.php

newtype SecretID = int;

function modify_secret_id(SecretID $sid): SecretID {

return $sid - time() - 2042;

}

function main_ot1(): void {

echo modify_secret_id(44596);

}

main_ot1();

<?hh // strict

type HTTPStatusCode = int;

class HTTPStatus {

const HTTPStatusCode OK = 200;

const HTTPStatusCode FOUND = 302;

const HTTPStatusCode NOT_FOUND = 404;

protected Map<HTTPStatusCode, string> $status = Map {

self::OK => "200 OK",

self::FOUND => "302 Found",

self::NOT_FOUND => "404 Not Found",

};

public function send(HTTPStatusCode $code): bool

{

if (isset($this->status[$code])) {

header('HTTP/1.1 ' .$this->status[$code]);

return true;

}

return false;

}

}

Page 106: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

113 1314 مرداد PHP همایش

File2.php

<?hh

// File2.php

require_once "File1.php";

function try_modify_secret_id(SecretID $sid): SecretID {

return $sid + time() + 2000;

}

function main_ot2(): void {

try_modify_secret_id(44596);

}

main_ot2();

SecretIDعملیاتی از قبیل جمع و تفریق را اجرا می کند. ولی در هرفایل دیگری اجازه دسترسی به intبه عنوان SecretID، متغیر 1در فایل

وجود نخواهد داشت. برای مثال باال، خروجی به صورت زیر است:

File "File2.php", line 7, characters 14-17:

Typing error

File "File2.php", line 7, characters 14-17:

This is an int/float because this is used in an arithmetic operation

File "File2.php", line 6, characters 31-38:

It is incompatible with an object of type SecretID

Hack ( توانایی افزودن نوع ثابتtype constraint را به )Opaque type اجازه دسترسی خارجی به اضافه کرده است. در این قابلیت هم باز

Opaque ( وجود ندارد، اما اجازه دسترسی به نماینده ثابتconstraint:وجود خواهد داشت. به مثال زیر توجه کنید )

ot1.php

<?hh // strict

newtype EvenInt as int = int;

newtype OddInt = int;

function checkIfEven(int $x): EvenInt {

if ($x % 2 === 0) {

return $x;

}

throw new Exception("Not Even");

}

function checkIfOdd(int $x): OddInt {

if ($x % 2 === 1) {

return $x;

}

throw new Exception("Not Odd");

}

function add(int $x, int $y): int {

return $x + $y;

}

Page 107: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

114 1314 مرداد PHP همایش

ot2.php

<?hh // strict

require_once "ot1.php";

function test_me(): void {

add(checkIfEven(4), checkIfEven(6));

add(checkIfOdd(3), checkIfOdd(5));

}

خروجی به شکل زیر است:

/tmp/ot2/ot2.php:7:22,34: Invalid argument (Typing[4110])

/tmp/ot2/ot1.php:20:22,24: This is an int

/tmp/ot2/ot1.php:13:30,35: It is incompatible with an object of type OddInt

/tmp/ot2/ot2.php:7:7,19: Invalid argument (Typing[4110])

/tmp/ot2/ot1.php:20:14,16: This is an int

/tmp/ot2/ot1.php:13:30,35: It is incompatible with an object of type OddInt

هم برایش تعریف شده است. int، ثابت EvenInt. البته در مورد OddIntو EvenIntتعریف شده: opaque typeدو newtypeبا کلمه کلیدی

فراخوانی checkIfEvenرا با add(int , int)هم استفاده شود. به همین دلیل، وقتی تابع intمی تواند به عنوان EvenIntنی که بدین مع

فراخوانی کردیم، خطا داشتیم، چون خروجی تابع checkIfOddاست. ولی زمانی که با intیا EvenIntکردیم، مشکلی نبود. چون خروجی تابع

OddInt می باشد. addمغایر با ورودی تابع است که

Shapes Shapes ساختاری شبیه آرایه دارد، مانندTuples اما این امکان را فراهم می کند تا کلیدها و مقادیر از پیش تعریف شده را برای آرایه، استفاده .

کنیم.

داشته باشیم می توانیم چیزی HHTP responseهیم یک هم می توان استفاده کرد. برای مثال اگر بخوا Validationبه عنوان یک Shapاز

شبیه زیر داشته باشیم:

<?hh // strict

newtype HTTPRequest = shape(

'status' => HTTPStatusCode,

'headers' => Map<string, string>,

'data' => shape (

'GET' => ?Map<string, mixed>,

'POST' => ?Map<string, mixed>,

'COOKIE' => ?Map<string, mixed>,

'SERVER' => Map<string, mixed>

),

'body' => ?string

);

Page 108: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

115 1314 مرداد PHP همایش

استفاده شود، می توانیم ضمانت کنیم که همه این کلیدها وجود خواهد داشت و مقداری از نوع HTTPRequsetدر این مرحله، هر جائی که یک

مشخص خواهند داشت.

تغییر ناپذیری

Hack ی از انواع تغییرناپذیرVectors ،Maps وSets .)جفت ها همیشه تغییرناپذیر هستند (

خطا می دهد. static analyzer. اگر بخواهیم مجموعه را تغییر دهیم با ImmMapاستفاده می کنیم، مانند *Immبرای استفاده ابتدای متغیر از

مانند مثال زیر:

خواهد بود: static analyzerنتیجه خطای زیر از

در زمان اجرا خطای زیر را خواهد داد: HHVMو

Fatal error: Uncaught exception 'RuntimeException' with message 'Cannot assign to an element of

a ImmMap' in <file>

نکته:

در ریشه پروژه usr/share/hhvm/hack/hhi/Imm*.hhi/باید فایل strictدر حالت Immutable: برای استفاده HHVM < 3.2فقط برای

تان کپی نمائید.

عناصر اضافه شده

این اجازه را به شما می دهد که عناصر جدید را با استفاده از براکت به آن اضافه کنید: PHPآرایه های استاندارد

<?hh // strict

function getTags(): ImmMap<string, string> {

$map = ImmMap {"php" => "PHP", "hack" => "Hack"};

$map["hhvm"] = "HHVM";

}

<file>|13 col 6 error| You cannot mutate this

<file>|12 col 13 error| This is an object of type ImmMap

<?php

$array = [ "foo", "bar" ];

// Append new value:

$array[] = "baz";

?>

Page 109: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

ها Mapنها اجازه افزودن مقادیر اضافی را نخواهند داد. آ Tuplesو Pairsبه طور معمول این اجازه را نمی دهند. در مورد Hackمجموعه های

در Bugرا به مجموعه می دهند. مقدار اول به عنوان کلید دلخواه، و مقدار دوم به عنوان مقدار آورده می شود. اما یه Pairفقط اجازه افزودن

HHVM 3.0 وجود دارد که موجب می شودstatic analyzer اجرا درست کار می کند. خطا نمایش دهد اما زمان

خروجی به شکل زیر است:

بردارها طبق انتظار کار می کنند:

خروجی:

<?hh // strict

function appendToMap(): void {

$m = Map { 0 => "foo", 1 => "bar" };

$m[] = Pair { 5, "bat" };

var_dump($m);

}

object(HH\Map)#1 (3) {

[0]=>

string(3) "foo"

[1]=>

string(3) "bar"

[5]=>

string(3) "bat"

}

<?hh // strict

function appendToVector(): void {

$v = Vector { "foo", "bar" };

$v[] = "bat";

var_dump($v);

}

appendToVector();

object(HH\Vector)#1 (3) {

[0]=>

string(3) "foo"

[1]=>

string(3) "bar"

[2]=>

string(3) "bat"

}

Page 110: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

XHP :XML fragments as expressions

( منتشر facebookر برای )همین طو PHPبرای extensionاست. در اصل به عنوان یک XHP، معرفی syntaxیکی از بزرگترین تغییرات در

شد.

XHP یکextension زبانPHP است کهsyntax زبان را به دو منظور تکمیل میکند، اول اینکه فهمیدن کدfront-end ،را ساده تر می کند

جلوگیری کنید. cross-siteدوم اینکه به شما کمک می کند تا از حمالت

XHP ،syntax هایPHP وHack مثل ،XML کمیل می کند تا را تPHP experssion .ها معتبر شوندHack در حال حاضر دو نوع ازXHP

و ... . همه <ui:link>و <div>است. به عنوان مثال XHPوالد همه المنت های XHPChild .:xhpو xhp:را بررسی و چک می کند:

است. استفاده اصلی این xhp:و هم چنین خود floatو array ،string ،intیک رابط ویژه اجرا شده با XHPChild هستند. xhp:برگرفته از

(.<div>{$foo}</div>برای عملگر }{ می باشد )مانند concrete typeرابط برای آماده سازی یک

هایی namespaceمی شود. برای نامگذاری p:به <p>شروع می شوند، برای مثال کالس :به یک کالس نگاشت می شود. نامها با نشانه tagهر

است. hal:resource:به شکل کالس <hal:resource>مثل

پشتیبانی می کنند. ،DOMرا بسط میدهند که به نوبه خود از تعدادی از متدهای x:element: هر کدام از این کالسها، کالس پایه

مانند متدهای زیر:

appendChild()

prependChild()

replaceChildren()

getChildren()

getFirstChild()

getLastChild()

getAttribute(), getAttributes()

setAttribute(), setAttributes()

isAttributeSet()

removeAttribute()

استفاده کنید با خطای زیر مواجهه خواهید شد: XHPزمانی که می خواهید از

Fatal error: Class undefined: xhp_html in /

را به پروژه خود اضافه نمائید. XHPبدین منظور باید کتابخانه

اضافه نمائید تا کتابخانه نصب شود. composer.jsonقابل دسترسی است. خطوط زیر را به Githubاز طریق لینک XHPکتابخانه

"require": {

"facebook/xhp-lib": "dev-master"

}

<?hh

echo <p>Hello World</p>;

Page 111: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

112 1314 مرداد PHP همایش

و یا مستقیماً روی hhnm.enable_xhp = trueشما ini.تغییر می یابد یا اینکه در فایل hh?>به php?>از XHPنهایتاً، یا فایلهای

command line هنگام اجرایhhvm .تنظیم می شود

(Anonymous Functionsتوابع ناشناس )

پشتیبانی می کنند. lambda expressionدیگری با عنوان anonymousپشتیبانی می کند، از توابع closureاز Hackعالوه بر اینکه

را اضافه کنند: anonymousتصمیم گرفتند این شکل جدید از توابع Hackدو دلیل برای اینکه تیم

متراکم بسیار بیشتری دارد syntaxتوابع ناشناس، -1

–بری می شود. یعنی اینکه توابع، متغیرها را از دامنه تعریف شده اشان ارث بری می کنند) با مقدار دامنه توسط توابع ناشناس ارث -2

by value)

:Lambdaساده ترین شکل استفاده از

: multiple expressionبرای

Static Analysis

حتی روی پایگاه های کد بزرگ مانند ;ار زمان ذخیره، می باشد، نزدیک به زمان واقعی و به صورت خودکstatic analysisاجرای Hackهدف

فیسبوک.

در hh_server. همان طور که از نام آن پیداست، hh_clientو hh_serverدو قسمت است: static analysisبرای دستیابی به این هدف،

background با است(فاده از اجرا می شود، جائیکه بر فایلهای تغییر یافته نظارت داردnotify و با استفاده از )static analyzer آنها را معتبر می

.مسائلی داده می شود گونه هر نمایش و بازیابی برای درخواست hh_client توسط سازد. سپس

را با hh_serverکرد و همچنین می توان وضعیت stop , start , restartرا hh_serverبه صورت دستی hh_clientمی توان با استفاده از

درخواست کنید. hh_client statusاستفاده از

<?hh

$fn = $args ==> expression;

?>

<?hh

$fn = ($arg1, $arg2) ==> { expression; return ...; };

?>

Page 112: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

STATIC ANALYZERاستفاده از

نمایش php.یا hh.در فایلهایی با پسوند hackهر گونه خطای command lineروی hh_clientاستفاده شده، با اجرای hh tag?>تا زمانی که

گی و بافاصله می باشد.داده می شود. این خروجی برای خوانایی بیشتر، رن

برای مثال، خروجی برای کد دارای خطای زیر را در ادامه مشاهده خواهید کرد:

می نشان پروژه کل برای خروجی همیشه hh_client .است خاص و دقیق بسیار حال عین در و طوالنی کامال خروجی بینید، می که همانطور

.دهد

Hackificating

می باشد. Hackشامل ابزاری، برای تبدیل کد موجود به static analyzer ،HHVMعالوه بر

هشدار

این پروسه هنوز تا کامل شدن راه زیادی دارد. شما باید همه تغییرات را به صورت دستی بررسی نمائید.

مرحله می باشد: 3شامل Hackificatingپروسه

سپرده می شود. static analyzer. در اینجا فایلها به hh?>به php?>ی با تغییر ، به سادگhackتبدیل همه فایل ها به فایل های -1

اجرا نمی شود. type hints، در اینجا اجازه اجرای کدها و ثبت هر نوع خطایی به شما داده می شود، اما soft type hintافزودن -2

soft type hintsحذف -3

<?hh // strict

function greeting(string $who):void {

return "Hello $who";

}

function sayHello() {

echo greeting(1.0);

}

Page 113: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

Hack سیستم با PHP 7 مقایسه

، نسبت به نسخه های قبلی PHPرا ارائه کرده است. این آخرین نسخه HHVM ،PHP7حاضر برای پاسخ به رقابت با در حال PHPجامعه

افزایش عملکرد داشته است. 111%

PHP7ویژگی های

افظه مصرفی را از بهبود موتور اجرایی، ذخیره سازی بومی و کاهش ح 12رنجی PHP7هنر برنامه نویسی در تغییر سریع است . بهبود عملکرد:

Zeev Suraskiدر محدودیت است، این ویژگی ها برای آنها مطلوب خواهد بود. web browsingدر mobile deviceارائه می دهد. از آنجا که

فرض می کند. Zendرا به عنوان رقیب مستقیم Zend ،HHVMاز بنیان گذاران برنامه

JIT Engine Speculation :یتاجرای قابل توانایی JIT موتور برای Zend زبان نسخه بعدی توسعه پشت صحنه در نخست انگیزه PHP است.

.HHVMرا درون دستوالعمل ماشین بومی ممکن می سازد، یعنی همان کلید اصلی اجرا با موتور Zend opcodeاین قابلیت، کامپایل داینامیک

Asynchronous Programming Speculation: PHP7 سعه یافته که اجرای همزمان به نوعی توtask هایasynchronous را بهتر کرده

هایی مانند دسترسی به پایگاه داده، taskو asynchronousاین اجازه را می دهد تا از برنامه نویسی phpاست. این توانایی به نسخه های آینده

، پشتیبانی کند. PHP-loop شبکه، تایمرها و ... با اجرای یک

و نسخه PHP7هم، چنین امکانی را برای PHP Coreرا پشتیبانی می کند، برنامه نویسان asynchronousبرنامه نویسی Hackز آنجائیکه ا

های بعدی آن بوجود آوردند.

معیار مقایسه:

:مختلف می باشد محتوای تمدیری سیستمهای سراسر در HHVM و PHP مختلف های نسخه عملکرد شده بر مقایسه انجام معیار زیر، نتایج

را کاهش داده است. HHVMو PHPبا بهبود عملکرد خود نسبت به نسخه های قبلی، فاصله بین PHP7نتیجه نشان می دهد که

و قبلتر، با سرعت دو برابر اجرا می شود. PHP 5.6زمانیکه درخواست ها زیاد است، در مقایسه با WordPress 4.1.1 ،PHP7در

78 -range

Page 114: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

Page 115: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

112 1314 مرداد PHP همایش

درصد از درخواست 31نشان می دهد، با توانایی مدیریت بیش از HHVMرا بر PHP7پیروزی آشکار Drupal 8 CMSجام شده روی مقایسه ان

های اضافی سرور در هر ثانیه.

ثل هایی م CMSبرای HHVMعملکرد بهتری نسبت به Zendبا اجرای PHP7همچنین با برخی تست های انجام شده، نتیجه بر این بود که

WordPress وDrupal .دارد

همراه با حالت Scalar type hintingمی توان گفت، گذشته از بهبود عملکرد باورنکردنی، معرفی PHP 7یکی از چیزهایی که می شود درباره

است. Hackجهات شبیه از بسیاری type hintingبا PHP 7، مطلع شدیم که کد نوشته شده در RFCمی باشد. با مطالعه "strict"اختیاری

و اختالفاتی که ممکن است در اجرا پیش بیاید، میپردازیم. Hackو PHP 7در اینجا به بررسی نحوه اجرای کدهای یکسان در

به کدهای زیر توجه کنید:

$ php --version

PHP 7.0.0-dev (cli) (built: Apr 23 2015 01:12:36) (DEBUG)

Copyright (c) 1997-2015 The PHP Group

Zend Engine v3.0.0-dev, Copyright (c) 1998-2015 Zend Technologies

with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

____________________________________________________________________________________________

$ hhvm --version

HipHop VM 3.8.0-dev (rel)

Compiler: heads/master-0-gd71bec94dedc8ca2e722f5619f565a06ef587efc

Repo schema: fa9b8305f616ca35f368f3c24ed30d00563544d1

را با تنظیم hhvm، مجبوریم source codeهای باز در فایلهای tagبدون تغییر HHVMدر PHPبه منظور اجرای کد

-vEnableHipHopSyntax = true .اجرا کنیم

:مثال

به مثال زیر دقت کنید:

Page 116: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

113 1314 مرداد PHP همایش

<?php

declare(strict_types=1);

function myLog(string $message): string {

return $message;

}

function add(int $a, int $b): int {

myLog($a + $b);

return $a + $b;

}

$result = add(1, 3);

echo $result;

به شکل زیر است: PHP 7خروجی این مثال در

Fatal error: Argument 1 passed to myLog() must be of the type string, integer given, called in

/home/vagrant/basic/main.php on line 9 and defined in /home/vagrant/basic/main.php on line 4 ( را به تابعی ارسال می کنیم که انتظار ورودی رشته را دارد و a + $b$) integerبدرستی به ما می گوید که یک PHP7به نظر خوب می آید!

چه می گوید: HHVMببینیم که خطای مناسب نمایش داده می شود. حاال

Catchable fatal error: Argument 1 passed to myLog() must be an instance of string, int given in

/home/vagrant/basic/main.php on line 6

دو اختالف آشکار در اینجا دیده می شود:

HHVM یک“catchable” fatal error لب است که خطای نشان داده شده در را فراخوانی می کند. جاRFC مطابق با خطای

HHVM .است

HHVM رخ داده، در حالیکه 1می گوید خطا در خطPHP رخ داده است. 1می گوید در خطPHP7 اطالعات بیشتری در مورد خطا

به ما میدهد.

دهد: می نشان را Hack و PHP 7 میان مهم تفاوت یک که دیگری است مثال اینجا در

<?hh

declare(strict_types=1);

function myLog(string $message=null): string {

if ($message === null) {

return '';

} else {

return $message;

}

}

echo myLog("Hello world!\n");

echo myLog();

اجرا می کنیم، خطای زیر را می گیریم: hackمی شود. ولی زمانیکه در اجرا می کنیم به خوبی انجام PHPزمانیکه این کد را در

/home/vagrant/nullable/main.php:4:16,21: Please add a ?, this argument can be null

(Typing[4065]) "string\?یا int?قرار بگیرد، مثل متغیر باید عالمت سؤال typeاگر آرگومانی می تواند خالی باشد، قبل از "همان طور که قبالً گفتیم :

Page 117: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

114 1314 مرداد PHP همایش

در نتیجه کد باید به شکل زیر تغییر کند:

<?hh

declare(strict_types=1);

function myLog(?string $message=null): string {

if ($message === null) {

return '';

} else {

return $message;

}

}

echo myLog("Hello world!\n");

echo myLog();

نتیجه گیری

نویسی هک از بسیاری جهات شبیه به زبان پی اچ پی است و زبان هک باعث افزایش سرعت زبان پی اچ پی، شده است. به طور خالصه، زبان برنامه

شابهی اجرا میدر محیط نرم سان قادر خواهند بود کدهای پی اچ پی خگردد. بنابراین برنامهافزاری م شتر نوی سرعت بی ود را در جاهایی که نیاز به

ستند به زبان ستفاده از زبان برنامه Hackه شنی با ا سی کنند. عالوه براین، زمانی که وب اپلیکی سرعت میبازنوی شود، به شته سی هک نو وان تنوی

یسی کنند. تری برنامه نوتر و اثربخشی قابل مالحظهنویسان خواهند توانست با دقت بیشتر، سرعت باالبازخورد از برنامه خود گرفت. بنابراین برنامه

خود هم نتواند به 7اسببت زیرا شبباید حتی در نسببخه خطرنویسببی پی اچ پی در با توجه به امکانات و رشببد زبان برنامه نویسببی هک، زبان برنامه

زبان هک وابسببته باشببد. هرچند با HHVMماشببین مجازی داشببته باشببد و شبباید برای باقی عمر خود به ددسببتاوردهای هک برسببد و برای خو

پوشببی در تولید ابزارهای های غیرقابل چشببمدهد، پی اچ پی به یکی از گزینهدر اختیار توسببعه دهندگان قرار می HipHopهای باالیی که قابلیت

ست. این درحالیست که زبان برنامه البته با برای ادامه، پیش رو دارد.راه طوالنی را HHVMنویسی هک و ماشین مجازی تحت وب مبدل گشته ا

در اختیار برنامه نویسان قرار HHVMمی تون امیدوار بود که قابلیت های جدید و بروز و حتی بهتر از PHP Coreپیگیری و تالش برنامه نویسان

شد و ما می توا PHPیک مکان عالی برای آزمایش ویژگی های جدید HHVMو HACKگیرد. به طور کلی شیم تا در آینده، می با نیم امیدوار با

را ببینیم. PHP.netتعداد زیادی از ویژگی های جدید منتقل شده به

منابع:

https://blog.engineyard.com/2014/hhvm-hack

https://blog.engineyard.com/2014/hhvm-hack-part-2

https://blog.engineyard.com/2014/hhvm-hack-php

https://blog.engineyard.com/2014/hhvm-hack-part-4

https://blog.engineyard.com/2014/hhvm-hack-part-5

hhtp://hhvm.com

http://docs.hhvm.com/manual/en/index.php

http://www.dmiller.io/blog/2015/4/26/comparing-the-php7-and-hack-type-systems

Page 118: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

115 1314 مرداد PHP همایش

http://www.quora.com/What-is-XHP

https://en.wikipedia.org/wiki/XHP

https://kinsta.com/blog/hhvm-vs-php-7

Page 119: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

Docker محیط از development تا production

راستیان میالد

که رفتمگ تصمیم بار این ولی دارم صحبت این برای شده تعیین پیش از فرمت یک تقریبا و کردم صحبت مختلفی جلسات در Docker مورد در حال به تا من

روشن شما برای رو Docker مثل ابزاری از استفاده اهمیت که است نای جدید فرمت این از من هدف .کنم معرفی شما به رو Docker جدیدی صورت به

.کنم معرفی رو ابزار این از ای کلیشه تعریفات شما برای اینکه جایی به کنم

Delivering Fast انجام به ابلق هرکسی که شده فعالیتی به تبدیل هبرنام ایجاد و اند گرفته فرا را دنیا موبایل و وب ها برنامه از اهم کامپیوتری هابرنامه و اینترنت اینکه از بعد

سته زمانی است، موثر شرکت یک موفقیت در مواردی از یکی و است شده ایجاد هستند افزارهانرم این سر پشت که ها شرکت بین سختی رقابت است، دادن

در شوند می رسانی روز به نسخه موبایل هابرنامه که میزانی به اگر مثال عنوان به .برسد هامشتری دست به افزار نرم شده روز به نسخه یک تا کشد می طول که

اربردک که ای برنامه دو بین از مشتری عنوان به شما که است مشهود کامال مساله این .آمد خواهد چشم به بیشتر امر این کنید، نگاه گذشته سال 3 الی 2 گذر

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

تمامی .بینید می DevOps و Agile های حرکت در رو موضوع این شما نیست، جدیدی ایده چندان ایده این کنید نگاه موضوع این به تردقیق اگر و

را آن دنباله اگر و باشند، داشته کوتاهی زمانی مدت در ای ارائه قابل افزار منر تا کنند کمک IT های تیم به که اند شده نهاده بنها این برپایه Agile هایایده

روند کردن ساده به کمک تا شده ارائه این برای operation و development هایتیم امیختن هم در ایده که ببینید توانید می بگیرد DevOps در

.دهد افزایش شود می اجرا برنامه که هایمحیط در را ها برنامه امنیت و پایداری ن،اطمینا قابلیت اینحال در و بیانجامد ها برنامه انتشار

Delivering fast needs discipline

دارم شما از سوال دو بدم، انتقال شما برای رو صحبتم بهتر بتوانم اینکه برای

production محیط به دکمه یک کلیک با یا دستور یک با دهید می عهتوس که را افزاری نرم نسخه تواند می که هستید ایدسته آن از شما آیا •

بفرستید؟

شود؟ می productionمحیط به موفقیت با هاتست اینکه از بعد خودکار صورت به را افزارتان نرم جدید نسخه که هستید ایدسته آن از شما آیا •

What prevent us from having continues delivery

باشیم داشته افزار نرم یک برای delivery continues توانیم نمی دلیل دو به ما من، تقاداع به

Page 120: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

آن به خالصه صورت به بخواهم اگر ولی است جداگانه مبحث یک نیازمند تست موضوع :هاآن به اعتماد عدم یا و FunctionalTest و UnitTest نبود •

یمت باید باشه، داشته وجود تستی هم اگر و ندارند موضوع این به زیادی توجه ایران در مخصوصا ما ندگانده توسع متاسفانه که کنم اشاره باید بپردازم

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

برنامه چرا که مدیرتان جواب در تانحرفه از زمان یک در شما مطمئنا : oductionPr و Development، Test، Stage های محیط در ها تفاوت •

!کرد می کار من ماشین روی بر دانم، نمی که، ایدگفته جواب در هست مشکل دارای

طور چه هک است این کنم روبرو آن با را شما کنم می تالش دارم من که ای مثله بیاورید، پایین را خطا و اشتباه امکان خودکار هاتست با باشید توانسته شما اگر

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

.باشد شده بندی بسته PHP 5.3 همراه به که باشد Ubuntu از تری قدیمی نسخه دارای شما سرورهای ولی کنید می استفاده Ubuntu نسخه آخرین

به داد گسترش توان می را مثال همین .بکشاند پایین به Production در را شما برنامه تواند می PHP5.6 در جدید هاویژگی از استفاده و اشتباه یک

.کنید می استفاده شما که PostgreSQL یا MySQL نسخه

Build a sustainable environment

ذهن از دور اینکه دلیل به نه !نرسد کسی ذهنی به وقت هیچ روش این شاید .deploy هر در کد همراه ماشین یک ایجاد و virtualization از استفاده •

کی روزرسانی به هایگام .هست لبیجا بسیار ایده بگذاریم کنار را هاشمحدودیت لحظه یک اگر ولی نیست، بهینه عمل در اینکه دلیل به بلکه هست

اگر . productionمحیط در آن اجرای و ،ارسال مجازی ماشین در برنامه تست ماشین، داخل به کدها کردن کپی تازه، ماشین یک ایجاد شامل افزارنرم

محیط به VM یک کردن کپی تنها .بود هدخوا بیشتر بسیار آید می همراه به افزار نرم deploy روش این همراه که مشکالت باشیم منصف بخواهیم

production تا کشد می طول که زمانی مدت شبکه، تنظیمات مانند دیگر مشکالت اگر کشید، خواهد طول زمانی مدت VM را غیره و شود بوت جدید

.بگذاریم کنار به

اریه که هایسرویس (infrastructure) زیرساخت توانید می رهاابزا این با . Ansible و Chef مثل تنظیمات مدیریت ابزارهای از استفاده دیگر روش •

اجرا Production و Development، Stage های محیط روی بر را شده ایجاد مدل توانید می شما .کنید سازی مدل کد صورت به را دهید می

با را Vagrant مانند ابزارهای شما وقتی مخصوص .دارند قرار یا مشابه وضعیت در شما ها محیط تمامی که کنند می ضمانت بیش و کم ابزارها این .کنید

Chef هایمحیط که باشید داشته اطمینان توان می زیادی حدود تا کنید می مخلوط Development و Production هستند یکسان شما.

روی بر که هست سرویسی Docker چیست؟ Docker اما !است Docker از استفاده بودید شنیدنش منتظر شما هستم مطمن من که دیگری روش •

بدهم، توضیح ساده کامال صورت به بخواهیم اگر .کنید اجرا مجزا کامال محیط یک در را برنامه یک تا دهد می اجازه شما به و شود می اجرا لینوکس

docker container این که کنید می تضمین و آورد می در بسته یک صورت به دارد الزم شما برنامه که هایکتابخانه و هافایل همراه به شما برنامه ها

ادامه در است Docker از نادقیقی و خالصه بسیار توضیح این گفتم که طور همان .شود اجرا است،Docker که محیطی و سیستمی هر در بسته

محیط که دهد تضمین ما به تواندمی مجزا محیط در امهبرن یک اجرای چگونه که آمده پیش شما برای سوال این احتماال .داد خواهم دقیقتری توضیحات

که امید این با Docker با باال گزینه دو تفاوت بر باشم داشته مرور خواهم می بدهم، پاسخ شما سوال این به اینکه از قبل .باشیم داشته یکسانی های

.شوید آشنا Docker مفهوم با بیشتر که کند کمک شما به آنها مقایسه

Page 121: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

112 1314 مرداد PHP همایش

Docker Vs Virtual Machine

ماش شود اجرا سرو یک روی بر شما برنامه اینکه برای که بینیم می بیاندازیم نگاه VM مدل به اگر

سرور Ubuntu مثال طور به آنها از یکی روی بر توانید می و دارید نیاز میزبان عامل سیستم یک به

آخر سرور روی بر و acheAp و سرور Debian دیگری روی بر .کنید نصب MySQL و

Ubuntu و سرور HHVM 11 داری شما فیزیکی سرور مثال طور به اگر .باشید کرده نصبGB

شیدبا گرفته را خود تصمیم کنید، می تنظیم را سرورها از کدام هر که زمانی باید شما باشد، حافظه که از هرکدام این

میزان مورد در باید ها گیری صمیمت همین کنند، می مصرف حافظه میزان چه به های سرویس و CPU هارد دیسک

دیگر ذکر قابل موضوع .شود گرفته شود می گذاشته اشتراک به سرورها از هرکدام بین که

overhead الیه که است Hypervisor هر .گذاشت خواهد مجموعه این روی بر

از باید شود اجرا افزار تسخ روی بر اینکه برای کند می اجرا مهمان عاملسیستم که عملی دستور

دیگر .شود فرستاده افزارسخت به سپس و شود ترجمه میزبان زبان به بگذرد، Hypervisor الیه

هسته 4 وجود باشید، نکردید توجه آن به حال به تا شما شاید و دارد وجود مدل این در که اینکته

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

حالی در کنیم اجرا همزمان را کرنل هسته 4 که است کرده تحمیل ما به روش این اما بوده همدیگر

.هستند هم شبیه تقریبا انها که

کماکان شما که بینیم می .کنیم دقت کند می اجرا را هابرنامه Docker که مدلی به اگر

ولی کنید نصب مجزا های محیط در خود میزبان روی بر را فاوتمت برنامه سه توانید می

این روی بر خواهم می .اند شده حذف مهمان عامل سیستم و Hypervisor هایالیه

اصطالح به و است متفاوتVM مدلی با کامال مدل این که باشم داشته تاکید نکته

virtualization level-system-Operating بسیار مدل نای .شود می نامیده

هسته از برنامه تمامی لینوکس هسته 4 کردن اجرا جای به و است قبلی مدل از تر بهینه

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

RAM، CPU از کدام هر که دیگر تنظیمات و continaerمدیریت کنند می استفاده ها

یدباش داشته کامل

Docker Vs Configuration management tools

من نظر به طلبد، می را ای جداگانه مبحث خود که .اند گذاشته IT در ها زیرساخت مدیریت بر شگرفی تاثیر تنظیمات مدیریت ابزارهای کنیم، نگاه منصفانه

انددهندا اریه مناسبی کاره راه هستند مهم بسیار که حوضه دو در ابزارها این

ادامه را سنتی الیه همان همچنان است، شده ارایه ابزارها این توسط که ای workflow و ساختار :developer و sysadmin تیم بین دیوار شکستن •

ار تنظیمات باید ندهده توسعه تیم همچنان .ندارند شود اجرا است قرار برنامه که زیرساختی تنظیمات در نقشی برنامه هایدهنده توسعه معموال و هدد می

تیم افزارنرم یک relaease برای شدن اماده از بعد و دهد انجام Vagrant و Chef مثل ابزارهای توسط خود development محیط در

Sysadmin یا و Operation برای را تنظیمات همان دوباره باید cookbook(حالت اگر Chef بگیرید نظر در را) محیط production انجام

گیرد می انجام Production و Development محیط دو نبودن یکسان دلیل به بلکه گروه دو بین اعتماد نبود بدلیل نه کاری دوباره این .دهند

تمام تا کنند می زیادی تالش ابزارها این که دانید می باشید آشنا ها ابزار این با اگر (:infrastrcutre immutable)ناپذیر تغییر زیرساختار ایجاد •

کمبود مواردی در اما .اند بوده موفق کار این در هم زیادی حدود تا .اند کرده سازی مدل را آن شما که بمانند(state) موقعیت همان در شما زیرساخت

کنید، حذف را نیازمندی این بعد مدت چند و باشید کرده را XML-PHP بسته نصب خواست در خود Cookbook در شما اگر مثال، طور به دارند،

را موردی ولی یدبیا بنظر افتاده پا پیشه بسیار مثال این که است ممکن .ماند خواهند باقی سیستم در همیشه برای بسته این که است این افتد می که اتفاقی

Page 122: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

امروز همین شما اینکه برای ندک کار Development روی بر است ممکن شما برنامه .بیافتد اتفاق مهمتری یبسته برای الگو همین که کنید تصور

نسخه به نسخه یک از را شما محیط ابزارها این خالصه طور به .نکند کار دارد ایاضافه ایبسته که Production روی بر اما اید، کرده اعمال را تغییرات

.ندارد وجود ها محیط بودن یکسان برای تضمینی اما برند می دیگری

را هابرنامه و بگذارید اشتراک به هم با توانید می Sysadmin یا و Developer عنوان به شما که دهد می شما به مشترکی فریمورکی Docker مقابل در

بخواهیم اگر .ذاریدبگ اشتراک به اینترنت در دیگر افراد با را آن توانید می بلکه بگذارید اشتراک به خود تیم افراد بین را آن توانید می شما تنها نه و کنید منتشر

می گذارید، می اشتراک به دیگران به composer در را خود استفاده مورد هایکتابخانه که سادگی همان به توانید می شما بگویم، شما به PHPزبان به

!بگذارید اشتراک به دیگران با را خود زیرساخت توانید

.کنید ذخیره آن در را زیر دستورات و کنید ایجاد ckerfileDo نام به جدید فایل یک شویم، متمرکز مثال یک رو بر بگذارید

FROM php:5.6-apache

RUN apt-get update && \

apt-get install -y d git && \

docker-php-ext-install zip

RUN a2enmod rewrite

COPY . /var/www/html/

RUN cd /var/www/html && \

php ./bin/composer install

نیاز مورد که های extension سپس و کنید می استفاده شده نصب آن روی بر Apache وPHP هایبرنامه که ای شده آماده زیرساخت ما مثال این در

نصب را نیاز مورد های انهکتابخ تا کنیم می اجرا را composer دستور سپس و کنیم می کپی نظر مورد شاخه به را نیاز مورد هایفایل کنیم، می نصب را

مثابه به Hub Docker.کند می دانلود hub docker از راapache-php:5.6 نسخه build docker، docker دستور اجرای از بعد .کنید

Packagist نیاز، مرود ها فایل دریافت از بعد .بگذارید اشتراک به دیگران با را خود تظیمات توانید می و کند می عمل kerDocشده درخواست دستورات

در Docker که سیستمی هر روی بر را آن توانید می شما که دهد می ارایه docker image یک شما به پایان در و کند می اجرا مجزا محیط یک در را

: بدهم نمایش شما به را پروسه این بگذارید .کنید اجرا را آن و ببرید شود می اجرا آن

docker build -t my_app .

Sending build context to Docker daemon 3.584 kB

Sending build context to Docker daemon

Step 0 : FROM php:5.6-apache

---> f1ea6b51ea94

Step 1 : RUN apt-get update && apt-get install -y libxml2-dev zlib1g-dev

git && docker-php-ext-install zip

---> Running in a15f468f827e

Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB]

Get:2 http://security.debian.org jessie/updates/main amd64 Packages [165 kB]

Get:3 http://httpredir.debian.org jessie InRelease [134 kB]

Get:4 http://httpredir.debian.org jessie-updates InRelease [123 kB]

Get:5 http://httpredir.debian.org jessie/main amd64 Packages [9038 kB]

Get:6 http://httpredir.debian.org jessie-updates/main amd64 Packages [3614 B]

Fetched 9527 kB in 2min 36s (61.0 kB/s)

. . .

---> d02ceb8e3bc5

Removing intermediate container a15f468f827e

Step 2 : RUN a2enmod rewrite

---> Running in 82187a011534

Enabling module rewrite.

To activate the new configuration, you need to run:

Page 123: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

121 1314 مرداد PHP همایش

service apache2 restart

---> 7ca38a5dca5b

Removing intermediate container 82187a011534

Step 3 : COPY web /var/www/html

---> 815be0e67d29

Removing intermediate container 204eed16f5f5

Successfully built 815be0e67d29

و کنیم حذف لیست از را ها extension از یکی ما اگر .است ناپذیر تغییر اید ساخته که ای image که دهد می تضمین شما به Docker همچنین

image بسازیم، جدیدیimage به ارتباطی هیج جدید image محسوب جدیدی بسته کامال ولی دارد قرار بسته این در هنوز شما کد چه اگر ندارد قبلی

شد خواهد حل گیرد می فاصله اولیه نسخه از زمان گذر با شما production که مشکلی صورت این به بینید، می که همانطور .شود می

Docker use cases

محیط بتوانید تا باشد می شما development محیط روی بر سرویس یک اریه کند، شما به روزمره کارهای در تواند می Docker که مواردی از یکی

production ابزار با شما اگر .کنید سازی شبیه خود لپتاپ بروی راvagrant قبال که همانطور .پرسید خواهید دو این وتتفا از انمطمئن باشید آشنا

.شد خواهند اجرا باالتری سرعت با developmentمحیط در حتی برنامه نتیجه در کنید، می حذف را VM الیه شما Docker از استفاده با دادم توضیح

برای TeamCity یا و Jenkines مثل ابزارهای از اگر .باشد می تست های محیط در کنید استفاده Docker از توانید می شما که مواردی از دیگر یکی

یک روی بر همزمان طور به برنامه یک تست اجرای امکان که است این دارند ابزارها این که های محدودیت از یکی باشید کرده استفاده تست محیط اجرای

Agent اینکه دلیل به .ندارد وجود Docker ماشین یک روی بر همزمان صورت به را تست یک توانید می دهد، می اریه ایزوله و ایجداگانه محیط شما به

.کنید اجرا دلخواه تعداد به

معماری با شما افزار نرم که صورتی در کنید اجرا مختلف هایمحیط در و کنید بندی بسته تانبرنامه تا دهد می اجازه Docker اینکه دلیل به

Microservices امکان این از وانیدت می باشد، شده نوشته Docker نیازتان به توجه با راحتی به را تان برنامه و کنید استفاده scale دهید.

Real app on Docker .کنیم می مرور را نمودیم ایجاد پروژه یک برای ما Docker اساس بر ما که معماری و ساختار ادامه در

: شامل برشمریم را این اصلی های مولفه بخواهیم اگر

development محیط •

• Control Version Source • Integration Continues • servers enabled Docker with Linux

:شود می ارایه زیر های سرویس development محیط در

• HHVM • MySQL • Nginx • RabbitMQ • Redis

و بخواند YMLفایل یک از را تنظیمات توانید می که کنم اآشن Compose Docker ابزار با را شما خواهم می بپردازیم، تنظیمات به اینکه از قبل

continaer محیط در .کند اجرا مربوطه تنظیمات با همراه را شما نیاز مورد development نام به فایل یک در تنظیمات compose.yml-docker

: است شده ذخیره

yamato:

build: .

links:

Page 124: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

121 1314 مرداد PHP همایش

- mysql:mysql.local

- redis:redis.local

- rabbitmq:rabitmq.local

environment:

SAM_ENV: development

SAM_GROUP: none

volumes:

- .:/var/www/html/yamato

- /dev/log:/dev/log

working_dir: /var/www/html/yamato

nginx:

image: nginx

ports:

- "8001:80"

links:

- yamato:yamato.local

restart: always

volumes:

- ./docker-compose/etc/nginx/sites-

available/yamato:/etc/nginx/conf.d/default.conf:ro

- /dev/log:/dev/log

mysql:

image: mysql

ports:

- "3316:3306"

environment:

MYSQL_ROOT_PASSWORD: dummy

MYSQL_DATABASE: my_db

redis:

image: redis

rabbitmq:

image: rabbitmq

شود اجرا زیر دستور بایست می مربوطه تنظیمات اعمال و ها سرویس تمام آوردن باال برای

$ docker-compose up -d

Recreating yamato_redis_1...

Recreating yamato_rabbitmq_1...

Recreating yamato_mysql_1...

Recreating yamato_yamato_1...

Recreating yamato_nginx_1...

اجرا را آنها سپس و کند می دانلود hub docker از را آنها nginx و redis,rabitmq,mysq ها بسته نبودن صورت در docker دستور این اجرای با

.باشید داشته دسترسی localhost:8001 آدرس از برنامه به بود خواهید قادر شما و نماید می

deployment and integration continuous:

نرم بسته ایجاد برای نیاز مورد دستورات TeamCity برنامه شد، ارسال master branch روی بر git سرور به کد و شد اعمال تغییرات اینکه از پس

را برنامه این که سرورهای به شده آماده بسته تست، بودن موفق صورت در کند، می اجرا شده آماده بسته روی بر را stTe Unit سپس و کند می اجرا را افزار

بر شما که ای بسته همان که دهد می را اطمینان این شما به Docker.شوند می روزرسانی به اوتوماتیک صورت به برنامه و شود می ارسال کنند می اجرا

.باشد دسترس در کنند می اجرا را برنامه این که سرورهای تمامی روی بر شده نصب extentions و dependency همان با اید داده جامان تست آن روی

nortcudorPservers) enabled Docker with Linux (:

شما وقتی مدل این در .اند شده السترک هم با Swarm Docker نام به ایبرنامه توسط که است هاسرور از مجموعه شاملProduction محیط

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

باید شما که ای هزینه تنها باشند، نداشته را شما برنامه برای نیاز دمور منابع شما سروهای زمانی اگر بود، خواهد پذیر scale راحتی به شما برنامه مدل

Page 125: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

122 1314 مرداد PHP همایش

مانند های برنامه توسط و کنید اجرا خواهد می که میزان هر به خود برنامه از تا کند می کمک شما به Docker و بود خواهد افزار سخت هزینه بپردازید

Nginx یا و HAProxy بین را ها درخواست contianer docker کنید منتشر شده اجرا تازه های.

Page 126: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

123 1314 مرداد PHP همایش

PHPشیوه های مختلف پیاده سازی برنامه های چند زبانه در

افشین طالبی

مقدمه - 4

گاه/نرم افزار تحت وب ممکن است از سراسر جهان بازدیدکننده داشته باشد و با توجه به حذف مرزهای جغرافیایی در اینترنت، یک وب

گاه/نرم افزار تحت وب می باشند باید بتوانند با آن ارتباط برقرار کنند. یکی از مهمترین همترین سرمایه برای یک وباز آنجا که کاربران م

گاه/نرم افزار تحت وب می باشد تا کاربران بتوانند بر اساس عوامل برای برقراری این ارتباط قابلیت انتخاب زبان های مختلف برای یک وب

ا را مرور کنند.زبان انتخابی خود محتو

روش های مختلفی برای پیاده سازی این امکان ایجاد شده است که هر کدام دارای معایب و مزایایی می باشند. برخی روش ها phpدر

را نام برد. intlو TMX ،gettext ،ini file ،Arrayبرای ایجاد چند زبانه بودن برنامه بکار می رود می توان PHPکه در

TMX :TMX خفف مTranslation Memory eXchange .تبادل حافظه ترجمه( می باشد(TMX یک استاندارد می باشد که از

XML ( برای آرشیوبندی و تبادل متقابل حافظه های ترجمهTM استفاده می شود. این حافظه ها توسط نرم افزارهای اختصاصی )

نامیده می شود. CAT d Translation)(Computer Aideترجمه و بومی سازی ایجاد می شوند که

gettext :باز می باشد که امکان چندزبانه کردن برنامه را ممکن می سازد. این سیستم یک سیستم بومی سازی و بین اللملی سازی کد

افزوده است. نیز با توجه به کدباز این سیستم آن را به کتابخانه های خود PHPمی تواند در زبان های مختلف پیاده سازی شود که

INI File فایل :ini ها و نرم افزارها استفاده می شود. یک استاندارد غیر رسمی برای پیکربندی می باشد که در برخی سیستم عاملini

توابعی وجود دارد که PHPیک فایل متنی ساده می باشد که دارای ساختار پایه متشکل از بخش ها، ویژگی ها و مقادیر می باشد. در

را تفسیر کرده و محتوا را در قالب یک آرایه بر می گرداند. iniایل ف

Array با توجه به پشتیبانی :PHP از آرایه ها با اندیس رشته ای و سریع بودن دسترسی به آرایه ها این قابلیت می تواند به عنوان روشی

برای پیاده سازی سیستم چندزبانه استفاده شود.

intl افزونه :intl ساس کتابخانه بر ست که امکان تطابق با ICUا شده ا شته را بر و قالب بندی تاریخ/زمان/اعداد/واحد پولی UCAنو

اساس کشور مشخص شده فراهم می سازد.

۲ - TMX

TMX مخففTranslation Memory eXchange .تبادل حافظه ترجمه( می باشد(

Page 127: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

124 1314 مرداد PHP همایش

TMX یک استاندارد می باشد که ازXML ( برای آرشیوبندی و تبادل متقابل حافظه های ترجمهTM استفاده می شود. این حافظه )

نامیده می شود. CAT (Computer Aided Translation)ایجاد می شوند که ها توسط نرم افزارهای اختصاصی ترجمه

TMX ژه با نام نتیجه یک پروژه می باشد و توسط یک گروه ویLISA توسعه داده شده است، که با عنوانOSCAR (Open Standard

use-for Container/Content Allowing Re.نیز شناخته می شود )

فراهم آوردن سیستمی خنثی برای تبادل داده بین سیستم های ترجمه مختلف می باشد، با به حداقل رساندن یا حذف TMXهدف از

در حال حاضر در اکثر نرم افزار های ترجمه در بازار پشتیبانی می شود. TMXای مهم. فرمت از دست دادن داده ه

TMXنمونه فایل

sample_tmx.xml

<?xml version="1.0" ?>

<tmx version="1.4">

<header

creationtool="XYZTool"

creationtoolversion="1.01-023"

datatype="PlainText"

segtype="sentence"

adminlang="en-us"

srclang="EN"

o-tmf="ABCTransMem">

</header>

<body>

<tu tuid="hello" datatype="plaintext">

<tuv xml:lang="en">

<seg>hello</seg>

</tuv>

<tuv xml:lang="fa">

<seg>سالم</seg>

</tuv>

</tu>

<tu tuid="world" datatype="plaintext">

<tuv xml:lang="en">

<seg>world</seg>

</tuv>

<tuv xml:lang="fa">

<seg>دنیا</seg>

</tuv>

</tu>

</body>

</tmx>

Page 128: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

125 1314 مرداد PHP همایش

توضیحات :

tu (translation unit.بخش والد هر عنصر که ترجمه می شود. این بخش می تواند شامل یک شناسه یکتا باشد : )

tuv (translation unit variant: ) ( بخشی که حاوی کد زبان ترجمه می باشدxml:lang.)

seg (segmentبخشی که حاوی متن ترجمه می : ) .باشد

حافظه ترجمه

( حافظه های ترجمهTM شند شوند، حاوی جمالت مختلف در یک زبان مرجع می با شناخته می ( که پایگاه داده ترجمه نیز

که به ترجمه های مرتبط در یک یا چند زبان لینک شبببده اند. یک جمله مرجع به همراه ترجمه های آن یک واحد حافظه

شود. برنامه هایی که از ترجمه )رکورد در پایگاه داده( ن سودمند برای ترجمه های TMامیده می ستفاده می کنند ابزارهایی ا

زبان، بهبود کیفیت و بهره وری روند ترجمه انسانی می باشند و آن را جایگزین نکنید.

زمانی که یک جمله جدید از طریق برنامهTM شود، برنامه آن را در جمالت مرجع درون دیتابیس ج ستجو می کند وارد می

و مقدار مشخص متناظر را بر اساس تطابق بدست می آورد.

صحیح %100زمانی که میزان تطابق شده در دیتابیس صحیح بوده و ترجمه متناظر پیدا ست که تطابق شد بدین معنی ا با

باشد اما بزرگتر %100فرض می شود و مستقیما برای ایجاد متن ترجمه استفاده می شود. هنگامی که میزان تطابق کمتر از

از یک میزان مشخص باشد )منطق فازی(، ترجمه متناظر پیدا شده در دیتابیس به یک مترجم انسانی نمایش داده می شود، و

مترجم قضبباوت می کند و می تواند اصببالحات نیز انجام دهد. برای جمالتی که میزان تطابق آنها کمتر از میزان مشببخص می

صد ترج شد برای هیچ ق شوند. جمالت جدید که برای یک با ستی ترجمه صورت د شوند و آنها باید به ستفاده نمی مه ای ا

ترجمه وارد شده است در دیتابیس ذخیره شده و در جستجو های بعدی استفاده می شود.

TMX PHP Bridge

این امکان وجود دارد که عناصببر متنی را از راه حلی مفید برای چند زبانه کردن ارائه کرده اسببت. در واقع PHPاسببتفاده از آرایه ها،

درون سورس برنامه جدا کرده و آنها را در درون یک آرایه قرار دهد.

این روش چندین مزیت برای برنامه نویس دارد اما برای مترجم می تواند بسیار پیچیده باشد بویژه از لحاظ استفاده مجدد.

می باشد. این امکان مترجم ها را قادر می سازد از ترجمه های خود ورودی و TMXفرمت گزینه بهتر متشکل از آرشیو منابع متنی در

خروجی بگیرند با استفاده از ابزارهای ترجمه مورد استفاده که کامال مستقل از زبان برنامه نویسی مورد استفاده می باشد.

ستاندارد شکل از ایجاد یک کالس واسط می باشد که مستقیما داده ، متPHPدر برنامه های TMXبهترین راه حل برای پیاده سازی ا

فایل PHP ذخیره می کند )آرایه PHPسروکار دارند می خواند و آنها را در یک آرایه TMXکه با استاندارد XMLرا از فایل های

TMX .)برنامه ترجمه

را بکار بگیریم و فرآیند انتقال از برنامه های PHPهای این روش این امکان را به ما می دهد که تمام مزیت های اسبببتفاده از آرایه

خارجی را تسهیل کنیم. TMXکاربردی

می باشد. TMX معایب روش ذکر شده عمدتا مربوط به زمان و حافظه مورد نیاز برای بارگزاری فایل

می تواند به عنوان این کالس واسط عمل کند. TMX PHP Bridgeکتابخانه

Page 129: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

121 1314 مرداد PHP همایش

9 - gettext

gettext یک سیستم بومی سازی و بین اللملی سازی کد باز می باشد. این سیستم در چندین زبان کهPHP نیز شامل آن می شود

پیاده سازی شده است، و فرآیند ترجمه را برای مدیریت و نگهداری آسان تر میکند.

بودن نرم افزارهای خود را درک کردند. مشببکل محاسبببات جهانی شببده بود و برنامه نویسببان اهمیت چند زبانه 1111در اوایل دهه

بیشتر از یک ترجمه بود، این یک کابوس برنامه نویسی بود. برنامه نویسان اغلب مجبور بودند چندین کپی از یک کد بگیرند تا نسخه

شد. شته با سایت در زبان های مختلف وجود دا شرکت های مختلف از وب شکل، ستمی را در Sunبری رفع این م اوایل دهه سی

سعه داد که 1111 سال بعد، gettextتو شد. چند سخه کد باز GNU Project ،GNU gettextنامگذاری شر کرد، که ن را منت

بود. SUNسیستم

است می باشد. gettextنسبتا ساده می باشد. این کار شامل تغییراتی در کد منبع انگلیسی اصلی که شامل تابع gettextاستفاده از

gettext .ترجمه رشته مشخص شده را بر اساس زبان از پایگاه داده برمی گرداند

سال، شامل gettext بعد از چند ست که شده ا سازی سی پیاده ، و C++ ،C#،ASP.net ،Perl ،Rubyدر چندین زبان برنامه نوی

صار PHPالبته ستم )برای اخت سی ساس تعداد کلمات i18n. این شود که بر ا internationalizationو حرف اول و آخر نامیده می

POدر یک فایل با پسوند gettetکلیه ترجمه ها در می باشد( اکنون استانداردی جهانی در میان زبان های برنامه نویسی می باشد.

(Portable File ذخیره می شوند. برای ترجمه زبان های مختلف باید فایل های )PO .مختلفی داشته باشیم

مناسب را ایجاد کند. می توانید از برنامه هایی همانند POبرای ترجمه را ایجاد کنید، ابتدا باید فایل های PHPآنکه کدهای قبل از

POEdit برای ایجاد فایل هایPO .استفاده کنید

1 – INI File :

یک فایل iniو نرم افزار ها استفاده می شود. یک استاندارد غیر رسمی برای پیکربندی می باشد که در برخی سیستم عامل ها iniفایل

شد. در شکل از بخش ها، ویژگی ها و مقادیر می با ساختار پایه مت شد که دارای ساده می با شد PHPمتنی کتابخانه ای موجوی می با

را تفسیر کرده و محتوا را در قالب یک آرایه بر می گرداند. iniکه فایل

ذخیره کرده و برمی گرداند. PHPرا تفسیر کرده و تنظیمات را در یک آرایه iniربندی فایل پیک parse_ini_fileتابع

شیوه استفاده :

parse_ini_file(file,process_sections)

پارامتر توضیحات

File در آن تعریف می شود iniالزامی بوده و مسیر فایل

بخش های مختلف مشخص شده در باشد، trueاختیاری بوده و در صورتی که دارای مقدار

به همراه تنظیمات مرتبط را در یک آرایه چند بعدی با نام هر بخش برمیگرداند. iniفایل

است. falseمقدار پیش فرض

process_sections

Page 130: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

121 1314 مرداد PHP همایش

نکات :

شود، و هیچ تغییری الزم نیست ستفاده php.iniدر فایل این تابع می تواند برای خواندن فایل های تنظیمات برنامه خودتان ا

انجام دهید.

کلمات کلیدی زیر نباید به عنوان کلیدها در فایلini : استفاده شود

o null ،no ،yes ،true ،false

: کاراکترهای رزرو شده زیر نباید در کلیدها استفاده شود

o {}|&~![()"

۵ - Array :

ستفاده از آرایه سازی برنامه های چند زبانه با ا شود برای پیاده ستفاده ها ابتدا باید فایل های زبان هایی را که می خواهید در برنامه ا

سپس در درون این directoryایجاد کنید.برای مثال ما دو زبان انگلیسی،فارسی را در نظر میگیریم. ابتدا یک پوشه با نام ایجاد کنید،

شه دو فایل با نام صلی )ایجاد کنید. در lang.fa.phpو lang.en.phpپو ضمیمه می common.php( ما فایل index.phpفایل ا را

کنیم که شامل قطعه کدی است که زبان درخواستی را می گیرد. فایل های زبان شامل کدهای زیر می باشد :

lang.en.php <?php

/*

------------------

Language: English

------------------

*/

$lang = array();

$lang['PAGE_TITLE'] = 'My website page title';

$lang['HEADER_TITLE'] = 'My website header title';

$lang['SITE_NAME'] = 'My Website';

$lang['SLOGAN'] = 'My slogan here';

$lang['HEADING'] = 'Heading';

// Menu

$lang['MENU_HOME'] = 'Home';

$lang['MENU_ABOUT_US'] = 'About Us';

$lang['MENU_OUR_PRODUCTS'] = 'Our products';

$lang['MENU_CONTACT_US'] = 'Contact Us';

$lang['MENU_ADVERTISE'] = 'Advertise';

$lang['MENU_SITE_MAP'] = 'Site Map';

?>

lang.fa.php <?php

/*

------------------

Language: Persian

Page 131: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

122 1314 مرداد PHP همایش

------------------

*/

$lang = array();

$lang['PAGE_TITLE'] = عنوان صفحه;

$lang['HEADER_TITLE'] = 'عنوان هدر;

$lang['SITE_NAME'] = 'وب سایت من';

$lang['SLOGAN'] = 'شعار تبلیغاتی';

$lang['HEADING'] = 'عنوان';

// Menu

$lang['MENU_HOME'] = 'خانه';

$lang['MENU_ABOUT_US'] = 'درباره ما';

$lang['MENU_OUR_PRODUCTS'] = 'محصوالت ما';

$lang['MENU_CONTACT_US'] = 'ارتباط با ما';

$lang['MENU_ADVERTISE'] = 'تبلیغات';

$lang['MENU_SITE_MAP'] = 'نقشه سایت'; ?>

های یکسببانی دارند و فقط مقادیر آنها با هم همانطور که مشبباهده میکنید در کدهای باال اندیس آرایه ها در فایل های زبان شببناسببه

متفاوت می باشببد. در فایل هایی که از مقادیر ترجمه ها اسببتفاده می شببود، فقط آرایه را با اندیس مربوطه فراخوانی کرده و مقادیر بر

اساس زبان انتخابی نمایش داده می شوند.

intlافزونه – 6

و قالب بندی تاریخ/زمان/اعداد/واحد پولی UCAنوشته شده است که امکان تطابق با ICUخانه بر اساس کتاب intl( extensionافزونه )

را بر اساس کشور مشخص شده فراهم می سازد.

API شده در سازی شد، بنابراین کسانی که در ICUهای APIمشابه PHPهای پیاده ستفاده کردند ICU از ++Cیا Javaمی با ا

نیز استفاده کنند. PHPهای APIبه راحتی می توانند از

می باشد. ماژول ها به شرح ذیل می باشد : ICUدر APIدارای چندین ماژول می باشد، که هر کدام از آنها معادل intlافزونه

Collator

Number Formatter

Message Formatter

Normalizer

Locale

نتیجه گیری – ۷

ع این لطببرای ارتباط با کاربران در نقاط مختلف جهان، چند زبانه بودن یک نرم افزار تحت وب ار ابتدائی ترین ملزومات می باشد، با

در روش ها و سیستم هایی که برای این منظور ارائه شده سعی شده که بخش ترجمه از هسته کد .امکان دارای هزینه هایی می باشد

کامال مجزا شود و یک واسط ارتباط بین این دو بخش را برقرار کند.

Page 132: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

121 1314 مرداد PHP همایش

، TMX ،gettextشرح داده شد که شامل PHPشده به زبان به طور اجمالی روش های مرسوم پیاده سازی ترجمه متون در برنامه های نوشته

ini file ،Array وintl می باشد. هر کدام از این روش ها دارای مزایا و معایبی می باشد که با توجه به سیستم نرم افزاری تحلیل شده

باید بهترین گزینه انتخاب شود.

منابع – ۸

php.net

wikipedia.org

w3schools.com

lingohub.com

udemy.com

bitrepository.com

tecnick.com

Page 133: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

131 1314 مرداد PHP همایش

راهکار 21، پیاچپیچالش 11

حمید رضا دبیری نژاد

مقدمه

در کنار شیرینی و سادگی آن، در برخی مواقع سخت و خسته کننده می شود و این به دلیل وجود چالش ها و PHPبرنامه نویسی با زبان

با آنها دست و پنجه نرم کند.مشکالتی است که برنامه نویس بایستی

می پردازیم و برای هرکدام حداقل یک راه حل پیشنهادی ارائه می دهیم. PHPچالش عمده و البته مهم 11در مقاله پیش رو به

چالش اول: برنامه ریزی کنید

نویس هستید!به احتمال بسیار زیاد برنامه و قصد خواندن آنرا دارید، اگر این مقاله برای شما جذاب است

برنامه نویسی نه مثل هر کار دیگری نیاز به برنامه ریزی دارد، بلکه بسیار بیشتر از هر کار دیگری نیاز به برنامه ریزی دارد.

هو کد هایی که امروز می نویسید، می توانند در آینده زندگی شما را دچار تحول کنند، پس پیش از شروع کار، حتی پیش از فکر کردن ب پروژه

کار، برنامه ریزی کنید.

ابزارهای برنامه ریزی زیادند، پیشنهاد می کنیم به این ها نگاهی بیاندازید:

آنالین ها:

OrangeScrum

http://www.orangescrum.com

Producteev

https://www.producteev.com

Trello

https://trello.com

Asana

https://asana.com

Evernote

http://evernote.com

آفالین ها:

Page 134: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

131 1314 مرداد PHP همایش

Microsoft Project

https://products.office.com/en-us/Project/project-standard-desktop-software

YouTrack

https://www.jetbrains.com/youtrack

ProjectLibre

http://www.projectlibre.org

GanttProject

http://www.ganttproject.biz

کاغذ و یک قلم بردارید: 3اگر نمی خواهید از ابزارها استفاده کنید،

تان به آنها دست یابد.یسید، همان هایی که می خواهید پروژهدر برگ اول اهداف پروژه را بنو -1

در برگ دوم کارهایی را که می خواهید و باید انجام دهید را در فاز های مد نظرتان بنویسید، سعی کنید زمان بندی کنید و زمان انجام -2

هر کار را در جلویش معین کنید.

گزارش کوتاهی از آنچه انجام داده اید، زمانی که صرف کرده اید و میزان کلی پیشرفت برگ سوم را بگذارید پس از پایان هر کار، در آن -3

پروژه را یادداشت نمایید.

این زمان بندی شما را منظم خواهد ساخت، پیشرفتتان را ساده تر و دید کلیتان را یکپارچه تر می نماید.

ایست و ایرادی ندارد اگر در ابتدا کمی از وقت شما را بگیرد، اما پس از شروع کار، فراموش نکنید که برنامه ریزی مناسب، اولین قدم هر پروژه

دقیقه وقت نیاز داشته باشد. 15تا 5نباید بیشتر از

لطفا بروز باشید! چالش دوم :

زبان جدید ستودنی بود، اما به نوشتید به خاطر بیاورید، شوق و عطشان برای به کار گیری این PHPرا با !Hello Worldاولین باری را که

، به متغیرهای بدون نوع و راحتش، به همه خوبی ها و دردسر هایش؛ اما حاال اگر موضوع جدیدی می بینید، $مرور عادی شد، عادت کردید به

م می خواهد.ای هدانش هسته PHPندیده اش نگیرید یا از آن بدتر متعصبانه راه حل های قبلی را ترجیح ندهید، میدان نبرد

و لبخندی روی صورتتان بنشانند. لطفا برای بروز بودن عطش داشته باشید، قابلیت ها و امکانات توسعه داده می شوند که شما را آسوده کنند

برای بروز بودن به این آدرس ها سر بزنید:

آب را اول از سرچشمه بنوشید

http://php.net http://php.net/archive/2015.php

https://www.reddit.com/r/PHP

http://www.planet-php.net

http://www.phpdeveloper.org

http://www.sitepoint.com/php

http://www.phpbuilder.com

Page 135: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

132 1314 مرداد PHP همایش

لیست ها عضو شوید: Mailing یا در این خبرنامه ها و

http://news.php.net/

http://www.phpweekly.com/

چالش سوم : یک... دو... سه... پرتاب!

( را می توان سکوی پرتابی در نظر گرفت که قرار است محصوالت و پروژه های شما بر روی Development Environmentمحیط توسعه )

آن تولید شود، آزمایش شود و در نهایت توزیع شود.

ه داده محیط توسعه آماده می شود و با یک ویرایشگر ساده متن می توان پروژه نوشت.، یک وب سرور و یک پایگاPHPبه طور معمول با نصب

اما این حداقل ها خود چالش برانگیزند، کمک کننده نیستند و کار شما را ساده نمی کنند.

ه دیگر چه بهتر:بهتر است محیط توسعه ای داشته باشید که امکانات زیر را پوشش دهد، اگر بهتر از این ها هم سراغ دارید ک

مدیریت پروژه

برنامه های خود را به عنوان یک پروژه متحد در آورید، نه مجموعه ای از فایلها و دایرکتوری ها، بین آنها سوییچ کنید و از همه مهمتر

خود را کم کنید یا اصال همه را ببندید. Explorerپنجره های

پیش ازRefresh کردن دیباگ کنید

کالن را فراموش نکنید.رچه و مجتمع برای دیباگ کردن و خطایابی مراقب کد های گرانبهای شماست. سمییک ابزار یکپا

کد های هوشمند

PHP ساختاری ساده دارد، همه می دانند، حتی محیط های توسعه، وقت شما ارزشش را دارد که بخشی از کد های خود را به هوش

عالقه و هوشمندی کار شما را ساده و سریعتر کند.محیط توسعه ی خود بسپارید تا آن هم با

نمایش درختی

دیدن ساختار کالس های و فایل هایتان، غیب کردن برخی از آنها و پریدن از این شاخه به آن شاخه درون کد هایتان، برنامه نویسیتان

را طبیعی تر می کند.

کنترل منابع کد

فکر می کنم باید برنامه نویسی را کنار استفاده نمی کنید؟ ( Source Code Control System )از مدیریت کنترل کد

بگذارید یا همین امروز خود را تغییر بدهید.

کنترل از راه دور

را به دست بگیرید. SFTPیا FTP وقتی پروژه ها نیاز به توزیع پیدا می کنند، بهتر است کنترل خطوط توزیع و انتقال همچون

ه های دادهاتصال به پایگا

ساختار داده هایتان را به درون محیط توسعه بیاورید، مدل ها بهتر از متن ها حرف می زنند.

چیزهای کوچک

و ... چیزهای کوچک را فراموش نکنید. Syntaxجستجو، مرتب سازی، کارهای ساده تکراری، مرتب سازی کد، رنگبندی

Page 136: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

133 1314 مرداد PHP همایش

تی کنید، دوستش داشته باشید و البته اگر رایگان نیست، هزینه اش را پرداخت کرده محیط توسعه ای مناسب شماست که با آن احساس راح

باشید!

پیشنهاد ات من به شما:

Eclipse + PHP Plugins

PhpStorm

Php Designer

Zend Studio

Komodo

امتحانشان کنید و بهترین را برگزینید.

چالش چهارم : ساختار فایل سیستمی پروژه ها

استفاده می کنید، اصول و ساختاری که توسط توسعه دهندگان آن فریم ورک ارائه شده است را بشناسید، از PHP Frameworkیک اگر از

آنها پیروی کنید و اگر انعطاف الزم را دارند بهترشان کنید.

تا پروژه های خود را بهتر سازماندهی و چه از فریم ورک خاصی استفاده کنید چه نه، راهکارها و راهنمایی های زیر شما را کمک می کنند

مدیریت کنید:

دسته بندی کلی این است: .1

a. فایل هایPHP

b. فایل های غیرPHP

آنها را شناسایی کنید و در جای مناسب قرار دهید.

را PHPداشته باشید و باقی فایل های index.phpبا نام PHPتنها یک فایل اجرایی public_htmlیا Webسعی کنید در ریشه

به مکانی غیر از ریشه وب انتقال دهید.

PHPاش است با پسوند اش است و در فایلی که هم نامNamespacesهر کالس باید در دایرکتوری های تو در تویی که معادل .2

سازماندهی شود.

ه شده است، به صورت جامع شرح داد PSR-4و PSR-0است که در PHP Standard Recommendationاین خالصه ای از

اطالعات بیشتر را در آدرس زیر مطالعه کنید:

http://www.php-fig.org/psr/psr-0

http://www.php-fig.org/psr/psr-4 PSR-4 ی ارتقاء یافتهPSR-0 است و کمی آنرا بهبود بخشیده است، تفاوت عمده شان پشتیبانیPSR-0 از ساختار پکیج های

PEAR بود کهPSR-4 پشتیبانی نمی کند. دیگر آنرا

دسته کرد: 2را نیز می توان PHPفایل های .3

a. فایل هایی با اطالعات قابل تغییر

b. فایل های ثابت

.Configurationsها و Settingاین تغییرات را بایستی مقداری دانست نه کدی، مثال فایل های حاوی

یشان را تنظیم کنید و برای تغییرشان میان کد ها و کالس هایتان غرق آنها را جدا کنید و در پوشه ای نگهداری کنید که بتوانید مجوزها

نشوید.

Page 137: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

134 1314 مرداد PHP همایش

شان دقیقا معادل کالس درونشان است، بدون تغییر در بزرگی و یا ساده است، اگر کالسی در خود دارند، نام PHPنام گذاری فایل های .4

کوچکی.

.کندنیز از همین قانون پیروی می Namespaceدایرکتوری مسیرهای

استفاده کنید. ، عالمت منها( dash) -سایر فایل ها را با حروف کوچک نام گذاری کنید و اگر نیاز به فاصله میان کلمات بود از

حاال ساختاری دارید که هم استاندارد است، هم درک و فهم آسانی دارد و هم از دیدنش لذت خواهید برد.

نظرتان راجع به ساختار زیر چیست؟

Page 138: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

135 1314 مرداد PHP همایش

الش پنجم : اصول نام گذاریچ

برویم و کد های خود را PHPدر چالش قبل به نام گذاری و ساختار فایل ها و دایرکتوری ها پرداختیم، حل وقت آن است که به درون فایل های

هرس کنیم و از آنها یک شاهکار هنری درست کنیم.

Naming Conventions بان برنامه نویسی به زبانی دیگر متفاوت است و عموما به تعداد برنامه یا همان قواعد و اصول نام گذاری، از هر ز

نویسان آن زبان وجود دارد.

حق با دتعداد زیاد این اصول و قواعد به این دلیل است که آنها بیشتر سلیقه ای استفاده می شوند تا به عنوان یک استاندارد جامع و در این مور

حت باشند و احساس خوبی داشته باشند.برنامه نویسان است، می خواهند را

ای دارید از این چالش عبور کنید، اما اگر می خواهید اصول نام گذاریتان را ارتقاء ببخشید و آن را به اگر برای خود اصول نامگذاری دوست داشتنی

استاندارد ها نزدیک کنید با اصول و قواعد زیر همراه شوید:

آشنایی با اصطالحات

StudlyCaps به طور کلیStudly caps .ها نوع نوشتار را مشخص می کنند

در همه آنها از فاصله استفاده نمی شود و بزرگی و کوچکی حروفشان به عنوان یک پترن و

الگو برای نوشتار بکار می رود.

های زیر داشت: Studly capsرا می توان با First nameبه عنوان مثال اصطالح

StudlyCaps => FirstName

sTudlycAps => fIrstnAme

studLYcaPS => firSTnaME

الگوی اولین کاراکتر از هر کلمه بزرگ، مابقی StudlyCapsدر این چالش منظور از

کوچک می باشد.

camelCase camelCase خود به عنوان یکStudly Caps شناخته می شود که با توجه به

ل کلمه اول کوچک، حرف اول کالمات دوم به بعد بزرگ و توضیحات باال می شود: حرف او

مابقی حروف کوچک.

snake_case الگوی ماری: الگویی که در آن همه حروف کوچک اند و به جای فاصله از زیرخط_

(Underline.در آن استفاده می شود )

یا str_replaceاست همانند: PHPمثال آن عمده توابع درون ساخت

mysql_connect

4. Namespace ها و کالس ها

به پایین استفاده می 5.3نسخه PHPنوشته شود و اگر احیانا از StudlyCapsها و کالس ها بایستی به صورت Namespaceنام

( بگذارید.Underlineخط )_را در نام کالس وارد کنید و میان بخش های آن زیر Namespaceکنید

<?php // PHP >= 5.3.0 namespace BaseNamespace\Vendor\Model class UserSystem { … } <?php // PHP < 5.3.0 class BaseNamespace_Vendor_Model_UserSystem { … }

Page 139: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

131 1314 مرداد PHP همایش

ثابت ها .۲

در همه حال بایستی تمامی حروف آنها constو یا با defineفرقی نمی کند ثابت ها در کجا تعریف شوند، عمومی یا درون کالس با کمک

( استفاده شود.Underlineخط )_بزرگ باشد و میان کلماتشان از زیر

<?php // Constant definition define('MY_CONSTANT', 'something'); // Class constant definition class Information { const CLASS_NAME = 'Information'; const PI = 3.14; }

ع و متد هاتواب .9

نوشته شوند. camelCaseتمامی توابع و متد ها بایستی به صورت

<?php // Function naming function doSomthingOnHtml() { ... } // Method naming class Information { public function userLoginAction() { ... } }

متغیر ها و خصوصیات .1

یکی از دو الگوی زیر پیشنهاد می شود. Propertiesاری متغیر ها و به منظور نام گذ

ی خود انتخاب و استفاده کنید، نه هر دو را.نکته مهم این است که فقط یکی از آنها را به سلیقه

1. $cameCase

2. $sanke_case

<?php // $camelCase variable naming $firstName = 'Hamiid'; // $snake_case variable naming $first_name = 'Hamiid';

Page 140: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

131 1314 مرداد PHP همایش

class Information { // $camelCase property naming public $firstName = 'Hamiid'; // $snake_case property naming public $first_name = 'Hamiid'; }

چالش ششم : اشتباهات نام گذاری

ه اند و برخی به اشتباه تبدیل به عادت شده اند، پروژه بعدیتان را از این اشتباهات پاک کنید:برخی اصول نام گذاری منسوخ شد

خط در ابتدای نام متغیر ها و خصوصیات_زیر .4

این یکی از رایج ترین اشتباهات ممکن در نام گذاری است.

خط _؛ برای به یاد آوری حوزه دید آنها از زیر public یا Private, Protectمهم نیست که حوزه دید متغیر یا خصوصیت شما چیست،

در ابتدای نامشان استفاده نکنید.

این کار باعث می شود، کدهای خواناتری داشته باشید و از برخی برخوردها در حوزه نام گذاری جلوگیری می کند.

خط در ابتدای نام توابع و متد ها_زیر .۲

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

خط شروع _که با زیر Magic Methodsتوابع خاصی وجود دارند به نام PHPبه یاد داشته باشید امکان تداخل وجود دارد، چرا که در

می شوند.

استفاده از پیشوند یا پسوند .9

می تواند حاوی رشته PHPک متغیر نوع ندارند و نوع آنها با توجه به محتوایشان تعیین می شود، این بدین معناست که ی PHP متغیرهای

باشد و بعد در طول اجرای برنامه حاوی عددی صحیح شود یا حتی یک شئ.

با توجه به نکته باال نیازی به تعریف نوع متغیر به عنوان پیشوند یا پسوند در نام متغیر ها نیست.

همه موارد زیر اشتباه تلقی می شوند و باید از آنها پرهیز کرد:

<?php // Wrong name prefixes|postfixes $sName = ''; $int_total = 0; $user_object = new User(); $obj_mysqli = new mysqli();

بهینه سازی کد چالش هفتم :

ه سازی صحبت کنیم.در این مقاله قصد توضیح روش های بهینه سازی کد و برنامه نویسی بهینه وجود ندارد، می خواهیم راجع به خود بهین

تعاریف

ارتقاء سطح کمی و کیفی و ایجاد تغییرات به منظور: بهینه سازی

استفاده کمتر و بهتر از منابع -1

Page 141: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

132 1314 مرداد PHP همایش

کاهش زمان اجرا و پردازش -2

افزایش کارایی و عملکرد -3

کاهش حجم و فضای مورد استفاده -4

حذف تاخیر ها و گلوگاه ها -5

را بهینه سازی می گویند.

چنانچه بهینه سازی )با توجه به تعریف قبل( بر روی کد های زبان برنامه نویسی و با تغییر بهینه سازی کد

آنها صورت بگیرد، بهینه سازی کد انجام پذیرفته است.

پیش بهینه سازی یا

بهینه سازی زودرسPremature Optimization

کالت عملکردی، کاهش اگر زمان بهینه سازی، هر زمانی قبل از پیدا شدن گلوگاه، تاخیر، مش

یا بهینه سرعت و کارایی و یا کمبود منابع صورت بپذیرد، به این عمل پیش بهینه سازی

سازی زودرس میگویند.

هدر ندهید.« پیش بهینه سازی کد» اش است، لطفا آنرا با : مهمترین دارایی برنامه نویس، وقت توجه

درصد از زمان 5تا 1برنامه های متوسط و بزرگ و برنامه هایی که با داده سر و کار دارند، تنها در PHPطبق بررسی های معتبر انجام شده، کد

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

درصد برسیم؟ 15تا 11درصد صرف نکنیم و به آن 5تا 1آیا درست نیست که وقت با ارزش خود را برای

ازدیاد سربار برنامه ها کجاست؟اما بخش بزرگ اتالف زمان و

نیست. PHPساده است در کار با ورودی ها، داده ها و دیتابیس ها، پردازش های طوالنی )به عنوان مثال پردازش تصاویر(؛ می بینید، مشکل از

ت آنها را ی به حساب می آیند، بد نیسالبته بایستی به این نکته توجه نمود که اکثر بهینه سازی های کد، به عنوان الگویی مناسب در برنامه نویس

برخورد نمودید که نیاز به بهینه سازی داشت )گلوگاه بود( آدرس های زیر PHPبشناسیم و به مرور به آنها عادت کنیم؛ یا اگر به مشکلی در کد

ل بعضا برای یک مشک زی را امتحان کنید،شما را در یافتن این بهینه سازی ها کمک خواهند نمود؛ بیاد داشته باشید روش های مختلف بهینه سا

بیش از یک راهکار وجود دارد.

PHP Micro-Optimizations http://micro-optimization.com

A HOWTO on Optimizing PHP http://phplens.com/lens/php-book/optimizing-debugging-php.php

50+ best practices to optimize PHP code performance http://www.mdproductions.ca/guides/50-best-practices-to-optimize-php-code-performance

10 PHP Micro Optimization Tips http://hungred.com/useful-information/php-micro-optimization-tips

How to make your code run faster http://www.slideshare.net/djesch/php-optimization-35545593

PHP: a fractal of bad design http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design

43 Tips for Optimizing PHP code http://www.wmtips.com/php/tips-optimizing-php-code.htm

The PHP Benchmark http://www.phpbench.com

Page 142: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

131 1314 مرداد PHP همایش

کد را می توان کش هم نمود، اطالعات بیشتر را در آدرس های زیر دنبال کنید: PHPدر

Alternative PHP Cache http://php.net/manual/en/book.apc.php

OPcache http://php.net/manual/en/book.opcache.php

سعی کرده اند PHPبه عنوان راهکار آخر این چالش، به چالش اول نگاهی بیاندزید و سعی کنید همیشه بروز باشید، نسخه های بروزتر و جدیدتر

ذف کرده و یا بهینه سازی کنند.مشکالت کارایی را تا حد امکان ح

چالش هشتم : بهینه سازی داده ها و دیتابیس

شان هزینه بر است و معموال گرانقیمت ترین بخش داده ها مهم هستند چون بزرگترین دارایی اکثر برنامه ها به شمار می روند، تولید و نگهداری

برنامه ها هستند.

د، پس:بد نیست در نگهداری شان بهینه رفتار کنی

در برنامه تنها داده های مورد نیاز را ذخیره کنید، آنها که مورد استفاده ای ندارند یا قرار است در آینده ای دور مورد استفاده قرار بگیرند را -1

نگهداری نکنید.

ست.اگر داده یا داده هایی حاصل پردازشی سنگین هستند، حتما ذخیره شان کنید، کش کردن آنها راه حل مناسبی ا -2

ه نهمیشه کمترین میزان داده ممکن را تولید، ذخیره و یا در اختیار کاربر قرار دهید، مثال ذخیره شماره ردیف برای سطرها اضافه است، مگر -3

اینکه هر کدام ترتیبی دارند؟

زش های پیچیده بر روی داده ها برای فرمت کردن، پردازش ساده و ذخیره داده ها بوجود آمده، کارها و پردا PHPدر نظر داشته باشید که -4

را به زبان ها و برنامه هایی که برای این کار ساخته شده اند بسپارید.

داده های که کاربر ارائه می دهد را الغر کنید، آنها را که نمی خواهید حذف کنید و اگر می توانید به فرمت مورد نیازتان تبدیل کنید. -5

PHPو بی نیاز از تغییر همچون اسامی شهرها، لیست خدمات و ... را می توان درون ثابتز داده های در نظر داشته باشید که مجموعه ای ا -1

و در ساختاری همچون آرایه ذخیره کرد.

در مورد داده ها نیز همچون هر مسئله دیگری، پیش بهینه سازی انجام ندهید. -1

.صبر کنید، اگر گلوگاهی بوجود آمد، آنها را بهینه سازی کنید

می دهدیتابیس یا پایگاه داده پر استفاده ترین محل ذخیره سازی داده هاست، ابزاری است که با هدف انجام همین کار ایجاد شده است و توسعه دا

شود.

ا دیتابیس ها ب با این حال در اینجا نکاتی برای بهینه سازی کلی رفتار کار با دیتابیس ها و سیستم های مدیریتشان به مفصلی چندین کتاب است،

ارائه می دهیم: PHPدر

.تنها و تنها فیلد ها و داده هایی را بازیابی کنید که به آنها نیاز دارید -1

در کوئری استفاده نکنید. *یک سطر را نیاز دارید، از انتخابگر idاگر

Page 143: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

141 1314 مرداد PHP همایش

دو کوئری ساده، بهتر از یک کوئری پیچیده است. -2

ی مکرر در حلقه است.دار بهتر از کوئری ها JOINیک کوئری -3

<?php // Looping queries $query = 'SELECT id,name FROM categories'; $rows = $db -> fetchAll($query); foreach($rows as $row) { $query = 'SELECT id,name FROM sub_categories WHERE category_id=' . (int) $row['id']; $subCategories = $db -> fetchAll($query); // ... } // Use join query instead of Looping queries $query = 'SELECT categories.id,categories.name, sub_categories.id AS subcat_id,sub_categories.name AS subcat_name FROM categories LEFT JOIN sub_categories ON categories.id=sub_categories.category_id'; $rows = $db -> fetchAll($query); foreach($rows as $row) { ... }

اگر داده هایی دارید که از دیتابیس می خوانیدشان، سپس بر رویشان پردازش انجام میدهید، حتما نتایج پردازش را در کش ذخیره کنید. -4

Memcache, Couchbase, Redis, File base, xCache , …

( استفاده کنید.Normalizedنرمالسازی را یاد بگیرید و از جداول نرمال شده ) -5

اندیس، اندیس و باز هم اندیس -1

یا همان اندیس فقط به منظور بهینه سازی کارایی ایجاد شده، با توجه به قواعد زیر، در استفاده از آنها خصاصت به خرج (Index)ایندکس

ندهید:

a. کلید ها، اعم از اصلی، خارجی، ترکیبی و ... باید اندیس گذاری شوند. کلیه

b. هر فیلدی که در شروطWHERE مرتب سازی با ،ORDER BY هم گروهی با ،GROUP BY وHAVING اسمش

ذکر می شود و یا قرار است ذکر شود، نیاز به اندیس دارد.

c. به مستنداتDBMS خود در رابطه باIndexes اطالعات مفیدی در اختیارتان خواهد گذاشت.مراجعه کنید ،

استفاده کنید. Cachingو Optimization ،Shrinkingجهت DBMSخود بزنید و از ابزارهای DBMSسری به مستندات -1

سخت افزار قویتری تهیه کنید، وقتتان از هزینه سخت افزار گرانبهاتر است. -2

Page 144: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

141 1314 مرداد PHP همایش

نکته پایانی

تان را صحیح و بدون خطا بسازید، اگر وقت برنامه نکته به پایان می رسانیم : همیشه اول مبحث بهینه سازی را با این

داشتید و یا نیاز بود آنرا پروفایل کنید، گلوگاه ها و نقاطی که برنامه شما را با مشکالت کارایی روبرو ساخته اند بشناسید، و

بعد به سراغ بهینه سازی بروید.

گوید:یک اصلی کلی می

"Make it work before you make it fast."

استفاده کنید! PHPاست؛ پس از PHPسریعتر از Cچالش نهم :

باعث شده PHPنوشته شده است، یکی از سریعترین و بهینه ترین زبان های برنامه نویسی؛ این خاصیت Cبا PHPهمانطور که می دانید،

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

نوشته اند استفاده کنید تا اینکه Cکه با PHP؛ از توابع درون ساخت « چرخ را دوباره اختراع نکن » با در نظر گرفتن این نکته و جمله معروف

بخواهید خودتان آنها را پیاده سازی کنید.

PHP کتابخانه ای غنی از توابع در اختیار دارد، این به لطف موتور قدرتمند وExtension .ها بسیار زیادی است که در اختیار دارد

پیش از این آنرا PHPبزنید، احتمال آنکه تیم توسعه دهندگان PHPپس پیش از ایجاد توابع و یا متد هایی که می خواهید، سری به مستندات

نوشته باشند، وجود دارد.

شان به عهده خودتان:پیگیری شان و جستجوی باقینظرتان را به چند مورد از این قابلیت ها و توابع جمع می کنم؛

extract()

stream_resolve_include_path()

func_get_args()

range()

Filters

Standard class

PHP CLI

AND Trick , OR Trick

HEREDOC

Array manipulations

Closures

ورک مناسبچالش دهم : انتخاب فریم

وه بر راحتی تولید برنامه و استفاده مجدد از کد هایی که دیگر توسعه دهندگان نوشته و آزمایش کرده اند، باعث سرعت استفاده از فریم ورک عال

بخشیدن به روند کاری و در نتیجه صرف جویی بیشتر در زمان شما را به همراه خواهد داشت.

نوشته ام، که قرار است در همین کنفرانس ارائه شود، اگر « ریم ورک؟پی فاچکدام پی» راهنمای انتخاب فریم ورک را در مقاله ای با عنوان

نشد می توانید با مراجعه به وب سایتم آنرا دریافت و مطالعه نمایید.

Page 145: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

142 1314 مرداد PHP همایش

http://www.Hamiid.com آدر وب سایت نویسنده:

توجه کنید: عالوه بر موضوعات مطرح شده در مقاله فوق در انتخاب فریم ورک مناسب به موارد زیر نیز

زیاد وسواس به خرج ندهید. -1

تجربه نشان داده ، مهمتر از انتخاب فریم ورک، نحوه ایجاد پروژه و قابلیت های آن است.

کار با چند فریم ورک را همزمان انجام ندهید! -2

برید. بهترین فریم ورک، فریم ورکی است که با آن احساس راحتی بیشتری می کنید و از استفاده از آن لذت می -3

به لیست پروژه هایی که با فریم ورک ها نوشته شده اند نگاه بیاندازید، فریم ورکی که پروژه های بیشتری مشابه با پروژه شما داشت، -4

منطقا مناسب پروژه شماست.

از دیگران مشورت بگیرید، چرا که همه چیز را همگان دانند. -5

چالش یازدهم : امنیت

چالشی است که بایستی در تمامی مراحل انجام پروژه در نظر گرفته شود. برخالف بهینه سازی، امنیت

تان:موارد زیر راهنمای شما هستند در امنیت بخشی به پروژه های آینده

شان اند، اصل کلی آن است که همهتانتمام استفاده ها از برنامه و درخواست های ممکن را شناسایی کنید، این ها درهای ورود به پروژه -1

خطرناک هستند، اما اول به سراغ آنهایی بروید که امکان سوء استفاده دارند.

خودتان را بروز کنید، لیست های امنیتی که در پایان این چالش قرار دارند را مرور کنید و بیش از استفاده خوب یاد بگیرید. -2

تان را ایمن کنید.، وب سرور و دیتابیس PHPربندی پیکر بندی مناسب، قدمی است بسیار بزرگ در جهت امن شدن برنامه تان، پیک -3

ها و استثنائات را مدیریت کنید، آنها را به حال خود رها سعی کنید کد کد های عاری از خطا بنویسید، ممکن نیست!؛ پس سعی کنید خطا -4

نکنید چرا که حاوی اطالعات مفید برای شما هستند، نه برای استفاده هکرها.

ت کنید، آزمایش های امنیتی بسیاری وجود دارند که به شما کمک خواهند نمود.کدهایتان را تس -5

م ایک لیست از موارد مهم امنیتی تهیه کنید، برای هر پروژه یک کپی از آن بگیرید و به مرور آنها را برطرف کنید و روبروی هر کدام که انج -1

شد، یک تیک بگذارید.

پروژه را توزیع نکنید. تا زمانی که همه موارد رفع نشده اند،

به کاربران اعتماد نکنید و چالش بعد را بخوانید. -1

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

Page 146: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

143 1314 مرداد PHP همایش

:PHPلیست منابع امنیتی

http://php.net/manual/en/security.php

http://phpsec.org/projects/guide

https://www.owasp.org https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet http://www.php-security.org

http://phpsecurity.readthedocs.org/en/latest

http://www.sitepoint.com/top-10-php-security-vulnerabilities/

http://www.cyberciti.biz/tips/php-security-best-practices-tutorial.html

:PHPلیست چک لیست ها و موارد امنیتی برای

http://www.sk89q.com/2009/08/definitive-php-security-checklist

http://www.sk89q.com/2010/04/printable-php-security-checklist

http://stackoverflow.com/search?q=php+security

http://www.php-developer.org/php-website-application-security-audit-and-check-list

به سراغشان بروید. مسائل امنیتی را جدی بگیرید و پیش از آنکه به سراغتان بیایند،

چالش دوازدهم : هر کاربر، یک هکر

کردن ذخیره و یا استفاده نکنید. ی آنها را بدون فیلترهرگز به کاربران اعتماد نکنید و هیچ گاه اطالعات وارد شده

بودنشان، در اختیار تعداد زیاد کاربر و استفاده کننده قرار می Web-Basedنوشته می شوند به دلیل ماهیت PHPاکثر برنامه هایی که با

دسته زیر تقسیم کرد: 3گیرند، این کاربر ها را می توان به

کاربران عادی و با سواد -1

ه کنندگان بهترین کاربران موجود اند، فقط می خواهند از سرویس های برنامه شما استفاده کنند، وضیفه شما در این کاربران و استفاد

مقابل این گونه کاربران، خدمت رسانی مناسب و مورد انتظارشان است.

هکر ها و سوء استفاده کنندگان -2

ا می خواهند، به آنها امکان سوء استفاده های ممکن را ندهید.قصد شما سرویس دهی به آنها نیست، اما آنها نیز سهمی از برنامه شم

کاربران عادی اما بیسواد -3

این دسته خطرناکند، با آنکه قصد سوء استفاده و یا تخریب برنامه شما را ندارند، اما رفتاری از خودشان بروز می دهند که شاید اتفاق

تان باشد.بدی برای برنامه

ان، ورود داده هاست، داده هایی که قرار است پردازش شوند، ذخیره گردند و در آینده مورد استفاده قرار بگیرند.خطرناکترین رفتار کاربر

داده های ورودی کاربران، همیشه مطابق آنچه که انتظار دارید نیست، ممکن است شیطنت یک هکر باشد، اشتباه تایپی باشد و یا ناشی از کم

سوادی کاربر باشد.

ز اینها که باشد، شما باید داده های ورودی کاربران را پیش از انجام هر کار دیگری، فیلتر نمایید و از وجود کد های مخرب و ناخواسته هر کدام ا

پاک سازی کنید.

Page 147: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

144 1314 مرداد PHP همایش

در روند دریافت داده از کاربر، بایستی حمالت زیر را بشناسید و برنامه خود را در مقابل آنها ایمن سازید:

1- CSRF گاهی وبمیان خواستدر یا جعل

2- Reply Attack بازپخش یا حمله

3- Session Hijacking نشست یا استراق

4- Session Fixation یا تثبیت جلسه

5- File inclusion vulnerability دور راه از فایل یا گنجاندن

1- XSS: Cross site scripting گاهوب طریق از اسکریپت یا تزریق

1- HTTP header injection یق هدرهای یا تزرHTPP

در روند ذخیره سازی داده ها و ورودی های کاربر موارد زیر را در نظر بگیرید:

کلیه داده ها فیلتر کنید، اگر عددی صحیح می خواهید مطمئن شوید که ورودی کاربر عددی صحیح است. -1

راهنمای بسیار خوبی خواهد بود. PHPدر مستندات Filtersنگاهی به مبحث

را بشناسید و راه های مقابله با آنرا بکار ببندید. SQL-Injection ذخیره می شوند، SQLها در دیتابیسی از نوع اگر داده -2

کنید و از وجود تگ ها و اسکریپت های ناخواسته پاکشان کنید. escapeاگر می خواهید داده ها را نمایش دهید حتما آنها را -3

چالش سیزدهم : مستند سازی

ماه دیگر برایتان گنگ و نامفهوم باشد. 1تان خوب باشد؛ ممکن است وز می نویسید و انجام می دهید، هرچقدر هم که حافظهآنچه که امر

بخواهد کد شمارا بخواند، و یا آنرا تغییر دهد، یا شما بخواهید همین کارها را با کد دیگران انجام Teamworkممکن شخص دیگری در قالب

دهید.

است. مستند سازیاز سرگیجه و مشکالت روانی ممکن فقط راه حل جلوگیری

است به صورت مکتوب، مجموعه مطالبی افزاری ، نرم ( است؛ مستنداتCommentingمستندات نرم افزاری چیزی فراتر از توضیح نویسی )

ی شاملبه طور کل و دارد اشاره افزار نرم از استفاده نحوه یا افزار نرم اجزای داخلی روابط ایجاد، در رابطه با اطالعاتی به الکترونیکی؛ که یا فیزیکی

:می شود زیر موارد

کارفرما اهداف و نیازمندی ها بررسی و شرح

افزار نرم های نیازمندی بررسی و ها سنجی امکان

و بیسیستم، شرح ابزارهای جان های برنامه عملکرد طراحی، مراحل و روش از توصیفی ، سیستم معماری و ساختار شرح ...

نیاز مورد توضیحات همراه به ها برنامه زیر و مختلف بخشهای لیست

است. مختلف شرایط در افزار نرم تست و بررسی از حاصل نتایج ثبت واقع در که سیستم ارزیابی مستندات

سیستم از استفاده راهنمای ارائه

میدهد. شرح را احتمالی خطاهای و مشکالت انواع با مواجه و افزار نرم اداره نحوه که از برنامه و نرم افزار نگهداری مستندات

Page 148: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

145 1314 مرداد PHP همایش

را انجام دهید، باید کد هایی که می نویسید را مستند کنید، Technical Design Documentبه عنوان یک برنامه نویس، شما بایستی

د.متد ها و متغیر ها را شرح دهید، اهداف کالس ها، وظایفشان و نحوه عملکردشان را شرح دهی

نکات و موارد زیر شما را در نوشتن مستندات بهتر یاری می رسانند:

مختصر و مفید بنویسید -1

ای گویا و قابل فهم باشند.العادهمستندات بایستی بشکل فوق

مستندات را مخفی نکنید! -2

مستندات نوشته شده بایستی در دسترس سایرین باشد، آنها که مثل شما علم غیب ندارند.

را در حین برنامه نویسی و توسعه کد بنویسید.مستندات -3

هر چقدر زمان بگذرد، به یاد آوری آنها و نوشتنشان سخت تر خواهد بود.

قوانین را زیر پا نگذارید -4

وجود دارد، آنها را مطالعه کنید و به صورت عملی به کار ببندید. PHPاصول و قواعد استانداردی جهت نوشتن مستندات

که اطالعات کاملش را می توانید در آدرس زیر بیابید، PHPDocumentorاز PHPود به منظور مستند سازی برنامه های پیشنهاد می ش

استفاده کنید.

http://www.phpdoc.org

چالش چهاردهم : نسخه ها را کنترل کنید!

:دست و پنجه نرم خواهد کردد با مواردی همچون موارد زیر یسی و یا مدیریت پروژه خوبرنامه نونویس در طی دوران هر برنامه

خورد با مشکل و تالش برای بازگردادندن تغییراترافزاری و سپس بی نرماعمال تغییراتی در پروژه

های پروژه و قدیمی بودن آخرین نسخه پشتیبان پروژه از دست دادن فایل

ی مدنظرده در پروژه در بین دو بازهمقایسه تغییرات اعمال ش

بررسی و پیدا کردن بخشی که باعث ایجاد مشکل تالش به منظوربرخورد با مشکلی جدیدی در پروژه پس از تغییرات زیاد در آن و

شده جدید

بصورت تیمی و همزمانکار بر روی یک پروژه با افراد دیگر

ژه تغییر کندتست کردن یک قابلیت جدید بدون آنکه کلیات پرو

...و

های سیستم افزاربه اینگونه نرم ؛افزاری متعدد و کارآمدی ارایه شده استهای نرمدهنده، راه حلهای یک توسعهبرای رفع این مشکالت و نیاز

گفته میشود. VCSیا به اختصار (Version Control System) کنترل نسخه

سازی ها تنها در نوع ذخیرهتفاوت ؛آنها برای رفع مشکلی واحد آماده شده اند سخه استفاده میکنید. همهافزار کنترل نفرقی نمیکند که از کدام نرم

های پروژه و همچنین امکانات اضافی آنها است. اطالعات و نسخه

Page 149: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

141 1314 مرداد PHP همایش

بل قیا پروژه ای کار با آنها را یاد بگیرید؛ اما اید، بایستی بایستید و قبل از شروع هر کار اگر تا به حال از این نرم افزارها و سرویس ها استفاده نکرده

موارد زیر را در نظر بگیرید: VCSاز استفاده از یک راهکار

بطور کلی به دو دسته تقسیم میشوند. VCSهای راهکار -1

1- Centralized در این نوع :VCS .ها، یک سرور اصلی وجود دارد و تعدادی کالینت

ها تغییرات جدید را اعمال میکنند یا دهندگان با استفاده از کالینتل میشود و توسعهتمامی تغییرات در سرور اصلی اعما

کنند.آخرین تغییرات را دریافت می

2- Distributedباشد و تاریخچه کامل را در اختیار دارد.: در این نوع، سرور متمرکز حذف شده و هر فرد خود یک سرور می

را انتخاب نمایید. VCSهندگانی که بر روی آن فعالیت میکنند یکی از انواع دبا توجه به ساختار پروژه و توسعه -2

از VCSترین که پراستفاده استفاده نمایید Subversion (SVN)، میتوانید از Centralizedاز نوع VCSدر صورت انتخاب -3

نیز در اختیار شماست. CVSمیباشد. همچنین Centralizedنوع

Distributedاز نوع VCSترین که پراستفاده استفاده نمایید Git، میتوانید از Distributedز نوع ا VCSدر صورت انتخاب -4

توانید استفاده کنید.نیز می Mercurialیا Bazaarمیباشد. همچنین از

تواند راهگشای شما باشد:خود را انتخاب نمودید نکات زیر می VCSپس از آنکه

درصورت انتخابGit بعنوان VCS خود میتوانید بصورتlocal اطالعاتVCS خود را ذخیره کنید و یا آنرا بصورتOnline

ذخیره نمایید.

میتوانید به رایگان استفاده کنید و در Githubاست از Open-Sourceبرای ذخیره بصورت آنالین در صورتی که پروژه شما

رایگان استفاده کنید. بصورت Bitbucketصورت خصوصی بودن پروژه میتوانید از

ازBitbucket میتوانید برایVCS از نوعMercurial .نیز استفاده کنید

فعالیت درGithub خواهد بود شما معیار بسیار مناسبی در رزومه.

چالش پانزدهم : برنامه نویس خوبی باشید

یای برنامه نویسی می پردازد.این چالش و چالش شانزدهم به موضوعات و مسائل شخصیتی و اجتماعی در دن

همه شما برنامه نویسان عزیز، بینظیر می شوید اگر:

آراسته باشید. -1

ترین و با پرستیژترین گروه های اجتماعی هستید.ی یکی از متشخصشما نماینده

صبور و شکیبا باشید. -2

کن است، بدانید که تنها نیستید، مشکالت برای برنامه نویسی در کنار همه شیرینی هایش، کمی سخت، پیچیده و بعضا اعصاب خورد

همه تقریبا یکسان است.

تا پروژه تان به بار بنشیند باید آرام بخوابید.

اعتماد به نفس داشته باشید. -3

می سازد. هر پروژه یا کاری را بدانید تا آن را انجام دهید، برخی چالش ها یا ندانسته ها، شما را بزرگتر و قویتر 111تا 1نیازی نیست

Page 150: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

141 1314 مرداد PHP همایش

شور و هیجان داشته باشید. -4

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

خالق باشید. -5

تان را خالق پرورش دهید.کلید اصلی موفقیت خالقیت است، ذهن

نمی نویسید که پشتتان را بخاراند؟ همین که کد مینویسید خالق هستید، اما چرا کدی

منطق داشته باشید. -1

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

های پیرامونتان دقت کنید، شاید الزم باشد کمی SWITCHها و IFشما منطقی ترین شغل و هنر دنیار انتخاب کرده اید، خوب به

sleep(10)

اشید.تعهد و وجدان داشته ب -1

در مقابل کار، کارفرما و قراردادی که دارید مسئولیت پذیر باشید، عدم مسئولیت پذیری و تعهد شما را کوچک و ناتوان خواهد کرد.

کارهای دیگر برنامه نویسان را بی ارزش ندانید. -2

م مثل شما نیست.دیگران را سرزنش نکنید که چرا مثل شما برنامه نمی نویسند. همه که مثل هم نیستند، هیچکس ه

به دیگران کمک کنید. -1

تان در اختیار دیگران بگذارید، بیشتر سودش برای خود شماست.و دانش علم

بیش از توانتان کار نکنید. -11

بازدهی شما زمانی بیشتر است که از همه توانتان استفاده می کنید نه از آن بیشتر یا کمتر.

مطالعه کنید. -11

گرایی خواند، ناتور دشت یا بینوایان هم می توانند همانقدر جذاب باشند.و شئ PHPهمیشه که نباید

با دیگر برنامه نویسان هم صحبت شوید. -12

هیچکس مثل آنها درد دل های شما را نمی فهمد.

خودتان، هرچه را که خوب می دانید به این لیست اضافه کنید.

چالش شانزدهم : کمالگرا نباشید

حتت که است آشنایی پدیده این. برسانند سرانجام به احسن نحو به را آن توانند نمی ندهند انجام خودشان را کاری اگر دارند رباو افراد از ای عده

به عنوان یک خصوصیت اخالقی مهم و با ارزش است. وجودش که است خصوصیتی و شود می یاد آن از گرایی کمال عنوان

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

د.شده انبرخی از کارها و کدها انجام شده اند تا شما از آنها استفاده کنید؛ باید بپذیرید، بعضی از آنها حتی از کد های شما نیز بهتر نوشته

.دهد افزایش را شما عمل آزادی تواند می تنهای در مساله این اما بیاید نظر به خطر پر امری نخست وهله شاید این رویه در

Page 151: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

142 1314 مرداد PHP همایش

العاده باالیی اگر به این رویه عادت ندارید، آنرا از کارها و تکه کد ها و ابزارهای ساده و کوچک شروع کنید، اعتماد کنید و به مرور از انعطاف فوق

که به شما می بخشد استفاده کنید.

چالش هفهدهم : چالش ها را جدی بگیرید

مقاله سعی شده چالش هایی انتخاب شوند، که هم تاریخ انقضاء نداشته باشند و هم طیف وسیعی از توسعه دهندگان و مشکالت شان را در این

پوشش دهد.

ید.چالش های گفته شده، شما را با معضالت و مشکل های عمده آشنا می سازد، آنها را مرور کنید ، تجربه بیاندوزید و به دیگران هم آموزش ده

ی ایران PHPما را تشکیل می دهیم، ما از سایر فناوری ها و برنامه نویسی های وب ، بروزتر و قدرتمند تریم؛ PHPما جامعه برنامه نویسان

.هستیم

منابع

PHP.net

sitepoint.com

beebom.com

en.wikipedia.org

learntocodewith.me

infoworld.com

techrepublic.com

phpdoc.org

reddit.com

planet-php.net

phpdeveloper.org

phpbuilder.com

micro-optimization.com

phplens.com

stackoverflow.com

php-developer.org

phpsec.org

owasp.org

owasp.org

php-security.org

Page 152: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

141 1314 مرداد PHP همایش

آنها توسعه روند و، کیفیت کد منبع PHPهایبرنامه تست

امیر یوسفی

نویسی است. بدون تست کد منبع امکان بررسی صحت عملکرد آن همانطوری که های ضروری توسعه در هر زبان برنامهتست یکی از جنبه .مقدمه

توانند فقط به صورت نامنظم و به صورت محدود اجرا شوند. برای تست منظم و در عمق کدهای های دستی میرود عمال وجود ندارد. تستانتظار می

معموال از یک چارچوب PHPهایی در های خودکار هست تا به صورت متناوب اجرا شوند. برای نوشتن همچون تستبه نوشتن تست منبع، نیاز

دهد تا به صورت واحدهای عملکرد ایزوله مثل یک ای اجازه میشود. چارچوبی که به کد منبع هر اپلیکیشن یا کتابخانهآزمون واحد استفاده می

ها متد تست شوند. با رایج شدن آزمون واحد، نیاز به پوشش آزمون واحد در کد منبع به عنوان یک روش استاندارد در کتابخانهکالس واحد یا یک

تبدیل شده است. PHPدر زبان Symfonyو Swiftmailer،Framework Zendهایی مثل ورکو فریم

ها باعث طور هم باشد. اما صرف زمان برای نوشتن تسترسد و ممکن است همینبر به نظر میهای واحد معموال یک کار اسرارآمیز و زمانآزمون

ها زودتر تشخیص داده شوند، یک های کمتری داشته باشد، بسیاری از خطاخواهد شد تا کیفیت کدهای منبع افزایش پیدا کند و در مجموع باگ

تغییرات جدید ایجاد شود، و اعتماد کافی برای تکیه به کد به وجود بیاید. فرایند تست دائمی برای جلوگیری از تغییر رفتار کدهای قبلی توسط

مزایای دیگر آزمون واحد را در ادامه با دقت بیشتری بررسی خواهیم کرد.

های تستمغالطه. 4

کنند:منع می نآها را از پذیرش دهندهآزمون واحد، و در واقع همه انواع تست، گرفتار چهار بهانه معمول زیر هستند که توسعه

بر هستند.زمان .1

کدهای پیچیده قابل تست نیستند. .2

کند، نیازی به نوشتن تست نیست.تا زمانی که کار می .3

کننده است.تست خسته .4

.دانگیری شدهای با اطالعات غلط نتیجهآیند ولی در واقع به صورت زیرکانههایی که به نظر معقول میهای تست هستند، بهانهها مغالطهاین

داری، گیرد. سوال این است که چرا این زمان باید ارزشمند تلقی شود و جواب این است که تست زمانی که در آینده برای اصالح،نگهتست زمان می

گ دانیم اگر تست را به صورت جامع انجام ندهیم هزاران بادهد. و همه ما مینشده صرف خواهید کرد را کاهش میهای کشفبهبود و رفع باگ

نشده وجود خواهد داشت.کشف

. های کاربردی استفاده کنیدهای ایزوله یا گروهی از کالسهای واحد برای تست متدها/کالستوانید مستقیما از آزموننویسید، میهمچنان که کد می

تی شما شوید. وفزمانی که گرفته می کنید، طوری که به سختی متوجهکنید و به سرعت اصالح میها را غالبا پیدا مییک مشکل این است که باگ

توانید به همان سرعت مشکل یکپارچگی را برطرف کنید و زمان بیشتری ذخیره کنید که باز خورد، میکنید، و تستی شکست میتغییری ایجاد می

وجود ندارند و فقط زمانی که صرفای خوب مستتر شده باشد که کامال فکر کنید شوید. مزایای تست ممکن است به اندازهبه سختی متوجه آن می

ول های متمادی در طها و یا حتی ساعتاند که ممکن بود دقیقههایی که در عرض ده ثانیه حل شدهنه باگ ،اید را ببینیدنوشتن کدهای تست کرده

چند ماه صرف کشف آنها کنید.

Page 153: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

151 1314 مرداد PHP همایش

یکاربرد ترکوچک هایقسمت از که ایپیچیده کدهایدهای پیچیده و در مورد کدهای پیچیده باید بگوییم وجود آنها غیر قابل انکار است اما ک

ساده معموال قابل تست است. اگر کدهای شما به راحتی قابل 11نویسی شی گرا یک آبجکتیواند دو مقوله کامال متفاوت هستند. در برنامهساخته شده

های که در نوشتن کدهای کاربردی که هم منعطف هستند و هم بخشتست نیست این آزمون واحد نیست که شکست خورده است بلکه این شمایید

ها اید. اگر همزمان با نوشتن کد تست را هم انجام بدهید ناخواسته مجبور خواهید شد تا کالساند شکست خوردهمختلف آن به خوبی از هم جدا شده

رسند معموال حاصل انتظار طوالنی برای شروع تست است.را ازهم جدا کنید. این حقیقت که کدها برای تست بسیار پیچیده به نظر می

ه ها یک تور حفاظتی ارائکند دو موضوع کامال متفاوت هستند. تستای که کار میشدهکند با کد تستدر مورد سوم، توجه کنید کدی که کار می

هم شود. عالوه های جدید به راحتی فراسازی و افزودن ویژگیهینهیکپارچگی امکان تغییر، بهبود و ب کنند تا با شناسایی تقریبا بالفاصله مشکالتِمی

و بازخورد رتکوتاه چرخه یک در اشتباهاتشان بالفاصله مشاهده طریق از نیز را هستند ناآشنا کدها با که تیم جدید هاینویسبرنامه کارآییبر این،

.بخشدمی بهبود آن، طریق از تجربه کسب

ول ها را به آخر پروسه توسعه موککننده هستند که نوشتن تستها معموال به این دلیل خستهکننده نیست. تستخسته و در آخر، تست همیشه هم

ابراین درمان رسانید. بنکنیم. اگر به صورت پیوسته از کد به تست و برعکس سویچ کنید بدون خمیازه کشیدن کار بیشتری به مرحله انجام میمی

سادگی تعویض پیوسته بین کد و تست و نوشتن تست در طول زمان است. در دام نوشتن تست و فقط نوشتن تست برای کننده بودن تست بهخسته

چند روز متوالی نیفتید.

PHPآزمون واحد در . ۲

تر که کمی قدیمی phptتوانید از است. همچنین می PHPUnitو دیگری SimpleTestیکی PHPدو انتخاب معمول برای آزمون واحد در

های دو چارچوب اولی امکانات بیشتری ، همچنین کتابخانهکندفراهم میهای واحد را است استفاده کنید. همه این سه روش امکان نوشتن آزمون

دهد.نیز در اختیار شما قرار می

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

از شی مورد نظر برای ورود به تست و نابود کردن آن در انتهای 21برد که کار ساختن یک وهلهبهره می 21مشترک نشود این کالس از فیکسچرهایی

ی آزمون در اختیار داریم. شوند تا مطمئن شویم برای هر تست یک نسخه جدید از شی را براتست را به عهده دارند. فیکسچرها باعث می

گیرد و آن را با یک یک مقدار مورد انتظار را می 23دارد. هر اظهار 22هر متد عمومی کالس تست یک آزمون است. هر متد ارجاعاتی به تابع اظهار

نان از ایزوله بودن تست از سایر درصد بقیه اطمی 11درصد راه است. 11کند. دانستن چیزی که باید در هر تست اظهار شود مقدار واقعی مقایسه می

ها است.تست

هااجرای تست. 9

بندی های آزمون واحد امکان دستهها معموال به سادگی اجرای یک دستور در خط فرمان و یا بارگذاری مجدد مرورگر است. البته چارچوباجرای تست

ها را نداشته باشید.اجرای تک به تک تست دهد تا دردسرها را به صورت یکجا میای از تستها و اجرای مجموعهتست

(TDD)مبتنی بر تستآزمون واحد و توسعه . 1

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

کنیم.

یک جزء ضروری آزمون واحد نیست، بلکه روشی است که از TDDاست. مبتنی بر تستتمرین توسعه یکی از کاربردهای معمول آزمون واحد

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

شود.دهی به چگونگی طراحی کالس فراهم میدنویسی آن، ابزاری برای جهتدر کد قابل اجرا)به عنوان مثال تست( قبل از ک

مربوط به آن هستیم. از آنجایی که بیشتر از چگونگی عملکرد کالس به نتیجه عمومی API در نوشتن یک تست برای یک کالس، مجبور به طراحی

ماند اما ممکن کالس نیست. در بسیاری از موارد، نتیجه ثابت می 24صیخصومورد انتظار از کالس عالقه داریم نیازی به نوشتن تست برای متدهای

های سیستمی دستخوش تغییر شود. بنابراین تست ، یا نیازمندیPHPسازی، عملکردهای جدید است کد در طول زمان به خاطر بهبود و بهینه

ای جز تغییر پیوسته کدهای تست نخواهد داشت.کردن همه این اجزا نتیجه

79 Objective 80 Fixtures 81 Instance 82 Assert 83 Assertion 84 Private

Page 154: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

151 1314 مرداد PHP همایش

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

جرا شده را انویسیم تا عملکرد مشخصکنیم و سپس کدها را میاند(، اما انتظاری که از نحوه عملکرد کالس داریم را مشخص میهنوز نوشته نشده

.کنند

ها به طور پیوسته صحت ای از تستایم و عالوه بر آن مجموعهزمانی که واقعا شروع به کدنویسی کردیم، بسیاری از کارهای طراحی را انجام داده

کنند.نویسیم را بررسی میکدهایی که می

توانیم شروع به کدنویسی کنیم کند. حال مییفراهم منیز ها را ای از تستمجموعه همچنینیک متدولوژی طراحی است اما TDDوجود اینکه با

های بیشتری نیز اضافه کنیم.شده پاس شوند. همچنین ممکن است در آینده تستهای نوشتهتا تست

مزایای آزمون واحد. ۵

دهد.را کاهش می ۸۵های کد نهاییآزمون واحد سطح باگ. ۵.4

توانید در مدت ها، معموال میها شناسایی خواهند شد. با شناسایی زودهنگام باگباگ های نوشته شدهبا اجرای متناوب مجموعه در حال رشد تست

، انددهکرها بالفاصله شناسایی نکه تست یهای جدیدزمان کوتاهی آنها را برطرف کنید زیرا کدها هنوز در ذهنتان تازه اند. عالوه بر این، برای باگ

. اجازه ندهید هیچ باگی دو بار اتفاق بیفتد.شوندتشارهای بعدی نیز شناسایی های جدیدی بنویسید تا در انتوانید تستمی

کند.زمان ذخیره می آزمون واحد برای توسعه. ۵.۲

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

شود و شتاب پیوسته رو به جلو در پیشرفت پروژه اد تغییرات باعث ایجاد مشکل در کدهای قبلی میجزمانی را که ای ،شدهن زمان ذخیرههستید. به ای

در طول دوره عمر پروژه صرف خواهید 21داریرا نیز اضافه کنید. البته این همیشه به معنی اتمام زودتر پروژه نیست اما قطعا زمان کمتری برای نگه

بری است که دوست داریم محدود کنیم.داری معموال از کارهای هزینهرد. نگهک

توانند به طور متناوب اجرا شوند.نیاز می بسته بههای خودکار تست. ۵.9

د. رورگر اجرا کنیتوانید همه آنها را با یک دستور خط فرمان ساده یا بارگذاری مجدد مهای خودکار میهای دستی زجرآورند. با استفاده از تستتست

ها را تقریبا همزمان با رخ دادن آنها شناسایی کنید. رود مطمئن شوید و باگتوانید پیوسته از عملکرد کد منبع همانطور که از آن انتظار میمی

همیشگی را به دست بیاورید. کنید تا یک سطح از اطمینانای است که یک بار پرداخت میها هزینهنوشتن تست

کندون واحد بهبود و تغییر کدها را آسان میآزم. ۵.1

ها یا خطاهای منطقی اتفاقی، مشکل در های معمول خود را دارد. اجرا شدن کد همانند گذشته، امکان وجود باگدانیم تغییر کد ریسکهمه ما می

ها را توانند جلوی هر کدام از این ریسکها میای از تستها هستند. مجموعهاز جمله این ریسک PHPعمومی و یا APIهای قبلی تطابق با نسخه

های توانید با تکیه بر تستها نوشته شده باشد، میو مبتنی بر نتیجه مورد انتظار از کالسعمومی APIهای شما بر روی بگیرند. تا جایی که تست

های مختلف ها بر اساس نسخهتواند وظیفه انجام تستیز مین 21سازینوشته شده کدها را بهبود و یا تغییر دهید و تعدیل کنید. یک سیستم یکپارچه

PHP های مختلف را بر عهده بگیرد.عاملو یا سیستم

همراه شود. TDDبه خصوص زمانی که با ،بخشدمیآزمون واحد طراحی کد را بهبود . ۵.۵

ها چطور باید طراحی شود. همچنین با افزودن السکند تا بفهمیم کانجام بدهد کمک می کالس ها برای مشخص کردن آنچه بایدنوشتن تست

Mock Object توان به طراحی چندین کالس و ارتباط بین آنها نیز جهت داد. حتی بدون ها میTDDها همزمان که در حال ، نوشتن تست

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

سازی است.آزمون واحد نوعی مستند. ۵.6

دهنده یا یک مثال. یک مثال در مستندات به اندازه هزاران کلمه برای توسعه 22دهد فکر کنید: شرح یک مورد استفادهبه چیزی که یک تست انجام می

کنند که اساسا لیستی سازی مستندات ارائه میبرای خالصه «testdox»به نام های آزمون واحد ابزاریارزش دارد. همچنین بسیاری از چارچوب

ها نیز قابل فهم نویستوسط غیربرنامه حتی کند کهها فراهم میای از مشخصات کالسخالصهاین مستندات در اصل .از اظهارات هر مثال است

است.)مانند مدیر پایگاه داده(

85 Production code 86 Maintenance 87 Integration 88 Use case

Page 155: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

152 1314 مرداد PHP همایش

.کند تا مستقیما با مشکل روبرو شویدیآزمون واحد شما را مجبور م. ۵.۷

تن کد کند تا با نوشای داشته باشد تالش میریزیدهنده بدون اینکه ساختار یا برنامهدهد این است که توسعهیکی از مشکالتی که معموال رخ می

. ندارید راهی های موثر و نوشتن تستی عموم APIمشکلی را حل کند. با نوشتن تست شما جز روبرو شدن با نحوه حل مشکل با تمرکز بر روی

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

افتد.به سختی اتفاق می

.شودآزمون واحد باعث اعتماد به نفس می. ۵.۸

زمان کمتری ،های فعلی و آینده را شناسایی کنید، تغییر دیگر یک پیشنهاد پرمخاطره نیستاطمینان کنید، باگ توانیدوقتی به کد منبع خود می

شود، باعث تعجب نیست که تست و اختصاصا آزمون واحد اعتماد به نفس شما را افزایش کنید و زمان بیشتر صرف توسعه میبرای اصالح صرف می

بی هایی که به خوها و برنامهها، چارچوبدهندگان به استفاده از کتابخانهها ترجیح توسعهکنید. به همه اینگاه میدهد. شما به طور مستمر به جلو ن

اند را نیز اضافه کنید که مزیت بسیار ارزشمندی است.تست شده

آزمون واحد معیاری برای اتمام است.. ۵.3

یم توانیم فرض کنها را نوشته باشید و همه آنها پاس شده باشند، منطقا میکردهای کالسها و عملهای مورد نیاز برای پوشش همه ویژگیاگر تست

ه یک شود. ب توقفتواند ماید. ممکن است در آینده ویژگی جدیدی به کد اضافه شود اما تا آن روز کار کدنویسی میشما آن بخش از کد را تمام کرده

های عملیاتی را نیز شناسایی و در بر بگیرد.د تا نه تنها به طراحی جهت دهد بلکه نیازمندیشومعنا تست به خوبی با متدلوژی چابک چفت می

کننده است.آزمون واحد سرگرم. ۵.40

اربردی کننده و کسازی پروسه توسعه و تست سرگرمتر، امکان بهبود و بهینههای سادهحلبا اعتماد به کدها، هزینه کم تغییرات، حل مشکالت با راه

کنند نیست.دهندگان از آن فرار میکننده که توسعهواهد بود. دیگر تست یک فرایند خستهخ

گیرینتیجه

پوشی است. با در نظر گرفتن مزایای تست، توجه کنید برای نویسی است که به سختی قابل چشمامروزه تست و آزمون واحد ضرورتی در برنامه

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

ومند شوید نیازمند یادگیری و تمرین آن هستید. به خاطر داشته باشید تست، آزمون واحد و یا توسعه مبتنی بر تست بیشتر از آنکه مستندات بهره

هایی هستند که نیازمند یادگیری عملی و کسب تجربه هستند.ها و متدولوژیروشده باشند، شامل بههایی برای مطالعه و استفاکدها و چارچوب

Page 156: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

153 1314 مرداد PHP همایش

PHPذخیره پسورد به صورت امن در

علیرضا دبیری نژاد

ق، یف رمز دار، گاو صندودر دنیای واقعی اطالعاتی به صورت فیزیکی وجود دارند که صاحبان آنها به منظور حفظ و نگهداری آنها از وسایلی همچون ک

کنند؛ همه روش های دسترسی، از طریق ابزارهای دسترسی همچون کلید، کارت های الکترونیک و .. انجام می کمد های مخفی و ... استفاده می

.پذیرد

:اصل زیر بهره جسته است 3در واقع نگهداری از وسایل و اطالعات در دنیای واقعی همیشه از

گاه داشتن محل نگهداری، دومین اصل محکم نمودن نگهدارنده در برابر آسیب ها و دسترسی سایرین و سومین اصل نگهداری نخستین اصل مخفی ن

.باشدمطمئن از ابزار دسترسی می

دسترسی ند و به منظوردر دنیای دیجیتال ما با شرایطی تقریبا مشابه با دنیای واقعی سرو کار داریم، اطالعات به محلی امن برای ذخیره سازی نیاز دار

خفی م به آنها بایستی از ابزارهای دسترسی همچون کلمه عبور، امضای دیجیتال، اثر انگشت و ... بهره جست. تنها تفاوت محسوس میان این دو دنیا

.سازی محل نگهداری اطالعات است؛ که این مهم در دنیای دیجیتال به آسانی امکان پذیر نخواهد بود

عنوان مهم ترین و پر استفاده ترین ابزار دسترسی به اطالعات، از شروع بکارگیری تا کنون، شرایط، قوانین و راهکارهای متعددی را کلمه عبور به

.جهت مخفی بودن از دید سوء استفاده کنندگان داشته است

هکار فعلی را انتخاب خواهیم نمود.در مقاله پیش رو نگاهی انداخته ایم به این شرایط و راهکارها و با بررسی آنها بهترین را

راه های ذخیره سازی کلمات عبور

راهکار 1با این وجود کلیه راهکارهای پیشنهادی، زیر مجموعه ای از به منظور ذخیره سازی کلمات عبور، راه های پیشنهادی بسیاری وجود دارند،

:اصلی زیر خواهند بود

ذخیره به صورت متن خام (1

تن دستکاری شدهذخیره به صورت م (2

ی رمز نگاری شدهذخیره به صورت داده (3

ی هش شدهذخیره به صورت داده (4

سالت شده-ی هشذخیره به صورت داده (5

Page 157: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

154 1314 مرداد PHP همایش

ی شناوری هش شدهذخیره به صورت داده (1

زیم.پیش از بررسی هرکدام از این راهکارها ابتدا به برسی خطرات و آسیب پذیری های موجود در رابطه با کلمات عبور می پردا

مخاطرات و آسیب پذیری ها

ر طبه منظور بررسی دقیق راه کارهای ذخیره سازی کلمات عبور ابتدا به بررسی مخاطرات، آسیب پذیری ها و حمله هایی که کلمات عبور را به خ

.می اندازند، می پردازیم

دسترسی دستاوردها

Gains Access

.و بانک های اطالعاتی ذخیره نمود XML های متنی، فایل های داده ای همچون اطالعات کلمه عبور را می توان بر روی در فایل

عات الچنانچه این اطالعات به صورت دستاوردهایی خام ذخیره شده باشند و کاربری به هر نحو به این اطالعات دسترسی داشته باشد و توان رویت اط

.پذیری قرار خواهند گرفت کلمات عبور را داشته باشد، کلمات عبور در معرض این آسیب

حمله دیکشنری

Dictionary Attack

ی موجود از کلمات می آزماید. در اکثر موارد، این فهرست شامل یک در این سناریو، حمله کننده کلمه عبور رمز گذاری شده را در برابر مجموعه

.غت روزانه خود به عنوان رمز عبور خود استفاده می کنندفرهنگ لغت می باشد؛ با این پیش فرض که بسیاری از مردم از کلمات فرهنگ ل

جدول رنگین کمان

Rainbow Table

.ی آنها قرار دارندای است که در آن میلیاردها مقدار و نتایج هش شدهجدول رنگین کمان عموما پایگاه داده

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

حمالت تصادم

Collision Attacks

ی زمانی که کلمه عبور به صورت یک متن هش شده ذخیره گردد، تالش برای پیدا کردن دو ورودی اختیاری ) غیر همسان( که مقدار هش شده

.یکسانی داشته باشند؛ حمله تصادم نام دارد

حمالت پیش تصور

Preimage Attacks

حمالت پیش تصور حمالتی هستند که با داشتن مقدار ت تصادم که در آنها خروجی توابع هش در دسترس حمله کننده قرار ندارند،بر خالف حمال

.داشته باشد X رسید که مقدار هشی برابر با هش Y رسید؛ یا به مقداری همچون X بتوان در زمانی کم و به صرفه به مقدار اصلی X یهش شده

X <> Y

Hash(X) = Hash(Y)

Page 158: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

155 1314 مرداد PHP همایش

راگیرحمالت جستجوی ف

Brute-force Attacks

.در این نوع حمله تمام حاالت و مقادیر ممکن تا رسیدن به جواب مورد بررسی قرار می گیرند

توان زمان الزم برای آزمودن کلیه حاالت ممکن جهت رسیدن به کلید را محاسبه نمود، از این رو این نوع برای هر الگوی رمزنگاری و هشینگ می

سنجش الگوهای موجود می باشد.حمله معیاری جهت

بررسی جامع راهکارهای ذخیره سازی کلمات عبور

ذخیره به صورت متن خام

ترین و در عین حال نا امن ترین روش موجود شناخته می شود، کلمات عبور بدون هیچ گونه تغییری در این روش ذخیره سازی که به عنوان ساده

ذخیره سازی می شوند.

رت خام ذخیره شده اند، در صورت دسترسی به محل ذخیره سازی آنها کلیه کلمات عبور قابل روئیت خواهند بوند، همچنین به داده ها که به صو

دلیل عدم هشینگ و رمز نگاری بر روی کلمات عبور، حمالت مخرب بر روی این نوع از ذخیره سازی با سرعت بسیار زیاد انجام می پذیرد.

مثال:

توضیحات ر ذخیره شده(خروجی )مقدا ورودی

123456 123456

Abcdef abcdef

سطوح آسیب پذیری:

توضیحات سطح آسیب پذیری نوع آسیب پذیری

بسیار زیاد دسترسی دستاوردها

بسیار زیاد حمله دیکشنری

- جدول رنگین کمان

- حمالت تصادم

- حمالت پیش تصور

بسیار زیاد حمالت جستجوی فراگیر

ذخیره به صورت متن دستکاری شده

ای پیاده سازی شده است، با این حال به دلیل سختی عملیات ریاضی قابل این روش توسط برنامه نویسان چه در سطح مبتدی چه در سطح حرفه

اتکاء، عدم جامع انگاری و کمی تست های عملکردی و امنیتی؛ آسیب پذیری آن زیاد خواهد بود.

مثال:

توضیحات وجی )مقدار ذخیره شده(خر ورودی

Page 159: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

151 1314 مرداد PHP همایش

با محاسبه پیشرونده یکتایی 234567 123456

Abcdef bcdefg با محاسبه پیشرونده یکتایی

سطوح آسیب پذیری:

توضیحات سطح آسیب پذیری نوع آسیب پذیری

زیاد دسترسی دستاوردها

بسیار زیاد حمله دیکشنری

کم جدول رنگین کمان

ار زیادبسی حمالت تصادم

بسیار زیاد حمالت پیش تصور

بسیار زیاد حمالت جستجوی فراگیر

ی رمز نگاری شدهذخیره به صورت داده

استفاده می گردد. ( Encryptionدر این روش به جای استفاده از الگوریتم های هشینگ ) درهم سازی( از الگوریتم های رمزنگاری )

دسترسی به اطالعات کلمات عبور بسیار آسان خواهد بود، از این رو محافظت کلید در اختیار فرد مهاجم قرار بگیرد،به دلیل استفاده از کلید، چنانچه

از کلید رمزنگاری در این روش خود چالش امنیتی دیگری است.

ن برگشت پذیر بودن کلمات عبور را هرچند کندی عملیات رمزنگاری مانعی است در برابر حمالت ممکن، با این حال رمزنگاری متقارن همیشه امکا

به همراه خواهد داشت.

طول متغیر خروجی این الگوریتم ها نیز نیز مشکل دیگری در زمان ذخیره سازی ایجاد خواهد نمود.

مثال:

توضیحات خروجی )مقدار ذخیره شده( ورودی

123456 5221f53467177ae5cb82fe2c8f4e425a :الگوریتمRijndael-128-

CBC

SECRET_KEYید: کل

Abcdef d3109ee5b4fb77cc521445db33f8fa91 :الگوریتمRijndael-128-

CBC

SECRET_KEYکلید:

سطوح آسیب پذیری:

توضیحات سطح آسیب پذیری نوع آسیب پذیری

کم دسترسی دستاوردها

متوسط حمله دیکشنری

جدول رنگین کمان

زیاد حمالت تصادم

سیار زیادب حمالت پیش تصور

زیاد حمالت جستجوی فراگیر

Page 160: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

151 1314 مرداد PHP همایش

ی هش شدهذخیره به صورت داده

مچون ه این روش که به عنوان فراگیرترین و مورد استفاده ترین روش ذخیره کلمات عبور می باشد، با استفاده از الگوریتم های هشینگ ) درهم ساز(

MD5 یاSHA1 .کلمات عبور هش شده و ذخیره می گردند

ریتم ها یک رشته متنی با طول متغیر را به یک نگاشت بیتی با طول ثابت تبدیل می کنند.این الگو

نگاشت بیتی ایجاد شده ذخیره می شود و در زمان مورد نیاز جهت بررسی کلمات عبور استفاده خواهد گردید.

ز وجود دارد که خروجی برای مقادیر متفاوت نیز یکسان این نگاشت بیتی برای مقادیر یکسان همیشه یکسان خواهد بود، اما احتمال بسیار کمی نی

شود. ) احتمال تصادم(

مثال:

توضیحات خروجی )مقدار ذخیره شده( ورودی

123456 e10adc3949ba59abbe56e057f20f883e :الگوریتمMD5

Abcdef e80b5017098950fc58aad83c8c14978e :الگوریتمMD5

سطوح آسیب پذیری:

توضیحات سطح آسیب پذیری ذیرینوع آسیب پ

متوسط دسترسی دستاوردها

زیاد حمله دیکشنری

بسیار زیاد جدول رنگین کمان

زیاد حمالت تصادم

زیاد حمالت پیش تصور

زیاد حمالت جستجوی فراگیر

سالت شده-ی هشذخیره به صورت داده

ده می کند با این حال برای ایجاد پیچیدگی بیشتر، پیش از درهم سازی یک سالت دراین روش همچون روش قبل از الگوریتم های هشینگ استفا

) رشته ای تصادفی( به اطالعات اضافه می شود.

چنانچه این سالت در اختیار فرد مهاجم قرار داشته باشد، سطح آسیب پذیری این روش با روش قبل تفاوتی نخواهد داشت.

م سازی برای مقادیر یکسان ثابت خواهد بود و احتمال تصادم نیز وجود خواهد داشت.همچون روش قبل، خروجی این نوع دره

مثال:

توضیحات خروجی )مقدار ذخیره شده( ورودی

123456 4d5b9ab2b0df60ed300b3a64e46c3545 :الگوریتمMD5

SECRET_SALTسالت:

Abcdef c23e9ffe1dd211021e42529853ac314f :الگوریتمMD5

SECRET_SALTسالت:

Page 161: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

152 1314 مرداد PHP همایش

سطوح آسیب پذیری:

توضیحات سطح آسیب پذیری نوع آسیب پذیری

کم دسترسی دستاوردها

زیاد حمله دیکشنری

کم جدول رنگین کمان

زیاد حمالت تصادم

زیاد حمالت پیش تصور

زیاد حمالت جستجوی فراگیر

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

عنوان پیشرفته ترین و امن ترین روش ذخیره سازی کلمات عبور به شمار می آید، داده ها توسط الگوریتم های هشینگ بسیار در این روش که به

امن و قوی و توسط یک سالت متغیر و تصادفی درهم سازی خواهند شد.

و به منظور بررسی آنها نیاز به اعتبار سنجی خاص و به دلیل استفاده از سالت های متغیر، برای مقادیر یکسان متغیر خواهد بود خروجی این توابع

پیشرفته می باشد.

پیچیدگی الگوریتم ها با توجه به توان پردازشی در دسترسی، در این روش قابل تنظیم می باشد و سرعت کمتر این روش نسبت سایر روش ها،

حمالت را به طرز چشم گیری کند خواهد نمود.

یا سالت از دیگر مزایای این روش می باشد. عدم نیاز به ذخیره سازی کلید

و باالتر، توابع درون ساختی برای استفاده 5.5.0نسخه PHPمی باشد، با این حال در bcryptعمومی ترین الگوریتم مورد استفاده در این روش

از این روش در دسترس خواهند بود.

مثال:

توضیحا خروجی )مقدار ذخیره شده( ورودی

ت

12345

6

$2y$08$M1UmPQjVxF.qMi2i6KmVVugyMuoxvvWpzheFc4DDYxMUaj/Xws

VyS

الگوریتم:

Bcryp

t

پیچیدگی

:8

Abcde

f

$2y$08$NXWTuNXDThPyQzK7KRzSg.13elHTn0OY/npJZKDlJC9YA8Q.up

9Ke الگوریتم:

Bcryp

t

پیچیدگی

:8

سطوح آسیب پذیری:

توضیحات سطح آسیب پذیری نوع آسیب پذیری

ادسترسی دستاورده

کم حمله دیکشنری

جدول رنگین کمان

حمالت تصادم

حمالت پیش تصور

کم حمالت جستجوی فراگیر

Page 162: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

151 1314 مرداد PHP همایش

پیاچپی در منتخب روش سازی پیاده نحوه

:نمود سازی پیاده زیر صورت دو به توان می را باشد می شناور هشینگ روش که منتخب روش

PHP 5.5.0 از پایینتر های نسخه

PHP < 5.5.0

// ایجاد هشینگ به منظور ذخیره سازی

// ایجاد سالت

$salt_chars='./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

$salt = sprintf('$2y$%02d$', $cost);

// PHP < PHP 5.3.7 '$2a$%02d$'

mt_srand();

for($i = 0; $i < 22; $i++)

{

$salt .= $chars[mt_rand(0,63)];

}

// ایجاد هش کلمه عبور

$options=array('cost'=>12, 'salt' => $salt);

$hash = crypt("my password", $salt);

// بررسی هشینگ موجود به منظور اعتبار سنجی کلمه عبور

if(crypt('my password', $hash) == $hash)

{

echo 'Password is valid';

}

else

{

echo 'Invalid password';

}

Page 163: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

PHP 5.5.0 از رباالت های نسخه

منابع

1) How to store passwords safely with PHP and MySQL https://alias.io/2010/01/store-passwords-safely-with-php-and-mysql/

2) Storing Passwords with PHP http://codular.com/storing-passwords-php

3) Best way to store passwords in MYSQL database http://stackoverflow.com/questions/14798275/best-way-to-store-passwords-in-mysql-

database

4) PHP password_hash function

http://php.net/manual/en/function.password-hash.php

5) PHP crypt function

http://php.net/manual/en/function.crypt.php

6) Preimage attack - Wikipedia, the free encyclopedia

https://en.wikipedia.org/wiki/Preimage_attack

PHP > 5.5.0

ایجاد هشینگ به منظور ذخیره سازی //

$options = array('cost' => 11);

$hash = password_hash("my password", PASSWORD_BCRYPT, $options);

بررسی هشینگ موجود به منظور اعتبار سنجی کلمه عبور //

$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash))

{

echo 'Password is valid';

}

else

{

echo 'Invalid password';

}

Page 164: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

7) Brute-force attack - Wikipedia, the free encyclopedia

https://en.wikipedia.org/wiki/Brute-force_attack

8) Rainbow table - Wikipedia, the free encyclopedia

https://en.wikipedia.org/wiki/Rainbow_table

Page 165: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

112 1314 مرداد PHP همایش

PHPلی پایگاه های داده متعامل با زبان برنامه نویسی بررسی اجما

سید دانیال نوآیین

مقدمه

و نپس از ابداع کامپیوتر ، هر روز اختراعات جدیدی در ذیل این پدیده به جهان معرفی می شود . شاید به جرأت بتوان گفت که تاثیر گذار تری

افراد بسیار را تحت تاثیر خود قرار داده است . اما در خود اینترنت هم اختراعاتی وجود دارد که بزرگترین آنها اینترنت باشد . پدیده ای که زندگی

را نبدون آنها شاید زندگی بسیار مشکل شود . وب یکی از این اختراعات است که کاربرد آن به حدی زیاد شده که برخی مواقع به اشتباه مفهوم آ

ی برنامه نویسی در زمان ابداع کامپیوتر و به اقتضای صحبت با آن ابداع شدند . اما وب ماجرای دیگری داشت با اینترنت یکی گفته می شود . زبان ها

خود را با وب تطبیق 11و روبی 21 . به همین خاطر می بایست زبانی در خور و متعامل با آن ساخته می شد . برخی زبان های برنامه نویسی مثل جاوا

بود که منحصرا برای وب طراحی و توسعه پیدا کرد . 11این پی اچ پیدادند . اما

ابداع شد . زبان های 12پایگاه داده یکی از دالیل اصلی استفاده از کامپیوتر ها ذخیره سازی انبوه اطالعات در حداقل فضا بود . به همین خاطر

می کنند ، که البته بدون شک پی اچ پی یکی از پیشروترین آنهاست . ه برقرار برنامه نویسی پیشرو و محبوب بهترین ارتباط را با پایگاه های داد

اینترنت

رتباطی ااگر بخواهیم معنای دقیقی از اینترنت ارائه دهیم ، می توانیم بگوییم اینترنت یک شبکه جهانی به هم پیوسته است که براساس پروتکل های

العاتی بر بستر آن ارائه می شود . اینترنت هیچ مالک حقیقی و یا حقوقی ندارد و همچنین هیچ شخص و یا استاندارد ، انواع امکانات ارتباطی و اط

سازمانی آن را به صورت کلی کنترل نمی کند .

اشیم . هد نبشاید بتوان تعریف اینترنت را در همین جمالت خالصه کرد ، اما بدون شک قادر به بیان خدماتی که این پدیده به بشریت ارائه می د

میلیارد کاربر در آنها دارد . ارتباط بین سازمان های مختلف برای استفاده از 3کشور در جهان به آن متصل بوده و بیش از 111جایی که می دانیم

رین نی ، ایمیل و وب از مهمتمنابع همدیگر ، اتصال پایگاه های عملی در سراسر جهان ، ارائه رادیو و تلویزیون ، مکالمات صوتی و تصویری ، پیام رسا

خدماتی هستند که تا امروز بر روی بستر اینترنت ارائه شده اند .

وب

ت که ساز میان خدمات گسترده ای که بر روی اینترنت ارائه می شود ، وب گسترده ترین و پر استفاده ترین آنها می باشد. این گستردگی تا جایی ا

معنی خوانده می شوند . وب جهان گستر که به اختصار وب خوانده می شود مجموعه ای است از صفحاتی که گاهی به اشتباه وب و اینترنت به یک

89 Java 90 Ruby 91 PHP 92 Database

Page 166: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

113 1314 مرداد PHP همایش

رک د دارای ابرمتن بوده و به یکدیگر متصل هستند. با کمک نرم افزاری به نام مرورگر وب می توان اطالعات درون این صفحات را به محتوای قابل

رد . برای انسان تبدیل و اصطالحا مرور ک

و سمت 14و پایگاه های داده . برنامه های کاربردی نیز دارای دوبخش سمت کاربر 13وب به دو بخش کلی تقسیم می شود : برنامه های کاربردی

درخواست کرده و HTTPیا سرور هستند . در پروسه استفاده از صفحات وب ، ابتدا کاربر صفحه ی وب را از سرور با استفاده از 15سرویس دهنده

سرور با توجه به صفحه ی درخواستی به کاربر پاسخ می دهد . در صورت که صفحه دارای متنی بود که دارای کد های سمت سرور است ، ابتدا آن

ها تفسیر شده و نتیجه به همراه سایر متن های صفحه برای تبدیل شدن به صفحه ای که انسان درک می کند به سمت مرورگر ارسال می شود .

نمایش می دهد . 11ورگر این متن ها را با توجه به زبان برچست گذاریسپس مر

پی اچ پی

زبان برنامه نویسی به صورت مستمر در وب مورد استفاده قرار می گیرند: 1در حال حاضر می توان گفت که

جاوا -1

2- ASP.net

پایتون -3

پی اچ پی -4

روبی -5

پرل -1

درصد وب سایت ها با این زبان 21می باشد که تقریبا بیش از )Hypertext Preprocessor(ه ابر متن پی اچ پی برگرفته از پیش پردازند

نوشته شده اند . پی اچ پی در ابتدا منحصرا برای استفاده از برنامه های کاربردی وب در سمت سرور ابداع و توسعه پیدا کرد .

پی بیان کرد ؛ اما از مهمترین آنها به توابع پیش ساخته ی بسیار قدرتمند و کاربردی ، اجرا می توان دالیل زیادی را برای محبوبیت چشمگیر پی اچ

، سهولت در یادگیری و پشتیبانی IISو NginXبر روی پلتفرم ها و سیستم عامل های رایج ، تفسیر در اکثر وب سرور های امروزی مثل آپاچی ،

طیف وسیعی از پایگاه های داده اشاره کرد.

ایگاه داده پ

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

ارچه توسط نرم افزاری یکپ نگاه پایگاه داده ها را می توان با توجه به نوع محتوی طبقه بندی کرد.انجام امور دسترسی ، مدیریت و بروز رسانی داده ها

انجام می گیرد . از آن جا که ارتباط بسیار نزدیکی بین پایگاه داده و سیستم های مدیریت پایگاه داده 11و پیچیده به نام سیستم مدیریت پایگاه داده

و های کاری متفاوتی دارند ، اما آنچه که امروزه برای هر دوی آنها به کار می رود . پایگاه های داده الگ "پایگاه داده "وجود دارد ، معموال اصطالح

می باشد . 12متداول است مدل رابطه ای

سیستم های پایگاه داده پی اچ پی

خش امروزه داده ها و اطالعات در حد غیر قابل تصوری هستند . حجم بی اندازه ای از داده هایی که گوگل هر لحظه ارائه می دهد به تنهایی ب

میلیون حساب کاربری دارد که حتی اگر آنها در طول 111های تبادل شده در سطح اینترنت می باشند . سرویس جیمیل بیش از ناچیزی از داده

93 Applications 94 Client-side 95 Server-side 96 Markup Language 97 Database Management System - DBMS 98 Relational model

Page 167: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

114 1314 مرداد PHP همایش

میلیارد حساب 1.4میلیارد ایمیل نیاز داریم . فیسبوک حدود 1ایمیل ارسال کنند ، پایگاه داده ای برای ذخیره سازی 11استفاده از حسابشان فقط

دارد. کاربری فعال

ه شده وت نوشتاگر این دو را به عنوان نمونه ای از نرم افزار های کاربردی گسترده در نظر بگیریم ، خواهیم دید هر دو با دو زبان برنامه نویسی متفا

رای مدیریت پایگاه داده باند . پس نتیجه می گیریم زبان برنامه نویسی ای برای یک کار بزرگ انتخاب می شود که بتواند به طور قابل مالحظه ای با

این حجم اطالعات ارتباط برقرار کند .

ید توانایی اهمانطور که در پیشتر بیان شد ، پی اچ پی به عنوان یکی از پیشگامان زبان های برنامه نویسی در حوزه ی برنامه های کاربردی وب ، ب

توجه به پروژه های مختلف که براساس اندازه شان طبقه بندی می شوند ، پی اچ برقراری ارتباط موثری با پایگاه داده ها داشته باشد . اما با

پی توانایی برقراری ارتباط با پایگاه داده های مختلفی را دارد تا بتواند براساس نیاز آن پروژه انعطاف نشان دهد .

اه داده ای خواهیم پرداخت که زبان برنامه نویسی پی اچ پی توانایی برقرای از این رو در این مقاله به بررسی اجمالی و مختصر سیستم های پایگ

ارتباطی موثر با آنها دارد .

CUBRID CUBRID توسعه یافته و برای برنامه های کاربردی وب بهینه سازی شده است ، 2111یک سیستم پایگاه داده رابطه ای جامع است که از سال

یچیده وب حجم عظیمی از داده ها را پردازش کرده و درخواست های همزمان بسیاری را تولید می کنند . این خصوصا زمانی که سرویس های پ

هم به پی اچ پی متصل می شود . همچنین فقط دارای یک نسخه برای PDOاجرا شده و به روش Cپایگاه داده با استفاده از زبان برنامه نویسی

است . از استفاده کننده های این پایگاه داده می توان به سیستم مدیریت محتوای GPL v2وز هر دو مصرف شخصی و یا تجاری تحت مج

XpressEngine وNAVER Social Apps .که هر دو کره ای هستند اشاره کرد

DB++

توسعه Concept asaانی به نام این یک سیستم پایگاه داده رابطه ای با کارایی باال و استفاده کم از منابع حافظه است که توسط یک شرکت آلم

های پرل ز زبانپیدا می کند . این شرکت که عالقه مند است این پایگاه داده را با استفاده از زبان های برنامه نویسی متن باز توسعه دهد ، در ابتدا ا

استفاده می کند ، اما در واقع از زبان SQLز دستورات استفاده می کند . این پایگاه داده در ظاهر ا Tclاستفاده می کرد ، اما امروزه فقط از Tclو

منتشر می شود که استفاده کننده Concept asaاختصاصی شرکت 11بهره می گیرد . این پایگاه داده با مجوز AQLدرخواست خودش به نام

سطر محدود می کند)!( . 2111را به دو کاربر یا پایگاه داده ای با

Dbase

DBase پایگاه های داده می باشد و در زمان خود موفق ترین سیستم پایگاه داده برای میکروکامپیوتر ها بوده است . این سیستم که جزو اولین

منتشر شد ، شامل هسته موتور پایگاه داده ، یک سیستم درخواست ، یک موتور فرم ها و یک زبان برنامه نویسی که این 1111اولین بار در سال

یگر ربط می دهد ، می باشد. این سیستم مدیریت پایگاه داده در سه نوع که همگی غیر رایگان هستند منتشر می شود .بخش ها را به یکد

Filepro

fliepro به طور کامل یک سیستم پایگاه داده رابطه ای نیست . هم اکنون نامfilepro تجاری سازی شده و 111توسط شرکت اف پی تکنولوژیز

که یک سیستم پایگاه داده برای سیستم عامل های قدیمی است ، هم اکنون به صورت غیر رایگان fileproی شود . توسط این شرکت عرضه م

عرضه می شود .

Firebird

99 License 100 Fp Technologies

Page 168: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

115 1314 مرداد PHP همایش

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

تبدیل شده است ، اما گفته می شود که مستقل از برنامه نویسان این دو زبان است . همچنین این ++Cبه Cشدن از شرکت نرم افزاری برلند ، از

نیز به پی اچ پی متصل می شود . PDOشبیه است . این سیستم به روش GPLسیستم تحت مجوز خودش منتشر می شود که به

Frontbase

ایگاه داده رابطه ای که ویرایشی خاص برای سیستم عامل های شرکت اپل دارد . براساس آنچه که توسعه دهنده آن می گوید ، این یک سیستم پ

یت اسیستم نیازی به مدیر نداشته و فاقد زمان ازکار افتادگی می باشد . همچنین می توان به سرعت و ساختار منعطف آن اشاره کرد . از جمله س

اشاره کرد . استفاده از این پایگاه داده رایگان است . AppleSeedین پایگاه داده استفاده می کنند می توان به هایی که از ا

IBM DB2

خانواده ای از پایگاه های داده ای DB2خدمات موثر و پرشماری را به دنیای کامپیوترها ارائه داده است . IBMبه جرأت می توان گفت که شرکت

توسعه داده شده اند . این پایگاه داده در ابتدا رابطه ای بود ، اما در سال های اخیر از روش شئ گرا استفاده می کنند . این IBMاست که توسط

نوشته شده است ، به صورت پلتفرم مشترک برای سیستم عامل های ویندوز ، لینوکس و یونیکس ++Cو Cپایگاه داده که با زبان های اسمبلی ،

شود . این پایگاه داده دارای نسخه های زیادی است که هرکدام نیاز خاصی را پوشش می دهد . البته می توان این چند نسخه بودن را به منتشر می

نیز به پی اچ پی متصل می شود ، به صورت غیر رایگان و تحت PDOکه به روش DB2چند نسخه بودن سیستم عامل ویندوز شبیه دانست .

ترس است . در دس EULA111مجوز

Ingres

توسعه ی آن را کنترل کرده و نسخه معتبر Actianمی باشد ، اما شرکت 112یک سیستم پایگاه داده رابطه ای که هر چند به طور کامال منبع باز

ی ی کاربردی دولتی و تجارابتدا فقط یک پروژه تحقیقاتی در دانشگاه برکلی بود ، اما هم اکنون برای برنامه ها Ingresو رسمی را عرضه می کند .

منتشر می شود . همچنین پایگاه داده GNUنوشته شده است ، با مجوز Cبزرگ مورد استفاده قرار می گیرد . این سیستم که با زبان

PostgreSQL . تکامل یافته این پروژه است

MaxDB

به صورت منبع بسته توسعه پیدا می کند . این پایگاه داده که با یک سیستم پایگاه داده رابطه ای است که توسط شرکت اس آ پ آ گ در آلمان

نوشته شده است به صورت پلتفرم مشترک برای کار های سازمانی مورد استفاده قرار می گیرد . ++Cزبان

MongoDB

GNUنوشته شده و تحت مجوز JavaScriptو ++C ،Cیک پایگاه داده منبع باز پرونده گرا است . این سیستم با استفاده از زبان های

AGPL . منتشر می شودMongoDB محبوب ترین پایگاه داده ی 2114در سالNoSQL شد . یک رکورد در این پایگاه داده یک پرونده

های به کار می باشد . از نمونه JSONمقدار ذخیره شده است ، ساختاری که بسیار شبیه به اشیاء –است که ساختار داده آن به صورت فیلد

اشاره کرد . Expediaگیرنده این پایگاه داده می توان به وب سایت شهرداری شیکاگو و سرویس معروف

mSQL

نوشته شده است . برای Cتوسط شرکت هیوز تکنولوژیز عرضه می شود . این پایگاه داده با زبان MiniSQLاین پایگاه داده رابطه ای با نام کامل

غیر تجاری رایگان بوده و در استفاده های تجاری نیاز به خرید پروانه استفاده است . استفاده های

101 End User License Agreement 102 Open Source

Page 169: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

MS SQL

وسط تحتی معدود کسانی که از کامپیوتر استفاده نمی کنند هم نام مایکروسافت را شنیده اند . این سیستم یک پایگاه داده ای رابطه ای است که

نوشته شده و تحت مجوز اختصاصی نرم افزارهای غیر رایگان در دسترس است . ++Cو Cبان های این شرکت توسعه و عرضه می شود . با ز

هم دارای نسخه های متفاوتی است . از قابلیت های این پایگاه داده می توان به MSSQLهمچون سایر محصوالت نرم افزاری مایکروسافت ،

اشاره کرد . XMLپشتیبانی از

MySQL

است که به توصیه کنسرسیوم جهانی وب ، بهترین پایگاه داده برای پی اچ پی است . پی پال ، MySQLگاه داده منبع باز جهان محبوب ترین پای

نوشته شده و ++Cو Cبا زبان های MySQLلینکداین ، فیسبوک ، ویکیپدیا و تامبلر برای بیان قدرت و محبوبیت این پایگاه داده کافی است .

است . این پایگاه داده استفاده چندین کاربر را به طور Oracleنتشر می شود . توسعه دهنده این پایگاه داده شرکت مطرح م GPLتحت مجوز

نیز با پی اچ پی ارتباط برقرار می کند . PDOهمزمان به داده ها می دهد . همچنین به روش

Oracle

نوشته شده است ++Cو Cرایگان است که با استفاده از زبان های برنامه نویسی اسمبلی ، پایگاه داده اوراکل یک سیستم پایگاه داده رابطه ای غیر

بر روی سیستم عامل های 12c. همه ی امور توسعه و پشتیبانی از این سیستم توسط شرکت اوراکل انجام می پذیرد . همچنین آخرین نسخه آن ،

نیز به پی اچ پی متصل می شود . PDOه داده به روش لینوکس ، سوالریس و ویندوز اجرا می شود . این پایگا

Paradox

برای Ansaسیستم پایگاه داده ی رابطه ای است که هم اکنون توسط شرکت کورل منتشر می شود . در ابتدا توسط نرم افزاری

DOS ساخته شد ، اما بعدا برایWindows . هم ارائه شد

PostgreSQL

می باشد . این پایگاه داده منبع باز بر روی همه ی سیستم عمال های رایج Ingresه داده شئ رابطه ای است که تکامل یافته ی پروژه ی یک پایگا

منتشر شده است . یکی از PostgreSQL Licenseنوشته شده است تحت مجوز خودش به نام Cاجرا می شود . این پایگاه داده که با زبان

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

توان به یاهو و اینستاگرام اشاره کرد .

SQLite

به صورت Cده رابطه ای است که با زبان یکی از خاص ترین سیستم های پایگاه دا SQLiteموزیال و بلومبرگ از این سیستم استفاده می کند .

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

د داشته باشند ؛ بدون دردسر های سایر پایگاه داده بهترین انتخاب برای نرم افزارهایی باشد که می خوهاند یک پایگاه داده جاسازی شده درون خو

کیلوبایت است . این پایگاه داده که به صورت پلتفرم مشترک است ، 111ها . به طور مثال حجم این پایگاه داده به طرز غیر قابل باوری کمتر از

تحت مجوز مالکیت عمومی منتشر شده است .

نتیجه

Page 170: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

نوشته شده اند . بیش از نیمی از آنها را می توان Cاکثر این پایگاه های داده با استفاده از زبان جمالی قرار دادیم .پایگاه داده را مورد بررسی ا 11

مورد که جزء پایگاه های داده ی قدیمی اند ، 3درصد آنها به صورت منبع باز منتشر می شوند . به جز 11به صورت رایگان مورد استفاده قرار داد .

ای پشتیبانی فعال بوده و جامعه ی توسعه دهندگان خود را دارند . سایرین دار

ده است که ابا توجه به نتیجه به راحتی می توان گفت که یکی از دالیل اصلی محبوبیت پی اچ پی توانایی برقراری ارتباط موثر با این تعداد پایگاه د

ترین پایگاه داده را استفاده کنند. حق انتخاب را به توسعه دهندگان می دهد که براساس نیازشان به

منابعhttps://en.wikipedia.org/wiki/ http://www.webopedia.com/TERM/I/Internet.html http://www.businessdictionary.com/definition/internet.html http://books.google.com/ngrams/ https://fa.wikipedia.org/wiki/

2014-languages-development-web-top-101-development-https://www.upwork.com/blog/2014/03/web/

http://w3techs.com/technologies/overview/programming_language/all .com/php/php_intro.asphttp://www.w3schools

http://searchsqlserver.techtarget.com/definition/database e.htmlhttp://www.webopedia.com/TERM/D/databas

http://www.cubrid.org/ mysql-over-cubrid-choose-http://www.cubrid.org/blog/news/who/

asa.de/index_gb.html-http://www.concept http://www.dbase.com/ http://php.net/manual/en/book.filepro.php

ww.fptech.comhttp://w/

firebird-http://www.firebirdsql.org/en/about/ bin/WebObjects/FBWebSite-http://www.frontbase.com/cgi

01.ibm.com/software/data/db2-http://www 4881fe4e1a25ba6079/frameset.htmhttp://help.sap.com/saphelp_nw74/helpdata/en/e3/43526ddc6046

http://docs.mongodb.org/manual/core/introduction/

http://www.hughes.com.au/products/msql/

server/Features.aspx-cloud/products/sql-us/server-https://www.microsoft.com/en doc/refman/5.6/en/introduction.htmlhttp://dev.mysql.com/

http://www.postgresql.org/about/

https://www.sqlite.org/about.html تقی ، نشر جلوه اصول طراحی پایگاه داده ها ، روحانی رانکوهی ، سید محمد

Page 171: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

112 1314 مرداد PHP همایش

Rulesچگونه ماژول خود را با ماژول یکپارچه کنیم 1در دروپال

کیانی ایمان، گروه نرم افزاری سوله پرداز

را به hookاین مقاله برای چه کسانی است؟ این مقاله برای کسانی است که توانایی کدنویسی برای ایجاد ماژول در دروپال را دارند و مفاهیم

آشنا باشند زیرا ()hook_schemaو ()hook_menu() ،hook_permission های پرکاربرد نظیر hookبی درک می کنند. بایستی با خو

نیز از ملزومات است. Form APIو Database layer فرض ما بر این است که خواننده این مقاله، یک توسعه دهنده ی دروپال است.

و امکانات آن را به خوبی می شناسد. اما نگارش این مقاله به گونه ای است که افراد با Rulesواننده، ماژول همچنین فرض بر این است که خ

توانایی های مختلف می توانند از آن بهره ببرند.

قبل از شروع، به توضیح چند اصطالح که بیشتر در این مقاله کاربرد دارد می پردازیم:

UI رابط کاربری ماژول :Rules که از آدرسdrupal/admin/config/workflow/rules -to-http://path قابل دسترسی است که به

می گوییم. UIاختصار و برای راحتی به آن

را دارد. UI: هر کاربری که مجوز دسترسی به administratorکاربر یا

ایجاد می شود را رول Add new ruleبا استفاده از لینک UIکه در ایجاد کند. به عبارت دیگر هر آنچه UI: آنچه که کاربر می تواند در رول

ها می باشد. actionها و conditionتعامل می کند و شامل eventمی نامیم. یک رول با یک

ه دانش برنامه هایی ک administratorیک از کارآمدترین ماژول هایی است که برای دروپال فراهم شده است. این ماژول برای Rulesماژول

ه ایجاد کند ک رولینویسی و توسعه ی دروپال را ندارند، توانایی فوق العاده ای برای ارتباط با دروپال فراهم می آورد. به طور مثال مدیر می تواند

اشد تا نویسنده مجددا نیازی نب ه نمایش داده شود تا آنحیجاد مقاله ی دیگر نیز در باالی صفاایجاد یک مقاله، لینک منویسندگان مقاله هنگابرای

همان گونه که می دانید توانایی های بی نظیری که این ماژول در اختیار قرار میدهد، بسیار مراجعه کند. "ایجاد محتوای جدید <محتوا " به منوی

فراتر از این دست مثال هاست.

privatemsgبود. آیا برای ماژول integrateای کاش این ماژول با ماژول رولز، اما همه ی ما کاربران دروپال وقتی ماژولی را می بینیم، می گوییم که

نباشد؟ اکنون که ماژول پیغام خصوصی با رولز یکپارچه است، مدیر سایت می تواند رولی ایجاد کند که به طور integrateحیف نبود که با رولز

زوده شود آنگاه به نویسنده ی آن محتوا یک پیغام خصوصی ارسال شود مبنی بر این مثال اگر روی محتوای نوشته شده توسط کاربران، دیدگاهی اف

که نویسنده ی محترم، روی محتوای شما یک دیدگاه افزوده شد.

Page 172: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

ستفاده اکسانی که توسعه دهنده ی دروپال هستند اگر ماژولی که می نویسند با رولز یکپارچه باشد، مدیران سایتی که از ماژول آن توسعه دهنده ها

می کنند، آن توسعه دهنده ها را برای یکپارچه کردن آن ماژول با رولز، تحسین می کنند. چون رولز دوست داشتنی است، ماژولی هم که با آن

یکپارچه می شود دوست داشتنی خواهد بود، این طور نیست؟

برای CRUDن برای یک شرکت کدنویسی می کنید و عملیات به طور مثال فرض کنید شما به عنوان توسعه دهنده، برای ایجاد یک اتوماسیو

برای رولز ایجاد eventمشتریان آن شرکت را نیز فراهم آورده اید. اما خواهان این هستید که ماژول شما با رولز یکپارچه باشد. مثال می خواهید یک

. "ل کردن نام پشتیبان اختصاص داده شده به آن مشتریایمی"ایجاد کنید: actionو یک "رویداد پس از ایجاد شدن یک مشتری"کنید :

دیگر: actionو eventیک

"هنگام ایجاد فاکتور خرید یک مشتری"

"ایمیل شدن جزییات آن فاکتور به مشتری"

لز یکپارچه باشد به طوری پس شما به عنوان توسعه دهنده، برای راحتی آن مدیری که از ماژول شما استفاده می کند، نیاز داریدکه ماژول شما با رو

که آن مدیر قادر باشد انواع رول های دلخواه را ایجاد کند.

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

قابل دسترسی است. http://imankiani.ir/phpconfطریق آدرس نوشته شده همگی در سایت اینجانب و از

های اختصاصی برای ماژول خود می پردازیم تا ماژولمان conditionو همچنین action ،eventدر این مقاله به چگونگی کدنویسی برای ایجاد

، eventل ایجاد خواهیم کرد. یک ماژول برای ثبت اطالعات مشتری در پایگاه داده و ماژول دیگر برای ایجاد با رولز یکپارچه شود. ما دو ماژو

condition وaction های مرتبط با ایجاد یک مشتری به طوری که کاربر بتواند درUI .این موارد را انتخاب کند و رول دلخواه خود را ایجاد کند

ن کار ها را در یک ماژول انجام داد.هرچند که می توان همه ی ای

فراهم می آورد را Rulesرا با phpconfنام نهادیم و ماژول دوم که یکپارچگی phpconfماژول اول که برای ثبت اطالعات مشتری است را

phpconf_rules .نامگذاری می کنیم

و ثبت می کند. برای سادگی این فرم دارای چهار ورودی است: نام، دارای یک فرم است که از کاربر، اطالعات مشتری را گرفته phpconfماژول

اعالن می شود. در حقیقت hookاین فرم کلیک کرد، یک submit نام خانوادگی، جنسیت و ایمیل مشتری. پس از این که کاربر روی دکمه ی

می خواهیم یک رخداد برای ثبت مشتری جدید ایجاد کنیم.

ایجاد می کنیم. همانطور که می دانید برای phpconfپوشه ای به نام sites/all/modulesیجاد کنیم. در داخل پوشه ی بیایید ماژولمان را ا

را ایجاد کرده و phpconf.info( ، فایل phpconfدر داخل پوشه ی ماژولمان ) داشته باشیم. info.معرفی ماژول به دروپال بایستی یک فایل

نویسیم.خطوط زیر را در آن می

phpconf.info

name = phpconf

description = A simple module for registering new customers in our CRM.

core = 7.x

package = phpconf

نیم. برای ، یک جدول در پایگاه داده ایجاد می ک schema apiبرای این که اطالعات مشتری را ذخیره کنیم، هنگام نصب ماژول با استفاده از

ایجاد می کنیم. در فایل phpconf.install، یک فایل به نام phpconf.infoو در کنارفایل phpconfاین کار در پوشه ی ماژولِ

phpconf.install بایستیhook_schema() را پیاده سازی کنیم؛ چون ماژول ماphpconf نام دارد ، تابع پیاده سازِ اینhook ،

phpconf_schema() .است

Page 173: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

phpconf.install

/*

* Implements hook_schema()

*/

function phpconf_schema(){

$schema = array();

$schema['phpconf_customer_info'] = array(

'description' => 'Table for saving customers information.',

'fields' => array(

'id' => array(

'description' => 'Customer id',

'type' => 'serial',

'not null' => true,

'unsigned' => true,

),

'first_name' => array(

'description' => 'The fisrt name',

'type' => 'varchar',

'length' => 50,

'not null' => true,

),

'last_name' => array(

'description' => 'The last name',

'type' => 'varchar',

'length' => 50,

'not null' => true,

),

'gender' => array(

'description' => 'gender of customer. 0 for female, 1 for male',

'type' => 'int',

'size' => 'tiny',

'default' => 0,

),

'email' => array(

'description' => 'responding email',

'type' => 'varchar',

'length' => 255,

'not null' => true,

),

),

'primary key' => array('id'),

'unique keys' => array(

'email' => array('email'),

),

);

return $schema;

}

شدن با نام دیگر جدول conflictبرای جلوگیری از می باشد. phpconf_customer_infoهمانگونه که مشاهده می کنید نام این جدول

first_name ،last_name ،genderدارای فیلد های phpconf_customer_infoها، نام ماژول را نیز در ابتدای جدول می آوریم. جدول

Page 174: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

وجود دارد که با نیز idوه بر اینها فیلد می باشد که به ترتیب برای ذخیره ی نام، نام خانوادگی، جنسیت و ایمیل مشتری است. عال email و

به صورت کلید اولیه تعریف شده است. چون ایمیل هر مشتری باید یکتا باشد، 'id'(array =>'primary key'(استفاده از

با استفاده از

'unique keys' => array(

'email' => array('email'),

),

ست. همانطور که میدانید می توان چندین کلید یکتا ایجاد کرد که در هرکلید می تواند چندین فیلد قرار داشته باشد. به صورت یکتا در آمده ا

را در این کلید قرار داده ایم. emailمی باشد که فیلد emailکلید یکتای ما

در پایگاه داده ایجاد می hook_installوانی و فراخ phpconfکه هنگام نصب ماژول phpconf_customer_info جدول -( 1)تصویر

شود.

را پیاده سازی می کنیم زیرا بعدا می خواهیم ()hook_permissionرا ایجاد می کنیم. در ابتدای این فایل، phpconf.moduleاکنون فایل

، ماژول ما تنها دارای یک پرمیشن است.به نقش هایی که دوست داریم اجازه ی کار با این ماژول و منوهای آن را بدهیم. برای سادگیphpconf.module

/*

* Implements hook_permission()

*/

function phpconf_permission(){

return array(

'administer phpconf' => array(

'title' => 'Administer phpconf',

'description' => 'Perform administration task for phpconf.', ),

);

}

Page 175: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

112 1314 مرداد PHP همایش

phpconfمجوز ایجاد شده برای دسترسی دادن به نقش های دلخواه برای استفاده از ماژول –( 2)تصویر

‘ access را پیاده سازی می کنیم. دسترسی به این منو را با استفاده از ()hook_menuبرای این که فرم ثبت مشتری جدید را ایجاد کنیم،

arguments’ .به همان پرمیشنی که ایجاد کردیم، محدود می کنیم

phpconf.module /*

* Implements hook_menu()

*/

function phpconf_menu(){

$items = array();

$items['phpconf_customer_add'] = array(

'title' => 'Add Customer',

'description' => '',

'page callback' => 'drupal_get_form',

'page arguments' => array('phpconf_customer_add_form'),

'access arguments' => array('administer phpconf'),

);

return $items;

}

‘page callback’ مربوط به این منو ، تابعdrupal_get_form ازform api فراخوانی می کند. راdrupal_get_form نیز تابع

phpconf_customer_add_form را به عنوان فرمrender .خواهد کرد

phpconf.module

function phpconf_customer_add_form(){ $form = array();

$form['first_name'] = array(

'#title' => 'First Name',

'#description' => '',

'#type' => 'textfield',

'#size' => 20,

'#required' => true,

);

$form['last_name'] = array(

Page 176: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

113 1314 مرداد PHP همایش

'#title' => 'Last Name',

'#description' => '',

'#type' => 'textfield',

'#size' => 20,

'#required' => true,

);

$form['gender'] = array(

'#title' => 'Gender',

'#description' => '',

'#type' => 'select',

'#options' => array(

0 => 'Female',

1 => 'Male',

),

'#required' => true,

);

$form['email'] = array(

'#type' => 'textfield',

'#title' => 'Email',

'#size' => 20,

'#required' => true,

);

$form['submit'] = array(

'#type' => 'submit',

'#value' => 'Submit',

);

return $form;

}

است.email و first_name ،last_name ،genderاین فرم برای ایجاد یک مشتری جدید است و دارای المان های

فرم ثبت مشتری جدید –( 3)تصویر

.

Page 177: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

114 1314 مرداد PHP همایش

فراخوانی می ()phpconf_customer_add_form_submitکلیک کرد به صورت پیش فرض submitپس از اینکه کاربر روی دکمه ی

شود که در زیر آمده است.

phpconf.module

function phpconf_customer_add_form_submit($form, &$form_state){

$customer = new stdClass();

$customer->fname = $form_state['values']['first_name'];

$customer->lname = $form_state['values']['last_name'];

$customer->gender = $form_state['values']['gender'];

$customer->email = $form_state['values']['email'];

$cid = db_insert('phpconf_customer_info')

->fields(array(

'first_name' => $customer->fname,

'last_name' => $customer->lname,

'gender' => $customer->gender,

'email' => $customer->email,

))

->execute();

module_invoke_all('phpconf_customer_add',$customer);

}

customer$مقادیری که پس از ثبت فرم به این تابع ارسال می شود را در شیء -1، سه نکته وجود دارد. submitدر بدنه ی تابع مربوط به

مقادیری که کاربر در فرم ثبت کرده را در جدول -2ح میدهیم(. قرار دادیم )برای ثبت فرم نیازی به این کار نیست اما دلیل آن را بعدا توضی

insert .با استفاده از تابع -3می کنیمmodule_invoke_all .هوکِ ، یک هوک اعالن می کنیمphpconf_customer_add به سادگی

به تمام ماژول هایی که هوکِ module_invoke_allایجاد شد. در حقیقت پس از ثبت اطالعات مشتری در جدول، با استفاده از

phpconf_customer_add را پیاده سازی می کنند، اجازه ی خودنمایی می دهیم. به بیان دیگر یک رخداد ایجاد کرده ایم: رخداد افزودن

است،ِ ای ماژولها، رخداد ذخیره شدن مشتری اتفاق افتاده مشتری )رخداد ذخیره شدن مشتری(. با این کار به ماژول های دیگر می گوییم:

در حقیقت به ماژولهای دیگر اجازه ی قالب شدن به ماژول خود کارهایی که دوست دارید در زمان این رخداد انجام بدهید را انجام دهید.

ده کند بایستی را پیا phpconf_customer_addرا داده ایم تا در این رخداد همراه ما باشند. مانند سایر هوک ها، هر ماژولی که بخواهد هوِک

hook_phpconf_customer_add را پیاده سازی کند. )همانطور که دیدید برای تعریف یک هوکِ دلخواه، نیازی نیست که آن هوک را به

، یک هوک به طور module_invoke_allطور صریح اعالن کنید؛ هرچند که می توان این کار را کرد ولی نیازی نیست. در اینجا با استفاده از

ضمنی و نه صریح ایجاد کردیم(.

اما اما در این میان مشتری ایجاد شده را هم به عنوان پارامتر به رخداد مذکور ارسال می کنیم. رخداد ایجاد مشتری جدید، اتفاق افتاده است

خوب! با این کار ماژولهایی که این ماژول ما کارش درست است و مشتری ایجاد شده را نیز به عنوان پارامتر به رخداد مذکور ارسال می کند. چه

هوک را پیاده می کنند قادر به دسترسی به مشتری ایجاد شده هستند.

)$customer,''phpconf_customer_add(module_invoke_all

ه دهد تا در آینده اگر یک هوک تعریف کرد تا به ماژولهای دیگر اجاز phpconfاجازه دهید تا هوکی که ایجاد کرده ایم را تست کنیم. ماژولِ

هم می تواند هوکی که خودش تعریف کرده را پیاده سازی کند. بیایید پیاده کنیم: phpconfخواستند این هوک را پیاده سازی کنند؛ اما خودِ

phpconf.module

Page 178: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

115 1314 مرداد PHP همایش

/*

* Implements hook_phpconf_customer_add()

*/

function phpconf_phpconf_customer_add($customer){

watchdog('PHPCONF', 'The customer '.$customer->fname." ".$customer->lname.' was added'); }

ایجاد می شود. watchdogتوسط log messageاکنون اگر فرم ثبت مشتری را پُر کنیم خواهیم دید که پس از ثبت اطالعات مشتری، یک

می رویم. admin/reports/dblogها به آدرس log messageرسی به همان طور که می دانید برای دست

()hook_phpconf_customer_addپر کردن فرم ثبت مشتری برای آزمایش –( 4)تصویر

()hook_phpconf_customer_addدر هنگام ثبت مشتری و آزمایِش watchdogشدن نام و نام خانوادگی مشتری با log –( 5)تصویر

eventیکپارچه کند و Rulesرا با phpconfرا کدنویسی کردیم. اما می خواهیم ماژول دیگری بنویسیم که ماژول phpconfتا کنون ماژول

فراهم کند. هر چند که نیازی به نوشتن ماژول جداگانه ای نبود اما این تمرین Rulesهای دلخواه خود را برای conditionها و actionها ،

را ایجاد می کنیم. phpconf_rulesاست که برای یک ماژول دیگر این یکپارچگی را انجام دهیم. به این منظور ماژول خوبی

Page 179: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

را درون phpconf_rules.infoدرست می کنیم. طبق معمول بایستی یک فایل با نام phpconf_rulesدر پوشه ی ماژولها پوشه ای به نام

این پوشه ایجاد کنیم.

phpconf_rules.info

name = Phpconf Rules

description = Provides integration between Phpconf and Rules.

core = 7.x

package = phpconf

باز را در آن می نویسیم تا php?>را ایجاد می کنیم اما فعال درون آن چیزی نمی نویسیم. فقط تگ phpconf_rules.moduleفایل

phpconf_rules لیست ماژولهای دروپال ظاهر شود. در

phpconf_rules.module <?php

ایجاد کنیم بلکه phpconf_rules.moduleهای دلخواه خود نیازی نیست که آنها را در فایل actionو event ،conditionبرای تعریف

را ایجاد می کنیم. و در phpconf_rules.rules.incتعریف کنیم. پس فایل MY_MODULE>.rules.inc>کافی است آنها را در فایل

دلخواه ایجاد کنیم. درون فایل actionهای دلخواه خود را تعریف می کنیم. اجازه دهید ابتدا یک conditionها و actionها، eventآن

phpconf_rules.rules.inc ِهوکِ تعریف ، action که ماژولRules .اعالن کرده است را پیاده می کنیم

phpconf_rules.rules.inc /*

* Implements hook_rules_action_info()

*/

function phpconf_rules_rules_action_info(){

$actions = array();

return $actions;

}

ساده برای سالم کردن به دنیا: actionکه بخواهیم می توانیم تعریف کنیم. اما یک actionهر چندتا

/*

* Implements hook_rules_action_info()

*/

function phpconf_rules_rules_action_info(){

$actions = array();

$actions['phpconf_rules_action_hello_world'] = array(

'label' => 'hello world',

'group' => 'phpconf',

); return $actions;

}

شدن با اکشن هایی که سایر ماژولها conflictنهادیم. برای جلوگیری از phpconf_rules_action_hello_worldرا actionینی نام ماش

که نام ماژول است را ابتدای تعریف نام اکشن می آوریم. در ضمن بعد از عبارت phpconf_rulesعبارت ممکن است تعریف کنند،

Page 180: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

phpconf_rules از عبارتaction هم استفاده کردیم تا مشخص شود مربوط به تعریف یک اکشن است. تا همین جای کار اگر به سراغUI از

قرار گرفته است. Phpconfایجاد شده است که در زیر مجموعه ی Hello worldبا برچسب actionبرویم خواهیم دید که یک Rulesماژول

را انتخاب کرد، چه actionنیز گویاست. اما وقتی کاربر این groupمی دهد. کاربرد کلید نشان UIرا در actionبرچسب آن labelپس کلید

(actions$را باید در تابعی جستجو کرد که هم نام با نام ماشینی این اکشن ) اندیس آرایه انجمنی از آرایه ی actionاتفاقی بیفتد؟ عملکرد این

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

$actions['phpconf_rules_action_hello_world'] تعریف می شود. ()phpconf_rules_action_hello_world با تابع actionپس عملکرد این

phpconf_rules.rules.inc

//action function for $actions['phpconf_rules_action_hello_world']

function phpconf_rules_action_hello_world(){

drupal_set_message('Hello world!');

}

یک رول ایجاد UI، در actionباعث چاپ پیغام سالم دنیا می شود. برای تست کردن این actionهمان طور که مشاهده می کنید اجرای این

انجام شود. actionاین nodeمی کنیم؛ مثال هنگام نمایش یک

hello world( اکشنِ Content is viewed. هنگام نمایش یک محتوا )Hello world ک رول برای استفاده از اکشن ایجاد ی –( 1)تصویر

انجام می شود.

Page 181: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

112 1314 مرداد PHP همایش

انجام می شود. پس پیغام hello worldوقتی یک محتوا در حال نمایش است، رول قبلی که ایجاد کردیم عمل می کند و اکشن –( 1)تصویر

ه خواهیم کرد.سالم دنیا را مشاهد

م دنیا، سال اما اکشن ها می توانند دارای پارامتر نیز باشند. به طور مثال همان اکشن قبلی را در نظر بگیرید؛ می خواهیم کاربر هنگام ایجاد اکشنِ

ست را به اکشن اضافه می کنیم. که خود نیز یک آرایه ا parameterقادر باشد تا تعداد چاپ پیغام سالم دنیا را تعیین کند. برای این کار، کلید

می باشد. این پارامتر از count را برای نشان دادن این موضوع تعریف کنیم. این اکشن دارای پارامتر more hello world می خواهیم اکشن

نوع عددی است و برای مشخص کردن تعداد دفعات چاپ پیغام سالم دنیا به کار می رود.

phpconf_rules.rules.inc

/*

* Implements hook_rules_action_info

*/

function phpconf_rules_rules_action_info(){

$actions = array();

$actions['phpconf_rules_action_hello_world'] = array(

'label' => 'hello world',

'group' => 'phpconf',

);

$actions['phpconf_rules_action_more_hello_world'] = array(

'label' => 'more hello world',

'group' => 'phpconf',

'parameter' => array(

'count' => array(

'label' => 'Number of hello world messages',

'type' => 'integer',

),

),

);

return $actions;

}

برای تنظیم پارامترها باز می شود و configurationانتخاب کرد، صفحه ی UIرا در more hello worldبه محض این که کاربر اکشن

خاب این اکشن، صفحه یکاربر می تواند تنظیمات مربوط به پارامترها و مقادیر آنها را وارد کند. چون این اکشن دارای پارامتر می باشد، پس از انت

Page 182: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

باز نمی configurationپارامتر آن باز می شود.اگر این اکشن بدون پارامتر بود، پس از انتخاب اکشن، صفحه ی configurationمربوط به

قبل تر ایجاد کردیم(. که hello worldشد ) مانند اکشن

ه نوشتیم:اما تابعی که عملکرد این اکشن را به عهده می گیرد را این گون

phpconf_rules.rules.inc

//action function for $actions['phpconf_rules_action_more_hello_world']

function phpconf_rules_action_more_hello_world($count){

while($count){

drupal_set_message('Hello world!');

$count--;

}

}

count$ه می کنید نام تابع نیز مانند قبل، هم نام با نام ماشینی اکشن مربوطه است. در ضمن این تابع یک آرگومان به نام همانطور که مشاهد

به عنوان آرگومان تابع در نظر گرفته می شود وبه 3را وارد کند، عدد 3، مقدار countمربوط به پارامتر configurationدارد. مثال اگر کاربر در

(. اگر دو پارامتر count$و countمرتبه پیغام سالم دنیا چاپ می شود. اما الزم نیست که پارامتر اکشن و آرگومان تابع هم نام باشند ) 3 تعداد

نبود.آنها داشتیم، تابع نیز دو آرگومان داشت؛ پارامتر اول به آرگومان اول و پارامتر دوم به آرگومان دوم ارسال می شد و نیازی به هم نام بودن

. بال فاصله پس از انتخاب این اکشن، صفحه more hello world از اکشن countکردن متغیر configصفحه ی مربوط به –( 2)تصویر

config .پارامتر ها باز می شود. این اکشن تنها یک پارامتر دارد

Page 183: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

121 1314 مرداد PHP همایش

more( اکشنِ Content is viewedهنگام نمایش یک محتوا ). More hello world ایجاد یک رول برای استفاده از اکشن –( 1)تصویر

hello world .انجام می شود Number of hello world messages تنظیم شده است. 3برابر با

خواهیم بار پیغام سالم دنیا را مشاهده 3انجام می شود. پس hello world moreوقتی یک محتوا در حال نمایش است، اکشن –( 11)تصویر

کرد.

ظاهر شود. نظرتان چیست؟ مطمئنم نظرتان مثبت UIها در eventسفارشی هم ایجاد کنیم به طوری که در لیست eventمی خواهیم یک

است!

Page 184: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

121 1314 مرداد PHP همایش

استفاده می کنیم. ()hook_rules_event_infoبرای این کار از

phpconf_rules.rules.inc

/*

* Implements hook_rules_event_info()

*/

function phpconf_rules_rules_event_info(){

$events = array();

if(module_exists('phpconf')){

$events['phpconf_rules_customer_add'] = array(

'label' => 'After saving new customer',

'group' => 'phpconf',

);

}

return $events;

}

را بنویسید خواهید دید که یک eventنهادیم. اگر کدهای مربوط به این phpconf_rules_customer_addرا eventنام ماشینی این

event جدید با برچسبAfter saving new customer درUI مربوط به ماژولRules ظاهر می شود. اما برای عملکرد اینevent دوتا ،

م باید انجام داد.کار دیگر ه

کار اول:

کردنِ اطالعات مشتری اتفاق می افتاد. insertیک هوک تعریف نکرد؟ آن هوک چه چیزی بود؟ هوکی بود که پس از phpconfمگر ماژول

تفاق )ذخیره ی پیاده سازی کنیم؛ چرا؟ چون که می خواهیم هروقت این ا phpconf_rulesاکنون ما هم باید بیاییم و همین هوک را در ماژول

UIهم متوجه ذخیره شدن مشتری شود و کاربر هم در Rulesهم فرستاده شود که Rulesاطالعات مشتری( رخ داد، این اتفاق به سمت ماژول

بتواند از آن مشتری در رخداد تولید شده استفاده نماید.

آن را اعالن کرده بود را پیاده سازی می کنیم. phpconf، هوک مربوط به ذخیره مشتری که ماژول phpconf_rules.moduleدر فایل

/*

* Implements hook_phpconf_cusromer_add()

*/

function phpconf_rules_phpconf_customer_add($customer){

rules_invoke_event('phpconf_rules_customer_add', $customer);

}

باخبر شو که این رخداد اتفاق افتاده و هرکاری دوست داری انجام بده؛ Rulesتری جدید ذخیره شد، آقای با این کار می گوییم که وقتی یک مش

قرار بده تا کاربر بتواند از آن استفاده کند. UIمخصوصا اینکه بیا و این مشتری را هم که ایجاد شده را در اختیار

Rules هم می گوید ای به چشم؛ پس این متغیر$customer که به سمت من فرستادی را می گیرم؛ فقط یک کاری انجام بده؛ در

پس در فایل مربوطه قرار دهم. eventو UI، یک متغیر ایجاد کن که مشتری که به من می دهی را بتوانم در اختیار eventتعریف

phpconf_rules.rules.inc که یکevent که ایجاد کردیم یک تغییر کوچکی می دهیم. قرار بودUI بتواند این مشتری که هنگام ذخیره

، متغیرها را ایجاد می کنیم. همه ی متغیرها دارای نوع variablesشدن به وجود می آید را دریافت کند، درست است؟ با استفاده از کلید

خواه شما(. نوع دلخواه ما، نوع مشتری و یا هرنوع دیگری باشند)نوع دل ineteger ،textهستند، اینجا هم به همین صورت است مثال می توانند

در نظر بگیریم تا بعدا customerچگونه بفهمد که نوع مشتری هم وجود دارد؟ فعال اجازه دهید تا نوع این متغیر را از نوع Rulesاست. ولی

Page 185: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

122 1314 مرداد PHP همایش

آن را از نوع مشتری 'customer' =>'type'بفهمانیم. با استفاده از Rulesرا به customerببینیم که چگونه نوع متغیر

تعریف می کنیم.

phpconf_rules.rules.inc

/*

* Implements hook_rules_event_info()

*/

function phpconf_rules_rules_event_info(){

$events = array();

if(module_exists('phpconf')){

$events['phpconf_rules_customer_add'] = array(

'label' => 'After saving new customer',

'group' => 'phpconf',

'variables' => array(

'customer' => array(

'label' => 'New customer',

'type' => 'customer',

),

),

);

}

return $events;

}

را ایجاد کردیم، کار دوم بود. variablesه همین ک

کرده ایم زیرا اگر phpconfرا مشروط به وجود داشتن ماژول eventنکته ی آخر این که همان طور که مشاهده می کنید تعریف این

phpconf وجود نداشته باشد و مشتری ذخیره نشود پس اینevent با استفاده از خاصیت اصال معنایی نخواهد داشت. البته می توانید

dependencies در فایلphpconf_rules.info وابستگیphpconf_rules را بهphpconf .الزامی کنید

Tokenنوع های سفارشی را از Rulesچگونه تعریف کنیم. Rulesرا برای customerخوب است! نه؟ حاال بیاییم سر این بحث که نوع

ها را از تو می گیرم؛ تو اگر برای من تعریف کنی من هم می typeمن Tokenگوید که آقای می Rulesدوست داشتنی می گیرد.

اعالن کرده است تعریف کنیم. خوب این کار را می توانیم هم در ماژول tokenجدید با استفاده از هوکهایی که ماژول typeپس باید یک فهمم.

phpconf_rules انجام دهیم و هم در ماژولphpconf اما بهتر است که در ماژول . phpconf این کار را انجام دهیم زیرا اینphpconf

بلکه در آینده در اختیار Rulesاست که می آید و مشتری را ذخیره می کند. ضمن اینکه ممکن است بخواهید این نوع جدید را نه تنها در اختیار

دهید. را پشتیبانی می کنند قرار tokenسایر ماژولهایی که

را پیاده سازی می کنیم. این نوع مشتری، ویژگی ()hook_token_info، هوکِ phpconf.moduleو در فایل phpconfپس در ماژول

هایی چون نام، نام خانوادگی، جنسیت و ایمیل دارد.

phpconf.module

/*

* Implements hook_token_info()

*/

function phpconf_token_info(){

$type = array(

'name' => 'Customer',

'description' => 'Tokens related to customers used in phpconf

module',

Page 186: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

123 1314 مرداد PHP همایش

'needs-data' => 'customer',

);

$customer['fname'] = array(

'name' => 'First name',

'description' => 'Customer first name',

);

$customer['lname'] = array(

'name' => 'Last name',

'description' => 'Customer last name',

);

$customer['gender'] = array(

'name' => 'Gender',

'description' => 'Customer gender',

);

$customer['email'] = array(

'name' => 'Email',

'description' => 'Customer email',

);

return array(

'types' => array('customer' => $type),

'tokens' => array('customer' => $customer),

);

}

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

کردن فرم اطالعات مشتری، submitمربوط به دیگر می فهمد. فقط یک نکته و آن اینکه آیا به خاطر دارید که در تابع Rulesبسیار خوب

باشد تا وقتی در نهایت به دست object باید به صورت customerتعریف کردیم؟ چرا؟ چون stdClassمشتری را به صورت شیء و به صورت

Rules می رسد ونوع را ازtoken .می خواهد ، باید برای توکن به صورت آبجکت باشد و نه به صورت آرایه

به یک رول ایجاد کنیم: بعد از ثبت مشتری جدید، نام و نام خانوادگی مشتری را UIسفارشی خود را ساختیم، اجازه دهید در eventحاال که

صورت پیغام نشان دهد.

React onایجاد یک رول جدید برای اینکه با رخداد ایجاد مشتری جدید تعامل کنبم. همانطور که قابل مشاهده است در قسمت –( 11)تصویر

event ،After saving new customer را انتخاب می کنیم. چون اینevent دارای یکvariable غبر مشتری و از نوع مشتری است، مت

Page 187: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

124 1314 مرداد PHP همایش

هایی که به این رول اضافه می شوند، قابل دسترسی actionها و هم در conditionنیز اجزای آن )شامل نام و نام خانوادگی و.. ( هم در

می نامیم. test rule for using the after saving new eventهستند. این رول را

Show a message on the siteاستفاده می کنیم: Rulesای پیش فرض برای نمایش نام و نام خانوادگی مشتری از اکشن ه

فهمیده که مشتری جدید دارای Rulesاستفاده می کنیم. چه خوب! Replacement Patternمربوط به این اکشن، از configدر صفحه ی

نام و نام خانوادگی و ... ) وتوکن های مربوط به آنها( است.

، قابل دسترسی Show a message on the siteای مربوط به مشتری در کلیه اکشن ها و از جمله اکشنِ پیش فرضِ توکن ه –( 12)تصویر

است.

اجازه دهید اکشن این رول، این پیغام را در سایت نشان دهد:

The customer [customer:fname] [customer:lname] was added.

Page 188: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

125 1314 مرداد PHP همایش

این که مشتری جدید افزوده شد. همان طور که مشاهده می کنید توکن های مربوط به نام و نام خانوادگی نمایش پیغام مبنی بر –( 13)تصویر

مشتری هم در این پیغام وجود دارند.

. این رول با ذخیره شدن مشتری جدید تعامل می کند و پیغام test rule for using the after saving new event رول –( 14)تصویر

وجود دارد. 13جدید ذخیره شد را نشان می دهد. جزییات مربوط به این پیغام در تصویر شماره مشتری

ایجاد شد اکنون بیایید آن را تست کنیم. مجددا به آدرس صفحه ای که فرم مربوط به ثبت مشتری جدید است می رویم و یک UIاین رول در

Driesبه ترتیب ی بایستی یک پیغام ظاهر شود . مثال اگر نام ونام خانوادگی مشتری رامشتری جدید ثبت می کنیم. با رولی که ایجاد کردیم م

نمایش داده شود. The customer Dries Buytaert was addedوارد کنیم، بایستی پیغام Buytaert و

Page 189: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

121 1314 مرداد PHP همایش

نمایش دهد اما توکن های نام و نام خانوادگی با این که رول توانست با رویداد افزودن مشتری جدید تعامل کند و یک پیغام –( 15)تصویر

replace .نشده اند

)جایگزین( نمی شوند. )توکن های نام و replaceها با مقادیر اصلی، tokenها موجودند ولی این tokenاما اگر دقت کنید می بینید با اینکه

نام خانوادگی مشتری جایگزین نشده اند(

ها را اعالن کردیم، tokenکه phpconfکردن توکن ها را نیز بنویسیم. در همان ماژول replaceبه پس نیاز است که کدهای مربوط

replacement های آن را نیز اعالن می کنیم. عملreplace کردنtoken ها با مقادیر واقعی، با استفاده ازhook_tokens() انجام می شود

ی کنیم.پیاده سازی م phpconfو ما این هوک را در

phpconf.module

/*

* Implements hook_tokens()

*/

function phpconf_tokens($type, $tokens, array $data = array(), array

$replacements = array();

if ($type == 'customer' && !empty($data ['customer'])) {

$customer = $data ['customer'];

foreach ($tokens as $name => $original) {

switch ($name) {

case 'fname':

$replacements [$original] = $customer->fname;

break;

case 'lname':

$replacements [$original] = $customer->lname;

break;

case 'gender':

$replacements [$original] = $customer->gender;

break;

case 'email':

$replacements [$original] = $customer->email;

break;

}

}

}

return $replacements;

}

Page 190: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

121 1314 مرداد PHP همایش

مراجعه کنید به شما می گوید که این هوک زمانی رخ می دهد که شما drupal.orgدر سایت hook_tokensه مستندات مربوط به وقتی ب

The customer [customer:fname]عبارت UIرا اجرا می کنید. درست است. وقتی ما در ()token_replaceتابع

[customer:lname] was added ژول را نوشتیم، خودِ ماRules تابع ،token_replace() به عنوان آرگومان فراخوانی را با عبارت فوق

را پیاده سازی کنیم و ()hook_tokensاین تابع را فراخوانی می کند ما فقط کافی است Rulesمی کند. پس ما فراخوانی نمی کنیم. وقتی که

انجام دهی ، ما را هم دخیل کن. فقط در پیاده سازی این هوک باید مشخص کنیم به دروپال بگوییم هنگامی که می خواهی عملیات جایگزینی را

جایگزین کن و ... fnameکه اگر عملیات جایگزینی مربوط به نوع مشتری است اقدامات را انجام بده؛ مثال نام را با

سفارشی می رویم. condition ها باقی نمانده و اکنون به سراغ اعالن یک actionها و eventدیگر نکته ای در مورد

condition سفارشی ما چک کردن جنسیت مشتری ایجاد شده را انجام می دهد. مثال فرض کنید می خواهیم که رولی ایجاد کنیم که پس از

د. یا پیامک های ثبت اطالعات مشتری، به آن مشتری ایمیل بفرستیم که آقای ... اطالعات شما ذخیره شد یا خانم .... اطالعات شما ذخیره ش

آن رول چک شود، می توانیم این کار را انجام دهیم. conditionمتفاوتی بسته به آقا یا خانم بودن مشتری ارسال کنیم. پس اگر جنسیت در

، eventاستفاده می کنیم. همان طور که می دانید برای اعالن ()hook_rules_condition_infoاز conditionبرای اعالن یک

condition وaction ها ، کدهای اعالن و هوک های آنها را در فایل <MY_MODULE>.rules.info می نویسیم.

phpconf_rules.rules.inc /*

* Implements hook_rules_condition_info()

*/ function phpconf_rules_rules_condition_info(){

$conditions = array();

$conditions['phpconf_rules_condition_customer_has_gender'] = array(

'label' => 'customer gender is',

'group' => 'phpconf', );

return $conditions;

}

ید ، اگر همین تکه کد را بنویس می گذاریم. phpconf_rules_condition_customer_has_genderرا conditionنام ماشینی این

ظاهر می شود. اما می خواهیم Customer gender isبا برچسب condition، یک UIها در conditionخواهید دید که در قسمت

یک پارامتر از -1بایستی دارای دو پارامتر باشد: conditionمقایسه کنیم. پس این Maleو Femaleجنسیت مشتری ایجاد شده را با دو مقدار

یک پارامتر از نوع متنی. -2نوع مشتری

/*

* Implements hook_rules_condition_info()

*/

function phpconf_rules_rules_condition_info(){

$conditions = array();

$conditions['phpconf_rules_condition_customer_gender_is'] = array(

'label' => 'customer gender is',

'group' => 'phpconf',

Page 191: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

122 1314 مرداد PHP همایش

'parameter' => array(

'new_customer' => array(

'label' => 'customer to check gender',

'type' => 'customer',

),

'gender' => array(

'label' => 'gender',

'type' => 'text',

'options list' => 'phpconf_rules_customer_gender_list',

),

),

);

return $conditions;

}

مربوط به این پارامترها باز می configurationدارای پارامتر را انتخاب می کند، صفحه ی conditionها هنگامی که کاربر یک actionمانند

به صورت options listوجود دارد این است که این متغیر از نوع متنی است اما با استفاده از کلید genderد پارامتر شود. نکته ای که در مور

تعریف phpcof_rules_customer_gender_listقرار می گیرند را تابع dropdownباز می شود.گزینه هایی که در dropdownلیست

می کند:

phpconf_rules.rules.inc

//defines options list for the gender parameter. function phpconf_rules_customer_gender_list(){

return array(

0 => 'Female',

1 => 'Male',

);

}

در حقیقت عملیات مقایسه را می باشد، تعیین می شود که conditionنیز توسطی تابعی که هم نام با نام ماشینی این conditionعملکرد این

خواهد بود: falseیا trueها همیشه به صورت conditionانجام می دهد. خروجی

phpconf_rules.rules.inc

//condition function for

//$conditions['phpconf_rules_condition_customer_gender_is'] function phpconf_rules_condition_customer_gender_is($customer, $gender){

return ($customer->gender == $gender) ? true : false;

}

به کار conditionسفارشی ما را تعیین می کند، دو آرگومان دارد )متناظر با دو پارامتری که در اعالن این condition این تابع که عملکرد

تنظیم می شود، مقایسه می کند. اگر این دو مقدار با هم برابر بودند مقدار dropdownه در بردیم(. این تابع جنسیت مشتری را با مقداری ک

true و در غیر این صورت مقدار false .را باز خواهد گرداند

Page 192: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

121 1314 مرداد PHP همایش

خیرا ایجاد ی که خودمان به صورت سفارشی ایجاد کردیم انجام دهیم. رولی که ا eventرا با condition اجازه دهید تا تست مربوط به این

ی conditionنامگذاری کردیم را ویرایش می کنیم و test rule for using the after saving new customer eventکردیم و آن را

کلیم می کنیم. سپس از Add Conditionاین رول را باز می کنیم و بر روی لینک UIکه اکنون اعالن کردیم را به آن رول می افزاییم. در

باز 11پارامترهای آن مطابق با تصویر configurationرا انتخاب می کنیم. صفحه ی Customer gender isها برچسب conditionت لیس

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

ها قرار میگیرد. conditionها و actionدر اختیار تمامی variableاز نوع مشتری داشتیم، این variableارشی خود یک سف eventتعریف

condition سفارشی ما هم یکparameter از نوع مشتری دارد. چون متغیر مشتری و پارامتر مشتری به ترتیب درevent وcondition

به eventرا پُر می کند که همان مشتری است که conditionبه طور هوشمندانه پارامتر مشتری در Rulesسفارشی ما، نوع یکسانی دارد،

به طور است. اگر کاربر Maleو Femaleمی فرستد. پارامتر دوم نیز یک لیست انتخابی است که مقادیر آن برابر conditionسمت

باشد Femaleتی از لحاظ منطقی درست خواهد بود که جنسیت مشتری ایجاد شده در صور conditionرا انتخاب کرد، این Femaleمثال

این رول اجرا خواهد شد و پیغام مشتری جدید actionدرست باشد، conditionنادرست است. در این رول وقتی این conditionوگرنه این

افزوده شد بهمراه نام و نام خانوادگی آن در سایت نمایش داده می شود.

بررسی می کند که آیا جنسیت مشتری برابر با انتخاب کاربر condition. این customer gender isسفارشی condition –( 11)تصویر

( هست یا خیر. در صورت برابربودن، اکشن یا اکشن ها در رول اجرا می شوند.Female)مثال

ازگو می کنیم:در اینجا مقاله ما به پایان می رسد. فقط چند نکته را ب

در تعریف پارامترها کلید هایprovides وsave [ بیابید.1[ و یا ]3نیز وجود دارند که می توانید کاربرد آنها را در مرجع ]

تاکید: پارامتر ها با استفاده از کلیدparameter در تعریفaction و هاcondition ها کاربرد دارند در حالیکه متغیرها با استفاده از

ها به کار می روند. eventدر تعریف variables کلید

یادآوری: در صورتی که یکvariable با یکparameter دارای نوع یکسانی باشند، به طور پیش فرض در صفحه یconfig

به سمت آن پارامترها می فرستد پُر می شود. eventپارامترها، مقدار آن پارامترها با مقدار متغیری که

مزمان با خواندن این مقاله، کد های یادشده را نیز خودتان می نویسید به یاد داشته باشید که با هر تغییری در کد، اگر هcache را نیز

پاک کنید.

Page 193: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

کلیه مباحثی که مطرح شد در مورد ماژولRules بود. پس دقت کنید که نسخه ماژول 2نسخه یRules باشد. 2شما

ایران کمال تشکر را دارم. از خوانندگان محترم این مقاله تقاضامندم در PHPن و نیز حامیان محترم اولین کنفرانس در پایان از برگزار کنندگا

انند نوشته مصورت داشتن هرگونه سوال با ایمیل اینجانب مکاتبه فرمایند. هرگونه پیشنهاد و یا انتقاد شما را صمیمانه پذیرا هستیم. این نوشته نیز

از اشتباه نیست پس بنده را از اشتباهات احتمالی آگاه سازید. سعی کردم که دانش خود در زمینه ی ماژول نویسی دروپال و نیز های دیگر خالی

را در قالب یک مثال ساده اما کاربردی بیان کنم تا سهمی بسیار کوچک در گسترش این فریم ورک قدرتمند و ارزشمند )دروپال( Rulesماژول

ز سعی کرم که این نوشتار ساده، قابل فهم و با لحنی خودمانی باشد. کدهای دو ماژولی که در طی این مقاله ایجاد شد را در سایت داشته باشم و نی

http://imankiani.ir/phpconf کنید.قرار داده ام. می توانید این دو ماژول را از آدرس فوق دریافت و نصب

مید ا این مقاله را تقدیم به روح پدر بزرگوارم می کنم که مهربانی را به من آموخت و نیز مادر خوبم که بزرگترین سرمایه ی زندگی من است. به

گسترش هرچه بیشتر دروپال در کشور عزیزمان.

ی سپارم.به هر حال به پایان آمد این دفتر حکایت همچنان باقیست. شما را به خداوند بزرگ م

مراجع:

[1] http://nodeone.se/en/coding-for-rules-2

[2] http://dominiquedecooman.com/blog/drupal-custom-rules-how-write-your-own-events-conditions-

actions-and-custom-object-custom-token

[3] https://www.drupal.org/node/298486

[4] https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_token_info/7

[5] https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_tokens/7

Page 194: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

PHPهای تیمی با محوریت تیم و فعالیت مصطفی میرموسوی

مقدمه:

پندارند و همین مسئله که آنها با این فرض، کار تیمی انجام مفهوم کار تیمی در حقیقت آنقدر ساده است که اغلب مردم فهم آن را بسیار عادی می

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

اند.های کاریهایی از گروهو یا مواجهه با یک گروه جدید از همکاران و انجام کار جمعی را داشته است اما اینها صرفاً مثال

ناگونی دارد. ذهن برخی از ی تیم است چرا که این واژه برای افراد مختلف معانی گوبه دلیل مشخص کردن منظور ما از واژه "تیم"ی توصیف واژه

کار هایشود. برخی نیز به ارزشی خاص کشیده میهای سخت برای پیروزی و قهرمانی در یک رشتهشنیدن این واژه به ورزش، مربیگری، و تمرین

یم هستند کنند، یک تمی کنند هر گروهی که با یکدیگر کارکنند. برخی دیگر فکر میتیمی همچون مشارکت، همکاری، و کمک به یکدیگر توجه می

گردد.های کاری معطوف میی اول به مشارکت دو نفر همچون ازدواج و یا شراکتها هم در وهلهو ذهن بعضی

شویم.دانیم تفاوت قائل میمی« صرف یک گروه از افراد با هدفی مشخص»بدین ترتیب ما بین یک تیم واقعی و آنچه که آن را

د که بر انی یکدیگر بوده و دارای مقاصد، اهداف، و رویکردی مشترککنندههای تکمیلشود که دارای مهارتفراد گفته مییک تیم به تعداد کمی از ا

کنند.خورند و به یکدیگر تکیه میمبنای آنها به هم پیوند می

قدری اهمیت دارد که کار تیمی است. این مورد بهشود روحیه و توانایی نویس، یکی از مواردی که بررسی میمعموالً در زمان مصاحبه از یک برنامه

های خیلی خوبی هم داشته باشد ولی به دلیل نداشتن روحیه تیمی ممکن است از تیم حذف شود.نویس، تواناییاگر یک برنامه

کنیم همچنین ابزار ها و مطرح میهای کلیدی آن را پردازیم و نکتهمی PHPنویسی های برنامهدر این مقاله به بررسی کار تیمی با محوریت تیم

نیاز است را بررسی می کنیم. PHPهای نویسامکاناتی که برای کار تیمی برنامه

شروع همکاری در تیم جدید:

ها یگنویس جدید و اعضا تیم شناخت خوبی از هم و اطالعات فنی یکدیگر ندارند، این هماهنشود، برنامهنویس وارد تیم جدیدی میوقتی یک برنامه

هایبه زمان نیاز دارد، هر چقدر محدوده فعالیت کم باشد زمان بیشتری برای هماهنگی نیاز است. بهتر است اعضا تیم در مورد فعالیت و پروژه

تر انجام شود.های مورد استفاده اشاره کنند تا شناخت فنی بین اعضا سریعگذشته خود صحبت کنند و در آن میان به تکنولوژی

ها و دیگر منابع یکی از مسائل شروع کار است. تا وقتی ها، سرورنویس جدید است. به طور مثال دادن دسترسی به کدگر عدم اعتماد به برنامهمورد دی

هتوانیم توسعه روی کد مورد نظر را شروع کنیم، اگر هم دسترسی داده شود ممکن است اطالعات مهمی انتقال داددسترسی به کدها داده نشود نمی

هشود و از آن سوء استفاده شود و یا حتی ممکن است در حین شروع کار، فرد جدید و یا تیم به دالیل سطح فنی تمایل به ادامه همکاری نداشت

های مختلف تست های کوچک تستی به اعضا جدید داده شود به طوری که در قسمتباشند. سه روز ابتدا همکاری زمان مناسبی هست که پروژه

تواند این درخواست را در شروع کار مطرح کند. همچنین بررسی کامل همچنین اگر این اتفاق از سمت تیم انجام نشد، عضو جدید میشوند.

شود اعضا تیم با نوع کار عضو جدید بیشتر آشنا شوند.های قدیمی عضو جدید توسط دیگر اعضا تیم باعث میپروژه

Page 195: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

112 1314 مرداد PHP همایش

خصوص ابتدا کار صحت داشته باشد، چون احتمال اینکه تیم در مورد شود باید همیشه بهته میتوضیحاتی که در مورد دانش فنی به تیم گف

های مطرح شده فعالیتی را از عضو جدید بخواهد بسیار زیاد است و ممکن است عضو جدید نتواند آن را انجام دهید و این موضوع باعث عدم موضوع

اعتماد شود.

افزار:فرایند تولید نرم

افزاری شود، ساختاری است که روی توسعه و تولید محصوالت نرمنیز شناخته می« افزارچرخه حیات تولید نرم»افزار که با عنوان تولید نرم فرایند

ر شود. الگوهای گوناگونی نظیدر این رابطه استفاده می« افزارفرایند نرم»و « افزارنرم حیات ٔ چرخه»های مشابهی چون شود. عبارتاعمال می

های متنوع در طول فرایندها را مشخص فرایندهای )خاص( وجود دارند که هر کدام خط مشی مختص )آن فرایندها( برای انجام کارها و فعالیت

کنند.می

اعضا تیم و تعداد فزار با توجه به نوع پروژه،افزار فعالیت نمایند. جهت توسعه نرمبرای کار تیمی الزم است همه اعضا تیم، توسط یک الگو تولید نرم

اشاره کرد. RUPتوان به اسکرام، کانبان، شود. به طور مثال میمورد نیاز انتخاب می مواردی دیگر، الگو

شود.تر است و مشکالتی در روند تولید ایجاد میفعالیت بدون الگو هم شدنی هست و ممکن است مشکلی پیش نیاید ولی بدون شک سخت

ها:تهای مدیریت فعالیابزار

افزار متفاوت هستند مانند ردماین، ترلو و ...ها نیاز داریم که با توجه به متدولوژی تولید نرمهای پروژههایی جهت مدیریت فعالیتبه ابزار

نمود. ا به خوبی ایجادتوان هماهنگ سازی بین اعضا تیم رهای پروژه اطالع داشته باشند و میتوانند از فعالیتها اعضا تیم همیشه میتوسط این ابزار

کنترل سورس کد:

گیری تغییرات واحد اطالعاتی دخیل در ایجاد یک ( عبارت است از سیستمی برای کنترل و پیRevision controlکنترل نسخه یا کنترل منبع )

ی منابع مشترکی کار کنند. در این نویس بخواهند روکند که چند برنامه. سورس کنترل به خصوص در جایی اهمیت پیدا میافزارینرم ٔ برنامه

آیند که سورس کنترل باید بتواند راه حل مناسبی برای هر یک ارایه دهد. صورت است که مفاهیمی همانند مقایسه، ترکیب، تداخل و ... پیش می

های قدیمی مانند داشتن یک هایی که از روششود. با این حال هنوز هم هستند شرکتافزاری برای این کار استفاده میامروزه معموالً از ابزارهای نرم

نمایند.فایل متن در هر پوشه، هارد کپی و ... استفاده می

PHPهای نوسشود، حتماً باید از سورس کنترل نیز استفاده شود، یکی از سورس کنترل محبوب برنامهای به صورت تیمی انجام میوقتی پروژه

( است.GITگیت )

(:PSRها )کد استاندارد

که PSRنیز از این قائده مستثنا نیست. استانداردهای PHPهر زبان برنامه نویسی، دارای استانداردها و قوانین مربوط به خودش است که زبان

ها تبعیت از آن PHPهستند که اکثر توسعه دهندگان PHPهستند، استانداردهایی معمول در PHP Standards Recommendationمخفف

ها را نادیده بگیرد و از استانداردهای خودش استفاده ، استانداردهای الزم الجرا نیستند و هر کسی میتواند آنPSRاما استانداردهای سری میکنند.

شود.ها توصیه میخواهد شد، بنابراین استفاده از آن PHPکند، اما از آنجا که استفاده از این استانداردها باعث یکپارچگی در کدهای

آید ولی در عمل بعد از مدت میبینیم که سرعت تیم خیلی باال ایت کد استاندارد ممکن است آن تصور ایجاد شود که سرعت کار پایین میبا رع

رود.می

انجین:تمپلیت

Template Engine شود.های موتور الگوی وب، موتور تمپلیت و موتور قالب وب معرفی می)تمپلیت انجین( معموالً با نام

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

دهند ای از کدهای نمایشی، عملیات خود را انجام میدهد به طوری که منطق برنامه به صورت جداگانههای تحت وب مینمایشی را از منطق برنامه

کنند.نویسان به صورت جداگانه یک ساختار وب را طرحی میو به این ترتیب طراحان وب و برنامه

Page 196: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

113 1314 مرداد PHP همایش

,Blade, Mustache, Smarty, Twig, Haangaتوان به وجود دارد که می PHPهای زیادی برای Template Engineدر حال حاضر

PHPTAL, Dwoo, RainTPL, Savant, Volt مه به بررسی و اشاره کرد. در اداBenchmark .هر کدام می پردازیم

-frontهای دهندهباشد و در زمان توسعه به توسعهمی back-endاز front-endشود جداسازیها بیشتر مطرح میمزیتی که در تمپلیت انجین

end نویس دهد، همچنین برنامهامکانات و راحتی بیشتری میback-end خودش را درگیرfront-end کند.مین

آموزش:

یک تیم موفق همیشه در حال پیشرفت است، یکی از موارد پیشرفت آموزش دیدن و باال بردن سطح فنی است، ولی اگر هر عضوی در تیم به صورت

له بگیرند و اعضا جداگانه اطالعات فنی خود را افزاش دهد و یا به روز کند و به دیگران انتقال ندهد ممکن است اعضا تیم از نظر فنی از هم فاص

تر شوند.یتر باعث کند شدن اعضا قوضعیف

ی های آموزشتوانیم جلسههای روزمره میبه طور کلی الزم است اعضا تیم اطالعات فنی خود را به یکدیگر انتقال دهند، برای اینکار جدا از صحبت

توانیم در یک جلسه کوتاهست که دیگر اعضا از آن اطالعاتی ندارند میگروهی هم ایجاد کنیم. به طور مثال اگر فردی موضوع جدید را یاد گرفته ا

آن را به دیگر اعضا تیم انتقال دهیم.

تفریحات:

بیعیط تیم در …ها، مشکالت، اختالفات و شود. همچنین سختیتفریحات گروهی وجود دارند که باعث بهبود کار تیمی و افزایش کیفیت کار می

.باشد گروهی تفرحات تواندمی آن هایراه از یکی که دارد زیادی اهمیت نآ کردن برطرف ولی است

های زمانی مختلف چنین تفریحاتی را در خارج از محل کار ایجاد کنیم ولی تفریحات در حین کار نیز اهمیت زیادی دارد. به طور توانیم در بازهمی

تواند از این نوع تفریحات باشد.ه میمثال دیدن یک انیمیشن کوتاه روزانه و یا بازی گروهی روزان

ها:پایان همکاری و تعهد

تواند در آینده کاری تأثیر بگذارد.طور انجام شود میشود ولی اینکه پایان همکاری چههر شروع همکاری، روزی به پایان همکاری ختم می

خواهد کار و پروژه مشترکی انجام دهد و یا مجدد وارد تیم شود، این شود ممکن است در آینده دور یا نزدیک ببه طور مثال فردی که از تیم جدا می

های فرد را از محل کار قبلیها در زمان استخدام، فعالیتآید. همچنین ممکن است کارفرمااتفاق به دلیل آشنایی تیم و فرد جدا شده از هم پیش می

پیگیر باشند.

ر کند و راه خود را دیک فرد بعد از پایان قرارداد به دالیل مختلف از اعضا تیم خداحافطی میشود به طور مثال در حالت طبیعی مشکلی دیده نمی

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

شود، کند و طبق همین قراردادها پروژه مدیریت میریزی میبرنامهکنیم، کارفرما روی این قرارداد وقتی قراردادی را با یک شرکت یا تیم شروع می

ار ک حاال اگر بخواهیم در وسط قرارداد بدون اطالع قبلی تیم را ترک کنیم، هر چند ممکن است از نظر قانونی بتوانیم چنین کاری کنیم ولی این

اه زودتر تیم و یا کارفرما را از تصمیم خود با خبر کینم تا بتوانند شخصی را توانیم به طور مثال دو مکند. میاخالقی نیست و مشکالتی را ایجاد می

تر است.جایگزین نمایند و اگر بتوانیم در این جایگزینی کمکی کنیم مناسب

ازی هم به هر دلیلی سشود ولی اگر این هماهنگهای آینده تیم خود جهت همکاری پیگیر میمعموالً کارفرما مدتی قبل از پایان قرارداد از برنامه

یجاد ای تیم اانجام نشد، بهتر است اعضا تیم برنامه خود را مدتی قبل از پایان قرارداد به کارفرما انتقال دهند تا در زمان پایان قرارداد مشکلی بر

ی پایان همکاری مناسب، بهتر است نشود. همانطور که توضیح داده شد اگر قرارداد به پایان برسد از نظر قانونی هیچ مشکلی وجود ندارد ولی برا

طرفین از این موضوع ناراضی نباشند.

Page 197: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

114 1314 مرداد PHP همایش

رسد همچنان تعهد تا مدتی وجود دارد. به طور مثال ممکن های اعضا تیم بعد از پایان همکاری است. وقتی همکاری به پایان مینکته دیگر تعهد

باید از تیم خارج شود.ای در اختیار اعضا تیم وجود داشته باشد که ناست اطالعات محرمانه

های های بعدی دیگر که حتی از تیمآموزیم، عموما اگر در تیموقتی مدتی در تیمی فعالیت کنیم، در آنجا اطالعات فنی مربوط به کار تیم را می

لی د تیم دیگری که رقیب تیم قبرقیب باشد هم از همان اطالعات استفاده کنیم طبیعی است و مشکلی وجود ندارد ولی اگر بعد از جدایی از تیم، وار

ن شود که برای طرفیاست شویم و اطالعاتی همچون برنامه و اهداف کاری تیم قبلی را به تیم جدید انتقال دهیم نوعی خیانت در امانت محسوب می

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

همکاری تا مدت مشخصی وارد تیم رقیب نشوند.

نویسی را مطرح کنیم تا هر وقت هر کدی توانیم در قرارداد همکاری، آزاد بودن سورس برنامهبرعکس همین حالت نیز وجود دارد به طور مثال می

تواند کاماًل قانونی انجام شود.ین کار مینوشتیم بتوانیم آن را به صورت آزاد در اینترنت منتشر کنیم، ا

منابع:

http://www.fekreno.org/articlefekreno/arfek526.htm

https://fa.wikipedia.org/wiki/%D9%81%D8%B1%D8%A7%DB%8C%D9%86%D8%AF_

%D8%AA%D9%88%D8%B3%D8%B9%D9%87_%D9%86%D8%B1%D9%85%E2%80%8C%D8

%A7%D9%81%D8%B2%D8%A7%D8%B1

https://en.wikipedia.org/wiki/Revision_control http://www.gravitatedesign.com/blog/best-php-development-tools/

https://fa.wikipedia.org/wiki/%DA%A9%D9%86%D8%AA%D8%B1%D9%84_%D9%86%D8%B3%D8%AE%D9%87

http://aparnet.ir/2486-psr-0-in-php

http://www.php-fig.org/psr/psr-2/

https://www.youtube.com/watch?v=1nPVAh78n34

Page 198: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

115 1314 مرداد PHP همایش

ای هستیم؟آیا ما حرفه جادی میرمیرانی

مقدمه

ها به منظور طبقه بندی آن ها نیستیم بلکه زدن به آدم ها و شرکت« آماتور»و « ایحرفه»یک تجمل نیست. ما به دنبال برچسب « ای بودنحرفه»

عرضه شده ارتقاء پیدا کنند. این نوشته با پرسیدن چند سوال می خواهیم تلنگری باشیم برای اینکه صنعت نرم افزار و محصول تولیدی و خدمات

اید و از طرف دیگر راهنمایی باشد برای یادگیری چیزهای جدید و دهد از یک طرف بسنجید که در کجای کیفیت ایستادهبه شما فرصت می

که این ارائه بر اساس گسترش مفهوم تست جوئل جاییای شدن نیست ولی از آنمعرفی مسیر حرکت آینده. مشخص است که این تنها راه حرفه

توانید برای آن اعتباری رهنمودی ( تنظیم شده، می/http://www.joelonsoftware.com)معرفی شده برای سنجش شرکت های آی تی در

ید. این مطلب با تمرکز زیاد روی تست جوئل و با کمی تغییرات به منظور محلی کردن نوشته شده.)و غیرآکادمیک( قایل باش

به آن ها جواب دهید و در نهایت کشف کنید که از دوازده سوال مطرح « خیر»یا « بله»ها را مرور کنید و با برای سنجش وضعیت خود، سوال

کنید و اگر کمتر جواب بله دارید بدانید که در شرکتی با کیفیت جهانی کار می 11اند. اگر بیش از گرفته« بله»ها از شما جواب شده، چند تای آن

هایتان را اصالح کنید.امتیاز گرفتید، قبل از نوشتن کد جدیدی برخی پروسه 3از

آیا از سورس کنترل استفاده می کنید؟ -4

غول نوشتن کد در دنیای طبیعی یک برنامه نویس نیستید. تفاوت خاصی ندارد مثل اکثر تا وقتی از یک سورس کنترل استفاده نکرده اید یعنی مش

یا فسیل یا هر چیز دیگر ولی اگر از هیچ نوعی سورس کنترل استفاده نمی CVSآدم های مرسوم و معمول این روزها از گیت استفاده کنید یا از

ایجاد ها نمی توانند بسیاری باگ هایری گیت بروید. بدون سورس کنترل برنامه نویسکنید یک منفی بزرگ به خود بدهید و سریع به سراغ یادگی

شده در پروسه توسعه را پیدا کنند، نمی توانند گروهی کار کنند و نمی توانند خودشان را برنامه نویس حرفه ای بدانند.

آیا در یک قدم بیلد می کنید؟ -۲

دارید؛ حاال برای رسیدن به برنامه قابل عرضه چند قدم باید طی شود؟ در یک پروژه منظم این عدد فرض کنید آخرین اسنپ شات کد را در دست

دن رباید برابر یک باشد. یک اسکریپت باید کل سورس ها را دریافت کند، ریبیلد کند، فایل های اجرایی بسازد و هر کار الزم دیگر حتی امضا ک

شونده به بازار. برای عرضه یک نرم افزار به بازار باید بتوانید در یک قدم همه اینکارها را انجام دهید برنامه ها یا ساختن ایزوهای سی دی عرضه

چون در غیراینصورت احتمال اشتباه زیاد بوده، اصالح باگ های لحظه آخری معموال با دردسرهای بزرگ همراه خواهد شد.

ایا بیلدهای روزانه دارید؟ -9

رس کنترل استفاده می کند، ممکن است یک برنامه نویس با یک سورس خراب کل بیلد را خراب کند. برای مثال ممکن وقتی پروژه ای از سو

یاست شما یک فایل کد را بر روی کامپیوتر خود ایجاد کنید ولی فراموش کنید آن را پوش کنید و در نتیجه برنامه روی کامپیوتر شما به خوب

د شود که الزم است در هر پروژه شبانه یک بیلت بخورد. شکستن بیلد روی ماشین اصلی آنقدر بد حساب میکمپایل شود ولی بیلد اصلی شکس

ی اگرفته شود تا خراب شدن این بیلد به هیچ وجه ندیده نماند. بد نیست برای چنین کاری، مجازاتی جدی و جالب در نظر بگیرید! مثال میوه بر

کس بیلد اصلی را خراب کند مسوولیت بازرسی کل بیلدهای بعدیکل تیم. در تیم اکسل مایکروسافت هر

Page 199: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

را بر عهده خواهد داشت تا زمانی که نفر بعدی بیلدی را خراب کند و این مسوولیت را بر عهده بگیرد.

شوند؟ها در دیتابیس خودشان پیگیری میایا همه باگ -1

آوری نکنید، کیفیت برنامه ارائه شده سقوط خواهد کرد! حتی جا منظم و مرتب جمع های دیده شده را در یکشک نداشته باشید که اگر همه باگ

تقل توان به کاغذ منکند. عالوه بر آن نگه داشتن چیزهایی که میها در ذهنتان کار نمیاگر در یک تیم یکنفره هستید، نگه داشتن فهرست باگ

ها هم ممکن است کار شما یک نفر را راه بیاندازد ولی برای ک لیست ساده از باگکرد در مغز، از نظر بهره وری کاری بسیار اشتباه است. ی

های بزرگتر این برنامه باید روش ایجاد دوباره باگ، رفتار مشاهده شده، رفتار مورد انتظار، اینکه چه کسی روی باگ کار می کند و اینکهسیستم

ندان جدی نگیرید. ترلو برای موارد در حال کار خوب است اما به گذشته برگشتن در آن کار حل شده یا نه را نگهداری کند. در این مورد ترلو را چ

راحتی نیست.

کنید؟ها را پیش از نوشتن کد جدید حل میآیا باگ -۵

زاری بود. است. برنامه ای که نسخه اولش یکی از فجایع مدیریت نرم اف« مایکروسافت ورد»های بزرگ در تاریخ نرم افزار یکی از شوخی

افتاد. در نهایت وقتی برنامه منتشر شد مایکروسافت همه تیم را به تر میها این پروژه شبانه روز کار می کردند و پروژه عقب و عقبنویسبرنامه

وی رسیدن ر رها این بود که تمرکز بفرستاد و بعد جلسه ای تشکیل شد برای بررسی مشکل دلیور شدن این پروژه. نتیجه بررسی Cancunساحل

چون حل باگ -ها نکنند ها کدی بسیار بد تحویل دهند و هیچ زمانی را صرف حل باگهای مقرر برای انتشار باعث شده برنامه نویسبه تاریخ

وشته بود: نبخشی از زمانبندی اولیه نبود. برای مثال برنامه نویسی که مسوول نوشتن تابع محاسبه ارتفاع یک خط متنی در صفحه ورد بود تنها

return 12ها را به کد تبدیل خواهند کرد. برای حل این هایی بودند که فکر می کردند سر فرصت آنها مشغول نوشتن باگنویس. در واقع برنامه

ی موجود هارود باگرا کشف کرد: قبل از توسعه هر کد جدید انتظار می zefor defects methodologyمشکل مایکروسافت متد برنامه نویسی

رود.حل شوند چرا که هرچقدر از زمان تولید یک باگ بگذرد، هزینه حل آن باالتر می

آیا برنامه زمانبندی واقعی است؟ -6

حتی اگر خودتان تنها کارمند -نویسید را دارد باشد که وظیفه پول درآوردن از کدی که شما می« بیزنس»در هر شرکتی باید بخشی به اسم

! اگر قرار است این بخش کار کند و کد شما به پول برسد باید زمانبندی محصول خود را بدانید. درست است که ما برنامه نویس ها شرکت باشید

ولی در دنیای واقعی کارهای زیادی باید انجام شود، تبلیغات، بسته بندی، پشتیبانی و ... . « هر وقت آماده شد خبر می دیم»دوست داریم بگوییم

های پروژه تصمیم بگیرید. به مورد بعدی نگاه کنید.شود شما بتوانید در مورد اندازهداشتن یک برنامه زمانبندی باعث میهمچنین

آیا مستندات هر پروژه کامل و مشخص است؟ -۷

بول داریم که باید انجام پیش از شروع هر پروژه باید در مورد ابعاد آن تصمیم گرفت. اسناد و اسپک ها کار سختی هستند. مثل ورزش. همه ق

گرها درک دقیق از نیازها پیدا کنند و طول ها. قبل از هر پروژه باید تحلیلبخصوص برنامه نویس -گذارد شوند ولی هیچ کس برایش وقت نمی

ر ، آن را تحویل دهند. در غیانجام پروژه باید مستندات دقیق و مفصلی تولید شود و در انتهای پروژه باید مدیرها بتوانند با بستن اسکوپ پروژه

«شودهیچ کدی بدون مستندات نوشته نمی»شعار ما «. چند تغییر جزیی باقی خواهد ماند»ها طول خواهند کشید و هنوز اینصورت پروژه ها سال

است.

ها مناسب است؟آیا محیط کاری برنامه نویس -۸

فق دارند که محیط کاری مناسب یک برنامه نویس ساکت، خصوصی و با فضای کافی تحقیقات زیادی در این مورد موجود است و تقریبا همه توا

قرار بگیرند و این کار راحتی نیست. ساختن این فضا گاهی اصلی ترین چلنج یک برنامه « فضای برنامه نویسی»ها الزم است در است. برنامه نویس

شروع« سالم چطوری؟»یک سنگ می تواند آن را خراب کند. این سنگ از نویس است، درست مانند ساختن یک خانه شیشه ای که هر کسی با

س وری باال برای یک برنامه نویگویند رسیدن به بهرهها میادامه دارد. بعضی تحقیق« فالن سیستم خراب شده، می تونی کمک کنی»می شود و تا

ره وری اصوال در یک روز کاری اتفاق نیافتاد. این مساله اهمیت آرام و دقیقه زمان دارد و البته ممکن است در زمان خستگی این به 15به حداقل

Page 200: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

شود یعنی نویس ها میخصوصی بودن محیط برنامه نویس ها را کامال نشان می دهد. اگر هر پانزده دقیقه یک نفر مزاحم تمرکز برنامه

کنند.های شما هرگز با حداکثر تمرکز خود کار نمینویسبرنامه

آید، انتخاب موزیک بلند وزی مربوط به دفاتر شلوغ و پر از داد و بیداد و استرس را فراموش کنید. کد خوب از فضای آرام بیرون میتصاویر فانت

هایشان است است ولی در سطح محیط کار باید فضا آرام و کامال خصوصی باشد.غیره وابسته به خود آدم ها و هدفون

کنید؟استفاده می آیا از بهترین ابزارهای ممکن -3

ها بیشتر از پانزده ثانبه طول بکشد شوند. اگر کمپایل برنامهاند و ابزارهای خوب باعث بهتر شدن نتایج میابزارها برای حل مسائل ساخته شده

بالگ جادی یا بقیه جاها را های شما سراغ کارهای دیگر خواهند رفت و درست بعد از کمپایل به کار ادامه نخواهند دارد و احتماال وبرنامه نویس

تر است و قیمت یک مانیتور منطقا کمتر از یک ها به ادیتور خود برنخواهند گشت! نوشتن برنامه در دو مانیتور بسیار سادهخواهند خواهد و تا مدت

پر شدن »زمره آی تی و کارمندان ام که کشمکش روکنید. من در جایی کار کردهچهارم هزینه ماهانه ای است که شما برای یک برنامه نویس می

ترین دردسر در هنگام خرابی دستگاهی قدیمی که از اصلی 232بود و جای دیگری که پیدا کردن یک تبدیل یو اس بی به آر اس « صندوق ایمیل

آن تیم داشت. هزینه ای کمتر از هزینه یک روز کار 232این پورت استفاده می کرد در حالی که خریدن یک لپ تاپ با پورت آر اس

تومان هارد اس اس دی یا یک مانیتور اضافه که همه به 111تومان رم یا حتی 111ای، اعضای تیمشان را به خاطر های حرفهمدیران و شرکت

ها به ویسنبرنامهکنند. در ضمن این نکته را نیز فراموش نکنید که دادن ابزارهای جذاب به بسیاری شوند، شکنجه نمیهای شرکت اضافه میدارایی

برد.شکل بامعنایی رضایت شغلی آن ها را باال می

آیا تسترها همه چیز را زیر نظر دارند؟ -40

د. توانستند حل شونهایی هستید که میها نباشند یعنی مشغول عرضه کدهایی با باگها مشغول تست تمام برنامهها و آدمدر صورتی که ماشین

ان کند و در غیر اینصورت مطمئن است که زمهایش استفاده مینویسشک از تسترهایی با قیمت بسیار پایینتر از برنامهای بدون یک شرکت حرفه

.شودمی تست کار صرف هانویس برنامه تر بسیار پر هزینه

نویسی نیز هست؟های غیربرنامهآیا روند استخدامی شما شامل کدنویسی و مهارت -44

رض شود. فای دنبال نمیترین مراحل ساخت یک تیم است و متاسفانه بخصوص در ایران این پروسه معموال به شکل حرفهلیاستخدام یکی از اص

هایش را برایتان انجام دهد یا آشپزی را استخدام خواهید یکی از چشمهخواهید شعبده بازی را استخدام کنید ولی در مصاحبه از او نمیکنید می

سد.ای بنوینویس بدون اینکه بخواهید برایتان برنامهزم بدانید دستپختش را بچشید. همینطور است استخدام برنامهکنید بدون اینکه ال

حاال چه روی تخته، چه با سرچ در اینترنت و چه با -ای بدون شک در پروسه استخدام باید از افراد درخواست نوشتن کد کنند های حرفهشرکت

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

های برنامه نویسی نیز کاری اشتباه است.اگر شرکتی به دنبال ایجاد یک در بخشی دیگر از این بحث باید اضافه کرد که تمرکز صرف بر روی مهارت

یری ها قابل یادگر نوکیا فرض بر این است که مهارتتیم حرفه ای است، باید به دنبال افرادی باشد که شخصیت سالم و خوبی داشته باشند. د

توان تغییر داد پس بهتر است آدم های با توان فنی متوسط ولی شخصیت سالم را به شرکت بیاوریم تا ها را به سختی میهستند ولی شخصیت

افرادی خود رای ولی بسیار با سواد.

آیا با دنیای واقعی تعامل دارید؟ -4۲

کند، احتماال هنوز برای حرفه ای بودن است که از جهان واقعی جدا شده و فقط کافیین را به کد تبدیل می« خفنی»کند موجود اگر کسی فکر

دهند تا فیدبک بگیرند و سه ها نشان میکنند، محصوالتشان را در همان اوایل به آدمخیلی ناپخته است. آدم های حرفه ای به دیگران کمک می

Page 201: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

112 1314 مرداد PHP همایش

کنند به دیگران برای پیش رفتن کمک کنند و چیزی که خریداری ندارد صرف نکنند، برای بقیه احترام قایل هستند و سعی می ماه بعدی را روی

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

های غیرفنی بخوانید تا با شخصیتی چند بعدی، به عنوان یک حرفه ای در صنعت نرم افزار س حشر و نشر کنید و کتابدوستان غیر برنامه نوی

شناخته شوید.

Page 202: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

111 1314 مرداد PHP همایش

محور سیبرنامه نو نرم افزار با نگاه دیتول نهیهز

یعباس درضایحم

میلیارد دالری کار می کنند و بازار نرم افزار دنیا را می چرخانند، آن ها نرم افزار در دره سیلیکون کالیفرنیا، صدها هزار نفر بر روی پروژه های چند

تضمین و هایی را تولید می کنند که دارای کمترین میزان خطا و بیشترین میزان کارایی می باشد، بهترین ارتباط را با کاربر نهایی برقرار می کند

ه گذار دارد.سود چند ده برابری برای تولید کننده و سرمای

ا وجود بمایکروسافت با وجود رقبای جدی همچون گوگل و اپل، همچنان یکه تاز دنیای نرم افزار است و هرگز در تولید نرم افزارهای با سورس بسته،

رتمندی یبانش شرکت ابر قدنیاز به سرمایه گذاری هایی که برابری با بودجه ساالنه یک کشور دارد، به خود تردیدی راه نمی دهد، حتی اگر یکی از رق

مثل گوگل باشد که حتی درصد باالیی از نرم افزارهای خود را به صورت رایگان ارائه می دهد.

د درآماگر از این دره خارج شویم و کمی به دیگر شهر های آمریکا نگاهی بیاندازیم، خواهیم دید که آنجا کمی سرمایه گذاری کمتر شده است، اما

ست، سودها هم همچنان باالست، حتی خارج از خاک ایالت متحده نیز، پروژه های نرم افزاری زیادی، پنجه در پنجه در سیلیکون ها همچنان ثابت ا

می باشد که این روزها رقیب جدی Alibaba.comمی اندازند و گاهی هم حتی به آن ها شکست سختی وارد می کنند. نمونه اش سایت نوپای

تجارت الکترونیک آمریکایی محسوب می شود.برای آمازون و سایت های

چه کسی فکر می کرد روزی یک دانشجو، یک پروژه وب سایتیِ دانشگاهی را به یکی از پردرآمد ترین سایت های جهان و البته مشهور ترینشان

د. ستانه، دانشگاهی یا شهری دیده می شتبدیل کند، شاید وقتی زاکربرگ پروژه فیس بوک را شروع کرد، در افق باورش تنها یک شبکه اجتماعی دو

مسئولین یاما این ابزار چنان مدیریت شد که با وجود اینکه بر پایه گزارشات یک پنجم طالق های آمریکا پایه فیس بوکی دارند و با وجود افشای دزد

ان آن اضافه می شود.سایت از اطالعات شخصی افراد و جاسوسی برای دولت آمریکا، با این حال باز هم هنوز به کاربر

م افزار چرا در ایران هر چه می دویم، باز هم سرخانه اول هستیم؟ چرا مدیریت پروژه در اینجا ناشناخته است؟ چرا ایرانیان دوست ندارند برای نر

پولی خرج کنند؟ چرا برنامه نویسان ایرانی زود بازنشست می شوند؟ چرا ایده ها اینجا مرده اند؟...

ک بحث چالشی در رابطه با بازار خراب نرم افزارهای ایرانی خواهیم داشت، هر چند که جنبه های این موضوع بسیار وسیع می باشد و باید در ادامه ی

مه به برناندر باب آن تحقیق و تفحص بسیار کرد، در این بحث با نگاهی کوتاه، برنامه نویس را محور اصلی قرار داده ایم و سعی کردیم موضوع را از ج

نویسی بررسی کنیم.

Page 203: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

211 1314 مرداد PHP همایش

نگاه اول: هر خط کد چند؟

هزار تومان! 21حداقل -

داشته اند. در 1123و همکارانشان در سال 113تعجب نکنید، جوابی که داده شد از آسمان آورده نشد، این نتیجه تحقیقی است که آقای پروفسور

ابعاد این موضوع را باز می کنیم.ادامه

محاسبه می شود، 2مهندسی نرم افزار، معموالً هزینه پروژه بر اساس تعداد مهندسین مورد نیاز برای پروژه ضربدر عدد بر اساس نگاه های ساده

دلیل این امر این می باشد که در شرکت های نرم افزاری در واقع موتور درآمد شرکت، کارشناسان در حال کار بر روی پروژه می باشند، این

یا مدیران پروژه، برنامه نویس ها، گرافیست ها و سایر القاب شغلی این حوزه می باشند، اما اینکه بودجه تولید دو برابر کارشناسان متشکل از مدیر

ن غلیاین عدد در نظر گرفته می شود این است که در واقع حقوق سایر افراد شاغل در شرکت اعم از حسابداران تا نظافت چی ها هم باید از کار شا

برای بودجه کامالً عقالنی به نظر می رسد. 2ود. به همین دلیل و بر اساس مطالعات انجام شده، به این نتیجه رسیده اند که ضریب پروژه تأمین ش

میلیون 31در نظر گرفته شود و حقوق هر برنامه نویس هم ماهانه ماه-نفر 3بر همین اساس و طبق یک معادله ساده، اگر برآورد زمان پروژه پروژه

میلیون 121باشد )برای سادگی حقوق تمام اعضای فعال پروژه را نیز مانند حقوق برنامه نویس در نظر می گیریم(، بودجه مورد نیاز برای پروژه ریال

ریال می شود:

B = 3 . (30,000,000) * 2 = 180,000,000 RLS

د.خب البته این یک برآورد ساده بود و شاید همیشه به همین راحتی ها هم نباش

م ویدر واقع برآورد هزینه نرم افزار یکی از چالش های اصلی و شاید مهمترین چالش توسعه نرم افزار می باشد. کمی از مقیاس های کوچک خارج ش

اشد، آیا می ب و در نظر بگیریم که بر روی پروژه ای دویست مهندس کار می کنند، با در نظر گرفتن ارقام باال، ماهی دوازده میلیارد ریال هزینه پروژه

می شود با این رقم شوخی کرد؟ در واقع مقیاس را بزرگ کردیم که ریسک های درصد خطا را بهتر درک کنیم، اما خارج از محدوده ارقام، هر

خطایی برای هر مقیاسی از شرکت ها، دارای ضرر هنگفت برای مدیران و سهام داران شرکت محسوب می شود.

رد که مشکل عدم برنامه ریزی و برآورد اندازه و هزینه نرم افزار در سازمان های نرم افزاری بزرگترین چالش پیش رو می شاید بتوان این ادعا را ک

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

درصد از سازمان ها نیز در فرآیند مهندسی نرم افزار 51نرم افزار را در توسعه نرم افزار های خود به کار نمی گیرند، حدود ها فرآیند مهندسی

اشتباهات فاحش دارند و اندازه و بودجه را اشتباه پیش بینی می کنند.

شود و بسته به همین اندازه، پیچیدگی مهندسی باالتر می رود تا در واقع هر چه نرم افزارها بزرگتر می شوند، نیاز به مهندسی نرم افزار بیشتر می

شی خجایی که دیگر نیاز به یک طبقه بندی از مدیر پروژه و مهندس نرم افزار می باشد، تیمی متشکل از چند آدم خبره و مجرب که هر کدام روی ب

نی کمتری نظارت دارد. با این حال به نسبت بزرگتر شدن ابعاد پروژه، درصد از پروژه تمرکز دارند و در رأس هرم، مدیر دیگری به کل فرآیند با ریزبی

که نتیجه زحمات بی وقفه پروفسور بوهم 114خطا و اتفاقات پیش بینی نشده و همچنین عدم هماهنگی بیشتر می شود، تا جایی که مدل کوکومو

قع بوهم نرم افزار ها را به سه دسته کوچک، متوسط و بزرگ تقسیم بندی می باشد، برای پروژه های بزرگ متغیرهای دیگری در نظر می گیرد. در وا

و کرده است. گاهی این دسته بندی را برای تیم های کوچک، متوسط و بزرگ نیز به کار می برند که البته خیلی تفاوت در مفهوم ایجاد نمی کند

نیز تیم بزرگ را می طلبد. با هم نگاهی گذرا به این سیستم داده باشیم:در واقع نرم افزار کوچک تیم کوچک را طلب می کند و نرم افزار بزرگ

PM = 2.4 * (KDSI) 1.05 نرم افزارها / تیم های کوچک

PM = 3.0 * (KDSI) 1.12 نرم افزارها / تیم های متوسط

PM = 3.6 * (KDSI) 1.20 نرم افزارها / تیم های بزرگ

103 Boehm 104 COCOMO

Page 204: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

211 1314 مرداد PHP همایش

و در واقع ماحصل زحمات آقای بوهم هست، همانطور که مشاهده می 2ایی سیستم برآورد نرم افزار کوکوموفرمول های باال برگرفته از مدل ابتد

که در واقع کیلو خط کد می باشد، نتیجه KDSIکنید، برای هر دسته نرم افزاری یک ثابت ضربی و یک ثابت توانی در نظر گرفته شده است و

خط کد، یک کیلو کد می 1111می باشد، یعنی هر 1111س آمار و احتماالت و تجربیات تقسیم بر محاسبه تعداد خطوط برآوردی برنامه بر اسا

باشد.

ماه -نفر 11خط کد باشد، به این معنی است که اندازه پروژه 4111به عنوان یک مثال ساده و با فرض فرمول اول، اگر به طور مثال وبسایتی دارای

می باشد:

PM = 2.4 * (4)1.05= 10.2 (به عدد 11 رند می شود)

ازه ت ااما آیا این بدان معناست که با داشتن هفت برنامه نویس این وب سایت ظرف مدت یک ماه به اتمام می رسد؟ در واقع جواب منفی است، زیر

ی باال را کمی کاملتر م را باید با متغیرهای تضمین خطای دیگری محاسبه کنیم تا زمان واقعی توسعه نرم افزار بدست بیاید. جدول PM115عدد

کنیم:

PM = 2.5 * (PM) 0.38 PM = 2.4 * (KDSI) 1.05 نرم افزارها / تیم های کوچک

PM = 2.5 * (PM) 0.35 PM = 3.0 * (KDSI) 1.12 نرم افزارها / تیم های متوسط

PM = 2.5 * (PM) 0.32 PM = 3.6 * (KDSI) 1.20 نرم افزارها / تیم های بزرگ

راست جدول فرمولی است که زمان توسعه را برحسب ماه محاسبه می نماید، یعنی ابتدا ستون میانی محاسبه می شود و بر اساس آن ستون سمت

در ستون سوم، زمان توسعه به دست می آید:

PM = 2.5 (10)0.38= 5.9ماه

دست می آید:فرض کنید، تنها دو توسعه دهنده داریم، به این صورت نتیجه زمان پروژه اینطور به

PM = 2.5 (2)0.38 * 5 = 16.2 ماه

برابر بیشتر نشد! این مسئله به این دلیل است که وقتی تعداد اعضای تیم 5برابر کم کردیم، اما زمان پروژه 5همانطور که مشاهده کردید، ما نیرو را

بیشتر می کند. در واقع عکس این موضوع نیز صادق ماه -نفرات تعداد کم می شوند، تعامل بین نفرات باالتر می رود و این سرعت توسعه در واحد

روژه را پاست و در واقع وقتی برای یک پروژه وقت کمی داریم، الزاماً با تزریق نیرو سرعت کدنویسی باالتر نمی رود و حتی گاهی با این کار سرعت

کندتر نیز کرده ایم.

و در واقع به هیچ عنوان این مقوله در یک مقاله - یز شدن بر روی برآوردهای نرم افزاری نیستدر واقع هدف مان از این بررسی ها و محاسبات، ر

، هدف این است که نشان دهیم محاسبات باال بهترین حالت ممکن می باشد، در حقیقت توسعه نرم افزار شامل چالش های -کوتاه نمی گنجد

برو شود که بودجه را با مشکل جدی روبرو کند، برای مثال عدم هماهنگی در یک تیم حرفه بسیاری می باشد و ممکن است با تأخیر های فراونی رو

وی های، زمان توسعه را به مقداری قابل توجهی زیاد می کند و یا یک اتفاق غیر منتظره برای یکی از اعضای کلیدی تیم، که منجر به کاهش روحی

.شود، ممکن است نظم را به طور کلی از تیم دور کند

هر » :حاال که یکی از حاالت برآوردی را محاسبه کردیم و گفتیم که این تازه بهترین حالت است، بر گردیم به سوالی که در این نگاه مطرح کردیم

«خط کد چند؟

مشخص شد که توان به همراه همکاران خود و با بررسی پروژه های بسیار انجام دادند، 1115بر اساس مطالعاتی که آقای پروفسور بوهم در سال

می باشد، یعنی برای برنامه های بسیار پیچیده خط کد 111تا 31 نقطه شیء است که این معادل 51تا 4 ماه رقمی در حدود-تولید به ازای هر نفر

ارائه شد. 111و برای برنامه های معمولی عدد 31عدد

105 Person-Month

Page 205: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

212 1314 مرداد PHP همایش

ان را بیان کردیم. بیایید به این عدد پایه علمی بدهیم، بر اساس مطالعات آماری هزار توم 21به خاطر دارید که در پاسخ به سوال این نگاه، مبلغ

دالر حقوق 1251دالر می باشد، به عبارت دیگر، برنامه نویس ها ماهانه 15111حقوق یک برنامه نویس در ایاالت متحده به طور متوسط ساالنه

را به کمترین میزان خروجی کد در محاسبات آقای 1251بررسی میکنیم(، حاال رقم دریافت می کنند )در نگاه های بعدی این رقم ها را بیشتر

خط در ماه تقسیم می کنیم: 111بوهم، یعنی

$6.9 = 900 / $6250 = هر خط کد

یم که می بینیم ریال می رس 222.142ریال می باشد، ضرب کنیم، به رقم 31211، که 1314اردبیهشت 23دالر را در معادل ریالی امروز 1.1اگر

کمی از جواب ما هم بیشتر شده است.

قوق ح علت اینکه بهای قیمت هر خط کد را با شرایط ایران محاسبه نکردیم این است که در ایران برای قیمت نرم افزار، بودجه تولید نرم افزار و

مهندسین واقعی نرم افزار در ایران، مانند خیلی از شغل های برنامه نویس، محاسبه علمی صورت نگرفته است، در واقع و متأسفانه برنامه نویس ها و

ا هم م مهندسی دیگر، علیرغم شخصیت شغلی بسیار باال، به جایگاه درآمدی مناسب خود نرسیده اند و این نیاز به کار کارشناسی زیاد دارد و البته

در حد بضاعت خود، کمی این مسئله را در ادامه باز می کنیم.

این نگاه وارد برآوردهای جعبه سیاه و جعبه سفید نشدیم که اگر آن ها را در نظر می گرفتیم هزینه توسعه کاهش پیدا می کرد، دلیل البته ما در

های آماده مثل وردپرس و CMSآن است مالک در این گفتار برنامه نویسی است و نه برنامه چینی، به همین خاطر از تکنیک های تولیدی نظیر

کردیم و آن ها را در محاسبات شرکت ندادیم. جومال عبور

به خاطر داشته باشید برآورد هزینه نرم افزار هرگز به این سادگی که بیان شد نمی باشد، همچنین است محاسبه درآمد یک برنامه نویس و یا -

ف بیش از حد وقت خواهد شد.ارزش خروجی او؛ اما باید در نظر داشت که الاقل برای شروع، محاسبات پیشرفته فقط باعث اتال

یر است.در واقع در مهندسی نرم افزار، برآورد هزینه نرم افزار و برآورد ارزش و همچنین برآورد درآمد برنامه نویسی، فرآیندی کاماًل تکرار پذ

نگاه دوم: هزینه هایی که حساب نمی شوند!

ها را گاهی با آدم فضایی ها مقایسه می کنند، از نظر خیلی از آدم های دور و بر آن برنامه نویس ها موتور تولید علم و صنعت نرم افزار هستند، آن

ها عجیب ترین دانشمند اطراف شان هستند. اما واقعاً برنامه نویس ها چه خصوصیاتی دارند؟

وش و سخت کوش. آنها شخصیت های با برنامه نویس ها هر چه هستند، آدم فضایی یا یک مهندس نرم افزار، قطعًا انسان های باهوشی هستند، باه

نپشتکاری هستند که دائماً در حال حل مسئله هستند تا یک موضوع چالشی را به اتمام برسانند، هر روز مطالعه می کنند و دوران دانشگاه شا

تمامی ندارد. برنامه نویس ها آرام، سخت کوش، شب بیدار، فراموش کار و هدفمند هستند!

ساعت به ازای هر نفر در ماه است. اما آیا واقعاً این اتفاق می 152ماه صحبت می کند، منظورش دقیقاً -مهندسی بر اساس نفروقتی بوهم از کار

ساعت در ماه کار کند، تعجب برانگیز است، شخصیتی 152افتند؟ در ایران که می توانیم به جرأت بگوییم خیر، در واقع باید بگوییم اگر برنامه نویسی

ساعت! یعنی تقریبًا 12می باشد، یعنی شش روز هفته، روزی x 1 12ایران از یک برنامه نویس برای کارفرما تداعی شده است، چیزی بالغ بر که در

لساعت در ماه! و شاید تعجب تان بیشتر شود اگر بگوییم بیشتر جاهای دنیا نیز این اتفاق می افتد، مثالً یک نمونه معروف داریم که در سا 312

برنامه نویسان شرکت الکترونیک آرتز به دلیل کار زیاد از حد، از کارفرما شکایت قانونی کرده بودند. 2114

واقعیت این است که در توسعه یک نرم افزار، هزینه هایی هست که در برآورد به حساب نمی آیند، منظور هزینه های درمانی و آسیب هایی هست

رآیند تولید وارد می شود. در هیچ جای دنیا برای این هزینه ها، به هیچ برنامه نویسی حقوق پرداخت نمی شود، اما که به برنامه نویس ها در اثر ف

مشکل ایران این است که برنامه نویس ها اصالً حقوق مهندسی دریافت نمی کنند، و این تخریب آسیب ها بیشتر می کند.

اشته باشیم، در ابتدا از مشکالت جسمی شروع می کنیم:با هم مروری به معضالت سالمتی برنامه نویس ها د

Page 206: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

213 1314 مرداد PHP همایش

درصد از برنامه نویس ها، دچار مشکالت چاقی هستند، حتی آن هایی که دارای جثه ریز و کوچک هستند هم چاقی 21تقریباً چاقی: •

یابت د منجر به معضالت قلبی و یا دشکم را تجربه می کنند، این به دلیل سبک زندگی بدون تحرک و استرس باال می باشد. چاقی می توان

شود.

یک بیماری بسیار جدی است، چیزی در حد مشکالت تنفسی یا حتی سرطان! 2دیابت نوع :۲چاقی منجر به دیابت سطح ▪

سال باید حتماً به صورت هفتگی تست گلوکز و به صورت ساالنه آزمایش کامل خون داشته باشند. 45برنامه نویسان چاق باالی

تحقیقات ده ساله یک کلینیک به اسم مایو که درباره قلب و عروق بالینی است، نشان داده چاقی منجر به حمالت قلبی: ▪

سال زودتر از افراد معمولی است، این خطر در رابطه با برنامه نویسان بیشتر و 3.1است که خطر بروز حمله قلبی در افراد چاق

سال می باشد. 2.2در حدود

منتشر شد، کسانی که بیشتر پشت میز می نشینند، سن 2112بر اساس تحقیقاتی که در مارس رگ در اثر عدم تحرک:خطر م •

ساعت را روی صندلی سپری می کنند، 11سال که روزانه باالی 45درصد از افراد باالی 41زندگی خود را بیشتر کاهش می دهند، در

ساعت یا بیشتر از روز را روی صندلی سپری می 12ی کند. بعضی از برنامه نویسان تقریبًا سال هم زودتر بروز پیدا م 4این خطر حدود

کنند!

ساعت )شاید در ایران خوشبینانه باشد( به مانیتور خیره میشوند، این 11تا 2برنامه نویس ها به طور متوسط روزانه مشکالت چشمی: •

جمله خشکی چشم و یا پارگی مویرگ های چشمی شود، بعضی از برنامه نویس ها امر می تواند منجر به بروز مشکالت حاد چشمی از

حتی نیاز به جراحی پیدا می کنند و پس از جراحی پایان زندگی حرفه ای در انتظار آن هاست!

که تأثیر مستقیم زیاد پشت میز نشستن و عدم ورزش می باشد. کمر درد: •

ر کم خوابی می تواند شامل افزایش ریسک ابتالء به دیابت، چاقی، فشار خون باال و سایر عوامل عوارض در اثعوارض در اثر کم خوابی: •

مضر برای سالمتی باشد.

فعالیت های بالقوه با دست، همانند کار برنامه نویسی باعث بروز مشکالت مشکالت شانه، دست و مچ دست یا سندرم تونل کوبیتال: •

شود، عضالت قفسه سینه را باریک می کند و عضالت پشت را کشیده و ضعیف می کند.جدی در بازو، گردن و شانه می

کنند، در ناحیه مچ دست از زیر بافت همبندی مچ دست و از روی استخوانهای مچ عبور می عصب میانی: سندرم تونل کارپ ▪

کند ی و حرکتی در انگشتان دست بروز میاگر به هر دلیلی این فضا تنگ شده باشد به این عصب فشار وارد شده و اختالالت حس

.شودکه به این بیماری سندرم کارپال تونل گفته می

کنند. هر سطحی و عمقی دست و تاندون بلند شست به همراه عصب مدین عبور می تاندون در این فضا )تونل کارپال( هشت

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

بروز این بیماری حرکات تکراری مچ دست و انگشتان است، کاری که برنامه نویس ها به صورت بالقوه آن را انجام می دهند.

Page 207: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

214 1314 مرداد PHP همایش

ه شده است تفلج تدریجی عصب اولترا نیز مشکل حاد دیگریست که به نام سندرم تونل کوبیتال شناخ: سندرم تونل کوبیتال ▪

و در واقع شاید بتوان به آن یک بیماری مشترک بین برنامه نویس ها و گیتارسیت ها گفت که منجر به درد و کم شدن قدرت

دست می شود.

در این میان بعضی بیماری ها هم هستند که به دلیل استرس باال ظهور می کنند و یا بعضی هم به دلیل تأثیر مخرب تمدن می باشند •

شهور ترین آن ها عبارتند از:که م

آلرژی / فشار خون / اعتیاد به الکل / ترمبوز وریدهای عمقی ▪

روی مواردی که در باال اشاره شد، برخی از مشکالت جسمی است که برنامه نویس ها به طور گسترده با آن ها مواجه هستند، اما این ها تنها یک

ی آن هاست که به مراتب آسیب های جدی تری وارد می کنند.سکه است، روی دیگر سکه مشکالت روحی و روان

برنامه نویس ها به سه دلیل در معرض ابتالء به افسردگی هستند: :افسردگی •

استرس باالی کاری ▪

نیز ادامه در گیرند، می قرار افسردگی معرض در شغل هر های ای حرفه که داده نشان تحقیقات) شغل بودن محوری دلیل به ▪

ایمپاستر را توضیح خواهیم داد.( سندرم یعنی موارد همین از یکی

هستند. Freelancer عبارتی به یا کنند می کار تنها که هست نویسانی برنامه با رابطه در مورد این که انفرادی، کار ▪

د که به مدت طوالنی ادامه این سندرم همانطور که از نام آن پیداست به خستگی عمومی بدن اطالق می گرد سندرم خستگی مزمن: •

داشته باشد، به طوری که به مرور توان عمومی فرد را کاهش می دهد، علت اینکه این مورد را در مشکالت جسمی ذکر نکردیم، این بود

اگفته نکه این سندرم بیشتر در اثر مشکالت افسردگی در برنامه نویسان ظهور پیدا می کند و در واقع از عوارض مشکل فوق می باشد،

نماند که مصرف زیاد کافئین در برنامه نویس ها نیز به این مشکل بیشتر دامن می زند.

نظم در تولید یک نرم افزار نقش کلیدی دارد، محیط های توسعه ای که از مدیر پروژه کارآمد استفاده می کنند، این وسواس فکری: •

رنامه نویس ها شلختگی های خاصی هم دارند، مثالً ممکن است اتاق شخصی آنها مورد را بیشتر درک می کنند، ناگفته نماند که بیشتر ب

عاری نبه طرز ناباورانه ای نامرتب باشد، اما این به هیچ عنوان نباید در نتیجه کار آن ها ظهور پیدا کند، برنامه آن ها باید تا سر حد امکا

لی به اسم وسواس فکری می شود، به طوری که آن ها در طول شبانه روز از نقص و دارای نظم برونی باشد، این مسائل باعث بروز مشک

اغلب به کدهایشان فکر می کنند تا دائماً آن ها را بهتر کنند. این مشکل تا حدی است که کدنویس حتی در موقعیت های مهم که نیاز به

گام صحبت با یک شخص مهم یا هنگام یک اتفاق مهم تمرکز بر روی موضوع دارد، مثل جلسه امتحان غیر مرتبط به کارش یا حتی در هن

مثل مراسم عروسی خود، از آن رهایی پیدا نمی کند. از مهمترین معضالت وسواس فکری، اضطراب می باشد.

یوع شاین مشکل در برنامه نویس هایی که به صورت انفرادی کار می کنند بیشتر بروز پیدا می کند، اما از دست دادن اعتماد به نفس: •

آن در برنامه نویس های تیمی هم زیاد است، دالیل آن را نیز می توان کار انفرادی، احساس بی ارزشی و بی لیاقتی )که حالت خاص آن

در برنامه نویس ها را در بخش سندرم ایمپاستر توضیح می دهیم.(، انکار موفقیت های گذشته )که این هم در سندرم ایمپاستر بحث می

فراوان از دردهای جسمانی و دالیل پرشمار دیگر دانست. شود.(، شکایت

Page 208: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

215 1314 مرداد PHP همایش

در واقع این دو سندرم از بزرگترین مشکالت برنامه نویس یا خود فریبی و سندرم برنامه نویسان در لحظه: 406سندرم ایمپاستر •

ح موضوع را به ترجمه مقاله ای از درصد در برنامه نویسان مجرب می باشد. اما در این رابطه شر 111ها می باشند و شیوع آن در حدود

منتشر شده می سپاریم: businessinsider.comژولی بورت که در سایت

این روزها برنامه نویسی شغل فوق العاده ای برای تأمین درآمد شده است، همچنین این شغل دارای ضریب امنیت شغلی باال [

یسی به شکل خارق العاده ای سالمت ذهنی شما را به مخاطره خواهد نیز می باشد. اما شاید جالب باشد که بدانید برنامه نو

انداخت.

می خواهیم به دو موضوع اشاره کنیم که برنامه نویسان را تا دیوانگی پیش می برد.

شناخته شده است. این سندرم زمانی ظهور پیدا می کند که شما کاماًل مطمئن شده سندرم خود فریبکاریموضوع اول به نام

که تمامی برنامه نویسانی که با شما کار می کنند، از شما باهوش تر، ماهر تر و دارای توانایی ذاتی بهتر هستند و شما در اید

ترس از این مسئله به سر می برید که دیگران فکر کنند که شما یک آدم جعلی با توانایی ها و مهارت های ساختگی هستید و

دستاوردهای شما را کوچک بشمارند.

برنامه نویسان زن اغلب ابتال به سندرم فریبکاری را اعتراف می کنند و خب البته این با توجه به خصلت های زنانه آن ها تعجب

به عنوان یک 112و دکتر سوزان آیمز 111آور نیست. این سندرم اولین بار توسط دو روانشناس به نام های دکتر پولین رز کالنس

فق مطرح شد. این سندرم همچنین موضوع یک کتاب خود درمانی است که توسط دکتر والری موضوع خاص در رابطه با زنان مو

یانگ برای زنان نوشته شده است.

اگرچه این سندرم در زنان بیشتر دیده است اما بسیاری از مردان نیز از آن در امان نیستند.

این شرایط را برای دیگران قائل نیستند. سندرم فریبکاری غالبًا این افراد از خود انتظاراتی باالتر از استاندارند دارند در حالی که

در شغل های کارشناسی بیشتر دیده می شود و نوشتن برنامه یکی از آن شغل هاست، با این حال باید شغل برنامه نویسی متن

ر یت و کنکاش هست و آنها از خطباز را در معرض خطر بیشتری دانست، زیرا نتیجه کار این برنامه نویسان توسط دیگران قابل رو

خلق یک کد بهتر توسط دیگران هراس دارند.

برنامه نویسان در لحظهتا سندرم خودفریبیاز

سندرم خود فریبی پا را از آنچه هست فراتر می گذارد و دام دیگری را برای برنامه نویسان پهن می کند که در نتیجه آن فرد

کافی خوب بودن، باید بیشتر و سخت تر کار کند! و به این ترتیب قربانی ساعات کار خود را احساس می کند که برای به اندازه

تقریباً به تمام ساعات بیداری افزایش می دهد و به شمار پروژه های باز خود نیز می افزاید و در نهایت به برنامه نویسی تبدیل

می شود که هر لحظه در خدمت برنامه است.

اولین بار توسط یک پست در سایت دریت نام گذاری و جنجالی شد، چیزی که بیان می « 111س در لحظهسندرم برنامه نوی»

می گوید:« big_al11»کند برنامه نویسان در لحظه تنها در کدها زندگی می کنند. یک نویسنده ردیت با نام کاربری

ند که تمامی زمان های خود را در حال کد زدن برنامه نویسان در لحظه عاشق برنامه نویسی هستند، آنها عاشق این هست»

سپری کنند. آنها هرگز به این کار به عنوان یک شغل نگاه نمی کنند، یک برنامه نویس هرگز یک برنامه نویس در لحظه نخواهد

نفوذ فرهنگ ساعت کار در هفته آن هم با هدف غیر مالی و به منظور تفریح داوطلب شود. این 21تا 11بود اگر نتواند برای

صنعتی است! یک برنامه نویس واقعی باید کمترین پارامتر های برنامه نویس های در لحظه را داشته باشد، برای او شب ها نیز

106 Imposter syndrome 107 Pauline Rose Clance 108 Suzzane Imes 109 Real Programmer syndrome

Page 209: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

211 1314 مرداد PHP همایش

روز کاری لقهستند و آخر هفته ها تنها تاریخی برای سپری شدن می باشند، خب همه این ها یعنی برنامه نویسان در لحظه

«می شوند!برای فرسودگی شغلی آماده

برای برنامه نویسان کار کردن با ساعات زیاد و تا سرحد مرگ چیز جدید نیست، اما این که آن ها این کار را برای لذت خود

انجام می دهند، شاید مطلب تازه ای باشد.

د. این کتاب توانست بهترین فروش را به خود اختصاص بده« پیاده روی مرگ»برای مثال حدود یک دهه قبل کتابی به نام

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

نهایت برنامه ریزی و مدیریت ضعیف پروژه را مقصر دانسته بود.

امپیوتری است در رابطه با ساعات برنامه نویس ها از شرکت الکترونیک آرتز که یک شرکت تولید بازی های ک 2114در سال

میلیون دالر خسارت دریافت کنند. 15اضافه کار شکایت کردند و توانستند

، ماجرای یک خانم که با یک برنامه نویس که در شرکت تولید بازی های کامپیوتری راک استار 2111چند سال بعد و در سال

روز از 1ساعت در 12توضیح می داد که چطور شرکت انتظار کار روزی شاغل بود، ازدواج کرده بود، جنجالی شد. این ماجرا

هفته را داشته و سالمتی همسر این زن و دیگر برنامه نویسان را به خطر انداخته است.

که شبکه اجتماعی متخصصان کامپیوتر است، نقل محافل شد، این StackExchangeیک پست در سایت 2111در سال

من برنامه ای برای زمان بیکاری ام ندارم، آیا من توسعه دهنده به درد نخوری »کرده بود و در آن گفته بود: پست را آقایی ایجاد

«هستم؟

در نهایت، می خواهیم به این نتیجه برسیم که شما اگر در ساعات نرمال کاری، کدنویسی کنید، می توانید برنامه نویس خوبی

ه برنامه نویسان بزرگ، از ساعات مرده خود نیز برای برنامه نویسی استفاده میکنند. خب باشید، اما این نکته هم واقعیت دارد ک

نتیجه گیری گیج کننده ای بود!

بیشتر همیشه بهتر نیست!

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

مقدار زمانی برای برنامه نویسی می تواند سازنده باشد؟ و در نتیجه ای جالب آن ها دریافتند که ساعات کاری زیاد می که چه

ساعت کار میکنند کمتر از برنامه 11تواند بهره وری را کاهش دهد، آن ها دریافتند کیفیت کار برنامه نویسانی که در هفته

می کنند. ساعت کار 41نویسانی است که در هفته

البته شرایط فوق نمی تواند سندرم خودفریبی و برنامه نویس در لحظه را متوقف کند، در واقع داستان های واقعی غم انگیزی

در این باره وجود دارد.

ت می دانستم عاقب»برای نمونه، سال گذشته یک برنامه نویس شرکتی به نام کنت پارکر در وبالگ خود مطلبی تحت عنوان

، منتشر کرد.«یسی دیوانگیست!کدنو

او درباره یکی از همکارانش که سخت کار می کرد و عاقبت دچار سقوط روانی شده بود، توضیح داده بود!

او یکی از سخت کوش ترین کارمندانی بود که من در حوزه صنعت دیده بودم، اغلب پس از ساعت کاری نیز او را در »

معموالً در زمان هایی که مدیرعامل، شخصی را برای انجام یک پروژه سریع در حال کار بر روی پروژه می دیدیم، او

آخر هفته نیاز داشت حاضر بود، یکی از عالیقش این بود که خودش را برای به اتمام رساندن یک پروژه تحت فشار

«بگذارد، اما بهره وری او زمانی که به موسسه روانی رفت، دیگر زیاد نبود!

Page 210: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

211 1314 مرداد PHP همایش

ندس نرم افزار به نام نیک فلوید شروع به نوشتن و صحبت کردن از مسئله ای کرده است که خود او آن را تحت اخیراً یک مه

می نامد، او پس از اینکه اعتراف کرده است که از سندروم خودفریبی رنج می برده است، به « تعادل در زندگی خوره ها»عنوان

ه دوست دارند خوشحال می شوند:این نکته اشاره کرد که خوره ها از یافتن شغلی ک

شروع یک حرکت جدید، چالش برانگیز است، سخت و گاهی ترسناک نیز هست، اما این ها هیچ وقت روی من اثر »

نداشته اند، قبل از شروع آن ، من برخی اعتقادات را پذیرفته بودم، مثل اینکه، کار همیشه کار است و ممکن خستگی

فرار از کارهای ناامید کننده است، اما من این اعتقاد را وارونه کردم، زندگی عالی است در پیش داشته باشد و زندگی

«زمانی که چیزی به نام کار راه جدیدی برای عشق ورزیدن می شود.

از سوی دیگر نویسنده ردیت که باالتر اشاره کردیم، به نکته درخور توجهی اشاره کرده است:

«جامعه ما سخت کار کردن ما تا سر حد مرگ، به عنوان یک فضیلت دیده نشود!من به شدت آرزو دارم که در »

[

ا د، امهمانطور که در این نگاه مشاهده کردیم، هزینه هایی وجود دارد که که به قلب های توسعه نرم افزار، یعنی برنامه نویس ها پرداخت نمی شو

یک برنامه نویس باید درآمد خوبی داشته باشد و اینکه چرا اگر درآمدش مناسب نیست این هزینه ها حداقل این مطلب را روشن می سازد که چرا

باید حتماً شغلش را ترک کند و به یک شغل کم خطر تر و ساده تر بپردازد.

نگاه سوم: سر منزل مقصود!

ه سزای شاغلین آن حرفه می باشد. شاید یکی از هر کشوری به فراخور نیاز خود، به بعضی از شغل ها اهمیت بیشتری می دهد و نتیجه آن درآمد ب

نرم تدالیلی که برنامه نویس ها در ایران نتوانسته اند به جایگاه درآمدی مطلوب برسند، این می باشد که هنوز در کشور، علت های نیاز به صنع

افزار و فواید آن به روشنی برای دیگر صنایع توضیح داده نشده است.

یم درآمد برنامه نویس ها را در چند کشور مورد بررسی قرار دهیم و در انتها مقایسه ای هم به کشور خودمان داشته باشیم. در این نگاه قصد دار

همچنین پارامتر های دیگری که برای زندگی مطلوب یک برنامه نویس در یک کشور مورد نیاز است، در یک گزارش بیان می شود.

متوسط درآمد ساالنه برنامه نویس های آن ها کمتر از کشور ایران هست، اما در انتهای بحث ثابت می کنیم در ابتدا سری به کشورهایی بزنیم که

که حتی در این کشورها نیز، شرایط زندگی به لحاظ درآمدی، بهتر از شرایط برنامه نویسان ایرانی می باشد.

دالر 1211هند: درآمد ساالنه •

الرد 1411اندونزی: درآمد ساالنه •

دالر 1511رومانی: درآمد ساالنه •

دالر 1111سری النکا: درآمد ساالنه •

دالر 1211پاکستان: درآمد ساالنه •

دالر 1311مصر: درآمد ساالنه •

دالر 1111فیلیپین: درآمد ساالنه •

دالر می باشد. 2111د و اما پس از این کشورها، کشور ایران قرار دارد که درآمد ساالنه برنامه نویس ها در آن حدو

اکنون در این لیست صعودی نگاهی به درآمد چند کشور که رتبه های بعدی پس از ایران را دارا می باشند، بیاندازیم:

دالر 11111اوکراین: •

دالر 14111آرژانتین: •

دالر 11511مالزی: •

Page 211: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

212 1314 مرداد PHP همایش

دالر 11111ترکیه: •

دالر 11311مجارستان: •

دالر 21111لیتوانی: •

همانطور که مشاهده کردید، کشورهایی که در لیست بودند، کشورهای بزرگی نبودند، شاید از نظر بسیاری از شاخص های اقتصادی مثل تولید

و در واقع ی باشدناخالص ملی، چندین رتبه هم پایین تر از ایران قرار داشته باشند، اما نگاه این کشورها، به مهندسین نرم افزار فراتر از نگاه ایران م

جایگاه درآمدی این کشور ها بسیار مطلوب تر از جایگاه درآمدی در ایران می باشد.

حاال نگاهی به درآمد ساالنه برنامه نویسان در چند کشور همسایه بیاندازیم:

دالر 1211پاکستان: •

دالر 11111ترکیه: •

دالر 22111روسیه: •

دالر 25211کویت: •

دالر 21111عربستان سعودی: •

دالر 21111امارات: •

ارند. )از د به وضوح می بینیم که اگر کشور پاکستان را از لیست کنار بگذاریم، تمام کشورهای همسایه ای که نام برده شد، درآمد بهتری از ایرانی ها

اما به دالیلی در ادامه ثابت می شود که حتی درآمد برنامه نویس ها در کشورهای همسایه ای که در لیست نبودند، اطالعاتی در دسترس نبوده است،

اوضاع برنامه نویسان در کشور پاکستان هم به لحاظ در آمدی، بهتر از ایران است.(

موم ع برای اینکه نشان دهیم، متوسط در آمد برنامه نویسان در کشورهای همسایه بیشتر از متوسط در آمد ساالنه مردم است، متوسط در آمد ساالنه

ر لیست باال را نگاه می کنیم:مردم د

دالر 1211پاکستان: •

دالر 1121ترکیه: •

دالر 14145روسیه: •

دالر 41342کویت: •

دالر 25221عربستان سعودی: •

دالر 44331امارات: •

ید رجوع به سرمایه گذاری های خاص و همانطور که مشاهده می کنید، تنها دو کشور کویت و امارت ارقام باالتر داشتند، در مورد امارات و کویت با

شرایط اقتصادی خاص آن ها شود، چیزی که برنامه نویس ها را از چرخه بیرون نکرده، ولی به مشاغل دیگری اهمیت بیشتری داده است و در ضمن

یرانی بود.نباید فراموش کرد که در آمد برنامه نویس ها، در این کشورها هم بسیار بیشتر از درآمد برنامه نویسان ا

1، بر اساس آماری که بخشی از آن در باال اشاره شد، بررسی هایی انجام داده است که بر اساس آن 2115در هشتم ژانویه itflow.bizاما سایت

اند، اما بندی شدهکشور دنیا، به عنوان بهترین کشورها برای زندگی برنامه نویسان معرفی شد، گرچه این کشورها تنها به لحاظ میزان درآمد رتبه

در گزارش هزینه های ساالنه، شاخص بیگ مک که گزک اصلی ما در این مقاله است، میزان شادی در آن کشورها، استرس، طول زندگی، سالمتی

و بهترین شرایط کاری نیز ارائه شده اند.

ضیحی در مورد شاخص برابری قدرت خرید و در ادامه آن شاخص در ادامه این کشورها را از رتبه نهم شروع به معرفی می کنیم، اما قبل از معرفی تو

Big Macs :که از شما می خواهیم در هنگام ارائه گزارش به آن دقت کنید، خواهیم داشت

Page 212: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

211 1314 مرداد PHP همایش

نوعی شاخص اقتصادی است که برای تعیین ارزش پول PPP( یا به اختصار Purchasing Power Parityبرابری قدرت خرید )

در کشورها استفاده می کنند. به بیان علمی، PPPه کار می رود، گاهی تولید ناخالص داخلی را مالکی برای مقایسه کشورهای مختلف ب

PPP :نوعی نرخ مبادله می باشد که برابر است با نسبت هزینه دو سبد کاالی یکسان در جامعه های مختلف بر حسب ارزهای ملی

است زیرا این همبرگر مک دونالد در مورد آن، برابری قدرت خرید را محاسبه کردند، همبرگر یکی از معروفترین مواردی که اقتصاددانان

و در دالر با کیفیت یکسان مصرف می شود. فرض کنیم که مصرف کننده این کاال در کشور آمریکا دو کشورهای جهان در بسیاری از

1.15خواهد بود.عدد 1.15پوند به دو دالر برابر 1.5خت کنند، نسبت بابت خرید همبرگر مک دونالد پول پردا پوند 1.5کشور بریتانیا

است، بزرگتر است و این به مفهوم آن است که مک دونالد در 1.12در مقایسه با نرخ برابری ارز آمریکایی)دالر( و ارز انگلیسی )پوند( که

. بریتانیا گرانتر از مک دونالد آمریکایی است

:ساده و تنها بر اساس شاخص همبرگر مک دونالد داوری کنیم باید بگوییم کهاگر بخواهیم به طور

.قدرت خرید مردم کشور آمریکا بیشتر از کشور بریتانیا است -

.اقتصاد کشور آمریکا بیشتر از اقتصاد کشور بریتانیا است رقابت پذیری توان -

.ستاستاندارد زندگی در کشور آمریکا بیشتر از کشور بریتانیا ا -

ارز کشور آمریکا به ارز کشور بریتانیا منطقی به نظر می رسد. نرخ تبدیل -

اما به صورت ساده، زمانی که می خواهند درآمد دو گروه خاص را در دو کشور مقایسه کنند، محاسبه می کنند که هر گروه با درآمد خود،

ساده، یک مالک راهگشای اقتصادی برای محاسبه قدرت خرید در چند عدد همبرگر مک دونالد می تواند خریداری کند، همین محاسبه

سال های اخیر بوده است.

ردر گزارشی که پیش رو دارید نیز، شاخص همبرگر مک دونالد، کمک کرده است تا ببینیم با درآمد یک برنامه نویس در سال، چند عدد همبرگر د

کشوری که قدرت خرید همبرگر بیشتر داشته باشد، شرایط اقتصادی بهتری را برای یک هر کدام از کشور ها می توان خرید. نا گفته پیداست که

برنامه نویس فراهم خواهد کرد، کما اینکه حقوق پرداختی به یک برنامه نویس، در کشور دیگری بیشتر باشد!

اخص فوق را محاسبه خواهیم کرد.در انتهای گزارش، گریزی هم به ایران خواهیم زد و بعد از بومی سازی همبرگر مک دونالد، ش

Page 213: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

211 1314 مرداد PHP همایش

و اما بهترین کشور های دنیا برای برنامه نویسان:

: کانادا -1

دالر 51511میانگین درآمد ساالنه برنامه نویسان: •

جهان( 13عدد )رتبه 11152قدرت خرید همبرگر مک دونالد با حقوق فوق در سال: •

2رتبه شادی و رفاه در جهان: •

11ت های بهداشتی در جهان: رتبه مراقب •

11رتبه شرایط کاری مطلوب در جهان: •

)رتبه های پایین جدول آرامش بیشتری داشته اند( 15کشور(: 14رتبه آرامش در جهان )بین •

: نیوزلند -2

دالر 51111میانگین درآمد ساالنه برنامه نویسان: •

جهان( 2عدد )رتبه 12114ل: قدرت خرید همبرگر مک دونالد با حقوق فوق در سا •

11رتبه شادی و رفاه در جهان: •

رتبه مراقبت های بهداشتی در جهان: اطالعات در دسترس نبوده است. •

2رتبه شرایط کاری مطلوب در جهان: •

کشور(: اطالعات در دسترس نبوده است. 14رتبه آرامش در جهان )بین •

: سوئد -1

دالر 11411رنامه نویسان: میانگین درآمد ساالنه ب •

جهان( 11عدد )رتبه 11311قدرت خرید همبرگر مک دونالد با حقوق فوق در سال: •

5رتبه شادی و رفاه در جهان: •

11رتبه مراقبت های بهداشتی در جهان: •

21رتبه شرایط کاری مطلوب در جهان: •

Page 214: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

211 1314 مرداد PHP همایش

ن جدول آرامش بیشتری داشته اند()رتبه های پایی 11کشور(: 14رتبه آرامش در جهان )بین •

: آلمان -1

دالر 13211میانگین درآمد ساالنه برنامه نویسان: •

جهان( 1عدد )رتبه 12112قدرت خرید همبرگر مک دونالد با حقوق فوق در سال: •

21رتبه شادی و رفاه در جهان: •

31رتبه مراقبت های بهداشتی در جهان: •

21ب در جهان: رتبه شرایط کاری مطلو •

)رتبه های پایین جدول آرامش بیشتری داشته اند( 15کشور(: 14رتبه آرامش در جهان )بین •

: استرالیا -5

دالر 15111میانگین درآمد ساالنه برنامه نویسان: •

جهان( 5عدد )رتبه 13111قدرت خرید همبرگر مک دونالد با حقوق فوق در سال: •

2جهان: رتبه شادی و رفاه در •

1رتبه مراقبت های بهداشتی در جهان: •

14رتبه شرایط کاری مطلوب در جهان: •

)رتبه های پایین جدول آرامش بیشتری داشته اند( 11کشور(: 14رتبه آرامش در جهان )بین •

: دانمارک -4

دالر 11511میانگین درآمد ساالنه برنامه نویسان: •

جهان( 3عدد )رتبه 13223د با حقوق فوق در سال: قدرت خرید همبرگر مک دونال •

1رتبه شادی و رفاه در جهان: •

32رتبه مراقبت های بهداشتی در جهان: •

Page 215: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

212 1314 مرداد PHP همایش

4رتبه شرایط کاری مطلوب در جهان: •

)رتبه های پایین جدول آرامش بیشتری داشته اند( 11کشور(: 14رتبه آرامش در جهان )بین •

: ایاالت متحده -3

دالر 11111انگین درآمد ساالنه برنامه نویسان: می •

جهان( 1عدد )رتبه 15233قدرت خرید همبرگر مک دونالد با حقوق فوق در سال: •

11رتبه شادی و رفاه در جهان: •

41رتبه مراقبت های بهداشتی در جهان: •

1رتبه شرایط کاری مطلوب در جهان: •

)رتبه های پایین جدول آرامش بیشتری داشته اند( 54: کشور( 14رتبه آرامش در جهان )بین •

: نروژ -2

دالر 21411میانگین درآمد ساالنه برنامه نویسان: •

جهان( 15عدد )رتبه 11421قدرت خرید همبرگر مک دونالد با حقوق فوق در سال: •

4رتبه شادی و رفاه در جهان: •

در دسترس نبوده است. رتبه مراقبت های بهداشتی در جهان: اطالعات •

1رتبه شرایط کاری مطلوب در جهان: •

)رتبه های پایین جدول آرامش بیشتری داشته اند( 14کشور(: 14رتبه آرامش در جهان )بین •

: سوییس -1

دالر 114211میانگین درآمد ساالنه برنامه نویسان: •

جهان( 2عدد )رتبه 15251قدرت خرید همبرگر مک دونالد با حقوق فوق در سال: •

1رتبه شادی و رفاه در جهان: •

Page 216: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

213 1314 مرداد PHP همایش

1رتبه مراقبت های بهداشتی در جهان: •

24رتبه شرایط کاری مطلوب در جهان: •

)رتبه های پایین جدول آرامش بیشتری داشته اند( 12کشور(: 14رتبه آرامش در جهان )بین •

منزل مقصود برای برنامه نویس ها می باشد، به این معنی که یک برنامه نویس در این همانطور که مشاهده کردید، این نه کشور، در حقیقت سر

کشورها، می تواند زندگی نسبتاً مرفهی را داشته باشد.

رکت ش اما از آنجایی که در ایران، شعبه مک دونالد وجود ندارد، سعی می کنیم با یک شبیه سازی قیمت و با حذف کیفیت! ایران را هم در مقایسه،

هزار تومان نبود، و با 15دهیم. فرض کنید که مک دونالد در ایران شعبه ای داشت، در آن صورت به طور یقین قیمت همبرگر بزرگ آن کمتر از

ا بیک فرض خوشبینانه، میانگین حقوق برنامه نویس ها در ایران را هم حدود دو میلیون و پانصد هزار تومان در ماه، در نظر می گیریم، یعنی

هزار تومانی بکنیم، 15دالر در سال حقوق یک برنامه نویس می شود. حاال اگر این رقم را در تقسیم به همبرگر 2151، 14محاسبات اردیبهشت

دهمبرگر در سال! این رقم در کجای لیست قرار می گیرد؟ دیدیم که رتبه نهم در لیست، یعنی کشور کاناد ساالنه قدرت خری 2111می شود تنها

همبرگر را می داد. اینقدر تفاوت نا امید کننده نیست؟! 11111حدود

ایران را به کانادا نزدیک کنم، به همین خاطر سبد خرید ایران را برابر ساندوچ فالفل معمولی قرار دادم و البته شاخص کانادا را PPPمن خواستم

ساندویچ در سال 11111تومان تمام شود، آنوقت با ارقام فوق به عدد 3111 همان مک دونالد حفظ کردم، فرض کنید هر فالفل در ایران معادل

می رسیم، ناراحت کننده نیست؟ با ساندوچ فالفل هم به رتبه آخر لیست نرسیدیم.

رهای همسایه ، اینبار کشواما به یکبار دیگر لیست کشور هایی که از نظر حقوق برنامه نویس قبل از ایران )حقوق کمتر از ایران( بودند را تشکیل دهیم

و خود ایران را هم در لیست قرار می دهیم، با این تفاوت که این دفعه شاخص محاسبه قدرت خرید بر حسب مک دونالد می باشد:

همبرگر 2111ایران: •

همبرگر 2133فیلیپین: •

همبرگر 2312پاکستان: •

همبرگر 2413سری النکا: •

همبرگر 3123مصر: •

همبرگر 3542هند: •

همبرگر 3215ترکیه: •

همبرگر 2151روسیه: •

همبرگر 1112عربستان سعودی: •

تعلت اینکه کشورهای امارات و کویت در لیست نبودند، این بود که اطالعاتی از شاخص بیگ مک آن ها در دسترس نبوده است، اما ناگفته پیداس

ستند، شاید اعدادی شبیه به عربستان سعودی یا روسیه، اما نکته ای که بسیار قابل تأمل می که آن ها نیز از اعداد مناسبی در لیست برخوردار ه

رای قرار گرفت! این ب حتی قبل از پاکستانباشد این است که حقوق برنامه نویس های ایران، زمانی که با شاخص برابری قدرت خرید محاسبه شد،

هم هست که الاقل در مقایسه با کشورهایی که از نظر اقتصادی پایین تر از ایران قرار دارند، در برنامه نویس ها حتی از نظر شخصیت اجتماعی هم م

جهانی در همین جدول می باشد، 44جهانی در جدول رتبه تولید ناخالص داخلی می باشد و پاکستان رتبه 21رتبه باالتری باشند! ایران جایگاه

انتظاری خواهید داشت؟شما در جایگاه یک برنامه نویس ایرانی چه

Page 217: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

214 1314 مرداد PHP همایش

نگاه چهارم: از ماست که بر ماست!

ود، ش در نگاه های قبلی روشن که سهم بزرگی از معضل نامناسب بودن قیمت نرم افزار در ایران به درآمد نامناسب برنامه نویسان ایران مربوط می

ه به کارفرما مربوط می شود؟ من می خواهم یک نتیجه گیری شخصی درآمدی که با شرایط شغلی خاص این حرفه همخوانی ندارد. اما آیا این مسئل

ربط از این مورد داشته باشم و کارفرما را در رتبه آخر مقصران قرار دهم. در واقع درآمد یک برنامه نویس در یک کشور خاص، به شرایط مختلفی

ان درآمد بهتری از مهندسان دارند؟! شاید بتوان پاسخ این سوال را در پیدا می کند، حتماً شما هم تا به حال پیش خود فکر کرده اید که چرا پزشک

این مسئله یافت که مردم در کشور ایران، ارزش یک پزشک را درک کرده اند، وقتی ارزش یک خدمت روشن باشد، مردم راحت تر برای آن پول

و نفرین وجود دارد، اما به هر حال این هزینه پرداخت می شود. این پرداخت می کنند، گرچه همیشه از هزینه باالی خدمات گالیه و گاهی هم ناله

در حالیست که هزینه های مهندسی دارای رقم های نجومی نیست و همیشه منطق معتبری پشت هزینه ها هست، در ضمن این گروه از متخصصین

شود که دارایی الزم برای دریافت خدمت را دارست یا مستعد کمتر به طور مستقیم با عامه مردم کار دارند، معموالً خدمت به قشری پرداخت می

دریافت خدمت با هزینه ای معقول می باشد.

شغل مهندسی نرم افزار را در نظر بگیرید، یک شرکت مهندسی به سازمان های دولتی، خصوصی و اشخاصی که بر اساس نیاز حرفه خود، احساس

س می دهد. اما این نیاز چقدر درک شده است؟ در حقیقت باید بگوییم که این روزها، نیاز به خوبی در حال کرده اند که به نرم افزار نیاز دارند، سروی

، اگر « ! خشت اول چون نهد معمار کج، تا ثریا می رود دیوار کج»درک شدن است، اما راه رسیدن به خدمت مناسب نهادینه نشده است، زیرا که

شور ما شده بود، به مدیریت پروژه، مهندسی نرم افزار و در نهایت فرآیند مهم برآورد اندازه و هزینه نرم افزار روزهای ابتدایی که این صنعت وارد ک

نرم ددقت شده بود و این مسئله توجیح علمی خود را در بین دیگر صنعت ها پیدا کرده بود، امروز شاهد این نابسامانی نبودیم، روزهایی که تولی

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

ایرانی خورده شد و این فکر تا امروز ادامه پیدا کرده است.

این رشته، جدی گرفته باشد؟ به جرأت می توان واحدی مهندسی نرم افزار را در 1تا به حال چند مهندس نرم افزار را دیده اید که درس مهم و

درصد از دانشجویان به این درس به دلیل پیچیدگی اهمیت نمی دهند و از مباحث راهگشای آن غافل می شوند. ناگفته نماند 11بگوییم که بیش از

کل را در آینده آن دانشجو کلید می زند.که در هیچ کالس مهندسی نرم افزاری نیز درس به مباحث درآمدی کشانده نمی شود و این خود مش

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

بر روی پروژه شکست خورده ویندوز ویستا هزار متخصص 11اعالم کرد که نزدیک به 2111مردم )خریداران و صنعتگران(: مایکروسافت در سال

میلیارد دالر هزینه ساخت ویندوز 2هزار دالر در سال، رقمی معادل 211کار کرده اند، با احتساب حقوق هر برنامه نویس در مایکروسافت از قرار

ین محصول در نظر نگیریم. دو میلیارد دالر معادل ویستا در ده سال شده است، البته اگر قاعده ضربدر دو را که در نگاه اول توضیح دادیم برای ا

بودجه ساالنه کشوری مثل گرجستان می باشد. آیا مایکروسافت ریسک و خطر را دوست دارد که معادل بودجه یک کشور را خرج یک محصول می

ن رقم را از ویندوز سود کرده است، باز کند که در سال اول شکست می خورد؟ اگر متوجه شوید که مایکروسافت در همان سال اول هشت برابر ای

و پلت فرم های بعدی 1هم به مایکروسافت انتقاد مالی وارد هست؟ ویندوز ویستا شکست خورد، اما پایه گذار نسل های بعدی ویندوز مانند ویندوز

پیوترها ماند. حاال فرض کنید که بازار هدف نیز روی کام 1شد، بودجه هزینه شده را با رقم چند برابری جبران کرد و تا انتشار نسخه ویندوز

آن را OEMدالر هزینه خرید نسخه 111دالر هزینه خرید ویندوز اوریجینال را بدهید؟ یا حتی 411مایکروسافت ایران بود، آیا شما حاضر بودید

ه اش پیچیده می شد. پرداخت کنید؟ اگر مایکروسافت ایران را انتخاب می کرد، در آن صورت حتماً و برای همیشه نسخ

خرید نرم هاینکه نرم افزارهای بزرگ دنیا در ایران به رایگان قابل دانلود هستند، یک دلیل منطقی برای توجیه این موضوع می باشد که مردم ایران ب

ت این نرم افزارها را نقض کنیم، از افزار عالقه ای نشان نمی دهند. مهمترین دالیلی که ما ایرانی ها خودمان را محق آن می دانیم که حق کپی رای

یک سو تحریم های ظالمانه ای می باشد که سالیان سال هست باعث تضعیف اقتصادی و قدرت خرید مردم ما شده است و از سوی دیگر، عدم بهره

این کنیم، شاید چیز جالبی نباشد، و مندی از روش های پرداخت بین المللی مانند پی پال می باشد. اما اینکه با تولید کننده داخلی هم دشمنی می

ته را در کموضوع باعث شده است که نتوانیم در صنعت نرم افزار هم مانند سایر صنایعی که تولید کننده داخلی دارد، قد علم کنیم. البته باید این ن

Page 218: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

215 1314 مرداد PHP همایش

ه نرم افزار استفاده می کند، اما اینجا باز هم باید به نظر گرفت که تولید کننده هم از همان نرم افزارهایی که به رایگان دانلود می شود، برای توسع

این مهم توجه کرد که گرچه محیط توسعه خارجی است، اما توسعه دهنده ایرانی است و از تحریم های برابر با سایرین برخوردار می باشد.

مبارزه با کپی محصول صورت گرفت، آیا پسندیده در سالهای اخیر فرهنگ سازی خوبی برای فروش فیلم های سینمایی اوریجینال تولید داخل و

هزار تومان عرضه می شود، اما اگر از نرم 3111نیست که برای حوزه نرم افزار هم فکری شود؟ شاید فکر کنید که فیلم سینمایی با رقمی حدود

نی فروخته شوند؟ حقیقتاً هم همینطور می باشد، اما حرف بگذریم، برخی نرم افزارها هرگز نمی توانند با رقم های غیر میلیو IOSافزارهای اندروید و

ر ااین است که کپی رایت رعایت شود، هر محصولی با توجه به تعداد مشتری و عملکرد، قیمت و شرایط خودش را طلب می کند، مطمئناً یک نرم افز

حسابداری به کار عامه مردم نمی آید! آیا نباید تولید شود؟

ی خواهم عمده مشکل بازار خراب نرم افزار در ایران را به گردن برنامه نویس ها بیاندازم. برنامه نویس: من م

به و برنامه نویسی بی شک یکی از طاقت فرسا ترین مشاغل دنیاست، به شخصه و در جایگاه یک برنامه نویس، بارها خواسته ام این شغل را رها کنم

ر برم. وقتی کد مانند یک تومور سرتاسر زندگی ات را بگیرد، دیگر نگاِه یک موضوع فراخ بخش از سراغ شغلی راحت تر، حتی با درآمدی پایین ت

شغلت گرفته خواهد شد و به آن نیز بسان یک سرطان خواهی نگریست.

تی تحصیل در دانشگاه، حدر نوجوانی پدرم دوستی داشت که یکبار مرا درباره ادامه تحصیل و رفتن به دانشگاه ترغیب کرد، آن مرد معتقد بود که

ی خرد، یاگر برای کم ارزش ترین رشته دانشگاهی هم باشد، باز ارزش دارد، زیرا دانشگاه عالوه بر اینکه به دانش فنی فرد می افزاید، باعث شکوفا

همت و فرهنگ فرد می شود.

ارکت فروش مواد غذایی هم تأسیس کند، از دیگر شاغلین در دوران دانشگاه، استاد شبکه ای داشتم که معتقد بود، یک مهندس اگر حتی یک سوپرم

او را یازآن حرفه موفق تر خواهد بود، زیرا او با فکر بازتری به همه مسائل پیرامون خود می نگرد، می تواند رفتار آینده مشتری را تحلیل کند، ن

کند. بسنجد و با دانش عمومی که در دوران تحصیل فراگرفته است، فروش خود را تضمین

میخواهم این نتیجه گیری را کنم که به همین سادگی تن دادن به معضالت جسمی و روحی که پیشتر ذکر شد، کار هوشمندانه ای نیست، شغل

های ساده تر دیگری هم رده درآمدی شغل برنامه نویسان هست که می توان آن ها را انتخاب کرد. یک فروشنده سخت افزار حرفه ای شاید چندین

بر بیشتر از یک برنامه نویس درآمد داشته باشد، آیا منطقی نیست که عمری را که صرف حرفه ای شدن در یک زبان برنامه نویسی می کنیم، برا

صرف تقویت خودمان در بازار فروش کنیم؟

آمد کار باشد، اما در ادامه فقط یک دراین یک واقعیت هست که هیچ برنامه نویسی برای تفریح دست به کد نمی شود، شاید در ابتدا تفریحی هم در

ه مناسب می تواند او را آرام کند. اما اگر قرار باشد سالهای سال رسیدن به این درآمد طول بکشد، چه کسی ضرر کرده است؟ ارباب رجوع که ب

یچاره با کوهی از تخصصی و یک دو محصول خود رسیده است، پیمانکار هم درآمد خود را به خوبی کسب کرده است، در این میان برنامه نویس ب

جین از امراض مختلف، ضرر اصلی کرده است، زمانی که به خود می آید و متوجه می شود که دیگر برای انتخاب هر شغل دیگری دیر شده است!

رآمد نی داشته باشد و بتواند حداقلِ دپس قبل از استفاده از کیبورد، دوباره فکر کنیم! در واقع بر این باور هستم که برنامه نویس باید قدرت چانه ز

راضی کننده را کسب کند و در غیر اینصورت اگر این شغل را رها نکند، هم به خود و هم به جامعه نرم افزاری زیان وارد کرده است!

نید، کابینت های خانه تان را عوض ککارفرما: شاید کارفرما در پایین بودن قیمت نرم افزار کمترین تقصیر را داشته باشد، فرض کنید قصد دارید

ت، وقتی سکابینت را هم خودتان دارید، قطعاً برای نصب آن، کارگری را انتخاب می کنید که هزینه کمتری از شما دریافت کند؛ کارفرما هم اینگونه ا

ر واقع نه باالتر به شخص دیگری نمی بیند. دبرنامه نویس مجربی حاضر می شود با یک قیمت نازل کد نویسی کند، کارفرما دلیلی برای پرداخت هزی

برنامه کارفرما در یک بازار رقابتی قرار دارد و قصد دارد هزینه ها را به هر نحوی کاهش دهد. تنها چیزی که او در نظر نمی گیرد، فرسایش توان

د، شاید چند سال بعد که سیستم کارفرما کامالً به نویس است که مرور زمان را شامل می شود و این تنها آسیبی است که به کارفرما وارد می شو

یک کارشناس وابسته شده است، او مهندسی را در سیستم خود ببیند که اصالً توانایی الزم برای مدیریت کدهایی که حتی خودش خلق کرده است

Page 219: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

211 1314 مرداد PHP همایش

ابر نیست، زیرا که در جامعه اقتصادی، هر شخصیتی را هم ندارد. در این میان نمی توان به کارفرما خرده گرفت که چرا نسبت پرداختی و سودش بر

د.ناعم از حقیقی یا حقوقی به فکر سود خویش است، اما می توان نتیجه گرفت که کارفرما هم نتوانسته آینده سیستم خود را به درستی مدیریت ک

)مهندس نرم افزار و برنامه نویس(، می تواند به سود اقتصاد در نهایت بهبود بازار نرم افزار به شرط ایجاد انگیزش برای تولید کننده و توسعه دهنده

ی یکشور تمام شود. با در نظر گرفتن امکان صادرات محصول با کیفیت، می توان از یک صنعت خدمت محور، استفاده بهتری کرد و درآمد زایی باال

را متصور شد.

نگاه پنجم: مژده ای دل که مسیحا نفسی می آید!

ت کوین به سرعت در حال پیشرفت است، خواه در بین دولت ها به یک جایگاه حقوقی برسد و یا نرسد، پیش بینی می شود این پول این روزها بی

آینده ر)یا کاالی( دیجیتال، دروازه های تجارت الکترونیک را در هم بشکند. از سویی می توان دسترسی به حساب های بین المللی نظیر پی پال را د

ور برای ایران متصور شد. این مقوالت یعنی دهکده جهانی که روزی تنها یک شعار بود، به ایران نیز نزدیک تر شود. شاید بتوان یک نه چندان د

ی کمزیت برای کاالهای نرم افزاری در مقابل کاالهای فیزیکی قائل شد، و آن هم سرعت باالی انتقال می باشد. بدون شک انتقال یک محصول فیزی

مثل ژاپن به ایران زمان زیادی می برد، خصوصاً که این حمل دریایی یا زمینی باشد، اما انتقال یک محصول نرم افزاری شاید در فاصله از کشوری

یک چشم به هم زدن هم طول نکشد. این ها همه نوید آن را می دهند که با گسترش فضای تجارت بین ایران و کشورهای دیگر در فضای ابری،

ی برای تجارت، کارآفرینی و کار در حوزه دیجیتال برای ایرانیان فراهم شود.روش های نوین

آوردن ردر نظر بگیرید که شرکت های دورکاری در کسب و کارهای کوچک، نمونه کار شما را ببینند و با شما قرارداد ببندند، این می شود به دالر د

برای کارفرمایی که حقوق پایین می دهد، کار می کند؟و به ریال خرج کردن. آیا در چنین شرایطی برنامه نویسی

نامه ردر فضای ایده آل دیگری، در نظر بگیرید با بدست آوردن یک حساب بانکی جهانی و هموار شدن تجارت ایرانیان در بازارهای آنالین جهانی، ب

تجارت با ویترینی که میلیاردها بازدید دارد!نویسان ایرانی به سایت هایی چون گوگل پلی و اپل استور راه پیدا کنند، این یعنی

د، ابر باشدر حقیقت باز شدن دروازه های ابری و جهانی برای توسعه دهنگان نرم افزار و برنامه نویس ها، می تواند به عنوان پایان عصر تجارت نابر

یادی درک واقعی از هزینه نرم افزار را برای جامعه، درک صحیح این مسئله می تواند اهرم فشاری برای ایجاد تعادل در بازار قیمت ها باشد و تا حد ز

از میزان حق و حقوق برای برنامه نویس و درک جدید برای کارفرما در پرداخت هزینه ایجاد خواهد کرد.

نیم نگاه: مبتدی ها به بهشت نمی روند...

ده است، در اینصورت ما چه چیزی برای عرضه خواهیم داشت؟فرض کنید شرایطی که در نگاه پنجم متصور شدیم، اکنون در ایران محیا ش

نرم افزارهای خوبی توسط برنامه نویس های حرفه ای نوشته شده است که پتانسیل خوبی برای ارائه در بازار جهانی هم IOSدر بازار اندروید و

ه تکه ک« واس ماس»آشفته بازار واقعًا کم است. برنامه ای با موضوع دارند. اما نباید این واقعیت را نادیده بگیریم که درصد برنامه های خوب در این

ی که چند ای طنز از هنرمندی جواد رضویان را جدا کرده است و در قالب عکس آن را نشان می دهد، قابلیت ارائه در بازار جهانی را ندارد؛ برنامه ا

خریدار جهانی ندارد! یا « دعاهای افزایش ثروت»شته اند، قابل رقابت نیست! نرم افزار گذا« آرتروز»بریده مجله را در کنار هم جمع کرده و نام آن را

چه جوری درس بخونم؟ « / کی زن می گیرم ؟ « / »کی شوهر می کنم؟ « / »شارژ ندارم )الکی( « / »چکار کنم عاشقم بشه»نرم افزارهایی مثل:

و ... 1314خودت درست کن! / خطوط انتقال آب –/ لواشک نخر

که در باال ذکر شد و یا امثال آنها، پولی هم هستند و البته -اگر بتوان اسم آن ها را نرم افزار گذاشت –جالب اینجاست که خیلی از نرم افزارهای

شد.نفر می با 111وقتی تعداد دانلود آن ها را نگاه می کنید، می بینید که درصد دانلود آن ها بسیار پایین، عموماً کمتر از

یشه مبرنامه نویس و توسعه دهنده نرم افزار، روزی که میل به پیشرفت را متوقف کند، خود را بازنشسته کرده است، از طرفی توسعه دهنده باید ه

کرده انیم نگاهی به تحوالت جاری و یا پیش روی جهانی داشته باشد، برای مثال امروز در جهان مدیریت دانش موضوعی است که طرفدار زیادی پید

Page 220: ناریا رد -  · PDF fileتسرهف 1 هدنی و لاح ،هتشذگ رد php 5 phpدیدج یاههخسن رد هداتفا قافتا تارییغت هب یهاگن

211 1314 مرداد PHP همایش

، اما هنوز جای کار بسیاری دارد، همچنین نرم 111است که خب البته تالش های نرم افزاری هم در کشور خودمان در این زمینه صورت گرفته است

از هایی که با مرورگرهای اینترنت چرخانده می شوند، CRMامروز مورد توجه توسعه دهندگان بسیاری در دنیا قرار گرفته است، SAASافزارهای

می باشد. Evernoteو یا Dropboxاین نمونه هستند. همچنین نرم افزارهای رایانش ابری دیگری هر روز در حال تولد هستند، نمونه ای از آنها

آیا بهتر نیست در این سمت و سو حرکت بیشتری داشته باشیم؟

منابع:softpanorama.org www.itflow.biz

en.wikipedia.org

www.recruiter.com www.araye.net

www.brandonsavage.net

www.zoomit.ir www.seattletimes.com

cost-of-living.startclass.com

selleo.com/blog

livingwage.mit.edu www.businessinsider.com

blog.codinghorror.com geekfeminism.wikia.com

www.hanselman.com/blog

programmers.stackexchange.com

افتخار می کنم که جزء اولین کسانی بودم که به همراه چند تن از دوستان از جمله آقای مهندس 110

را معرفی کردم، آن روزها شاید ما تنها گروه OpenKM مدیریت دانش سورس باز مردانی، نرم افزار

بودیم!