Как стать автором
Обновить

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

PHP
Перевод
Автор оригинала: 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 боты станут еще злее.
Теги:PHPZend FrameworkZendX_Console_Process_UnixThreadsShared MemoryProcess ControlPOSIXМногопоточностьФизика Лобачевского
Хабы: PHP
Всего голосов 42: ↑37 и ↓5+32
Просмотры742

Похожие публикации

Лучшие публикации за сутки