1. Go to this page and download the library: Download nabeghe/cronark library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
nabeghe / cronark example snippets
use Nabeghe\Cronark\Cronark;
class SendEmailsJob
{
public function __construct(private Cronark $cronark)
{
}
public function __invoke()
{
// Your job logic here
$this->cronark->print('Sending emails...');
// Send pending emails
// ...
$this->cronark->print('Emails sent successfully!');
}
}
abeghe\Cronark\Cronark;
$cronark = new Cronark();
// Register jobs for the 'email' worker
$cronark->addJob(SendEmailsJob::class, 'email');
$cronark->addJob(ProcessNewsletterJob::class, 'email');
// Start the worker
$cronark->start('email');
$cronark = new Cronark();
// Email worker - runs every minute
$cronark->addJob(SendEmailsJob::class, 'email');
$cronark->addJob(ProcessBouncesJob::class, 'email');
// Data processing worker - runs every 5 minutes
$cronark->addJob(ImportDataJob::class, 'data');
$cronark->addJob(GenerateReportsJob::class, 'data');
// Cleanup worker - runs hourly
$cronark->addJob(CleanupTempFilesJob::class, 'cleanup');
$cronark->addJob(PurgeOldLogsJob::class, 'cleanup');
// Start specific worker
$worker = $argv ?? 'email';[1]
$cronark->start($worker);
// If worker is already running, this will abort
$cronark->start('email');
// Check if worker is active
if ($cronark->isActive('email', $pid)) {
echo "Worker is running with PID: $pid";
}
// Gracefully stop a worker
$cronark->kill('email');
// Stop all workers
$cronark->killAll();
// Add to end (default)
$cronark->addJob(JobA::class, 'worker');
$cronark->addJob(JobB::class, 'worker');
// Insert at specific position
$cronark->addJob(UrgentJob::class, 'worker', 0); // First
// Jobs execute: UrgentJob -> JobA -> JobB -> repeat
use Nabeghe\Cronark\StorageInterface;
class DatabaseStorage implements StorageInterface
{
public function get(string $key, ?string $worker = null): mixed
{
// Fetch from database
return DB::table('cronark_storage')
->where('worker', $worker)
->where('key', $key)
->value('value');
}
public function set(string $key, mixed $value, ?string $worker = null): bool
{
// Save to database
return DB::table('cronark_storage')->updateOrInsert(
['worker' => $worker, 'key' => $key],
['value' => serialize($value)]
);
}
}
$cronark = new Cronark(new DatabaseStorage());
class CustomCronark extends Cronark
{
protected function onStarted(string $worker): void
{
// Log worker start
Log::info("Worker {$worker} started");
}
protected function onStopped(string $worker): void
{
// Log worker stop
Log::info("Worker {$worker} stopped");
}
protected function onError(Throwable $e, string $worker): void
{
// Custom error handling
Log::error("Worker {$worker} error: " . $e->getMessage());
parent::onError($e, $worker);
}
protected function onJobCreating(): void
{
// Before each job instantiation
DB::reconnect(); // Reconnect to database
}
}
// No delay (default) - maximum speed
$cronark = new Cronark();
$cronark->start('worker');
// Balanced - 50ms delay (recommended for shared hosting)
$cronark = new Cronark();
$cronark->setDelay(50000); // microseconds
$cronark->start('worker');
// Using seconds (convenience method)
$cronark = new Cronark();
$cronark->setDelaySeconds(0.1); // 100ms
$cronark->start('worker');
// Method chaining
$cronark = new Cronark();
$cronark->setDelay(50000)
->addJob(EmailJob::class)
->start('worker');
$cronark->addJob(JobA::class, 'worker');
$cronark->addJob(JobB::class, 'worker');
$cronark->addJob(JobC::class, 'worker');
// Execution order: A → B → C → A → B → C → A → ...
class RiskyJob implements Job
{
public function handle(): void
{
try {
// Risky operation
$this->processData();
} catch (Exception $e) {
// Handle error
Log::error($e->getMessage());
throw $e; // Worker will catch and continue
}
}
}
// worker-email.php
$cronark = new Cronark();
$cronark->addJob(SendEmailsJob::class, 'email');
$cronark->start('email');
// worker-data.php
$cronark = new Cronark();
$cronark->addJob(ProcessDataJob::class, 'data');
$cronark->start('data');
// Both can run simultaneously without conflict