محدودیت مدت زمان اجرای اسکریپت php

  • آپدیت شده در تاریخ

محدودیت حافظه و مدت زمان اجرای اسکریپت php

در زبان برنامه نویسی php , به طور پیش فرض مدت زمان اجرای اسکریپت php دقیفا ۳۰ ثانیه است . این مقدار از طریق فایل php.ini و دستوری به اسم max_execution_time کنترل می شود . این دستور مقادیر را بر حسب ثانیه قبول می کند . اگر ۰ باشد , به این معنا که هیچ محدودیت زمانی برای اجرای یک کد php وجود ندارد . این مورد می تواند بسیار خطرناک باشد بخصوص اگر برنامه شما با مشکل حلقه بی نهایت و یا عدم ارسال response مواجه شود . و به شدت منابع سخت افزاری و مموری را درگیر می کند .

حتما هنگام اجرای یک صفحه php به علت محدودیت حافظه خطایی مثل maximum execution time of 30 seconds exceeded برخوردید دقیقا در مقاله آموزشی افزایش محدودیت حافظه و مدت زمان اجرای اسکریپت php قصد داریم توابع و نحوه رفع خطای مربوط Execution Time در PHP را بررسی کنیم .

برای آشنایی با انواع خطاها در php کلیک کنید

برای اجرای اسکریپت php از طریق شل و CLI SAPI , محدودیت زمانی ۰ است . بنابر این هیچ محدودیت تایمی برای اجرای اسکریپت php توسط CLI وجود ندارد .

راه های افزایش محدودیت حافظه و مدت زمان اجرای اسکریپت php

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

  1. استفاده از تابع set_time_limit() که یک آرگومان ورودی برحسب ثانیه را دریافت می کند .
  2. جستجو در فایل php.ini برای تغییر مقدار max_execution_time
  3. استفاده از تابع ini_set() برای افزایش تایم اجرایی یک اسکریپت در ini که در ورودی اول اسم دستور (max_execution_time) و در ورودی دوم مقدار بر حسب ثانیه را تعیین می کنیم/
  4. استفاده از دستور php_value در فایل .htaccess برای ست کردن مقدار تایم اجرایی برنامه های php .

محدودیت حافظه و مدت زمان اجرای اسکریپت php

تابع set_time_limit()

این تابع برای ست کردن تعداد ثانیه هایی که یک اسکریپت php اجازه اجرا شدن در یک مرورگر را دارد , استفاده می شود. برای همین فقط یک مقدار عددی را به عنوان آرگومان می پذیرد . برای مثال , کد زیر را ببینیم :

باید دو خط کد بالا را به اسکریپت php خود , جایی که قصد داریم مقدار پیکربندی مدت زمان اجرای اسکریپت php را تغییر دهیم , قرار بدیم . اگر کد بالا در اولین خط اسکریپت خود , قبل از همه کدها , قرار بدیم , در اینصورت مقدار مشخص شده با تابع set_time_limit برا همه کد های بعدی اعمال خواهد شد .

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

برای این که موضوع واضح و قابل درک شود ,فرض کنید تابع set_limit_time را در اواسط کد ها برنامه با محدودیت ۴۰ ثانیه ای قرار بدیم . و همچنین زمانی که طول می کشد تا کدها اجرا شود ۲۰ ثانیه است .پس از آن set_limit_time(40) اجازه می دهد باقی کد ها حداکثر ۴۰ ثانیه اجرا شوند . پس اسکریپت ها ۶۰ ثانیه به عنوان محدودیت زمانی برای اجرا را دارد.

تغییر مقدار max_execution_time در php.ini

به جای اینکه مدت زمان اجرای اسکریپت php را با توابع به صورت run time ست کنیم , می توانیم به صورت مستقیم آن را از فایل پیکربندی php یا همان php.ini افزایش یا کاهش بدیم .

در هاست های اشتراکی به دلیل منابع محدود سرور , شما حق تغییر این مقدار را ندارید ولی اگر سرور اختصاصی دارید یا اینکه با لوکال هاست کار می کنید می توانید این مقدار را از فایل php.ini به راحتی تغییر بدید تا برای همه اسکریپت های اجرایی سرور اعمال شود. . اگر فایل php.ini را برای max_execution_time جستجو کنید , موردی مثل زیر را خواهید دید :

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

تابع ini_set()

این هم یکی دیگر از روش های تغییر محدودیت حافظه و مدت زمان اجرای اسکریپت php توسط توابع مثل تابع set_time_limit است . این تابع دو آرگومان را دریافت می کند . اولین آرگومان اسم directive یا دستور و دومین مقدار آن است . برای مثال , این محدودیت با تابع ini_set با خط زیر قابل تغییر است .

ایجاد محدودیت زمانی اجرای کد ها بستگی به محل فراخوانی تابع ini_set() دارد . دقیقا همین محاسبه را برای تابع set_time_limit در بالا انجام دادیم .

استفاده از دستور php_value در فایل .htaccess

می توانیم محدودیت مدت زمان اجرای اسکریپت php را با .htaccess بصورت زیر اعمال کنیم .

