Pull to refresh

Одноврéменно || Одновремéнно

Reading time2 min
Views921
Original author: Zend Technologies Ltd
image

Введение


ZendX_Console_Process_Unix позволяет разработчикам создавать объекты под видом процессов, и таким образом параллельно выполнять несколько задач. Из-за особенностей реализации на текущий момент эта возможность доступна только на *nix системах, таких как Linux, Solaris, Mac / OSX и другие в CLI или CGI режиме. Кроме того для работы этого компонента необходимы следующие модули: Shared Memory, Process Control и POSIX. Если одно из требований не выполняется, то будет брошено исключение.

Основы использования ZendX_Console_Process_Unix


ZendX_Console_Process_Unix это абстрактный класс, который должен быть расширен пользователем. В нем находится единственный абстрактный метод _run(), который должен описывать реализуемый алгоритм обработки тех или иных данных. Так же в классе определенны методы для проверки состояния процесса и обмена переменными между основным и дочерними процессами.

Метод _run(), а так же каждый метод вызванный внутри него будет выполняться в отдельном процессе. Любой другой метод, вызванный в вашем приложении будет выполняться в родительском процессе.

Методы setVariable () и getVariable () могут быть использованы для передачи переменных между родительским и дочерними процессами. Для наблюдения за статусом дочернего процесса следует вызывать внутри него метод _setAlive () через короткие промежутки времени, таким образом родительский процесс сможет получить информацию о состоянии дочернего процесса посредством вызова метода getLastAlive (). Чтобы получить PID дочернего процесса, родитель может вызвать getPid().

  1. class MyProcess extends ZendX_Console_Process_Unix
  2. {
  3.   protected function _run()
  4.   {
  5.     for ($i = 0; $i < 10; $i++) {
  6.       // Doing something really important which can't wait: sleeping
  7.       sleep(1);
  8.     }
  9.   }
  10. }
  11. // This part should last about 10 seconds, not 20.
  12. $process1 = new MyProcess();
  13. $process1->start();
  14. $process2 = new MyProcess();
  15. $process2->start();
  16. while ($process1->isRunning() && $process2->isRunning()) {
  17.   sleep(1);
  18. }
  19. echo 'All processes completed';
* This source code was highlighted with Source Code Highlighter.

В этом примере процесс распараллелен на два и запущен. Каждый дочерний процесс выполняется по 10 секунд, следовательно родительский процесс будет завершен в течение 10 секунд (а не 20).

P. S.
Не смотря на то что я достаточно активно использую Zend Framework и то что это компонент доступен уже более 16 месяцев (с 31 октября 2008), о его существовании я узнал только сейчас, возможно теперь curl боты станут еще злее.
Tags:
Hubs:
Total votes 42: ↑37 and ↓5+32
Comments34

Articles