Как сделать запуск крона по расписанию, указанному вручную?

Для запуска крона по пользовательскому расписанию в Symfony можно использовать компонент "Symfony Process" и создать команду, которая будет запускаться с помощью cron.

Во-первых, необходимо создать новую команду в вашем Symfony приложении. Для этого вы можете использовать команду make:command из Symfony Console. Выполните следующую команду:

php bin/console make:command

После этого вам будет предложено ввести имя команды, описание и название класса команды. Вы можете установить любые удобные вам значения.

После создания класса команды вы должны перейти в метод configure() этого класса и добавить аргумент и опции, позволяющие настроить расписание запуска команды. Например, вы можете добавить аргумент schedule, в который будет передаваться расписание запуска команды. Также вы можете добавить опции, позволяющие установить другие параметры, такие как --host или --user.

Пример реализации такой команды может выглядеть следующим образом:

protected function configure()
{
    $this
        ->setName('app:cron')
        ->setDescription('Run custom cron job')
        ->addArgument('schedule', InputArgument::REQUIRED, 'Cron schedule')
        ->addOption('host', null, InputOption::VALUE_REQUIRED, 'Host name')
        ->addOption('user', null, InputOption::VALUE_REQUIRED, 'Username');
}

Затем вам нужно добавить логику выполнения команды в метод execute() класса команды. В этом методе вы можете использовать объект Process для запуска крона.

protected function execute(InputInterface $input, OutputInterface $output)
{
    $schedule = $input->getArgument('schedule');
    $host = $input->getOption('host');
    $user = $input->getOption('user');

    $command = sprintf('crontab -l | { echo "%s php /path/to/your/command"; } | crontab -', $schedule);

    if ($host && $user) {
        $command = sprintf('ssh %s@%s '%s'', $user, $host, $command);
    }

    $process = new Process($command);
    $process->run();

    if (!$process->isSuccessful()) {
        throw new RuntimeException($process->getErrorOutput());
    }

    $output->writeln('Custom cron job successfully scheduled.');

    return Command::SUCCESS;
}

В данном примере скомпилированная команда cron добавляется к существующему списку задач cron, заменяя его.

Теперь вам остается настроить cron, чтобы запускать эту команду с заданным расписанием. Для этого вы можете использовать команду crontab -e, чтобы открыть файл cron для редактирования. Добавьте следующую строку, чтобы запускать вашу команду:

* * * * * php /path/to/your/symfony_app/bin/console app:cron "*/5 * * * *" --host <your_host> --user <your_user>

В данном примере команда запускается каждые 5 минут.

Сохраните изменения и закройте файл.

Теперь ваша команда будет запускаться по указанному пользовательскому расписанию.