Новый комментарий

Kirill.K 25.11.2018 в 15:41

В 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 25.11.2018 в 17:28

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

-sleep=20
Iliusha99 09.08.2019 в 18:47

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 10.08.2019 в 07:24

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

Metey 17.08.2019 в 17:33

Согласно рекомендациям в комментариях : 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 18.08.2019 в 06:54

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

Metey 18.08.2019 в 09:38

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

ivashkevich 18.08.2019 в 13:25

Ок

Moskva 18.08.2019 в 09:32

Будем использовать эту же команду: * 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 18.08.2019 в 13:27

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

Alexann 01.04.2020 в 22:05

Добавить три задержки по 20 c. в execute() класса TestCron. Файл TestCron.php:

<?php

namespace MyProject\Cli;

class TestCron extends AbstractCommand
{
...
    public function execute()
    {
            for ($i=1;$i<=3;$i++){
            file_put_contents('D:\\1.log', date(DATE_ISO8601) . PHP_EOL, FILE_APPEND);
            sleep(20);
        }
    }
}
ivashkevich 02.04.2020 в 05:37

А если сама задача выполняется 5 секунд, то следующий запуск произойдет лишь спустя 25 секунд. Так не годится.

Alexann 02.04.2020 в 14:58

Тогда только через Cron. Запланировать вот так (это для Windows старше Vista):

* * * * * php d:\OSPanel\domains\myproject.loc\bin\cli.php TestCron -x=20 -y=17
* * * * * (timeout /t 20) &&  php d:\OSPanel\domains\myproject.loc\bin\cli.php TestCron -x=20 -y=17
* * * * * (timeout /t 40) &&  php d:\OSPanel\domains\myproject.loc\bin\cli.php TestCron -x=20 -y=17
ivashkevich 02.04.2020 в 15:26

Да, нормальный рабочий вариант)

Larisa 27.01.2021 в 23:37
***** php C:\OPENSERVER\OpenServer\domains\study\bin\cli.php TestCron -x=20 -y=17
***** (timeout /t 20) && php C:\OPENSERVER\OpenServer\domains\study\bin\cli.php TestCron -x=20 -y=17
***** (timeout /t 20) && php C:\OPENSERVER\OpenServer\domains\study\bin\cli.php TestCron -x=20 -y=17
ivashkevich 28.01.2021 в 07:53

Отлично!

OneMoreTime 04.06.2021 в 14:28

Здравствуйте! А кто вообще занимается настройкой cron в частности? Девопс, сисадмин, бэкендщик?
Ну и хотелось бы поинтересоваться о практическом применении выполнения этих операций под виндой, если учесть, что это объясняется в контексте веб-программирования и cron по умолчанию будет работать на сервере с линуксом.

ivashkevich 04.06.2021 в 21:09

Да настройки как таковой нет. Есть список команд, которые нужно запускать по расписанию. Кому нужно их запускать, тот и меняет расписание как ему нужно.

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

Djem 16.11.2021 в 19:47

2021-11-16T19:36:00+0300
2021-11-16T19:36:20+0300
2021-11-16T19:36:40+0300
2021-11-16T19:37:00+0300
2021-11-16T19:37:20+0300
2021-11-16T19:37:40+0300

Почему смещение указано +0300? Хотя в системе установлен часовой пояс +0400
![описание картинки](https://php.zone/uploads/img/2021111657b0d7f8a59877d82c831413fda35db95c955e94acf61b30efd04fe93bbc59c6.png)

Dram 29.06.2022 в 22:45

Запускать каждую минуту, сделать 3 задания и добавить второму sleep 20, третьему sleep 40

ivashkevich 24.07.2022 в 19:14

Норм

Логические задачи с собеседований