alihankoc
Merhaba,
Öncelikle cevabınız için teşekkürler. Dediğiniz işi sanırım komut satırı ile yapabilirim.
100'ün üzerinde farklı sitelere iş yapan bir Cronjob schedule listemvar. Bunları şu mantıkla kullanıyorum. Her 15 dakikada 1 olmak üzere ürün fiyat ve stoklarını md5 leyip veritabanımdaki değerler karşılaştırıp ona göre job işliyorum. Bu kontrol de job içerisinde yapılıyor.
Ama bu aşamaya gelmeden önce verileri tarayıcı üzerinden kaynaklardan çağırıp , kuyruğa foreach ile atmam gerekiyor. Burada da süre faktörü araya girdiği için bir job queue manager oluşturdum. Kuyruğa aldığım bir iş kuyruktaysa tekrar eklemesin diye. Böylelikle sürekli bir döngü yakalamayı hedefledim.
foreach ($product_list as $key=> $product)
{
$key++;
$log_text = "Ürün güncelleme - ". $key.' satır işleniyor.';
$log_text = $log_text.' Ürün kodu:'.$product->ItemCode;
$log_text = $log_text.' Barkodu:'.$product->Barcode;
Log::channel($log_channel)->info($log_text);
$job = (new ProductUptadeJob($product,$database,$this->cacheKey,$onQueueName))
->onQueue($onQueue);
$product->EntegrasyonTipi = "ÜrünGüncelleme";
$control_status = $jobOperations->ControlJobQueueManager($onQueue, json_encode($product));
if ($control_status == true) {
$jobID = app(Dispatcher::class)->dispatch($job);
$jobOperations->AddJobQueueManager($onQueue, json_encode($product), $jobID);
}
}
Bunların classlarını da yukarıda paylaşmıştım.
Sonrasında da Job içerisinde bu kontrolü siliyorum.
DB::table("job_queue_manager")
->where("jobID", (string)$this->job->getJobId())
->where("queueName", $this->onQueueName)
->delete();
İşler için de oluşturduğum Cronjob schedule şu şekilde🙁1 örnek)
$schedule->command('CronJob:start Urun/site-guncelleme')->everyFifteenMinutes();
protected $signature = 'cronJob:start {integration?}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'CronJob işlemi başlatmak için kullanılır';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
* @return void
* @throws GuzzleException
*/
public function handle()
{
if(!empty($this->argument("integration")))
{
$test_status = false;
if($test_status == true)
{
$domain = 'http://127.0.0.1:8000';
}
else
{
$domain= "$url";
}
$client = new GuzzleServiceClass();
$response = $client->request("GET",$this->argument(
"integration"),
$domain,
["verify"=>false]);
if($response->getStatusCode() == 200)
{
echo "\033[32m İşlem başarılı!\033[0m\n";
}
else
{
echo "\033[32m İşlem başarılı!\033[0m\n";
}
}
else
{
echo "\033[31m İşlem başarısız!\033[0m\n";
}
}
Guzzle ile de bunları get ile çağırdım.
Dediğiniz gibi bunu şu şekilde yapsam da olur. Url'den çağırdığımda ise ilgili controller'a işler şu şekilde gidiyor.
Route::group(['prefix' => 'Customer','middleware' => 'ipcontrol'], function () {
App::setLocale("tr");
Route::get("{metod}/{metod2?}/{metod3?}",['uses' =>'AppController@CustomerType1']);
});
Route::group(['prefix' => 'Customer2','middleware' => 'ipcontrol'], function () {
App::setLocale("tr");
Route::get("{metod}",['uses' =>'AppController@CustomerType2']);
});
public function CustomerType1($metod)
{
if ($metod == "site1") {
$site1 = new Site1();
$site1 ->EntegrasyonCalistir(); // parametre olarak da $Database ismi alıyor. Olası farklı bir database kullanımında
anında değiştirebilmek için
}
}
public function CustomerType2($metod)
{
if ($metod == "site2") {
$site2 = new Site2();
$site2 ->EntegrasyonCalistir();
}
}
Buradaki guzzle iptal edip bir command satırı ile gelen $url parametresine göre class çağırıp entegrasyon çalıştır yapabilirim. Ama dediğiniz gibi socket kullanma konusunda hiç işlem yapmadım. Burada tarayıcıda bir çıktı nasıl gösterebilirim bilmiyorum.