Projekt

Obecné

Profil

Stáhnout (6.38 KB) Statistiky
| Větev: | Revize:
1
<?php
2

    
3
/*
4
 * This file is part of the Symfony package.
5
 *
6
 * (c) Fabien Potencier <fabien@symfony.com>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11

    
12
namespace Symfony\Component\Process;
13

    
14
use Symfony\Component\Process\Exception\InvalidArgumentException;
15
use Symfony\Component\Process\Exception\LogicException;
16

    
17
/**
18
 * Process builder.
19
 *
20
 * @author Kris Wallsmith <kris@symfony.com>
21
 */
22
class ProcessBuilder
23
{
24
    private $arguments;
25
    private $cwd;
26
    private $env = array();
27
    private $input;
28
    private $timeout = 60;
29
    private $options = array();
30
    private $inheritEnv = true;
31
    private $prefix = array();
32
    private $outputDisabled = false;
33

    
34
    /**
35
     * Constructor.
36
     *
37
     * @param string[] $arguments An array of arguments
38
     */
39
    public function __construct(array $arguments = array())
40
    {
41
        $this->arguments = $arguments;
42
    }
43

    
44
    /**
45
     * Creates a process builder instance.
46
     *
47
     * @param string[] $arguments An array of arguments
48
     *
49
     * @return ProcessBuilder
50
     */
51
    public static function create(array $arguments = array())
52
    {
53
        return new static($arguments);
54
    }
55

    
56
    /**
57
     * Adds an unescaped argument to the command string.
58
     *
59
     * @param string $argument A command argument
60
     *
61
     * @return ProcessBuilder
62
     */
63
    public function add($argument)
64
    {
65
        $this->arguments[] = $argument;
66

    
67
        return $this;
68
    }
69

    
70
    /**
71
     * Adds a prefix to the command string.
72
     *
73
     * The prefix is preserved when resetting arguments.
74
     *
75
     * @param string|array $prefix A command prefix or an array of command prefixes
76
     *
77
     * @return ProcessBuilder
78
     */
79
    public function setPrefix($prefix)
80
    {
81
        $this->prefix = is_array($prefix) ? $prefix : array($prefix);
82

    
83
        return $this;
84
    }
85

    
86
    /**
87
     * Sets the arguments of the process.
88
     *
89
     * Arguments must not be escaped.
90
     * Previous arguments are removed.
91
     *
92
     * @param string[] $arguments
93
     *
94
     * @return ProcessBuilder
95
     */
96
    public function setArguments(array $arguments)
97
    {
98
        $this->arguments = $arguments;
99

    
100
        return $this;
101
    }
102

    
103
    /**
104
     * Sets the working directory.
105
     *
106
     * @param null|string $cwd The working directory
107
     *
108
     * @return ProcessBuilder
109
     */
110
    public function setWorkingDirectory($cwd)
111
    {
112
        $this->cwd = $cwd;
113

    
114
        return $this;
115
    }
116

    
117
    /**
118
     * Sets whether environment variables will be inherited or not.
119
     *
120
     * @param bool $inheritEnv
121
     *
122
     * @return ProcessBuilder
123
     */
124
    public function inheritEnvironmentVariables($inheritEnv = true)
125
    {
126
        $this->inheritEnv = $inheritEnv;
127

    
128
        return $this;
129
    }
130

    
131
    /**
132
     * Sets an environment variable.
133
     *
134
     * Setting a variable overrides its previous value. Use `null` to unset a
135
     * defined environment variable.
136
     *
137
     * @param string      $name  The variable name
138
     * @param null|string $value The variable value
139
     *
140
     * @return ProcessBuilder
141
     */
142
    public function setEnv($name, $value)
143
    {
144
        $this->env[$name] = $value;
145

    
146
        return $this;
147
    }
148

    
149
    /**
150
     * Adds a set of environment variables.
151
     *
152
     * Already existing environment variables with the same name will be
153
     * overridden by the new values passed to this method. Pass `null` to unset
154
     * a variable.
155
     *
156
     * @param array $variables The variables
157
     *
158
     * @return ProcessBuilder
159
     */
160
    public function addEnvironmentVariables(array $variables)
161
    {
162
        $this->env = array_replace($this->env, $variables);
163

    
164
        return $this;
165
    }
166

    
167
    /**
168
     * Sets the input of the process.
169
     *
170
     * @param mixed $input The input as a string
171
     *
172
     * @return ProcessBuilder
173
     *
174
     * @throws InvalidArgumentException In case the argument is invalid
175
     */
176
    public function setInput($input)
177
    {
178
        $this->input = ProcessUtils::validateInput(__METHOD__, $input);
179

    
180
        return $this;
181
    }
182

    
183
    /**
184
     * Sets the process timeout.
185
     *
186
     * To disable the timeout, set this value to null.
187
     *
188
     * @param float|null $timeout
189
     *
190
     * @return ProcessBuilder
191
     *
192
     * @throws InvalidArgumentException
193
     */
194
    public function setTimeout($timeout)
195
    {
196
        if (null === $timeout) {
197
            $this->timeout = null;
198

    
199
            return $this;
200
        }
201

    
202
        $timeout = (float) $timeout;
203

    
204
        if ($timeout < 0) {
205
            throw new InvalidArgumentException('The timeout value must be a valid positive integer or float number.');
206
        }
207

    
208
        $this->timeout = $timeout;
209

    
210
        return $this;
211
    }
212

    
213
    /**
214
     * Adds a proc_open option.
215
     *
216
     * @param string $name  The option name
217
     * @param string $value The option value
218
     *
219
     * @return ProcessBuilder
220
     */
221
    public function setOption($name, $value)
222
    {
223
        $this->options[$name] = $value;
224

    
225
        return $this;
226
    }
227

    
228
    /**
229
     * Disables fetching output and error output from the underlying process.
230
     *
231
     * @return ProcessBuilder
232
     */
233
    public function disableOutput()
234
    {
235
        $this->outputDisabled = true;
236

    
237
        return $this;
238
    }
239

    
240
    /**
241
     * Enables fetching output and error output from the underlying process.
242
     *
243
     * @return ProcessBuilder
244
     */
245
    public function enableOutput()
246
    {
247
        $this->outputDisabled = false;
248

    
249
        return $this;
250
    }
251

    
252
    /**
253
     * Creates a Process instance and returns it.
254
     *
255
     * @return Process
256
     *
257
     * @throws LogicException In case no arguments have been provided
258
     */
259
    public function getProcess()
260
    {
261
        if (0 === count($this->prefix) && 0 === count($this->arguments)) {
262
            throw new LogicException('You must add() command arguments before calling getProcess().');
263
        }
264

    
265
        $options = $this->options;
266

    
267
        $arguments = array_merge($this->prefix, $this->arguments);
268
        $script = implode(' ', array_map(array(__NAMESPACE__.'\\ProcessUtils', 'escapeArgument'), $arguments));
269

    
270
        if ($this->inheritEnv) {
271
            $env = array_replace($_ENV, $_SERVER, $this->env);
272
        } else {
273
            $env = $this->env;
274
        }
275

    
276
        $process = new Process($script, $this->cwd, $env, $this->input, $this->timeout, $options);
277

    
278
        if ($this->outputDisabled) {
279
            $process->disableOutput();
280
        }
281

    
282
        return $process;
283
    }
284
}
(8-8/12)