Laravel Horizon Kurulumu ve Gerekli Sistem Yapılandırılması

Başarılı horizon için laravel ve horizin kurulum adımları :
Ben sistem olarak ubuntu 16.04 sunucu sürümü ve host için apache2 kullandım.Tüm ayarlarımı buna göre anlatmıl olacağım.
önce local host ortamını hazırlıyoruz.Buna da apache için yeni bir host conf bilgisi ayarlamak gerekiyor.İsterseniz default host
bilgilerini de silebilirsiniz,eğer silerseniz sites-enabled altında bulunan verileri de siliniz yoksa apache2 restart ettiğinizde
hata ile karşılaşacaksınızdır:
cd /etc/apache2/sites-available
sudo rm -r *.*
cd ..
cd sites-enabled
sudo rm -r *.*
cd ..
cd sites-available
sudo nano horizon.conf
Listen 8181
<VirtualHost *:8181>
ServerName localtest.com
DocumentRoot /var/www/localtest/horizon/public
ServerAdmin localtest@
ErrorLog /var/log/apache2/horizon_error
CustomLog /var/log/apache2/horizon_access combined
<Directory /var/www/localtest/horizon/public>
Options -Indexes
DirectoryIndex index.php index.html
#Options FollowSymLinks MultiViews
AllowOverride All
Require all granted
#Order allow,deny
#allow from all
</Directory>
</VirtualHost>
ben yukarda gördüğünüz gibi bir karışıklık olmasın diye port bilgisini 8181 olarak düzenledim.
sudo a2ensite horizon.conf
bununla birlikte conf dosyamı sistemde aktif ettim.Sonrasında apache2 yi restart ediyoruz ya da reload yapabilirsiniz.Ayrıca Rewrite modülümüzü de aktif edelim ki yönlendirmelerde sorun olmasın.
sudo service apache2 restart
sudo a2enmod rewrite
sudo service apache2 restart
Php versiyonumuz 7.1.3 ve üzeri olması gerektiği için 7.2 kurulumunu yapacağız şimdi.
sudo apt-get update
sudo apt-get install software-properties-common
Bu işlemde varsa bir yeni kurulum veya güncelleme işlemi sistemi sonrasında tekrar update edelim.
sudo apt-get update
Eğer php 7.2 öncesi sürümde sistem için gerekli eksiklikler var ise önce onları kontrol etmiş olalım.Aşağıdaki bilgiler ile bir kurulum yapalım.
sudo apt-get install php-pear php7.0-dev php7.0-zip php7.0-curl php7.0-gd php7.0-mysql php7.0-mcrypt php7.0-xml libapache2-mod-php7.0
sudo apt-cache search –names-only ^php
bununla birlikte php ile olan bağımlılık vb işlemleri de görmüş oluruz.
sudo apt-get update
Şimdi php reposu ekliyoruz:
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php7.2
şimdi sistem için gerekli olan işlemleri ekleyelim:
sudo apt-get install php-pear php7.2-curl php7.2-dev php7.2-gd php7.2-mbstring php7.2-zip php7.2-mysql php7.2-xml
sudo apt-get update
Mysql kullanacak isek işlerimizi kolaylaştıracak olan phpmyadmini kuralım.Siz dilerseniz kurmayabilirsiniz:
sudo apt-get install phpmyadmin php-mbstring php-gettext
Önüme gelen ekranda apache2 seçiyorum ,çünkü sistemimde bu sunucuyu kullanıyorum.
sudo phpenmod mbstring
sudo apt-get install php7.0-mbstrin
sudo service apache2 restart
localhost/phpmyadmin şeklinde veya bir ip adresi üzerinden test edebilirsiniz.
Şimdi laravel kurulumunda ve diğer paket kurulum işlemlerinde bize yardımcı olacak composer kurulumunu gerçekleştirelim:
sudo apt-get update
cd ~
ana dizine geçelim.Ayrıca bize yardımcı olabilecek aşağıdaki paketleri de kuralım.
sudo apt-get install curl php-cli php-mbstring git unzip
Şimdi sırasıyla aşağıdaki işlemleri yapalım:
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer
ve composer yazarak kurlumu başarılı ise kullanımı ile ilgili bilgiler gelecektir ekrana.

(bazen hata alırsak bu işlemleri de yapalım
sudo a2dismod php7.0
sudo a2enmod php7.2 )

