hakanispirli / laravel-shared-worker
Production-ready Laravel Queue Worker optimized for shared hosting environments - No SSH, No proc_open required
Package info
github.com/hakanispirli/laravel-shared-worker
pkg:composer/hakanispirli/laravel-shared-worker
Requires
- php: ^8.2
- illuminate/console: ^11.0|^12.0
- illuminate/database: ^11.0|^12.0
- illuminate/mail: ^11.0|^12.0
- illuminate/queue: ^11.0|^12.0
- illuminate/support: ^11.0|^12.0
README
Paylaşımlı (shared) hosting ortamları için geliştirilmiş Laravel Queue Worker paketi.
Bu paket, proc_open, pcntl_signal, symlink gibi fonksiyonların kapalı olduğu sunucularda Laravel Queue sistemini sorunsuz çalıştırır.
Problem
Paylaşımlı sunucularda standart php artisan queue:work komutu çalışmaz çünkü:
proc_openfonksiyonu güvenlik nedeniyle kapalıdır- SSH erişimi genellikle yoktur
- Uzun çalışan process'ler otomatik sonlandırılır
Bu paket, bu kısıtlamaları aşarak queue sistemini cron job ile çalıştırmanızı sağlar.
Kurulum
composer require hakanispirli/laravel-shared-worker
Config dosyasını yayınlamak için (opsiyonel):
php artisan vendor:publish --tag=shared-worker-config
Yapılandırma
1. Queue Driver Ayarı
.env dosyasında:
QUEUE_CONNECTION=database
Jobs tablosu yoksa oluşturun:
php artisan queue:table php artisan migrate
2. Schedule Tanımlaması
Laravel 11 ve üzeri - routes/console.php:
use Illuminate\Support\Facades\Schedule; Schedule::command('queue:shared-worker --max-time=55 --memory=128') ->everyMinute();
Laravel 10 ve altı - app/Console/Kernel.php:
protected function schedule(Schedule $schedule) { $schedule->command('queue:shared-worker --max-time=55 --memory=128') ->everyMinute(); }
3. cPanel Cron Job
cPanel kontrol panelinde Cron Jobs bölümüne gidin ve her dakika çalışacak şekilde ekleyin:
* * * * * /usr/local/bin/php /home/KULLANICI/public_html/artisan schedule:run >> /dev/null 2>&1
Not: PHP yolu sunucunuza göre değişebilir. Hosting firmanızdan öğrenebilirsiniz.
Parametreler
| Parametre | Varsayılan | Açıklama |
|---|---|---|
--max-time |
55 | Maksimum çalışma süresi (saniye) |
--memory |
128 | Maksimum RAM kullanımı (MB) |
--sleep |
3 | Kuyruk boşken bekleme süresi (saniye) |
--queue |
default | İşlenecek kuyruk adı |
--connection |
database | Queue connection |
--tries |
3 | Maksimum deneme sayısı |
--force |
- | Bakım modunda çalıştır |
Ortam Değişkenleri
Tüm ayarlar .env dosyasından özelleştirilebilir:
SHARED_WORKER_MAX_TIME=55 SHARED_WORKER_MEMORY=128 SHARED_WORKER_SLEEP=3 SHARED_WORKER_TRIES=3 SHARED_WORKER_LOCK=file SHARED_WORKER_QUEUE=default SHARED_WORKER_CONNECTION=database
Mail Gönderimi
Queue üzerinden mail göndermek için:
use HakanIspirli\SharedWorker\Jobs\MailJob; use App\Mail\WelcomeMail; // Mail'i queue'ya ekle MailJob::dispatch(new WelcomeMail($user), $user->email); // Belirli bir queue'ya ekle MailJob::dispatch(new WelcomeMail($user), $user->email, 'emails');
Lock Mekanizması
Paket, aynı anda birden fazla worker çalışmasını engeller. Üç farklı yöntem desteklenir:
file- Varsayılan. storage/framework klasörünü kullanır.database- Cache tablosunu kullanır.cache- Laravel cache sistemini kullanır.
SHARED_WORKER_LOCK=file
Çalışma Mantığı
Cron (her dakika)
|
v
schedule:run
|
v
queue:shared-worker
|
v
Lock kontrolü --> Başka worker var mı? --> Evet --> Çık
|
Hayır
v
Job al --> İşle --> Başarılı --> Sil
|
Başarısız
v
Deneme hakkı var mı? --> Evet --> Tekrar kuyruğa ekle
|
Hayır
v
failed_jobs tablosuna yaz
|
v
Süre/Memory kontrolü --> Limit aşıldı mı? --> Evet --> Çık
|
Hayır
v
Tekrar başa dön
Örnek Job
namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; class SendNotification implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public function __construct( public string $message ) {} public function handle(): void { // İşlem kodları } }
Job'u çalıştırmak için:
SendNotification::dispatch('Merhaba!');
Sorun Giderme
Worker çalışmıyor
- Komutu manuel çalıştırın:
php artisan queue:shared-worker - Log dosyasını kontrol edin:
storage/logs/laravel.log - Jobs tablosunu kontrol edin:
SELECT * FROM jobs
Overlapping sorunu
Lock dosyalarını temizleyin:
rm -rf storage/framework/shared-worker-locks/*
Job'lar işlenmiyor
.envdosyasındaQUEUE_CONNECTION=databaseolduğundan emin olunjobstablosunun var olduğunu kontrol edinfailed_jobstablosunu kontrol edin
Lisans
MIT License
Geliştirici
Hakan İspirli - destek@webmarka.com