add
int \Workerman\Timer::add(float $time_interval, callable $callback [,$args = array(), bool $persistent = true])
Belirli bir fonksiyonu veya sınıf metodunu belirli aralıklarla çalıştırır.
Dikkat: Zamanlayıcı, mevcut işlemde çalışır; Workerman içinde zamanlayıcıyı çalıştırmak için yeni bir işlem veya thread oluşturulmaz.
Parametreler
time_interval
Ne kadar sürede bir çalıştırılacağını belirler, birim saniye, ondalık destekler, 0.001'e kadar hassasiyet sağlayabilir, yani milisaniye seviyesinde hassasdır.
callback
Geri çağırma fonksiyonu Dikkat: Eğer geri çağırma fonksiyonu bir sınıf metoduyse, bu metodun public özelliğe sahip olması gerekir
args
Geri çağırma fonksiyonunun parametreleri, dizi olmalıdır, dizi elemanları parametre değerleri olmalıdır.
persistent
Sonsuz mu olduğu, sadece bir kez çalıştırmak istiyorsanız false ile geçin (sadece bir kez çalıştırılan görev tamamlandıktan sonra otomatik olarak yok edilir, Timer::del() çağrılmasına gerek yoktur). Varsayılan olarak true'dur, yani sürekli zamanlayıcı çalıştırılır.
Dönen Değer
Bir tam sayı döner, zamanlayıcının timerid'sini temsil eder, bu zamanlayıcıyı yok etmek için Timer::del($timerid) çağrılabilir.
Örnek
1. Zamanlayıcı fonksiyonu anonim fonksiyon (closure) olarak
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$task = new Worker();
// Zamanlayıcı görevlerini çalıştıracak kaç işlem açılacağı, dikkat edin işin çoklu işlemde eş zamanlılık problemi var mı
$task->count = 1;
$task->onWorkerStart = function(Worker $task)
{
// Her 2.5 saniyede bir çalıştır
$time_interval = 2.5;
Timer::add($time_interval, function()
{
echo "görev çalışıyor\n";
});
};
// Worker'ı çalıştır
Worker::runAll();
2. Sadece belirtilen işlemde zamanlayıcı ayarlama
Bir worker örneği 4 işlem içerir, yalnızca id numarası 0 olan işleme zamanlayıcı ayarlanır.
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker();
$worker->count = 4;
$worker->onWorkerStart = function(Worker $worker)
{
// Yalnızca id numarası 0 olan işlemde zamanlayıcı ayarlayın, diğer 1, 2, 3 numaralı işlemlerde zamanlayıcı ayarlamayın
if($worker->id === 0)
{
Timer::add(1, function(){
echo "4 worker işlemi, yalnızca 0 numaralı işlemde zamanlayıcı ayarlıyor\n";
});
}
};
// Worker'ı çalıştır
Worker::runAll();
3. Zamanlayıcı fonksiyonu anonim fonksiyon, closure ile parametre geçirerek
use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$ws_worker = new Worker('websocket://0.0.0.0:8080');
$ws_worker->count = 8;
// Bağlantı kurulduğunda ilgili bağlantıya zamanlayıcı ayarlayın
$ws_worker->onConnect = function(TcpConnection $connection)
{
// Her 10 saniyede bir çalıştır
$time_interval = 10;
$connect_time = time();
// connection nesnesine geçici olarak bir timer_id özelliği ekleyin
$connection->timer_id = Timer::add($time_interval, function() use ($connection, $connect_time)
{
$connection->send($connect_time);
});
};
// Bağlantı kapandığında, ilgili bağlantının zamanlayıcısını kaldır
$ws_worker->onClose = function(TcpConnection $connection)
{
// Zamanlayıcıyı kaldır
Timer::del($connection->timer_id);
};
// Worker'ı çalıştır
Worker::runAll();
4. Zamanlayıcı fonksiyonu anonim fonksiyon, zamanlayıcı arayüzü ile parametre geçirerek
use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$ws_worker = new Worker('websocket://0.0.0.0:8080');
$ws_worker->count = 8;
// Bağlantı kurulduğunda ilgili bağlantıya zamanlayıcı ayarlayın
$ws_worker->onConnect = function(TcpConnection $connection)
{
// Her 10 saniyede bir çalıştır
$time_interval = 10;
$connect_time = time();
// connection nesnesine geçici olarak bir timer_id özelliği ekleyin
$connection->timer_id = Timer::add($time_interval, function($connection, $connect_time)
{
$connection->send($connect_time);
}, array($connection, $connect_time));
};
// Bağlantı kapandığında, ilgili bağlantının zamanlayıcısını kaldır
$ws_worker->onClose = function(TcpConnection $connection)
{
// Zamanlayıcıyı kaldır
Timer::del($connection->timer_id);
};
// Worker'ı çalıştır
Worker::runAll();
5. Zamanlayıcı fonksiyonu normal fonksiyon
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
// Normal bir fonksiyon
function send_mail($to, $content)
{
echo "mail gönderiliyor ...\n";
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
$to = 'workerman@workerman.net';
$content = 'merhaba workerman';
// 10 saniye sonra e-posta gönderimini gerçekleştir, son parametre false geçilir, yani yalnızca bir kez çalıştırılır
Timer::add(10, 'send_mail', array($to, $content), false);
};
// Worker'ı çalıştır
Worker::runAll();
6. Zamanlayıcı fonksiyonu sınıf metodudur
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
// Dikkat, geri çağırma fonksiyonu public olmalıdır
public function send($to, $content)
{
echo "mail gönderiliyor ...\n";
}
}
$task = new Worker();
$task->onWorkerStart = function($task)
{
// 10 saniye sonra bir kez mail gönder
$mail = new Mail();
$to = 'workerman@workerman.net';
$content = 'merhaba workerman';
Timer::add(10, array($mail, 'send'), array($to, $content), false);
};
// Worker'ı çalıştır
Worker::runAll();
7. Zamanlayıcı fonksiyonu sınıf metodudur (sınıf içinde zamanlayıcı kullanımı)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
// Dikkat, geri çağırma fonksiyonu public olmalıdır
public function send($to, $content)
{
echo "mail gönderiliyor ...\n";
}
public function sendLater($to, $content)
{
// Geri çağırılan metod mevcut sınıfın yöntemi ise, geri çağırma dizisinin ilk elemanı $this olmalıdır
Timer::add(10, array($this, 'send'), array($to, $content), false);
}
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
// 10 saniye sonra bir kez mail gönder
$mail = new Mail();
$to = 'workerman@workerman.net';
$content = 'merhaba workerman';
$mail->sendLater($to, $content);
};
// Worker'ı çalıştır
Worker::runAll();
8. Zamanlayıcı fonksiyonu sınıfın statik metodudur
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
// Dikkat bu bir statik metot, geri çağırma fonksiyonu public olmalıdır
public static function send($to, $content)
{
echo "mail gönderiliyor ...\n";
}
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
// 10 saniye sonra bir kez mail gönder
$to = 'workerman@workerman.net';
$content = 'merhaba workerman';
// Sınıfın statik metodunu zamanlayarak çağırma
Timer::add(10, array('Mail', 'send'), array($to, $content), false);
};
// Worker'ı çalıştır
Worker::runAll();
9. Zamanlayıcı fonksiyonu sınıfın statik metodudur (isim alanı ile birlikte)
namespace Task;
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
// Dikkat bu bir statik metot, geri çağırma fonksiyonu public olmalıdır
public static function send($to, $content)
{
echo "mail gönderiliyor ...\n";
}
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
// 10 saniye sonra bir kez mail gönder
$to = 'workerman@workerman.net';
$content = 'merhaba workerman';
// İsim alanı içindeki sınıfın statik metodunu zamanlayarak çağırma
Timer::add(10, array('\Task\Mail', 'send'), array($to, $content), false);
};
// Worker'ı çalıştır
Worker::runAll();
10. Zamanlayıcı içinde mevcut zamanlayıcıyı yok etme (use closure ile $timer_id geçişi)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
// Sayım
$count = 1;
// $timer_id'nin geri çağırma fonksiyonuna doğru bir şekilde iletilmesi için $timer_id'nin önüne & işareti koyulmalıdır
$timer_id = Timer::add(1, function() use (&$timer_id, &$count)
{
echo "Zamanlayıcı çalışıyor $count\n";
// 10 kez çalıştıktan sonra mevcut zamanlayıcıyı yok et
if($count++ >= 10)
{
echo "Timer::del($timer_id)\n";
Timer::del($timer_id);
}
});
};
// Worker'ı çalıştır
Worker::runAll();
11. Zamanlayıcı içinde mevcut zamanlayıcıyı yok etme ($timer_id parametre ile geçişi)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
public function send($to, $content, $timer_id)
{
// Geçici olarak mevcut objeye bir count özelliği eklemek, zamanlayıcının çalışma sayısını kaydetmek için
$this->count = empty($this->count) ? 1 : $this->count;
// 10 kez çalıştıktan sonra mevcut zamanlayıcıyı yok et
echo "mail gönderiliyor {$this->count}...\n";
if($this->count++ >= 10)
{
echo "Timer::del($timer_id)\n";
Timer::del($timer_id);
}
}
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
$mail = new Mail();
// $timer_id'nin geri çağırma fonksiyonuna doğru bir şekilde iletilmesi için $timer_id'nın önüne & işareti koyulmalıdır
$timer_id = Timer::add(1, array($mail, 'send'), array('to', 'content', &$timer_id));
};
// Worker'ı çalıştır
Worker::runAll();