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

هنگام توسعه پروژه های بزرگ، سوال بهینه سازی کد پروژه به تدریج مطرح می شود: مصرف حافظه چقدر موجه است، چگونه می توانید سرعت اجرای کدهای PHP نوشته شده را افزایش دهید. در ابتدا، بسیاری از مردم به درستی و کارایی کد نوشته شده فکر نمی کنند؛ آنها بر اساس این اصل می نویسند: کار می کند - و این اشکالی ندارد. اگرچه مفسر PHP در اجرای کد PHP بسیار سریع است، و تنگناهای زیادی وجود دارد که اجرای کد را کاهش می‌دهد که خارج از PHP هستند، بهینه‌سازی کد PHP نیز مهم است و بهینه‌سازی کد باید در مراحل اولیه کدنویسی اعمال شود.

اکثر اسکریپت های PHP کارهای ساده ای انجام می دهند. رفتار استاندارد اسکریپت این است که مقدار کمی از اطلاعات را از کاربر دانلود کند، برخی از اطلاعات را از یک پایگاه داده یا فایل بازیابی کند، HTML مناسب را خروجی کند و نتیجه را برای مشتری ارسال کند. در اینجا، اولین چیزی که باید درک کنید این است که دقیقاً نتیجه بهینه‌سازی چیست: عملکرد، سهولت مقیاس‌بندی، کاهش میزان استفاده از منابع سرور، کاهش زمان انتقال داده یا همه. در مورد دوم، نه تنها لازم است همه مناطق بحرانی را پیدا کنیم، بلکه بهینه سازی آنها را نیز متعادل کنیم.

بگذارید یک مثال ساده برای شما بگویم: اجازه دهید دو اسکریپت روی یک سرور با 100 مگابایت رم رایگان وجود داشته باشد که نتیجه آن یکسان است. اسکریپت اول برای بهینه سازی شده است حداکثر عملکرد، به 10 مگابایت حافظه نیاز دارد و با خواندن کامل فایل، داده ها را از فایل دریافت می کند، دوم - برای حداقل مصرف حافظه، به 5 مگابایت حافظه نیاز دارد و داده ها را از همان فایل به صورت قطعات دریافت می کند. در نتیجه یک درخواست، اسکریپت اول سریعتر از دومی اجرا می شود، اما اگر همزمان بیش از ده درخواست وجود داشته باشد، این سرعت اسکریپت دوم است که بیشتر می شود. چرا این اتفاق می افتد؟ در اسکریپت اول، گلوگاه استفاده از منابع حافظه است، در دوم - ویژگی های سیستم I/O. پس از اینکه اسکریپت اول تمام RAM موجود را مصرف کرد، سیستم به استفاده از حافظه مجازی تغییر می کند و همان سیستم I/O به گلوگاه اضافی این طرح تبدیل می شود.

البته، این مثال تا حد زیادی ساده شده است، و گلوگاه های دیگری به جز RAM وجود دارد، اما ایده اصلی این است: بهینه سازی برای یک مورد می تواند به یک نقطه بحرانی در مورد دیگر تبدیل شود. در مثال، در نتیجه بهینه سازی برای افزایش جزئی سرعت در بارهای کم، سرعت اجرای اسکریپت در بارهای بالاتر به طور قابل توجهی کاهش یافت. بنابراین، برای بازدهی بهتر، مهم است که انرژی خود را صرف بهینه سازی مناطقی کنید که واقعاً شایسته توجه هستند.

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

در زیر مراحل اصلی عملکرد نسخه PHP 5 آمده است:

اقدامات برای بهینه سازی مصرف رم:

  1. نتایج عملکردهای خود را تجزیه و تحلیل کنید. قبل از نوشتن یک تابع، بررسی کنید که آیا معادل استاندارد وجود دارد یا خیر.
  2. آزاد کردن حافظه زمانی که آرایه‌ها یا اشیاء بزرگ به پایان می‌رسند فقط در محدوده جهانی استفاده می‌شوند (حافظه به طور خودکار در محدوده محلی آزاد می‌شود). لطفا توجه داشته باشید که تابع unset()یک متغیر را از محدوده حذف می کند و تنها در صورتی که هیچ مرجع دیگری به شی وجود نداشته باشد، حافظه اشغال شده توسط شی را آزاد می کند. اختصاص دادن یک مقدار به یک متغیر خالیهمیشه شی را از بین می برد و حافظه اشغال شده توسط شی را آزاد می کند، صرف نظر از اینکه آیا هنوز به این شیء ارجاعاتی وجود دارد یا خیر. در این صورت، متغیر از محدوده حذف نخواهد شد، یعنی. در واقع، متغیر حاوی یک مقدار تعریف نشده (صفر) خواهد بود و بر این اساس، حافظه محتویات این متغیر (حدود 72 بایت) را اشغال می کند.
  3. تجزیه و تحلیل توجیه استفاده از OOP (برنامه نویسی شی گرا). قبل از نوشتن کد شی گرا، دو سوال از خود بپرسید: "آیا این به یک رویکرد شی گرا نیاز دارد؟" و "آیا می توانم کد شی گرا بنویسم؟" به عنوان مثال، تعریف یک تابع استاتیک در داخل یک کلاس، مقدار حافظه مورد نیاز را فقط برای نگهداری آن تابع به میزان 10-18 درصد افزایش می دهد. استفاده از آرایه به جای کلاس به عنوان ساختار نیز باعث صرفه جویی در حافظه می شود. ممکن است به جای پیاده سازی آنها به عنوان متدهای کلاس، صرفاً قرار دادن توابع در یک فایل جداگانه سودمندتر باشد.
  4. تجزیه و تحلیل امکان پیاده سازی نسخه ایستا از یک متد در یک کلاس. اگر روش از پارامتری استفاده نمی کند این $، سپس باید با استفاده از کلمه کلیدی اعلام شود ایستا.

