همانند دیگر زبان های برنامه نویسی ، تابع sleep در php نیز برای ایجاد وقفه در اجرای برنامه یا اسکریپت مورد نظر برای لحظه های خاص استفاده می شود . مدت زمان sleep یا به اصطلاح به خواب رفتن برنامه توسط یک پارامتر ورودی به عنوان آرگومان به تابع sleep در php تعریف می شود .
تابع sleep در php فقط و فقط یک ورودی اجباری برای یک دوره زمانی را برای استاپ می پذیرد . این پارامتر باید با data type
(نوع داده ای) عددی باشد و این مقدار عددی برحسب ثانیه است .
بعضی زبان های برنامه نویسی مثل جاوا اسکریپت ، تابع مستقیمی برای sleep یا به اصطلاح به خواب رفتن برنامه ندارند . افراد ممکن است همچنین عملکردی را توسط یک حلقه ، درخواست XMLHTTP
(همان ajax و در سمت سرور با php عملی کنند) و غیره … .
البته با جی کوئری این کار بسیار راحت است . ! و حتی بعضی مواقع افرادی که تازه با php آشنا شدند ممکن است با یک حلقه زمان اجرای دستورات بعدی را برای چند ثانیه به وقفه بندازند . این کار بسایر می تواند زمان بر باشد ، مثلا استفاده از توابع date/time برای دریافت timestamp فعلی و ست کردن آن به عنوان لیمیت اجرای حلقه و …. . ولی در اینجا ما به سادگی از تابع sleep در php استفاده می کنیم .
مثال : تابع sleep در php
خب یک مثال از اجرای برنامه با وقفه دادن به آن با تابع sleep در php را ببینیم.
1 2 3 4 5 6 |
<?php $sleep_time = rand(5,10); echo "<b>Putting into sleep at</b>: " . date("H:i:s") . "<br/>"; sleep($sleep_time); echo "<b>waked up after $sleep_time seconds. Current Time is: </b>" . date("H:i:s") . "<br/>"; ?> |
در اسکریپت php بالا ، از یک تابع برای ساخت اعداد تصادفی (random) استفاده کردیم ، تابع rand()
، بطور اتفاقی یک عدد بر ثانیه انتخاب می کند و بعد آن را به تابع sleep پاس می دهد . در این مثال محدوده (range) مشخص شده بین ۵ تا ۱۰ ثانیه برای تابع rand() است .
قبل از فراخوانی تابع sleep با مدت زمان تصادفی انتخاب شده ، ما تابع date را قبل و بعد از آن تکرار کردیم . اسکریپت زمان را در فرم (ساعت : دقیقه : ثانیه ) نشان می دهد . بعد از احرای تابع sleep()
خواهیم دیدی که چند ثانیه وقفه توسط تابع Sleep ایجاد شده است .
توابع مرتبط با توقف اجرای برنامه در php
سه تابع دیگر هم برای ایجاد وقفه در اجرای اسکریپت php وجود دارد . تفاوت آنها با تابع php فقط در دریافت مقدار پارامتر آن ها بر حسب زمان است .
این توابع در زیر لیست شده اند :
- تابع usleep() – این تابع مقدار را به صورت میکروثانیه (۱۰ به توان ۶) به جای ثانیه در تابع sleep() در php می پذیرد
- تابع time_nanosleep() – برخلاف تابع sleep() و usleep() ، این تابع زمان را برحسب نانوثانیه قبول می کند .
- تابع time_sleep_until() – این تابع مقدار
timestamp
را با نوع داده ایfloat
(اعشاری) برای ایجاد وقفه دریافت می کند . تا زمانی که timestamp به صورت اعشار است ، می توانیم این مقدار را میکروثانیه ارسال کنیم.
احتیاط :
موارد زیر را هنگام استفاده از تابع sleep در php به خاطر داشته باشید. نکته های زیر هنگام اجرای تابع sleep در php که با خطاهایی مثل warning notice مواجه شدید بسیار به شما کمک خواهند کرد .
- اگر یه مقدار منفی را به تابع sleep در php پاس بدید ، در اینصورت یک خطای warning را در مرورگر نمایش میدهد
1 |
Warning: sleep(): Number of seconds must be greater than or equal to 0 |
برای آشنایی با انواع خطاها در php کلیک کنید.
- همچنین ارسال آرگومان با یک data typeی بجز
integer
(عددی) می تواند باعث خطایی مثل زیر شود .
1 |
Warning: sleep() expects parameter 1 to be long |
- در هنگام استفاده از تابع
time_sleep_until()
، اگر یک timestamp آینده که هنوز نرسیده است ، وارد کنیم ، در اینصورت یک خطایwarning
را چاپ می کند.
هر سوالی داشتید از قسمت نظرات ارسال کنید . سریعا پاسخگوی سوالات شما هستیم .
موفق و پیروز باشید .
سلام
من توی زبان PHP تازه کارم
برای ربات نویسی از این زبان استفاده میکنم
به عنوان مثال میخوام با ربات به ۱۰۰۰ نفر پیام بفرستم
برای این کار از حلقه For استفاده کنیم
ولی به علت محدودیتی که خود تلگرام گذاشته نمیشه یکدفعه از پیام را ارسال کرد و باید هر ثانیه فقط ۱ پیام را ارسال کنم تا رباتم مسدود نشه
داخل حلقه For دستور (۱)sleep را میذارم
بعد از ارسال ۲۰ یا ۳۰ پیام ربات قاطی میکنه و دوباره حلقه برمیگرده از اول درصورتی که وقتی sleep داخل حلقه نباشه برنامه هیچ مشکلی نداره و فقط ربات مسدود میشه
کسی میدونه مشکل از چیه
ممنون میشم
سلام. داخل هاست اشتراکی این عملیات معمولا به اتمام نمیرسه چون محدودیت زمانی اجرای اسکریپت روی ۶۰ثانیه هست و عملیات قطع میشه یا باید با صف بندی و کرون جاب هر بار مثلا ۵۰۰تا پیام بفرستید یا اینکه از هاست مجازی استقاده کنید که امکان تغییر این محدودیت ۶۰ثانیه رو داشته باشید.
ممنونم
عالی بود