Введение
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().
- class MyProcess extends ZendX_Console_Process_Unix
- {
- protected function _run()
- {
- for ($i = 0; $i < 10; $i++) {
- // Doing something really important which can't wait: sleeping
- sleep(1);
- }
- }
- }
- // This part should last about 10 seconds, not 20.
- $process1 = new MyProcess();
- $process1->start();
- $process2 = new MyProcess();
- $process2->start();
- while ($process1->isRunning() && $process2->isRunning()) {
- sleep(1);
- }
- echo 'All processes completed';
* This source code was highlighted with Source Code Highlighter.
В этом примере процесс распараллелен на два и запущен. Каждый дочерний процесс выполняется по 10 секунд, следовательно родительский процесс будет завершен в течение 10 секунд (а не 20).
P. S.
Не смотря на то что я достаточно активно использую Zend Framework и то что это компонент доступен уже более 16 месяцев (с 31 октября 2008), о его существовании я узнал только сейчас, возможно теперь curl боты станут еще злее.