نکته :

  • تمام این روش های تغییر محدودیت های اجرایی اسکریپت php برای برنامه هایی که به صورت طولانی اجرا می شوند, استفاده می شود . مثل آپلود یک فایل حجیم یا اراسل ایمیل های انبوه و یا جستجو و تغییر در فایل ها و غیره …
  • در هنگام استفاده از توابعی مثل set_limit_time و ini_set() , باید مطمین باشید حالت safe_mode فعال نباشد , اگر فعال باشد , عملا این توابع خروجی دلخواه را به ما نشان نمی دهند . این قابلیت در ورژن ۵٫۳٫۰ php منسوخ اعلام شد و در php 5.4.0 به طور کامل حذف شد بنابراین اگر از نسخه های بالاتر استفاده میکنید , هیچ مشکلی در اجرای توابع بالا پیش نمیاد . (اگر از ورژن های پایینتر بهره می برید , برای اینکه این مورد را غیرفعال کنید به دنبال safe_mode در فایل php.ini بگردید و مقدار آن را off قرار بدید . از طریق تابع phpinfo() هم می توانید مطمین شوید .)
  • اگر مدت زمان اجرای اسکریپت php بیشتر از آن چیزی که ست کردید طول بکشد با خطایی مثل زیر مواجه خواهید شد که می توانید با روش های بالا آن را افزایش بدید .

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

موفق و پیروز باشید.

حسن شفیعی توسعه دهنده وب و موبایل مدیر سایت علاقه خاصی به برنامه نویسی وب و موبایل دارم و هر روز تلاش می کنم به این حوزه مسلط تر شوم و اطلاعاتم را به شکل کاربردی برای علاقه مندان در وب به اشتراک بگذارم. اگر نیاز به برنامه نویس برای انجام پروژه و نوشتن اسکریپت های سمت وب, اپلیکیشن های اندروید و ios, پیدا کردن راه حل توسعه و غیره داشتید حتما از طریق تماس با ما/ واتساپ/ تلگرام بهم پیام بدید. برایتهیه هاست مطمین و پرسرعت کلیک کنید
مطالب زیر را حتما بخوانید
دیدگاه کاربران (۱۵)

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

  1. reza ۱۲ آذر ۱۴۰۰

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

    پاسخ
    1. حسن شفیعی ۱۳ آذر ۱۴۰۰

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

      پاسخ
  2. پرنیا فاضل ۳ مرداد ۱۴۰۰

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

    پاسخ
    1. حسن شفیعی ۴ مرداد ۱۴۰۰

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

      پاسخ
  3. نگار بصیری ۲۸ شهریور ۱۳۹۹

    سلام. متاسفانه سایت من با خطای :Request Timeout
    This request takes too long to process, it is timed out by the server. If it should not be timed out, please contact administrator of this web site to increase ‘Connection Timeout’.
    مواجه شده. افزونه ها را چک کردم و حافظه را هم در WP_config افزایش دادم.
    البته قبل از اینکه این خطا پیش بیاد، وردپرس را بروزرسانی کردم و پیام زیاد بودن مدت زمان اجرا اومد و فکر میکنم مشکل از همین هست ولی نمیدونم چطور به htaccess دسترسی داشته باشم و اصلا در public-htlml پیدا نکردم.
    ممنون میشم راهنمایی کنید که چطور زمان اجرا را افزایش بدم

    پاسخ
    1. حسن شفیعی ۲۸ شهریور ۱۳۹۹

      سلام. در هاست های اشتراکی این مدت را بیشتر از ۶۰ثانیه نمیشه کرد و همه روش هایی که برای تغییر حاقظه در سرتاسر وب هست پاسخگویی این کار نیستند.
      باید حتما هاست مجازی داشته باشید تا هاستینگ این امکان تغییر محدودیت زمانی اجرا را به شما بدند و در هاست اشتراکی این موارد جواب نمیدند

      پاسخ
  4. احسان ۱۰ تیر ۱۳۹۹

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

    پاسخ
    1. حسن شفیعی ۱۰ تیر ۱۳۹۹

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

      پاسخ
  5. زینب ۱۹ بهمن ۱۳۹۸

    با سلام و خیلی ممنونم از پاسخ گوییتون
    من یه سوال دیگه ام دارم که هر چی سرچ کردم در مطالب, بخشی رو پیدا نکردم که مربوط باشه.
    من میخام مقادیر utm رو به lat,lng بر حسب درجه(یعنی ۳۵….و۵۱….) تو php تبدیل کنم.میخاستم بدونم از چه تابعی باید استفاده کنم.خیلی ممنونم.

    پاسخ
    1. حسن شفیعی ۱۹ بهمن ۱۳۹۸

      سلام.
      از کلاس های آماده میتوانید استفاده کنید :
      https://gist.github.com/840476/8ac435fc58f22f14edd5fcdbb6dd4d3e0fad6b0d
      موفق باشید.

      پاسخ
      1. زینب ۱۹ بهمن ۱۳۹۸

        خیلی ممنونم

        پاسخ
  6. زینب ۱۸ بهمن ۱۳۹۸

    با سلام
    من از
    $execution_time_limit = 45;
    set_time_limit($execution_time_limit)
    در پروژه ام استفاده میکنم.اما باز گاهی timeout را برای من نمایش میده……نمی دونم دلیلش چیه

    پاسخ
    1. حسن شفیعی ۱۸ بهمن ۱۳۹۸

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

      پاسخ
  7. حمیدرضا ۳۰ دی ۱۳۹۶

    سلام حسن جان کلمه max_execution_time غلط املایی داره.

    پاسخ
    1. حسن شفیعی ۲ بهمن ۱۳۹۶

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

      پاسخ
دوره های آموزشی