مقدمه: چرا کرون جاب در هاستینگ ضروری است؟
در دنیای مدیریت وبسایت، بسیاری از عملیاتها نیاز به اجرای خودکار در زمانهای مشخص دارند. از پشتیبانگیری روزانه از دیتابیس گرفته تا ارسال ایمیلهای خبرنامه، بهروزرسانی کش، یا پردازش سفارشها. اینجاست که کرون جاب (Cron Job) وارد میدان میشود. کرون جاب یک ابزار زمانبندی در سیستمعاملهای لینوکسی است که به شما اجازه میدهد اسکریپتها یا دستورات خاصی را در فواصل زمانی معین اجرا کنید.
در محیط هاستینگ اشتراکی یا مدیریتشده، معمولاً کنترلپنلی مانند cPanel، DirectAdmin یا Plesk این امکان را در اختیار شما قرار میدهد. اما صرفاً کلیک کردن روی دکمه «افزودن کرون جاب» کافی نیست. اگر ساختار زمانبندی را اشتباه وارد کنید، مسیر فایل PHP را نادرست بنویسید، یا خروجی خطاها را نادیده بگیرید، کرون جاب شما یا اجرا نمیشود یا بیصدا شکست میخورد. در این مقاله، دقیقاً یاد میگیرید که چگونه یک کرون جاب کارآمد و قابل عیبیابی بسازید.
ساختار زمانبندی کرون جاب: از نحو تا عمل
قلب هر کرون جاب، رشته زمانبندی (Cron Expression) آن است. این رشته از پنج فیلد تشکیل شده که با فاصله از هم جدا میشوند:
* * * * * command_to_execute
| | | | |
| | | | +---- روز هفته (0-7) (0 و 7 یکشنبه)
| | | +------ ماه (1-12)
| | +-------- روز ماه (1-31)
| +---------- ساعت (0-23)
+------------ دقیقه (0-59)
هر فیلد میتواند یک عدد، یک بازه (مثلاً 1-5)، یک لیست (مثلاً 1,3,5)، یا یک ستاره (*) به معنای «همه مقادیر» باشد. همچنین میتوانید از علامت / برای گام (step) استفاده کنید. مثلاً */5 در فیلد دقیقه یعنی «هر ۵ دقیقه یک بار».
مثالهای رایج و کاربردی
- اجرای روزانه در ساعت ۳ بامداد:
0 3 * * * - اجرای هر ۱۵ دقیقه:
*/15 * * * * - اجرای هر دوشنبه و پنجشنبه ساعت ۸ شب:
0 20 * * 1,4 - اجرای اولین روز هر ماه:
0 0 1 * *
نکته مهم: زمان در کرون جاب بر اساس منطقه زمانی سرور (معمولاً UTC) تنظیم میشود. اگر وبسایت شما برای کاربران ایرانی است و نیاز به اجرا در ساعت ۳ صبح به وقت تهران دارید، باید اختلاف ساعت (معمولاً ۳:۳۰+ یا ۴:۳۰+ بسته به فصل) را محاسبه کنید. مثلاً برای ساعت ۳ صبح تهران در زمستان: 0 23 * * * (یعنی ۲۳:۳۰ UTC).
مسیردهی صحیح PHP: رایجترین دام
بزرگترین اشتباه تازهکارها این است که فرض میکنند کرون جاب دقیقاً مثل مرورگر عمل میکند. در مرورگر، شما آدرسی مثل https://example.com/cron.php را باز میکنید و سرور فایل را از طریق وب سرور (Apache/Nginx) اجرا میکند. اما کرون جاب مستقیماً از خط فرمان (CLI) اجرا میشود و هیچ اطلاعی از HTTP یا مسیرهای وب ندارد.
بنابراین، شما باید مسیر مطلق فایل را در سیستمفایل سرور به کرون جاب بدهید. این مسیر معمولاً چیزی شبیه /home/username/public_html/cron.php است. برای پیدا کردن مسیر دقیق، میتوانید از کنترلپنل یا دستور pwd در SSH استفاده کنید.
دستور صحیح اجرای PHP در کرون جاب
بهترین روش این است که مستقیماً مفسر PHP را صدا بزنید و مسیر فایل را به آن بدهید. در اکثر هاستینگها، مسیر PHP CLI چیزی شبیه /usr/local/bin/php یا /usr/bin/php است. دستور نهایی به این شکل خواهد بود:
/usr/local/bin/php /home/username/public_html/cron.php
اگر مطمئن نیستید که مسیر PHP چیست، میتوانید از دستور which php در SSH استفاده کنید یا از پشتیبانی هاست خود بپرسید. در کنترلپنل cPanel، معمولاً گزینهای به نام «PHP Path» در بخش Cron Jobs وجود دارد که مسیر را نشان میدهد.
اشتباه رایج: استفاده از wget یا curl به جای PHP CLI
برخی افراد سعی میکنند با دستور wget -O /dev/null https://example.com/cron.php کرون جاب را اجرا کنند. این روش کار میکند، اما مشکلاتی دارد:
- به وب سرور وابسته است. اگر وب سرور خراب باشد، کرون جاب هم کار نمیکند.
- محدودیتهای اجرایی PHP (مثل
max_execution_time) اعمال میشود که در CLI معمولاً بینهایت است. - خروجی خطاها به راحتی قابل ضبط نیست.
توصیه میکنم همیشه از روش PHP CLI استفاده کنید، مگر اینکه دلیل خاصی برای استفاده از HTTP داشته باشید (مثلاً نیاز به کوکی یا هدر خاص).
گرفتن خروجی برای عیبیابی: چرا کرون جاب من کار نمیکند؟
یکی از بزرگترین چالشها، عیبیابی کرون جابهایی است که بیصدا شکست میخورند. وقتی اسکریپت شما خطا میدهد اما خروجی آن جایی ثبت نمیشود، تشخیص مشکل بسیار سخت میشود. خوشبختانه، میتوانید خروجی استاندارد (stdout) و خطاهای استاندارد (stderr) را به یک فایل هدایت کنید.
هدایت خروجی به فایل لاگ
از عملگرهای > و 2>&1 استفاده کنید. دستور زیر خروجی عادی و خطاها را به فایل cron.log در پوشه public_html میفرستد:
/usr/local/bin/php /home/username/public_html/cron.php >> /home/username/public_html/cron.log 2>&1
توضیح عملگرها:
>>: خروجی را به انتهای فایل اضافه میکند (append). اگر از>استفاده کنید، فایل هر بار از اول نوشته میشود.2>&1: خطاهای استاندارد (stderr) را به همان جایی میفرستد که خروجی استاندارد (stdout) میرود. یعنی هر دو در یک فایل ثبت میشوند.
حالا میتوانید بعد از هر بار اجرای کرون جاب، فایل cron.log را باز کنید و ببینید چه اتفاقی افتاده است. اگر فایل خالی است، یعنی اسکریپت بدون خطا اجرا شده (یا اصلاً اجرا نشده!). اگر خطایی هست، دقیقاً در فایل نشان داده میشود.
مثال عملی: اسکریپت پشتیبانگیری از دیتابیس
فرض کنید میخواهید هر شب ساعت ۲ بامداد از دیتابیس MySQL خود پشتیبان بگیرید. اسکریپت backup.php را در مسیر /home/username/public_html/backup.php قرار دادهاید. کرون جاب شما باید به این شکل باشد:
0 2 * * * /usr/local/bin/php /home/username/public_html/backup.php >> /home/username/public_html/backup.log 2>&1
داخل فایل backup.php، از تابع exec() یا shell_exec() برای اجرای دستور mysqldump استفاده کنید. حتماً نام کاربری و رمز عبور دیتابیس را در خود اسکریپت یا یک فایل کانفیگ جداگانه قرار دهید (و آن فایل را از دسترس عمومی دور نگه دارید).
عیبیابی پیشرفته: وقتی لاگ هم کمکی نمیکند
گاهی اوقات فایل لاگ خالی است اما کرون جاب کار نمیکند. در این موارد، چند کار را بررسی کنید:
- مجوزهای فایل: مطمئن شوید فایل PHP شما حداقل مجوز
644(قابل خواندن برای همه) را دارد. اگر اسکریپت نیاز به نوشتن فایل دارد، پوشه مقصد باید مجوز755یا777داشته باشد (بسته به نیاز). - مسیر مطلق: دوباره مسیر فایل را با دستور
ls -l /home/username/public_html/cron.phpدر SSH چک کنید. یک اشتباه تایپی ساده میتواند کرون جاب را از کار بیندازد. - محدودیت حافظه و زمان: در محیط CLI، محدودیت
memory_limitوmax_execution_timeمعمولاً بینهایت است، اما اگر اسکریپت شما از طریقwgetاجرا میشود، محدودیتهای PHP-FPM اعمال میشود. - بررسی لاگ سیستم: در برخی هاستینگها، میتوانید لاگ سیستم کرون را در مسیر
/var/log/cronیا/var/log/syslogببینید. اگر به SSH دسترسی دارید، دستورgrep CRON /var/log/syslogرا اجرا کنید تا ببینید آیا کرون جاب شما توسط سیستم ثبت شده است یا خیر.
یک سناریوی واقعی: مشکل مسیر PHP
چند وقت پیش یکی از کاربران ServerNet با این مشکل مواجه شد که کرون جابش کار نمیکرد. لاگ خالی بود و اسکریپت در مرورگر به خوبی اجرا میشد. بعد از بررسی، متوجه شدیم که مسیر PHP که در کنترلپنل نوشته بود، /usr/bin/php بود در حالی که مسیر صحیح /usr/local/bin/php بود. با تغییر مسیر، مشکل حل شد. این نشان میدهد که حتی یک تفاوت کوچک در مسیر میتواند کل کار را خراب کند.
نتیجهگیری: کرون جاب را جدی بگیرید
ساخت یک کرون جاب در کنترلپنل هاستینگ کار سادهای است، اما برای اینکه واقعاً کار کند و قابل اعتماد باشد، باید به جزئیات توجه کنید. ساختار زمانبندی را دقیق وارد کنید، مسیر مطلق فایل PHP را با مفسر صحیح ترکیب کنید، و همیشه خروجی را به یک فایل لاگ هدایت کنید تا بتوانید در صورت بروز مشکل، عیبیابی کنید. با رعایت این نکات، کرون جاب شما به یک ابزار قدرتمند و بیدردسر برای خودکارسازی وظایف وبسایت تبدیل میشود.
اگر به دنبال یک هاستینگ پایدار با پشتیبانی کامل از کرون جاب هستید، میتوانید از خدمات هاست لینوکس سرورنت استفاده کنید که کنترلپنل cPanel را با دسترسی کامل به Cron Jobs ارائه میدهد. اما مهمتر از انتخاب هاست، یادگیری درست استفاده از این ابزار است که امیدواریم این مقاله به شما در این مسیر کمک کرده باشد.