اقداماتی برای افزایش سرعت اجرای کد:

  1. تجزیه و تحلیل بهینه سازی پرس و جو SQL. در اکثر پروژه ها، بهینه سازی پرس و جوی SQL است که بیشترین افزایش عملکرد را فراهم می کند.
  2. استفاده از بافر خروجی و ماژول های مختلف کش می تواند عملکرد را 25% تا 100% افزایش دهد.
  3. استفاده از نام‌های کوتاه‌تر برای متغیرها، توابع، ثابت‌ها و کلاس‌ها می‌تواند عملکرد را تا ۲۰ درصد بهبود بخشد. در عین حال، پشتیبانی بیشتر کد را فراموش نکنید؛ نام تابع واضح هنگام تغییر کد بسیار راحت تر است.
  4. بررسی وجود یک متغیر (تابع isset()) قبل از تماس با او. سرکوب خطایی که هنگام دسترسی به یک متغیر ناموجود با استفاده از @ رخ می دهد، عملکرد بسیار خوبی است.
  5. استفاده از "منفرد نقل قول" به شما امکان می دهد کد را سریعتر تفسیر کنید، زیرا در مورد "کوتیشن های دوگانه"، متغیرها در داخل رشته جستجو می شوند
  6. تجزیه و تحلیل امکان حذف توابع "اضافی" از حلقه. به عنوان مثال، جایگزینی یک تابع شمردن()به متغیری که قبل از شروع حلقه محاسبه شده و حاوی نتیجه این تابع در عبارت است برای ($i=0; $i بهره وری این چرخه را افزایش خواهد داد. در غیر این صورت عملکرد شمردن()در هر تکرار حلقه فراخوانی و اجرا خواهد شد.
  7. با استفاده از اپراتور موردبه جای استفاده از چندین ساختار اگر دیگری.
  8. استفاده از دسترسی صریح به فیلدهای آرایه. واژگونی فرم $array["id"] 7 برابر سریعتر از معکوس اجرا می شود آرایه $. علاوه بر این، این از خطاها در هنگام پشتیبانی بیشتر از اسکریپت محافظت می کند، زیرا یک روز ممکن است ثابتی به نام وجود داشته باشد شناسه.
  9. استفاده از یک متغیر اضافی حاوی ارجاع به آرایه نهایی هنگام پردازش آرایه های چند بعدی در یک حلقه. برای سرعت بخشیدن به چرخه برای ($i = 0؛ $i< 5; $i++) $a["b"]["c"][$i] = func($i); ، قبل از شروع حلقه می توان دستور بعدی را نوشت $item =p$a["b"]["c"]و حلقه را به این صورت بازنویسی کنید: برای ($i = 0؛ $i< 5; $i++) $ref[$i] = $i; .
  10. استفاده از ماژول های Apache mod_gzip و mod_deflate به شما این امکان را می دهد که ترافیک را کاهش دهید و در نتیجه سرعت بارگذاری صفحه را افزایش دهید.

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

  1. استفاده +$iبجای $i++در چرخه باعث افزایش عملکرد 6٪ می شود.
  2. استفاده از "کوتیشن های مضاعف" برای به هم پیوستن متغیرها. دستورالعمل فرم $s="$s1$s2$s3"سریعتر از $s=$s1.$s2.$s3. این عبارت فقط برای سه یا چند متغیر صادق است.
  3. استفاده از مسیرهای کامل در دستورالعمل ها عبارتند ازو نیازبه شما این امکان را می دهد که زمان کمتری را صرف جستجوی سیستم برای یافتن مسیر واقعی کنید.
  4. بستن اتصالات باز به پایگاه داده پس از عدم نیاز به آنها. در عین حال، نباید چندین بار به یک پایگاه داده متصل شوید.
  5. تحلیل امکان سنجی جایگزینی عبارتند از()و include_once()بر نیاز()و require_once()به ترتیب.
  6. استفاده از درج HTML در کد، به جای خروجی مقدار قابل توجهی از خطوط ثابت (که حاوی نتایج کد نیستند). به طور کلی سرعت صدور یک صفحه ثابت (HTML) چندین برابر سریعتر از صدور یک صفحه نوشته شده با PHP است. اما شما نباید اینجا رانده شوید، زیرا ... ورود و خروج مفسر به حالت پردازش PHP نیز سرور را بارگیری می کند.
  7. تجزیه و تحلیل امکان جایگزینی توابع preg_replaceو str_replaceدر بعضی موارد. تابع str_replaceسریعتر از preg_replaceو در عین حال تابع strtrتوابع سریعتر str_replace. همچنین با استفاده از توابع رشته ای strncasecmp, strpbrkو striposبهینه تر از استفاده از عبارات منظم. با این حال، به جای تودرتو کردن این توابع، باید از توابع عبارت منظم استفاده کنید.
  8. با استفاده از مقداردهی اولیه متغیر صریح. به عنوان مثال، افزایش یک متغیر بدون مقدار اولیه 9-10 برابر کندتر از یک متغیر اولیه است. علاوه بر این، هنگام تنظیم اولیه متغیرها به طور صریح، خطاهای کمتری وجود دارد.
  9. به عنوان یک نتیجه، من می خواهم توجه داشته باشم که استفاده از طراحی اکو، به جای یک تابع چاپ، افزایش قابل توجهی در بهره وری ایجاد نمی کند.
  • برای تعیین زمان شروع اجرای اسکریپت، به جای توابعی که زمان جاری را برمی گرداند، ترجیحاً از $_SERVER["REQUEST_TIME"].
  • از یک نمایه ساز برای شناسایی بخش های مهم کد استفاده کنید.

قبل از بهینه‌سازی عملکرد کد، اکیداً توصیه می‌کنم بهینه‌سازی کوئری‌های SQL را در پایگاه داده و همچنین بهینه‌سازی کوئری‌های http، کاهش اندازه js و css، فکر کردن در مورد کش کردن قالب‌ها و تنها پس از آن شروع به آزمایش کد برای عملکرد کنید.

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

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

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

چرا مجموعه ای از نکات و حقایق به جای قوانین سختگیرانه؟ زیرا همانطور که دیدم هیچ "بهینه سازی کاملا درستی" وجود ندارد. بسیاری از تکنیک ها و قوانین متناقض هستند و پیروی از همه آنها غیرممکن است. شما باید مجموعه ای از روش ها را انتخاب کنید که بدون به خطر انداختن ایمنی و راحتی، قابل قبول باشند. من موضع توصیه‌ای گرفته‌ام و بنابراین توصیه‌ها و حقایقی دارم که شما ممکن است رعایت کنید یا نکنید.

برای جلوگیری از سردرگمی، تمام نکات و حقایق را به 3 گروه تقسیم کردم:

  • بهینه سازی در سطح منطق و سازماندهی برنامه
  • بهینه سازی کد
  • بهینه سازی بی فایده

گروه ها به صورت مشروط تعیین می شوند و برخی از موارد را می توان همزمان به چندین مورد از آنها نسبت داد. اعداد مربوط به یک سرور متوسط ​​(LAMP) هستند. این مقاله مسائل مربوط به اثربخشی فن آوری ها و چارچوب های شخص ثالث مختلف را مورد بحث قرار نمی دهد، زیرا این موضوع برای بحث های جداگانه است.

بهینه سازی در سطح منطق و سازماندهی برنامه

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

  • به طور مداوم کد خود را در سرور (xdebug) و مشتری (firebug) نمایه کنید تا گلوگاه های کد شناسایی شود.
    لازم به ذکر است که هر دو بخش سرور و کلاینت نیاز به پروفایل دارند، زیرا تمام خطاهای سرور در خود سرور قابل شناسایی نیستند.
  • تعداد توابع کاربر استفاده شده در برنامه به هیچ وجه روی سرعت تاثیر نمی گذارد
    این به برنامه اجازه می دهد تا از توابع سفارشی بی شماری استفاده کند.
  • استفاده فعال از ویژگی های سفارشی
    اثر مثبت به این دلیل به دست می آید که عملیات درون توابع فقط با متغیرهای محلی انجام می شود. تأثیر این بیشتر از هزینه فراخوانی تابع سفارشی است.
  • توصیه می شود توابع "بسیار سنگین" را در یک زبان برنامه نویسی شخص ثالث در قالب پسوند PHP پیاده سازی کنید.
    این امر مستلزم مهارت های برنامه نویسی در یک زبان شخص ثالث است که زمان توسعه را به میزان قابل توجهی افزایش می دهد، اما در عین حال امکان استفاده از تکنیک های فراتر از توانایی های PHP را فراهم می کند.
  • پردازش یک فایل html ایستا سریعتر از یک فایل php تفسیر شده است
    تفاوت زمان در مشتری می تواند حدود 1 ثانیه باشد، بنابراین منطقی است که صفحات استاتیک را به وضوح از صفحات تولید شده توسط ابزارهای PHP جدا کنید.
  • اندازه فایل پردازش شده (متصل) روی سرعت تأثیر می گذارد
    تقریباً 0.001 ثانیه برای پردازش هر 2 کیلوبایت صرف می شود. این واقعیت ما را وادار می کند تا کد اسکریپت را هنگام انتقال آن به سرور تولید به حداقل برسانیم.
  • سعی کنید همیشه از require_one یا include_once استفاده نکنید
    زمانی که امکان خواندن مجدد فایل وجود دارد، باید از این توابع استفاده شود؛ در موارد دیگر، توصیه می‌شود از نیاز و درج آن استفاده شود.
  • هنگام انشعاب یک الگوریتم، اگر ساختارهایی وجود دارد که ممکن است پردازش نشوند و حجم آنها حدود 4 کیلوبایت یا بیشتر باشد، بهتر است آنها را با استفاده از include درج کنید.
  • توصیه می شود از تأیید داده های ارسال شده روی مشتری استفاده کنید
    این به این دلیل است که هنگام بررسی داده ها در سمت مشتری، تعداد درخواست هایی با داده های نادرست به شدت کاهش می یابد. سیستم های اعتبار سنجی داده های سمت مشتری عمدتاً با استفاده از JS و عناصر فرم سفت و سخت (انتخاب) ساخته می شوند.
  • توصیه می شود که ساختارهای DOM بزرگ برای آرایه های داده روی مشتری بسازید
    این یک روش بهینه سازی بسیار موثر در هنگام کار با مقادیر زیادی از داده های نمایش داده شده است. ماهیت آن به موارد زیر خلاصه می شود: آرایه ای از داده ها بر روی سرور آماده می شود و به مشتری منتقل می شود و ساخت ساختارهای DOM برای توابع JS ارائه می شود. در نتیجه، بار تا حدی از سرور به مشتری توزیع می شود.
  • سیستم های ساخته شده بر اساس فناوری AJAX به طور قابل توجهی سریعتر از سیستم هایی هستند که از این فناوری استفاده نمی کنند
    این به دلیل کاهش حجم خروجی و توزیع مجدد بار روی مشتری است. در عمل سرعت سیستم های دارای AJAX 2-3 برابر بیشتر است. اظهار نظر: AJAX به نوبه خود تعدادی محدودیت در استفاده از سایر روش های بهینه سازی ایجاد می کند، به عنوان مثال، کار با یک بافر.
  • هنگام دریافت درخواست پست، همیشه چیزی، شاید حتی یک فاصله را برگردانید
    در غیر این صورت صفحه خطای چند کیلوبایتی برای مشتری ارسال می شود. این خطا در سیستم هایی که از فناوری AJAX استفاده می کنند بسیار رایج است.
  • بازیابی اطلاعات از یک فایل سریعتر از یک پایگاه داده است
    این تا حد زیادی به دلیل هزینه اتصال به پایگاه داده است. در کمال تعجب، درصد زیادی از برنامه نویسان به صورت دیوانه ای تمام داده ها را در پایگاه داده ذخیره می کنند، حتی زمانی که استفاده از فایل ها سریع تر و راحت تر است. اظهار نظر:می‌توانید داده‌ها را در فایل‌هایی که جستجو نمی‌شوند ذخیره کنید، در غیر این صورت، باید از پایگاه داده استفاده کنید.
  • مگر در موارد ضروری به پایگاه داده متصل نشوید
    به دلیلی که برای من ناشناخته است، بسیاری از برنامه نویسان در مرحله خواندن تنظیمات به پایگاه داده متصل می شوند، اگرچه ممکن است بعداً به پایگاه داده پرس و جو نکنند. این یک عادت بد است که هزینه آن به طور متوسط ​​0.002 ثانیه است.
  • هنگامی که تعداد کمی مشتری فعال به طور همزمان وجود دارد، از یک اتصال دائمی به پایگاه داده استفاده کنید
    مزیت زمانی به دلیل کمبود هزینه برای اتصال به پایگاه داده است. اختلاف زمانی تقریباً 0.002 ثانیه است. اظهار نظر:اگر تعداد کاربران زیاد است، استفاده از اتصالات دائمی توصیه نمی شود. هنگام کار با اتصالات مداوم، باید مکانیزمی برای پایان دادن به اتصالات وجود داشته باشد.
  • استفاده از پرس و جوهای پیچیده پایگاه داده سریعتر از استفاده از چندین مورد ساده است
    تفاوت زمانی به عوامل زیادی (حجم داده، تنظیمات پایگاه داده و غیره) بستگی دارد و در هزارم و گاهی حتی صدم ثانیه اندازه گیری می شود.
  • استفاده از محاسبات در سمت DBMS سریعتر از محاسبات در سمت PHP برای داده های ذخیره شده در پایگاه داده است.
    این به دلیل این واقعیت است که چنین محاسباتی در سمت PHP به دو پرس و جو برای پایگاه داده (دریافت و تغییر داده ها) نیاز دارد. تفاوت زمانی به عوامل زیادی (حجم داده، تنظیمات پایگاه داده و ...) بستگی دارد و بر حسب هزارم و صدم ثانیه اندازه گیری می شود.
  • اگر داده های نمونه از پایگاه داده به ندرت تغییر می کند و بسیاری از کاربران به این داده ها دسترسی دارند، ذخیره داده های نمونه در یک فایل منطقی است.
    به عنوان مثال، می‌توانید از روش ساده زیر استفاده کنید: داده‌های نمونه را از پایگاه داده دریافت می‌کنیم و آن‌ها را به عنوان یک آرایه سریالی در یک فایل ذخیره می‌کنیم، سپس هر کاربری از داده‌های فایل استفاده می‌کند. در عمل، این روش بهینه سازی می تواند افزایش چند برابری در سرعت اجرای اسکریپت ایجاد کند. اظهار نظر:هنگام استفاده از این روش، باید ابزارهایی برای تولید و تغییر داده های ذخیره شده در فایل بنویسید.
  • داده های کش که به ندرت با memcached تغییر می کنند
    افزایش زمان می تواند بسیار قابل توجه باشد. اظهار نظر:حافظه پنهان برای داده های ایستا موثر است؛ برای داده های پویا، اثر کاهش می یابد و ممکن است منفی باشد.
  • کار بدون اشیا (بدون OOP) تقریباً سه برابر سریعتر از کار با اشیا است
    حافظه بیشتری نیز مصرف می شود. متأسفانه، مفسر PHP نمی تواند با OOP به سرعت توابع معمولی کار کند.
  • هرچه ابعاد آرایه بزرگتر باشد، کندتر کار می کنند
    اتلاف زمان به دلیل دست زدن به سازه های تو در تو رخ می دهد.

بهینه سازی کد

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

  • echo و print به طور قابل توجهی سریعتر از printf هستند
    اختلاف زمانی می تواند به چند هزارم ثانیه برسد. زیرا از printf برای خروجی داده های فرمت شده استفاده می شود و مفسر کل خط را برای چنین داده هایی بررسی می کند. printf فقط برای خروجی داده هایی که نیاز به قالب بندی دارند استفاده می شود.
  • echo $var."text" سریعتر از echo "$var text" است
    این به این دلیل است که موتور PHP در حالت دوم مجبور است به دنبال متغیرهای داخل رشته بگردد. برای حجم زیاد داده و نسخه های قدیمی PHP، تفاوت های زمانی قابل توجه است.
  • echo "a" سریعتر از echo "a" برای رشته های بدون متغیر است
    این به این دلیل است که در مورد دوم موتور PHP در تلاش برای یافتن متغیرها است. برای حجم زیادی از داده ها، تفاوت در زمان کاملاً محسوس است.
  • اکو "a"، "b" سریعتر از اکو "a"."b" است.
    خروجی داده های جدا شده با کاما سریعتر از نقطه است. این به این دلیل است که در حالت دوم الحاق رشته رخ می دهد. برای حجم زیادی از داده ها، تفاوت در زمان کاملاً محسوس است. توجه داشته باشید:این فقط با تابع echo کار می کند که می تواند چندین خط را به عنوان آرگومان بگیرد.
  • $return="a"; $return.="b"; echo $return; سریعتر از اکو "a"؛ پژواک "ب"؛
    دلیل آن این است که خروجی داده ها به برخی عملیات اضافی نیاز دارد. برای حجم زیادی از داده ها، تفاوت در زمان کاملاً محسوس است.
  • ob_start(); پژواک "a"؛ پژواک "ب"؛ ob_end_flush(); سریعتر از $return="a"; $return.="b"; echo $return;
    این به این دلیل است که تمام کارها بدون دسترسی به متغیرها انجام می شود. برای حجم زیادی از داده ها، تفاوت در زمان کاملاً محسوس است. اظهار نظر:اگر با AJAX کار می کنید، این تکنیک بی اثر است، زیرا در این مورد مطلوب است که داده ها را به صورت یک رشته برگردانید.
  • از "درج حرفه ای" یا؟> a ب استفاده کنید
    داده های استاتیک (خارج کد برنامه) سریعتر از خروجی پردازش می شوند داده های PHP. این تکنیک درج حرفه ای نامیده می شود. برای حجم زیادی از داده ها، تفاوت در زمان کاملاً محسوس است.
  • readfile سریعتر از file_get_contents است، file_get_contents سریعتر از نیاز است، و require سریعتر از شامل برای خروجی محتوای ثابت از یک فایل است.
    زمان لازم برای خواندن یک فایل خالی از 0.001 برای readfile تا 0.002 برای include متغیر است.
  • نیاز سریعتر از شامل فایلهای تفسیر شده است
    اظهار نظر:هنگام انشعاب یک الگوریتم، زمانی که امکان استفاده از فایل تفسیر شده وجود دارد، باید از include استفاده کنید، زیرا الزام همیشه شامل فایل است.
  • اگر (...) (...) در غیر این صورت اگر (...) () سریعتر از سوئیچ باشد
    زمان بستگی به تعداد شاخه ها دارد.
  • اگر (...) (...) در غیر این صورت اگر (...) () سریعتر از اگر (...) (...); اگر (...) ();
    زمان بستگی به تعداد شاخه ها و شرایط دارد. در صورت امکان باید از دیگری استفاده کنید، زیرا سریعترین ساختار "شرطی" است.
  • رایج ترین شرایط ساخت if (...) (...) else if (...) () باید در ابتدای انشعاب قرار گیرد.
    مفسر ساختار را از بالا به پایین اسکن می کند تا زمانی که شرایط را برآورده کند. اگر مفسر متوجه شد که شرط برآورده شده است، آنگاه به بقیه ساختار نگاه نمی کند.
  • < x; ++$i) {...} быстрее, чем for($i = 0; $i < sizeOf($array); ++$i) {...}
    این به این دلیل است که در حالت دوم، عملیات sizeOf در هر تکرار اجرا می شود. تفاوت زمان اجرا به تعداد عناصر آرایه بستگی دارد.
  • x = sizeOf($array); برای ($i = 0؛ $i< x; ++$i) {...} быстрее, чем foreach($arr as $value) {...} для не ассоциативных массивов
    اختلاف زمانی قابل توجه است و با افزایش آرایه افزایش می یابد.
  • preg_replace سریعتر از ereg_replace است، str_replace سریعتر از preg_replace است، اما strtr سریعتر از str_replace است
    تفاوت زمانی بستگی به مقدار داده دارد و می تواند به چند هزارم ثانیه برسد.
  • توابع رشته ای سریعتر از عبارات با قاعده
    این قانون نتیجه قاعده قبلی است.
  • متغیرهای آرایه‌ای را که دیگر برای آزاد کردن حافظه مورد نیاز نیستند حذف کنید.
  • اجتناب از استفاده از سرکوب خطا @
    سرکوب خطا تعدادی عملیات بسیار آهسته ایجاد می کند و از آنجایی که نرخ تلاش مجدد می تواند بسیار بالا باشد، کاهش سرعت می تواند قابل توجه باشد.
  • if (isset($str(5))) (...) سریعتر از if (strlen($str)>4)(...) است
    این به این دلیل است که به جای تابع strlen برای دستکاری رشته ها از عملیات تست استاندارد isset استفاده می شود.
  • 0.5 سریعتر از 1/2 است
    دلیل آن این است که در حالت دوم عملیات تقسیم انجام می شود.
  • هنگام برگرداندن مقدار یک متغیر از یک تابع، بازگشت سریعتر از جهانی است
    زیرا در حالت دوم یک متغیر سراسری ایجاد می شود.
  • $row["id"] سریعتر از $row است
    گزینه اول 7 برابر سریعتر است.
  • $_SERVER['REQUEST_TIME'] برای تعیین زمان اجرای یک اسکریپت سریعتر از time() است.
  • if ($var===null) (...) سریعتر از if (is_null($var)) است (...)
    دلیل آن این است که در حالت اول از تابع استفاده نمی شود.
  • ++i سریعتر از i++ است، -- من سریعتر، از من--
    این به دلیل ویژگی های هسته PHP است. اختلاف زمانی کمتر از 0.000001 است، اما اگر این روش ها را هزاران بار تکرار کنید، نگاهی دقیق تر به این بهینه سازی بیندازید.
  • افزایش متغیر اولیه i=0; ++i; سریعتر از غیر اولیه ++i
    اختلاف زمانی حدود 0.000001 ثانیه است، اما به دلیل احتمال تکرار تکرار، این واقعیت را باید به خاطر داشت.
  • استفاده از متغیرهای بازنشسته سریعتر از اعلام متغیرهای جدید است
    یا اجازه دهید آن را به شکل دیگری بیان کنم: متغیرهای غیر ضروری ایجاد نکنید.
  • کار با متغیرهای محلی تقریباً 2 برابر سریعتر از متغیرهای جهانی است
    اگرچه اختلاف زمانی کمتر از 0.000001 ثانیه است، اما به دلیل سرعت تکرار بالا، باید سعی کنید با متغیرهای محلی کار کنید.
  • دسترسی مستقیم به یک متغیر سریعتر از فراخوانی تابعی است که این متغیر در آن چندین بار تعریف شده است
    فراخوانی یک تابع تقریباً سه برابر فراخوانی یک متغیر زمان می برد.

