Чат Telegram
Группа ВКонтакте
Новый комментарий


Kirill.K

В bin/cli.php добавить задержку исполнения

try {
    unset($argv[0]);
    sleep(array_shift($argv));
    ...

Создать три задачи с разными параметрами выполнения: 0, 20 и 40, соответственно
...domains\myproject.loc\bin\cli.php 0 TestCron -x=20 -y=17
...domains\myproject.loc\bin\cli.php 20 TestCron -x=20 -y=17
...domains\myproject.loc\bin\cli.php 40 TestCron -x=20 -y=17

ivashkevich

Как вариант, неплохо. Но я бы сделал это не в cli.php, а в конкретном скрипте. И передавал бы именованный параметр:

-sleep=20
Iliusha99

Warning: file_put_contents(C:\1.log): failed to open stream: Permission denied in D:\OpenServer
\OSPanel\domains\myproject.loc\src\MyProject\Cli\TestCron.php on line 18

как доступ открыть?

ivashkevich

Измените путь до файла, чтобы туда мог писать ваш текущий пользователь в винде.

Metey

Согласно рекомендациям в комментариях : php cli.php TestCron -x=20 -y=17 -sleep=20

namespace MyProject\Cli;

class TestCron extends AbstractCommand
{
    protected function checkParams()
    {
        $this->ensureParamExists('x');
        $this->ensureParamExists('y');
        $this->ensureParamExists('sleep');
    }

    public function execute()
    {
        sleep($this->getParam('sleep'));
        // чтобы проверить работу скрипта, будем записывать в файлик 1.log текущую дату и время
        file_put_contents('D:\\1.log', date(DATE_ISO8601) . PHP_EOL, FILE_APPEND);
        echo 'OK';
    }
}
ivashkevich

Так каким образом запускать каждые 20 секунд? У вас просто задержка перед запуском 20 секунд.

Metey

Поставить несколько заданий, используя эту задержку, каждую минуту, но со стартом в одно время три задания с 0, 20 и 40 будут выполняться каждые 20 секунд

Moskva

Будем использовать эту же команду: * php c:\OSPanel\domains\myproject.loc\bin\cli.php TestCron -x=20 -y=17.
И ещё добавим цикл с задержкой 20 секунд в cli.php

 for($i=1; $i<=3; $i++) {
     sleep(20);
     // Создаём экземпляр класса, передав параметры и вызываем метод execute()
     $class = new $className($params);
     $class->execute();
 }

Результат 1.log:
2019-08-18T09:27:20+0300
2019-08-18T09:27:40+0300
2019-08-18T09:28:00+0300
2019-08-18T09:28:20+0300
2019-08-18T09:28:40+0300
2019-08-18T09:29:00+0300
2019-08-18T09:29:20+0300
2019-08-18T09:29:40+0300
2019-08-18T09:30:00+0300
2019-08-18T09:30:20+0300
2019-08-18T09:30:40+0300
2019-08-18T09:31:00+0300

ivashkevich

А если метод execute будет выполняться несколько минут? Как добиться, чтобы остальные всё же стартанули?

Онлайн обучение PHP
Путь с полного нуля до джуниора!
Начать бесплатно
Логические задачи с собеседований