1: <?php
2: /**
3: * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
4: * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
5: *
6: * Licensed under The MIT License
7: * For full copyright and license information, please see the LICENSE.txt
8: * Redistributions of files must retain the above copyright notice.
9: *
10: * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
11: * @link https://cakephp.org CakePHP(tm) Project
12: * @since 2.0.0
13: * @license https://opensource.org/licenses/mit-license.php MIT License
14: */
15: namespace Cake\Console;
16:
17: /**
18: * Object wrapper for interacting with stdin
19: */
20: class ConsoleInput
21: {
22: /**
23: * Input value.
24: *
25: * @var resource
26: */
27: protected $_input;
28:
29: /**
30: * Can this instance use readline?
31: * Two conditions must be met:
32: * 1. Readline support must be enabled.
33: * 2. Handle we are attached to must be stdin.
34: * Allows rich editing with arrow keys and history when inputting a string.
35: *
36: * @var bool
37: */
38: protected $_canReadline;
39:
40: /**
41: * Constructor
42: *
43: * @param string $handle The location of the stream to use as input.
44: */
45: public function __construct($handle = 'php://stdin')
46: {
47: $this->_canReadline = (extension_loaded('readline') && $handle === 'php://stdin');
48: $this->_input = fopen($handle, 'rb');
49: }
50:
51: /**
52: * Read a value from the stream
53: *
54: * @return mixed The value of the stream
55: */
56: public function read()
57: {
58: if ($this->_canReadline) {
59: $line = readline('');
60: if (strlen($line) > 0) {
61: readline_add_history($line);
62: }
63:
64: return $line;
65: }
66:
67: return fgets($this->_input);
68: }
69:
70: /**
71: * Check if data is available on stdin
72: *
73: * @param int $timeout An optional time to wait for data
74: * @return bool True for data available, false otherwise
75: */
76: public function dataAvailable($timeout = 0)
77: {
78: $readFds = [$this->_input];
79: $writeFds = null;
80: $errorFds = null;
81: $readyFds = stream_select($readFds, $writeFds, $errorFds, $timeout);
82:
83: return ($readyFds > 0);
84: }
85: }
86: