source: branches/1.2/workflow/inc/class.Thread.inc.php @ 1349

Revision 1349, 4.1 KB checked in by niltonneto, 15 years ago (diff)

Ticket #561 - Inclusão do módulo Workflow faltante nessa versão.

Line 
1<?php
2/**************************************************************************\
3* eGroupWare                                                               *
4* http://www.egroupware.org                                                *
5* --------------------------------------------                             *
6*  This program is free software; you can redistribute it and/or modify it *
7*  under the terms of the GNU General Public License as published by the   *
8*  Free Software Foundation; either version 2 of the License, or (at your  *
9*  option) any later version.                                              *
10\**************************************************************************/
11
12/**
13 * Classe que implementa, de forma simples, uma thread
14 * @package Workflow
15 * @author Brian W. Bosh
16 * @author Sidnei Augusto Drovetto Jr. - drovetto@gmail.com (minor modifications)
17 * @license http://www.gnu.org/copyleft/gpl.html GPL
18 */
19class Thread
20{
21        /**
22         * @var resource $processReference Referência ao processo em execução
23         * @access private
24         */
25        private $processReference;
26
27        /**
28         * @var array $pipes Pipes do processo
29         * @access private
30         */
31        private $pipes;
32
33        /**
34         * @var string $buffer Buffer da saída padrão
35         * @access private
36         */
37        private $buffer;
38
39        /**
40         * @var float $timeStart Início da execução do processo (em microsegundos)
41         * @access private
42         */
43        private $timeStart;
44
45        /**
46         * @var float $timeEnd Fim da execução do processo (em microsegundos)
47         * @access private
48         */
49        private $timeEnd;
50
51        /**
52         * Construtor da classe Thread
53         * @param string $file O arquivo PHP que será executado
54         * @return object Objeto da classe Thread
55         * @access public
56         */
57        public function Thread($file)
58        {
59                $this->timeEnd = null;
60                $this->timeStart = microtime(true);
61                $this->buffer = '';
62                $this->pipes = array();
63
64                $descriptor = array(
65                        0 => array('pipe', 'r'),
66                        1 => array('pipe', 'w'),
67                        2 => array('pipe', 'w')
68                );
69
70                $this->processReference = proc_open("php -q {$file} ", $descriptor, $this->pipes);
71                stream_set_blocking($this->pipes[1], 0);
72        }
73
74        /**
75         * Indica se o processo está ativo ou não
76         * @return bool Indica se o processo está ativo (true) ou não (false)
77         * @access public
78         */
79        public function isActive()
80        {
81                $this->buffer .= $this->listen();
82                $f = stream_get_meta_data($this->pipes[1]);
83                return !$f['eof'];
84        }
85
86        /**
87         * Libera o recurso do processo (só deve ser chamado quando o processo não estiver mais ativo)
88         * @return int O código de saída do processo
89         * @access public
90         */
91        public function close()
92        {
93                $this->timeEnd = microtime(true);
94                fclose($this->pipes[0]);
95                fclose($this->pipes[1]);
96                fclose($this->pipes[2]);
97                $output = proc_close($this->processReference);
98                $this->processReference = NULL;
99                return $output;
100        }
101
102        /**
103         * Mata o processo
104         * @return int O código de finalização do processo
105         * @access public
106         */
107        public function kill()
108        {
109                $this->timeEnd = microtime(true);
110                fclose($this->pipes[0]);
111                fclose($this->pipes[1]);
112                fclose($this->pipes[2]);
113                $output = proc_terminate($this->processReference);
114                $this->processReference = null;
115                return $output;
116        }
117
118        /**
119         * Envia mensagens ao processo
120         * @param string $thought A mensagem a ser enviada
121         * @return void
122         * @access public
123         */
124        public function tell($thought)
125        {
126                fwrite($this->pipes[0], $thought);
127        }
128
129        /**
130         * Lê o buffer da saída padrão do processo
131         * @return string O conteúdo do buffer da saída padrão
132         * @access public
133         */
134        public function listen()
135        {
136                $buffer = $this->buffer;
137                $this->buffer = '';
138                while ($r = fgets($this->pipes[1], 1024))
139                        $buffer .= $r;
140
141                return $buffer;
142        }
143
144        /**
145         * Lê o buffer da saída de erro do processo
146         * @return string O conteúdo do buffer da saída de erro
147         * @access public
148         */
149        public function getError()
150        {
151                $buffer = '';
152                while ($r = fgets($this->pipes[2], 1024))
153                        $buffer .= $r;
154
155                return $buffer;
156        }
157
158        /**
159         * Informa o tempo de execução do processo (até o momento)
160         * @return float O tempo de execução do processo
161         * @access public
162         */
163        public function getExecutionTime()
164        {
165                if (!is_null($this->timeEnd))
166                        return $this->timeEnd - $this->timeStart;
167                else
168                        return microtime(true) - $this->timeStart;
169        }
170}
171?>
Note: See TracBrowser for help on using the repository browser.