بهینه سازی بی فایده

تعدادی از روش های بهینه سازی در عمل تاثیر زیادی بر سرعت اجرای اسکریپت ندارند (افزایش زمان کمتر از 0.000001 ثانیه است). با وجود این، چنین بهینه سازی اغلب موضوع بحث و جدل است. من این حقایق "بی فایده" را ارائه کردم تا در آینده هنگام نوشتن کد به آنها توجه خاصی نداشته باشید.

  • اکو سریعتر از چاپ است
  • include ("مسیر مطلق") سریعتر از include ("مسیر نسبی") است.
  • sizeOf سریعتر از شمارش است
  • foreach ($arr به عنوان $key => $value) (...) سریعتر از تنظیم مجدد ($arr) است. while (list($key, $value) = هر ($arr)) (...) برای آرایه های انجمنی
  • کد بدون کامنت سریعتر از کد نظر داده شده است زیرا خارج می شود زمان اضافیبرای خواندن فایل
    کاهش حجم نظرات به خاطر بهینه سازی بسیار احمقانه است؛ فقط باید در اسکریپت های کاری ("مبارزه") حداقل سازی را انجام دهید.
  • متغیرهای با نام های کوتاهسریعتر از متغیرهایی با نام طولانی
    این به دلیل کاهش مقدار کد در حال پردازش است. مشابه نکته قبلی، فقط باید در اسکریپت های کاری ("مبارزه") حداقل سازی را انجام دهید.
  • علامت گذاری کد با استفاده از زبانه ها سریعتر از استفاده از فاصله است
    مشابه نکته قبل.

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


