در زبان برنامه نویسی 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 وجود دارد . که در زیر لیست شده اند :
- استفاده از تابع set_time_limit() که یک آرگومان ورودی برحسب ثانیه را دریافت می کند .
- جستجو در فایل php.ini برای تغییر مقدار max_execution_time
- استفاده از تابع ini_set() برای افزایش تایم اجرایی یک اسکریپت در ini که در ورودی اول اسم دستور (max_execution_time) و در ورودی دوم مقدار بر حسب ثانیه را تعیین می کنیم/
- استفاده از دستور php_value در فایل .htaccess برای ست کردن مقدار تایم اجرایی برنامه های php .
تابع set_time_limit()
این تابع برای ست کردن تعداد ثانیه هایی که یک اسکریپت php اجازه اجرا شدن در یک مرورگر را دارد , استفاده می شود. برای همین فقط یک مقدار عددی را به عنوان آرگومان می پذیرد . برای مثال , کد زیر را ببینیم :
1 2 |
$execution_time_limit = 45; set_time_limit($execution_time_limit); |
باید دو خط کد بالا را به اسکریپت 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 جستجو کنید , موردی مثل زیر را خواهید دید :
1 2 3 4 |
; Maximum execution time of each script, in seconds ; http://php.net/max-execution-time ; Note: This directive is hardcoded to 0 for the CLI SAPI max_execution_time = 30 |
و باید مقدار پیش فرض را بنابر نیاز خود تغییر بدید .بعد از لحاظ کردن تغییرات و ذخیره حتما باید وب سرور را ریستارت کنید تا از این به بعد کدهای شما با مقدار جدید اجرا شوند (در مقاله php.ini به طور کامل به این موضوع پرداختیم).
تابع ini_set()
این هم یکی دیگر از روش های تغییر محدودیت حافظه و مدت زمان اجرای اسکریپت php توسط توابع مثل تابع set_time_limit است . این تابع دو آرگومان را دریافت می کند . اولین آرگومان اسم directive یا دستور و دومین مقدار آن است . برای مثال , این محدودیت با تابع ini_set با خط زیر قابل تغییر است .
1 |
ini_set(“max_execution_time”,5); |
ایجاد محدودیت زمانی اجرای کد ها بستگی به محل فراخوانی تابع ini_set() دارد . دقیقا همین محاسبه را برای تابع set_time_limit در بالا انجام دادیم .
استفاده از دستور php_value در فایل .htaccess
می توانیم محدودیت مدت زمان اجرای اسکریپت php را با .htaccess بصورت زیر اعمال کنیم .
1 |
php_value max_execution_time 200 |
نکته :
- تمام این روش های تغییر محدودیت های اجرایی اسکریپت php برای برنامه هایی که به صورت طولانی اجرا می شوند, استفاده می شود . مثل آپلود یک فایل حجیم یا اراسل ایمیل های انبوه و یا جستجو و تغییر در فایل ها و غیره …
- در هنگام استفاده از توابعی مثل set_limit_time و ini_set() , باید مطمین باشید حالت safe_mode فعال نباشد , اگر فعال باشد , عملا این توابع خروجی دلخواه را به ما نشان نمی دهند . این قابلیت در ورژن ۵٫۳٫۰ php منسوخ اعلام شد و در php 5.4.0 به طور کامل حذف شد بنابراین اگر از نسخه های بالاتر استفاده میکنید , هیچ مشکلی در اجرای توابع بالا پیش نمیاد . (اگر از ورژن های پایینتر بهره می برید , برای اینکه این مورد را غیرفعال کنید به دنبال safe_mode در فایل php.ini بگردید و مقدار آن را off قرار بدید . از طریق تابع phpinfo() هم می توانید مطمین شوید .)
- اگر مدت زمان اجرای اسکریپت php بیشتر از آن چیزی که ست کردید طول بکشد با خطایی مثل زیر مواجه خواهید شد که می توانید با روش های بالا آن را افزایش بدید .
1 |
Fatal error: Maximum execution time of ... seconds exceeded |
هر سوالی داشتید ، از قسمت نظرات اقدام کنید . سریعا ، پاسخگوی سوالات شما هستیم .
موفق و پیروز باشید.
ببخشید این روش هایی ک با استفاده از کد php گفتید هم هاستینگ اجازه اعمال نمیده؟یا فقط مربوط به php.ini هست؟
هاست اشتراکی این اجازه رو نمیده و فقط هاست مجازی و بالاتر این امکان رو دارند
آقا این قالب ما اجازه دسترسی تو قسمت تم آپشن نمیده اصلا. میگه باید تو فانکشن پی اچ پی بری و Set_time_limit رو صفر کنی. من هر چی تعریف میکنم باز این اجازه دسترسی نمیده من این دمو رو اپلود کنم. چ کنم؟
سلام.
در هاست های اشتراکی نمیتونید مقدار این آپشن رو تغییر بدید و باید سرور مجازی بگیرید.
داخل لوکال هاست هم بعد اینکه داخل php.ini تغییر دادید باید یکبار سرور آپاچی رو ریستارت کنید تا تغییرات اعمال بشه
سلام. متاسفانه سایت من با خطای :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 پیدا نکردم.
ممنون میشم راهنمایی کنید که چطور زمان اجرا را افزایش بدم
سلام. در هاست های اشتراکی این مدت را بیشتر از ۶۰ثانیه نمیشه کرد و همه روش هایی که برای تغییر حاقظه در سرتاسر وب هست پاسخگویی این کار نیستند.
باید حتما هاست مجازی داشته باشید تا هاستینگ این امکان تغییر محدودیت زمانی اجرا را به شما بدند و در هاست اشتراکی این موارد جواب نمیدند
سلام
یعنی تو هاست های اشتراکی هیچ راهی نیست که بتونیم این تایم افزایش بدیم؟ افزونه ای ، کدی ….
سلام. متاسفانه این مورد امکانش نیست و این دسترسی رو هاستینگ به مشتری ها نمیده و قابل دور زدن نیست مگر اینکه سرور باگ داشته باشه یا هک کنید که عقلانی نیست
با سلام و خیلی ممنونم از پاسخ گوییتون
من یه سوال دیگه ام دارم که هر چی سرچ کردم در مطالب, بخشی رو پیدا نکردم که مربوط باشه.
من میخام مقادیر utm رو به lat,lng بر حسب درجه(یعنی ۳۵….و۵۱….) تو php تبدیل کنم.میخاستم بدونم از چه تابعی باید استفاده کنم.خیلی ممنونم.
سلام.
از کلاس های آماده میتوانید استفاده کنید :
https://gist.github.com/840476/8ac435fc58f22f14edd5fcdbb6dd4d3e0fad6b0d
موفق باشید.
خیلی ممنونم
با سلام
من از
$execution_time_limit = 45;
set_time_limit($execution_time_limit)
در پروژه ام استفاده میکنم.اما باز گاهی timeout را برای من نمایش میده……نمی دونم دلیلش چیه
سلام.
در هاست های اشتراکی بدلیل محدود کردن ویرایش php.ini و نداشتن پرمیشن, این آپشن ها کارایی ندارند و باید از هاست مجازی استفاده کنید تا بتونید به راحتی این موارد را از طریق کد اعمال کنید.
موفق باشید.
سلام حسن جان کلمه max_execution_time غلط املایی داره.
سلام . ممنون بابت دقت توجهتون . اصلاح شد
موفق و پیروز باشید