source: companies/serpro/workflow/inc/class.Thread.inc.php @ 903

Revision 903, 4.2 KB checked in by niltonneto, 15 years ago (diff)

Importacao inicial do Expresso do Serpro

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                //Corrige comportamento anomalo da funcao proc_open que nao referencia o diretorio atual
70                $curDir = getcwd();
71                $this->processReference = proc_open("php -q {$file} ", $descriptor, $this->pipes, $curDir);
72                stream_set_blocking($this->pipes[1], 0);
73        }
74
75        /**
76         * Indica se o processo está ativo ou não
77         * @return bool Indica se o processo está ativo (true) ou não (false)
78         * @access public
79         */
80        public function isActive()
81        {
82                $this->buffer .= $this->listen();
83                $f = stream_get_meta_data($this->pipes[1]);
84                return !$f['eof'];
85        }
86
87        /**
88         * Libera o recurso do processo (só deve ser chamado quando o processo não estiver mais ativo)
89         * @return int O código de saída do processo
90         * @access public
91         */
92        public function close()
93        {
94                $this->timeEnd = microtime(true);
95                fclose($this->pipes[0]);
96                fclose($this->pipes[1]);
97                fclose($this->pipes[2]);
98                $output = proc_close($this->processReference);
99                $this->processReference = NULL;
100                return $output;
101        }
102
103        /**
104         * Mata o processo
105         * @return int O código de finalização do processo
106         * @access public
107         */
108        public function kill()
109        {
110                $this->timeEnd = microtime(true);
111                fclose($this->pipes[0]);
112                fclose($this->pipes[1]);
113                fclose($this->pipes[2]);
114                $output = proc_terminate($this->processReference);
115                $this->processReference = null;
116                return $output;
117        }
118
119        /**
120         * Envia mensagens ao processo
121         * @param string $thought A mensagem a ser enviada
122         * @return void
123         * @access public
124         */
125        public function tell($thought)
126        {
127                fwrite($this->pipes[0], $thought);
128        }
129
130        /**
131         * Lê o buffer da saída padrão do processo
132         * @return string O conteúdo do buffer da saída padrão
133         * @access public
134         */
135        public function listen()
136        {
137                $buffer = $this->buffer;
138                $this->buffer = '';
139                while ($r = fgets($this->pipes[1], 1024))
140                        $buffer .= $r;
141
142                return $buffer;
143        }
144
145        /**
146         * Lê o buffer da saída de erro do processo
147         * @return string O conteúdo do buffer da saída de erro
148         * @access public
149         */
150        public function getError()
151        {
152                $buffer = '';
153                while ($r = fgets($this->pipes[2], 1024))
154                        $buffer .= $r;
155
156                return $buffer;
157        }
158
159        /**
160         * Informa o tempo de execução do processo (até o momento)
161         * @return float O tempo de execução do processo
162         * @access public
163         */
164        public function getExecutionTime()
165        {
166                if (!is_null($this->timeEnd))
167                        return $this->timeEnd - $this->timeStart;
168                else
169                        return microtime(true) - $this->timeStart;
170        }
171}
172?>
Note: See TracBrowser for help on using the repository browser.