اگر سوالی دارید، توصیه می کنیم از ما استفاده کنید

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

1. انجمن فایل های CSSبا استفاده از PHP.

به عنوان توسعه دهندگان وب، ما اغلب استایل ها را بین چندین شیوه نامه تقسیم می کنیم تا ساختار منطقی تر داشته باشیم و بعداً اصلاح کنیم. با این حال، این باعث افزایش تعداد درخواست ها به سرور می شود که نتیجه آن بیشتر است بارگذاری کندصفحات با استفاده از PHP می‌توانیم دو پرنده را با یک سنگ بکشیم: چندین شیوه نامه داشته باشیم و فقط از یک کوئری برای دسترسی به همه آنها استفاده کنیم.

آماده سازی

قبل از بهینه سازی فایل های CSS، برای کار کردن به استایل ها نیاز داریم. بیایید چند فایل سبک ایجاد کنیم:

// main.css
// برای مثال CSS

بدن (
عرض: 800 پیکسل؛
حاشیه: 0 خودکار;
رنگ: خاکستری؛
}

#لفافه (
حاشیه بالا: 30 پیکسل.
پس زمینه: url(../images/cats.png);
}
// typography.css
// برای مثال CSS

بدن (
font-family: Arial, san-serif;
فونت-وزن: پررنگ;
}