Şimdi https://laravel.com/ yararlanarak güncel örnek bir laravel projesi kurulumu yapalım:
composer global require laravel/installer
laravel new horizon
laravel: komut bulunamadı diye eğer uyarı aldıysak aşağıdaki gibi path bilgisini güncelleyelim.
export PATH=”~/.composer/vendor/bin:$PATH”  bunu deneyin olmaz ise aşağıdaki kodu deneyin.
export PATH=”$PATH:$HOME/.config/composer/vendor/bin”
sonrasında tekrardan laravel new horizon komutunu çalıştıralım.Burada ben horizon kurulumu yapacağim için projeye bu adı verdim.Siz başka bir isim verebilirsiniz.
yazma izni sorunu olursa storage için sudo chmod -R 777 storage şeklinde izin verebilirsiniz.
Şimdi localhost veya localhost:port_no gibi belirlediğiniz linki çalıştırdığınızda ,
eğer birşekilde herhangi bir adımda hata almadıysanız Laravel yazısını ekranda göreceksiniz.
Şimdi proje klasörümüzdeyken horizon u kuralım.Bunun için de https://laravel.com/docs/5.7/horizon adresinden yararlanıyoruz.
aşağıdaki komut ile horizon için gerekli kurulumlar başlamış olması gerekiyor.
composer require laravel/horizon
php artisan horizon:install
localhost/horizon dediğimizde aşağıdaki gibi bir hata alıyor olabiliriz.
The bootstrap/cache directory must be present and writable.
bu hatayı alıyorsak ;
sudo chmod -R 777 bootstrap/cache
ile yazma izni verelim.
adrese tekrar girdiğimizde horizon ekranı önümüze gelecektir.
Genelde bu tarz kuyruk işlemlerinde redisi kullanıyoruz.Performansı normal sql sunucusuna göre daha iyidir.Şimdi de redisin kurulumunu gerçekleştirelim.
Bunun için https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-redis-on-ubuntu-16-04 adresindeki bilgilerden yararlanıyorum.
sudo apt-get update
sudo apt-get install build-essential tcl
cd /tmp
curl -O http://download.redis.io/redis-stable.tar.gz
tar xzvf redis-stable.tar.gz
cd redis-stable
make
make test
sudo make install
sudo mkdir /etc/redis
sudo cp /tmp/redis-stable/redis.conf /etc/redis
sudo nano /etc/redis/redis.conf
dir /var/lib/redis  // dir . güncellendi.
sudo nano /etc/systemd/system/redis.service
[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target
sudo adduser –system –group –no-create-home redis
sudo mkdir /var/lib/redis
sudo chown redis:redis /var/lib/redis
sudo chmod 770 /var/lib/redis
sudo systemctl start redis
sudo systemctl status redis
redis-cli
ping
sudo systemctl restart redis
sudo systemctl enable redis
şimdi redis i querylerimizde kullanabilmek için .env dosyası içinde ;
QUEUE_DRIVER=redis
ekliyoruz veya var ise redis ile değiştiriyoruz.Redis conf değiştirecekseniz oradaki redis bilgilerini değiştirerek laravelde de kullanabilirsiniz.
queue dosyasında ki default verisini ben redis olarak düzenliyorum.
‘default’ => env(‘QUEUE_CONNECTION’, ‘redis’),
config içinde horizon.php içerisinde horizin conf bilgilerini kullanacağınız havuz adı veya işlem sayısı gibi bilgilerini düzenleyebilirsiniz.
‘environments’ => [
‘production’ => [
‘supervisor-1’ => [
‘connection’ => ‘redis’,
‘queue’ => [‘default’,’carmen’,’logo’,’lotus’,’trafikceza’],
‘balance’ => ‘simple’,
‘processes’ => 10,
‘tries’ => 5,
],
],

‘local’ => [
‘supervisor-1’ => [
‘connection’ => ‘redis’,
‘queue’ => [‘default’,’carmen’,’logo’,’lotus’,’trafikceza’],
‘balance’ => ‘simple’,
‘processes’ => 10,
‘tries’ => 5,
],
],
],

olarak düzenledim.Şimdi cach temizleyip conf verilerini bunlarla düzenlemiş olalım.
php artisan cache:clear
php artisan config:cache

php artisan horizon ile manuel olarak işlem karşılayabilirsiniz veya supervisor kurup onu sistemde aktif tutabiliriz.
Dilerseniz https://laravel.com/docs/5.7/queues yardımıyla supervisor kuralım.
sudo apt-get install supervisor
sudo nano /etc/supervisor/conf.d/laravel-worker.conf
[program:horizon]
process_name=%(program_name)s
command=php /var/www/localtest/horizon/artisan horizon
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/www/localtest/horizon/horizon.log
Şeklinde conf dosyamızı hazırladım.Siz kendi proje yolunuzu belirtirsiniz.

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start horizon

php artisan horizon
ile bir kere çalıştırdım ama hata verdi.
/var/www/localtest/horizon/storage/logs/laravel-2018-11-21.log
bu dosyaya yazma izni verince düzelecektir.Ya da klasöre izin verince.
sudo chmod -R 777 /var/www/localtest/horizon/storage/logs/
Predis\ClientException  : Command ‘EXPiRE’ is not a registered Redis command.
bu kez böyle bir hata aldım.
Yani redis komutları büyük harfe çevirirken küçük i I olamadı İ oldu bu da sistemi hataya düşürdür.İlgili dosyaya müdahale edebiliriz veya
dil ayarlarını düzenleyebiliriz.Ben dosyaya müdahel ettim.
$commandID = str_replace(‘i’,’I’,$commandID);
Horizon started successfully.

bundan sonra supervisor tekrar start veya restart yaptım
sudo supervisorctl start horizon
sudo supervisorctl restart horizon
localhost/horizon/dashboard
sisteme baktığımda artık aktif olarak görünmektedir.
Şimdi bir Job ve bu işi çalıştıracak küçük bir uygulama yapıp test edebiliriz.

Ayrıca eğer tag kullanıp bunu monitor edecekseniz önce monitoring sayfasinda bunu aktif edelim.Yoksa tag aktif etmeden önceki işlemleri görmeyecektir.
php artisan make:controller ArtiNotificationController
ile job failed olacağı zaman slack notification göndereceğim bir controller ekledim.
vendor/laravel/horizon/routes/web.php
altında fail olan jobları otomatik tekrar denetleyebilmek için route altında bir link yolu ekliyoruz ve sonrasında gerekli
düzenlemeleri yapacağız.

Route::get(‘/jobs/retryall/{id}’, ‘RetryController@retryall’)->name(‘horizon.retry-all’);
nano vendor/laravel/horizon/src/Http/Controllers/RetryController.php

use Laravel\Horizon\Jobs\RetryAllFailedJob;

/**
* Retry a failed job.
*
* @param  string  $id
* @return void
*/
public function retryall($id)
{
dispatch(new RetryAllFailedJob($id));
}

eklendi.
nano vendor/laravel/horizon/src/Jobs/RetryAllFailedJob.php
diye yeni bir job ekliyoruz bunu da RetryFailedJob işinden çoğaltarak yapıyoruz.
handle bölümünü düzenliyoruz.
if (is_null($job = $jobs->findFailed($this->id))) {
return;
}
/*once islem goren fail verisini siliyoruz
* sonra tekrar deniyoruz.Eger basarili olursa
* islemler icinde statusu guncelleniyor.
* basarisiz olursa tekrar listeye ekleniyor.
*/
$jobs->deleteFailed($this->id);
$queue->connection($job->connection)->pushRaw(
$this->preparePayload($id = JobId::generate(), $job->payload), $job->queue
);
$jobs->storeRetryReference($this->id, $id);

(Not: php 7.1.22 için eksik extension uyarısı alabilirsiniz.

Problem 1
– laravel/horizon v2.0.0 requires ext-pcntl * -> the requested PHP extension pcntl is missing from your system.
– laravel/horizon 2.0.x-dev requires ext-pcntl * -> the requested PHP extension pcntl is missing from your system.
– Installation request for laravel/horizon ^2.0 -> satisfiable by laravel/horizon[2.0.x-dev, v2.0.0].

To enable extensions, verify that they are enabled in your .ini files:
– /usr/local/php71/lib/php.ini
– /usr/local/php71/lib/php.conf.d/10-directadmin.ini
– /usr/local/php71/lib/php.conf.d/50-webapps.ini
You can also run `php –ini` inside terminal to see which files are used by PHP in CLI mode.

Bu hatadan sonra composer.json içinde config bölümünde aşağıdaki güncellemeleri yaptım.
“config”: {
“platform”: {
“ext-pcntl”: “7.2”,
“ext-posix”: “7.2”
}
}
composer update
tekrar horizonu kurduğumuzda hata giderilmiş olması gerekiyor.Benim yaptığım testte bu sorun bu şekilde giderilmiştir.
)