گیک فارسی

نوشته های یک گیک فارسی از فعالیت ها ،‌ علاقه مندی ها و نقد هایش

حرف حساب در مورد PHP و Framework ها و Design Pattern ها

نویسنده:
13 اکتبر 17

اگه عنوان براتون نامفهومه خوندن را ادامه بدین چون من عموما علاقه‌ای به ترجمه کلمات علمی به فارسی ندارم! این پست شاید مهم‌ترین پست کل وبلاگ من باشه و چند سال میشه میخواستم بهش بپردازم ولی انقدر جامع و نیاز به بررسی و مرجع دادن بود که وقتش را واقعاً پیدا نمیکردم ! مخصوصاً بعد از بدنیا اومدن فرزندم!

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

لینک به مطلب اصلی
دانلود نسخه PDF ی که من برای اولین بار خوندمش برای حفظ سند

رقابت Nginx و Apache در چند سال اخیر و اقبال بیشتر Nginx

نویسنده:
19 فوریه 15

اگر تا به حال مدیریت یک سایت را بر روی یک Server اختصاصی حالا چه Dedicated یا VPS تجربه کرده باشین میدونین که انتخاب یک سرویس دهنده و تنظیمات درستش یکی از مهمترین چالش های مدیریت Server هست.

مقایسه سرویس دهنده ها ۱

اولین نامی که در ذهن برای سرویس دهنده وب متبادر میشه قطعاً Apache هستش. آپاچی از سال ۱۹۹۵ تا کنون مقام اول در سرویس دهی به میلیون‌ها وب سایت را بر عهده داشته ، کاربران بسیاری داره ، ماژول های زیادی در راستای بهبود و توسعه امکاناتش براش نوشته شده و در جامعه سورس باز هم جایگاه تعریف شده و مهمی داره. اما چه دلیلی باعث میشه که با این تفاسیر بخواهیم به سرویس دهنده های دیگه فکر کنیم ؟

آپاچی وقتی با ترافیک بالا روبرو میشه کند میشه و این موضوع دلیلی نداره جز افزایش Process ها که قاتل Memory هستند و علاوه بر اون این Process ها با ایجاد Thread ها بر جنگ دسترسی به منابع Memory و CPU دامن میزنن. حتی با وجود MPM هایی مثل worker و event علاوه بر pre_fork باز هم Apache با مشکلات Process ها و Thread هاش دست به گریبان هست و زمانی که ترافیک افزایش پیدا میکنه با کندی مواجه میشه و گاهی اوقات با توجه به تنظیماتش کلاً مانع از دسترسی کاربران به سایت میشه.

در مقابل Apache انتخاب های دیگه ای هم وجود داره که Nginx در بینشون اقبال بیشتری داشته اما چرا ؟ بر خلاف Apache که با ایجاد Process ها و Thread های جدید درخواست های کاربر را پاسخ میده ، Nginx به صورت Event Driven و Asynchronous با توجه به تنظیمات مدیر سیستم که تعداد Worker Process ها را تعین میکنه و هر Process فقط یک Thread داره و میتونه هزاران کاربر را پاسخگو باشه کار میکنه.این تفاوت عملکرد تأثیر خیلی زیادی داره و Nginx را Stable تر و سریعتر میکنه. همین افزایش سرعت باعث میشه بسیاری از مدیران سیستم به سمت Nginx تمایل پیدا کنند و محبوب بشه.

مقایسه سرویس دهنده ها ۲

یکی از ایراد هایی که به Nginx گرفته میشه این هست که برای کار با محتوای دینامیک بر خلاف Apache که با ماژول هایی نظیر mod_php و mod_python و mod_rails و mod_rack میتونه مانع از اجرای هر بار Interpreter اون زبان بشه عمل میکنه و در این زمینه کند خواهد بود.

اخیراً دو تا پروژه وب سایت روی Server اختصاصی VPS را شروع کردم و با توجه به مطالبی که در مورد Nginx خونده بودم میخواستم امتحانش کنم و ببینم چقدر از Apache بهتر عمل میکنه. البته من با استفاده از php-fpm روی Nginx اصلاً مشکل سرعت برای php که در پاراگراف بالا اشاره کردم را احساس نکردم و در کل به نظرم خیلی بهتر از Apache جواب میده.مشکل بزرگی که داشتم عدم پشتیبانی از htaccess. برای همون بحث سرعت بود که تونستم به روش Nginx مشکلاتش را حل کنم.

شما هم میتونین روی سیستم Local خودتون Nginx را امتحان کنید و از سرعت بالاش در پروژه های بعدی بهره ببرید.

ارسال ایمیل از طریق حساب کاربری Gmail با PHP (پی اچ پی) از طریق SMTP

نویسنده:
2 دسامبر 14

