Планирование заданий из веб-среды в Linux - PullRequest
2 голосов
/ 25 декабря 2010

Я занимаюсь разработкой приложения на PHP на Linux / Apache. Я хочу иметь возможность планировать задания PHP (скрипты) для выполнения в определенное время в будущем из приложения.

Я знаю, что многие люди будут рекомендовать cron и at, но, во-первых, мне не нужно повторение (cron), а во-вторых, и самое главное, мне нужно решение, чтобы иметь возможность масштабировать. Он не был разработан с учетом условий гонки, и если два пользователя одновременно пытаются добавить работу, один или оба могут потерпеть неудачу.

Также важно, чтобы задания выполнялись в указанное время, а не просто "опрашивались" раз в минуту или около того.

Может кто-нибудь предложить решения для этой задачи? Спасибо.

Ответы [ 5 ]

2 голосов
/ 25 декабря 2010

написать php-скрипт в качестве демона, который скрипт запускает в фоновом режиме, просыпается каждые несколько микросекунд, проверяет выполнение задач.если у него есть какие-то задачи, которые он может выполнить, он может затем запустить саму себя и запустить задачу.

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

гиперссылки:

http://en.wikipedia.org/wiki/Daemon_%28computer_software%29

http://php.net/manual/en/function.pcntl-fork.php

http://www.php.net/manual/en/function.pcntl-signal.php

0 голосов
/ 14 июля 2015

Вот решение для Yii2 с использованием MySQL.Если вы поместите запрос / обновление статуса в транзакцию, у вас может быть несколько рабочих на разных компьютерах.

cron table
Field         | Type        
--------------+-------------
id            | int(11)     
execute_after | timestamp   
executed_at   | timestamp   
status        | int(11)     
progress      | int(11)     
action        | varchar(255)
parameter     | varchar(255)
result        | varchar(255)
Cron class
  /** This command waits for jobs to work on by polling the DB every 10s. TODO put this into Redis.
   * 
   */
  public function actionIndex()
  {
    do {
      $job = Cron::find()->where('execute_after < :now AND status = 0 ORDER BY id ASC', [':now'=>date(DATE_ATOM)])->one();
      if($job && method_exists($this, $job->action)){
        $job->status = 1;
        $job->save() or Yii::error($job->getErrors());
        $result = $this->{$job->action}($job, $job->parameter);
        $job->status = 2;
        $job->progress = 100;
        $job->executed_at = date(DATE_ATOM);
        $job->save() or Yii::error($job->getErrors());
      }
      sleep(10);
    } while (true);
  }

Тогда у вас могут быть задачи в классе, такие как

function toggleStatus($job, $id) {

, которые выполняют работу и обновляют ход выполнения задания по завершении.

0 голосов
/ 28 мая 2014

В системах POSIX должен быть at-daemon , который в основном является одноразовой версией cron:

$ at 13:20 executeVeryImportantScript.php withPositionalParameters taken

, которая может быть вызвана через exec php (или любой другойиспользуется для выполнения команд оболочки через php).

Реализовать уже существующие решения Очень плохая практика ™ :

  1. Вам необходимо реализовать это, а это не дорогоэффективный
  2. Вам необходимо проверить код
  3. Вам необходимо сохранить код
0 голосов
/ 25 декабря 2010

Это то, что вы могли (я бы) сделал:

0 голосов
/ 25 декабря 2010

можно попробовать КПП

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...