قوی (
اندازه فونت: 120%;
}
//forms.css
// برای مثال CSS

فرم(
موقعیت: نسبی;
بالا: 400 پیکسل؛
z-index: 99;
}

ورودی(
ارتفاع: 50 پیکسل؛
عرض: 400 پیکسل؛
}

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

//تعریف متغیرها
$cssPath = "./css/";
if (isset($_GET["q"])) (
$files = $_GET["q"];
// آرایه ای از فایل ها را دریافت کنید


foreach ($files به عنوان $key => $file) (
}

$cssData = "";
foreach ($files به عنوان $file) (

fclose($fileHandle);
}
}
// به مرورگر بگویید که یک فایل CSS داریم
if (isset($cssData)) (
echo $cssData;
) دیگر (
}
?>

//تعریف متغیرها
// --- توجه: مسیرها به اسلش دنباله دار نیاز دارند ---
$cssPath = "./css/";
if (isset($_GET["q"])) (
$files = $_GET["q"];
// آرایه فایل ها را دریافت کردم!

//بیایید مطمئن شویم که هیچ شخصیت ترسناکی در نام فایل ها وجود ندارد :) .
foreach ($files به عنوان $key => $file) (
$files[$key] = str_replace(array("/"، "\\"، ".")، ""، $file);
}

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

$cssData = "";
foreach ($files به عنوان $file) (
$cssFileName = $cssPath . $file. ".css"؛
$fileHandle = fopen($cssFileName، "r");

$cssData .= "\n" . fread($fileHandle، fileize($cssFileName));
fclose($fileHandle);
}
}

