PHP-Need kullanıcı kaydolma geri sitesi işleme için bir cron ...

3 Cevap php

Yeni bir kullanıcı sitemde imzalar zaman, ben gelecekte arama kısaltmak için bazı ön-işleme yapmak istiyorum. Bu, herhangi bir işlem süresi 30 dakika ila 2 içerir. Açıkçası ben onlar kaydolma üzerinde Gönder düğmesini tıkladığınızda, bu do ... ya da ziyaret ettiğiniz herhangi bir PHP sayfası üzerinde olamaz. Ancak, ben bu kaydolma (veya daha az) bunlardan 5 dakika içinde yapılması istiyorsunuz.

Cron Route I THINK this needs to be in a cron job, and if so, how should I setup the cron job? If so, what should my cron line look like to run every 2 minutes, and how can I insure that I don't have the same cron job overlapping the next?

Event/Fork Route - Preferred If I can possibly throw some event to my server without disrupting my users experience or fork a process off of the users signup (instead of a cron job) how could I do this?

3 Cevap

Ben ne çözüm öneriyoruz.

Bunun yerine, message queue onun işlerini alır uzun süren bir süreç (daemon) ile kapalı iyi olurdu. Sizin tercih edilen yöntem ise, Mesaj kuyruğu kendisi bir veritabanı kapalı olabilir.

Eğer veritabanına iş için bir tanımlayıcı yayınlayacağız, ve sonra uzun süren bir süreç onlara bir süre ve hareket kez onlara yinelemenize.Ölçütlere.

Bu kadar basit:

<?php
while(true) {
   jobs = getListOfJobsFromDatabase();  // get the jobs from the databbase
   foreach (jobs as job) {
      processAJob(job); // do whatever needs to be done for the job
      deleteJobFromDatabase(job); //remember to delete the job once its done!
   }
   sleep(60); // sleep for a while so it doesnt thrash your database when theres nothing to do
}
?>

Ve sadece komut satırından bu komut dosyasını çalıştırın.

Bir cron üzerinde bu faydaları alışkanlık bir yarış durumu almak vardır.

Ayrıca yerine sırayla işleme daha çok paralel yapılabilir işlerin aslında işleme kapalı ödemek isteyebilirsiniz.

Sen bir arka plan PHP görev çağırmak için aşağıdaki sınıfını kullanabilirsiniz.

class BackgroundProcess {
    static function open($exec, $cwd = null) {
    	if (!is_string($cwd)) {
    		$cwd = @getcwd();
    	}

    	@chdir($cwd);

    	if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
    		$WshShell = new COM("WScript.Shell");
    		$WshShell->CurrentDirectory = str_replace('/', '\\', $cwd);
    		$WshShell->Run($exec, 0, false);
    	} else {
    		exec($exec . " > /dev/null 2>&1 &");
    	}
    }

    static function fork($phpScript, $phpExec = null) {
    	$cwd = dirname($phpScript);

    	if (!is_string($phpExec) || !file_exists($phpExec)) {
    		if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
    			$phpExec = str_replace('/', '\\', dirname(ini_get('extension_dir'))) . '\php.exe';

    			if (@file_exists($phpExec)) {
    				BackgroundProcess::open(escapeshellarg($phpExec) . " " . escapeshellarg($phpScript), $cwd);
    			}
    		} else {
    			$phpExec = exec("which php-cli");

    			if ($phpExec[0] != '/') {
    				$phpExec = exec("which php");
    			}

    			if ($phpExec[0] == '/') {
    				BackgroundProcess::open(escapeshellarg($phpExec) . " " . escapeshellarg($phpScript), $cwd);
    			}
    		}
    	} else {
    		if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
    			$phpExec = str_replace('/', '\\', $phpExec);
    		}

    		BackgroundProcess::open(escapeshellarg($phpExec) . " " . escapeshellarg($phpScript), $cwd);
    	}
    }
}

Bu tür olarak kullanımı:

BackgroundProcess::fork('process_user.php');

İşte bence budur. Tüm kullanıcılar için tek bir cron var. Bu şekilde bir sıra gibi çalışan bir tablo koyarak üstüste temin edebilirsiniz. Cron her saat çalıştırın ama kuyruğu boş değilse ilk kuyruğunu kontrol edin. Saat tekrar sonraki deneyin için cron işi atlamak değilse.