توی خیلی از انجمن‌های برنامه نویسی به این سؤال برخوردم که چطور باید با PHP از حساب کاربری Gmail ایمیل ارسال کنیم. عده‌ای هم که میدونستند چطور باید این کار را بکنند اکثر ناموفق بودند. تصمیم گرفتم این مطلب را بنویسم تا مشکل خیلی از دوستان حل بشه.

برای ارسال ایمیل از Gmail برخلاف حالتی که از طریق وب سرور و یک MTA مثل Sendmail ایمیل ارسال میکنیم ، باید از SMTP استفاده کنیم. لازم هم نیست خیلی در مورد SMTP بدونیم و کلاس PHPMailer به خوبی SMTP را پشتیبانی میکنه. پس اولین کار اینه که PHPMailer را دانلود کنیم و بسته به مسیری که قرار دادیمش توی فایل ارسال ایمیل صداش کنیم. حواستون باشه که توی Package ی که دانلود میکنید یک فایل smtp.php هم هست که باید اون را هم در کنار فایل phpmailer.php قرار بدین.

دو نکته مهم :

۱ – اولین نکته مهمی که در رابطه با Gmail وجود داره این هست که Gmail از SSL/TLS استفاده میکنه.TLS روی پورت ۵۸۷ هست و توی کد بایستی به درستی تنظیم بشه.

۲ – دومین نکته مهمی که وجود داره بحث امنیت بالای خود Gmail هست. Gmail به شدت روی IP درخواست های ورود (در حالت SMTP هم شما مثل وب Login میکنید) حساس هست و مثلاً اگه شما از حساب Gmail خودتون توی ایران استفاده میکنید و سعی کنید با SMTP یک ایمیل از سرر خودون که مثلاً در انگلستان هست ارسال کنید. ۹۹ درصد Gmail مانع از Authentication پرتوکل SMTP میشه و خطای Authentication خواهید گرفت. یک ایمیل هم با افتخار از Gmail براتون ارسال میشه که شخص دیگری با پسورد صحیح شما از یک جای دیگه سعی کرده وارد بشه و ما جلوش را گرفتیم !!! :(. این موضوع دو تا راه حل داره :

راه حل اول : حساب کاربری Gmail را روی سرور خودتون بسازین و همیشه هم از همون سرور و IP درخواست SMTP بدین.

راه حل دوم : توی تنظیمات حساب کاربری گوگل در بخش Security → Account Permissions آیتم Access for less secure apps را Enabled کنین (این تغییر تا زمان نوشته شدن این مطلب وجود داشت و ممکنه بعد از مدتی مکانش یا حالتش عوض بشه یا حتی gmail بخواد که شما IP های معتبر مد نظرتون را تعیین کنین).

و اما کد :

 error_reporting(E_ALL);
 ini_set('display_errors','1');

 require("phpmailer.php");
 
 $mailObj = new phpmailer();
 $mailObj->IsSmtp();
 $mailObj->SMTPSecure = "tls";
 $mailObj->Host = "smtp.gmail.com";
 $mailObj->Port = "587";
 $mailObj->SMTPAuth = true;
 $mailObj->Username = "username@gmail.com";
 $mailObj->Password = "password";
 $mailObj->SMTPDebug = true; 
 $mailObj->CharSet = "utf-8";
 $mailObj->FromName = "Fullname";
 $mailObj->From = "username@gmail.com";
 $mailObj->AddAddress("recipient@domain.com",""); 
 $mailObj->Subject = "=?UTF-8?B?".base64_encode("عنوان فارسی نامه")."?=";
 $mailObj->Body = "متن نامه";
 $mailObj->Send();
 
 if ($mailObj->ErrorInfo != "")
 throw new Exception($mailObj->ErrorInfo);
 else 
 echo "Mail sent.";
 
 unset($mailObj);

پی نوشت : با وجود بررسی و دقتی که من در چگونگی حل مشکل ارسال از طریق Gmail SMTP داشتم باز هم یکی از دوستان مشکل داشتند که پس از بررسی متوجه ۲ نکته شدم ، توجه داشته باشید که فقط زمانی این دو نکته را اعمال کنید که خطای Authentication Failure بگیرین یا توی برگشتی Debug جمله Please log in via your web browser بگیرین و در ضمن اگه نکته ۱ مشکل را حل کرد نیاز به اعمال نکته ۲ نیست :

نکته ۱ : پس از ورود به حساب gmail روی این لینک https://www.google.com/accounts/DisplayUnlockCaptcha کلیک کنید و Accept کنید.
نکته ۲ : گذرواژه خودتون را عوض کنید و گذرواژه‌ای شامل حروف کوچک و بزرگ ، اعداد و علایم با طول حداقل ۸ کاراکتر انتخاب کنید.