اکنون باید یک شیوه نامه مشترک از فایل ها ایجاد کنیم. برای انجام این کار، یک حلقه را اجرا می کنیم که از میان آرایه فایل ها می گذرد، هر فایل را باز می کند و آن را در یک فایل واحد ترکیب می کند. "\n" یک خط جدید برای نظم و تمیزی اضافه می کند. تابع filesize() برای پی بردن به طول فایل و ارسال آن به fread() استفاده می شود.

// به مرورگر بگویید که یک فایل CSS داریم
header("نوع محتوا: متن/css");
if (isset($cssData)) (
echo $cssData;
echo "\n\n// Generated: " . تاریخ ("r");
) دیگر (
echo "// فایل‌ها در دسترس نیستند یا فایل‌هایی مشخص نشده‌اند.";
}
?>

قسمت آخر کد تمام استایل ها را به مرورگر منتقل می کند. این بدان معناست که ما باید به PHP بگوییم که در حال انتقال اطلاعات CSS هستیم و PHP باید مرورگر را در این مورد مطلع کند. ما این کار را با استفاده از تابع header() انجام می دهیم و Content-type: text/css را تنظیم می کنیم. سپس CSS را به مشتری ارسال می کنیم. اما قبل از آن، وجود سبک های CSS را در فایل بررسی می کنیم. اگر آنها وجود نداشته باشند، به این معنی است که نام فایل های CSS منتقل نشده است. اگر فایلی داریم آنها را منتقل می کنیم و پیامی در مورد نسل اضافه می کنیم.

معاینه

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

اکنون تمامی فایل ها را در روت سایت آپلود کرده و از طریق مرورگر خود به فایل index.php دسترسی پیدا کنید. شما باید با عبارت “Files not available or no file specified” (فایل ها در دسترس نیستند یا مشخص نشده اند) استقبال کنید. این بدان معنی است که ما نام فایل هایی را که باید متصل شوند، ارائه نکرده ایم. با این حال، خبر خوب این است که همه چیز بدون خطا کار می کند. بیایید سعی کنیم "index.php?q=main" را در مرورگر تایپ کنیم. محتویات فایل main.css روی صفحه نمایش شما ظاهر می شود. در صورت نیاز به بازیابی چندین فایل و ادغام آنها، باید درخواست زیر "index.php?q=main&q=forms" را ارسال کنیم. همانطور که می بینید، می توانیم "q=" را هر چند بار که بخواهیم تکرار کنیم. می توانید حداقل 50 شیوه نامه را در یک فایل ترکیب کنید.

نتیجه

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

یک هشدار: اگر فایل index.php را در هر پوشه ای (نه پوشه CSS) قرار دهید، باید مسیرهای مربوط به تصاویر پس زمینه را طوری بنویسید که گویی index.php برگه سبک شما است. این چیزی است که مرورگر فکر می کند.

2. حذف خطوط خالی از HTML و CSS

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

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

آماده سازی

در زیر کدهای فایل های HTML و CSS آمده است.

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


هی یک صفحه






لورم ایپسوم دل...





بدن (
حداقل ارتفاع: 800 پیکسل؛
پس زمینه: مشکی؛
اندازه فونت: 18px;
}
#لفافه (
عرض: 960 پیکسل؛
حاشیه: 20 پیکسل خودکار؛
بالشتک: 15 پیکسل؛
}
#header h1 (
text-indent: -99999em;
پس زمینه: url(../images/header.png);

نمایش: بلوک؛
عرض: 100%؛
ارتفاع: 48 پیکسل;
}
#بدنه اصلی (
فونت-وزن: پررنگ;
}

مزیت این اسکریپت این است که می تواند همزمان با هر دو HTML و CSS کار کند. اسکریپت فایل را بارگیری می کند، تمام خطوط خالی را حذف می کند و تنها 1 فاصله باقی می گذارد تا کلمات در یک کل ترکیب نشوند.

$fileDirectory = "";
$file = $_GET["q"];
$ext = $nameExplode;

//بررسی هکرها
مرگ ("هکرها...!");
) دیگر (
//بیا شروع کنیم


//عجایب عبارات منظم

fclose($handle);
//داده های خروجی
اگر ($ext == "css") (
header("نوع محتوا: متن/css");
}
echo $newData;
}
?>

جزئیات بیشتر در مورد هر بخش از کد

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

$fileDirectory = "";
$file = $_GET["q"];
$nameExplode = explode(.", $file);
$ext = $nameExplode;
$fileName = $fileDirectory . $file;

این کد متغیرهای لازم را تنظیم می کند. دوباره تمام داده ها را از طریق "q" عبور می دهیم. پوشه فایل ها نیز در اینجا تعریف شده است.

اگر ($ext != "css" AND $ext != "htm" و $ext != "html") (
//بررسی هکرها
مرگ ("هکرها...!");
) دیگر (

در اینجا بررسی می کنیم که آیا فایل واقعا CSS یا HTML است.

//بیا شروع کنیم
$handle = fopen($fileName، "r");
$fileData = fread($handle, fileize($fileName));
//عجایب عبارات منظم
$newData = preg_replace("/\s+/", " ", $fileData);
fclose($handle);
//داده های خروجی
اگر ($ext == "css") (

header("نوع محتوا: متن/css");
}
echo $newData;
}
?>

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

آیا کار می کند؟

اگر "index.php?q=css.css" را در مرورگر خود تایپ کنید، یک خط CSS را مشاهده خواهید کرد. بنابراین همه چیز کار می کند! اگر کد منبع صفحه را باز کنید، همان تصویر را خواهید دید. با استفاده از این روش، یک فایل CSS 314 کاراکتری را به 277 کاراکتر کاهش دادیم. فایل HTML از 528 تا 448 کاراکتر. برای 15 خط کد بد نیست.

نتیجه

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

3. کش کردن اسکریپت های PHP.

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

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

جزئیات بیشتر

$fileDirectory = "";
$file = $_GET["q"];
$nameExplode = explode(.", $file);
$ext = $nameExplode;
$fileName = $fileDirectory . $file;
//-- ما داده های کافی برای ایجاد نام فایل کش در اینجا داریم --
if ($ext != "css" AND $ext != "htm" AND $ext != "html") (
//افراد شرور را بررسی کنید...
مرگ ("هکرها...!");
) دیگر (

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

//بریم به کسب و کار برسیم
$handle = fopen($fileName، "r");
$fileData = fread($handle, fileize($fileName));
//حالا برای جادوگری regex!
$newData = preg_replace("/\s+/", " ", $fileData);

Fclose($handle);
//زمان خروجی داده ها.

//-- اکنون می‌توانیم داده‌های جدید را در صورت نیاز ذخیره کنیم و داده‌ها را تولید کنیم --

اگر ($ext == "css") (
header("نوع محتوا: متن/css");
}
echo $newData;
}
?>

$fileDirectory = "";
$file = $_GET["q"];
$nameExplode = explode(.", $file);
$ext = $nameExplode;
$fileName = $fileDirectory . $file;
$cacheName = "./cache/" . $nameExplode. $nameExplode. ".tmp"؛
if ($ext != "css" AND $ext != "htm" AND $ext != "html") (
//هکرها
print_r($ext);
مرگ ("هکرها...!");
) دیگر (
if (file_exists($cacheName) AND filemtime($cacheName) > (time() - 86400)) (


fclose($cacheHandle);
$isCached = TRUE;
) دیگر (
//بیا شروع کنیم
$handle = fopen($fileName، "r");
$fileData = fread($handle, fileize($fileName));
//عجایب عبارات منظم
$newData = preg_replace("/\s+/", " ", $fileData);
fclose($handle);
//کش کردن


fclose($cacheHandle);
$isCached = FALSE;
}
//داده های خروجی
اگر ($ext == "css") (
header("نوع محتوا: متن/css");
اگر ($isCached) (

}
) دیگر (
اگر ($isCached) (
پژواک"";

}
}
echo $newData;

توضیح

این اسکریپت عملکرد به روز رسانی کش را هر 24 ساعت اضافه کرده است. راحت است. فرض کنید اگر چیزی را در سایت تغییر داده اید، می توانید 24 ساعت صبر کنید یا کش را پاک کنید.

$cacheName = "./cache/" . $nameExplode. $nameExplode. ".tmp"؛

این قطعه کد نام فایل ها و پسوند آنها را می گیرد، آنها را به هم می چسباند و با پسوند صحیح ".tmp" به کش اضافه می کند.

اگر (file_exists($cacheName) AND filemtime($cacheName) > (time() - 86400)) (
$cacheHandle = fopen($cacheName، "r");
$newData = fread($cacheHandle, file size($cacheName));
fclose($cacheHandle);
$isCached = TRUE;
) دیگر (

در اینجا ما وجود یک حافظه پنهان ذخیره شده و ایجاد آن را در 24 ساعت گذشته بررسی می کنیم (مقدار در ثانیه است - می توان آن را به هر دیگری تغییر داد). اگر هر دو شرط وجود داشت، فایل را باز کنید و محتوا را استخراج کنید تا نتیجه اسکریپت با آن جایگزین شود. ما همچنین $isCached را روی true تنظیم کردیم تا پیام‌های اضافی در پایان چاپ شود.

//بگذارید کش
$cacheHandle = fopen($cacheName، "w+");
fwrite ($cacheHandle، $newData);
fclose($cacheHandle);
$isCache = FALSE;
}

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

//زمان خروجی داده ها.
اگر ($ext == "css") (
header("نوع محتوا: متن/css");
اگر ($isCached) (
echo "// بازیابی شده از فایل کش.\n";
}
) دیگر (
اگر ($isCached) (
پژواک"";
}
}

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

بیایید تلاش کنیم

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

نتیجه

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

بیایید آن را جمع بندی کنیم

در این درس چندین راه راحت و ساده برای افزایش سرعت وب سایت با استفاده از PHP به شما نشان دادم.

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

Fastcgi

FastCGI یکی از گزینه های اتصال PHP به وب سرور است. بهترین استفاده در رابطه با Nginx. PHP-fpm (کانتینر Fastcgi برای PHP) و Nginx به طور پیش فرض با هم کار می کنند و پیکربندی آنها بسیار آسان است.

OpCache


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

این دقیقاً همان کاری است که ماژول opCache انجام می دهد. نتیجه کامپایل اول در یک کش ذخیره می شود که PHP با آن کار خواهد کرد. بنابراین، با حذف فرآیند فشرده سازی، سرعت اجرا را افزایش می دهد. هنگامی که فایل ها تغییر می کنند، خود ماژول حافظه پنهان را بازنشانی می کند و کامپایل مجدد را ارائه می دهد. به طور خلاصه، این ماژول باعث صرفه جویی در منابع بسیار مفید می شود. و این بدون نیاز به پیکربندی آن.

در نسخه PHP5.5+ این ماژول به صورت استاندارد ارائه می شود. در نسخه های قبلی، ماژول باید به طور مستقل نصب شود. می توانید در دسترس بودن را به این صورت بررسی کنید: php -i | grep opcache

# خروجی خالی به این معنی است که ماژول وجود ندارد

اگر نسخه خیلی قدیمی است، بهتر است از APC استفاده کنید: apt-cache search php-apc

# این جایگزینی برای opCache است، اما همان کار را انجام می دهد

ذخیره سازی

اغلب کد به سادگی کند است. مثلا:

  • تماس با APIهای خارجی
  • انتخاب پایگاه داده سنگین
  • پردازش فایل های حجیم
session.save_handler = حافظه پنهان session.save_path = "tcp:// لوکال هاست: 11211"

# localhost:11211 میزبان و پورت پیش‌فرض Memcache است

علاوه بر این، این طرح ذخیره سازی به شما امکان می دهد در چندین سرور مقیاس بندی کنید.

بهینه سازی کد

OOP

یاد آوردن! OOP همیشه کند است. اشیا باید ایجاد شوند، در جایی ذخیره شوند و نابود شوند. اگر به اشیا نیاز ندارید از آنها استفاده نکنید. به عنوان مثال، در اینجا:

set_title($_GET["عنوان"]); $post->set_description($_GET["description"]); $post->save();

# $posts = لیستی از اشیاء Post که به نحوی به دست آمده اند foreach ($posts به عنوان $post) ( echo $post->title . "
"; }

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

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

$_GET["title"]، "description" => $_GET["description"]]);

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

"; }

# خیلی بهتر - یک انتخاب ساده انجام دهید و داده های لازم را از آرایه خارج کنید

چیزهای کوچک

هنگام کار با فایل ها، از مسیرهای مطلق استفاده کنید. سپس عملیات جستجوی غیر ضروری فایل رخ نخواهد داد:

شامل "/var/www/file.php"؛ file_get_contents("/var/www/dir/data.txt");

ثابت‌های کلاس کارآمدتر از تعریف زیر عمل می‌کنند:

پست های کلاس (const PER_PAGE = 10؛ ...)

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

$max = mysql::get_col("SELECT count(*) FROM posts"); برای ($i = 0؛ $i< $max; $i++) { ... }

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

$post["title"] = "اولین پست";

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

strpos($post["title"], "خوب");

از رشته ها با نقل قول تک استفاده کنید:

$post["title"] = "در این مورد، پردازش متغیر اضافی وجود ندارد"

اسکریپت های کرون پی اچ پی

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

(.+?)<\/title/", $rss, $ match); }

(.+?)<\/title/", $rss); if ($has_something) به روز رسانی $= time(); $rss = file_get_contents("http://othersource.com/rss"); $has_something = preg_match("/title>(.+?)<\/title/", $rss); if ($has_something) به روز رسانی $= time(); )

حالا متغیر $updates تا حداکثر حد خود رشد خواهد کرد. وقتی به محدودیت حافظه رسید، اسکریپت متوقف می شود. پیگیری همه متغیرها بسیار دشوار است، بنابراین بهتر است از توابع استفاده کنید. تمام متغیرهای ایجاد شده در داخل تابع پس از تکمیل آن حذف خواهند شد:

روند()؛ function process() ($rss = file_get_contents("http://somesite.com/rss"); $has_something = preg_match("/title>(.+?)<\/title/", $rss); if ($has_something) $updates = time(); $rss = file_get_contents("http://othersource.com/rss"); $has_something = preg_match("/title>(.+?)<\/title/", $rss); if ($has_something) $updates = time(); }

مهم ترین

  • حتما از opCache برای PHP استفاده کنید. این رایگانموجب صرفه جویی در منابع می شود.
  • از FastCGI استفاده کنید (Nginx + PHP-fpm بهترین است).
  • توابع در وظایف cron به جلوگیری از نشت حافظه کمک می کند.
  • کش کردن بخش‌های آهسته کد اغلب ساده‌ترین راه‌حل برای افزایش سرعت است.
  • به یاد داشته باشید در مورد