-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathServer_Command.php
More file actions
136 lines (122 loc) · 3.95 KB
/
Server_Command.php
File metadata and controls
136 lines (122 loc) · 3.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?php
use WP_CLI\Utils;
class Server_Command extends WP_CLI_Command {
/**
* Launches PHP's built-in web server for a specific WordPress installation.
*
* Uses `php -S` to launch a web server serving the WordPress webroot.
* <http://php.net/manual/en/features.commandline.webserver.php>
*
* Importantly, PHP's built-in web server doesn't support `.htaccess` files.
* If this is a requirement, please use a more advanced web server.
*
* ## OPTIONS
*
* [--host=<host>]
* : The hostname to bind the server to.
* ---
* default: localhost
* ---
*
* [--port=<port>]
* : The port number to bind the server to.
* ---
* default: 8080
* ---
*
* [--docroot=<path>]
* : The path to use as the document root. If the path global parameter is
* set, the default value is it.
*
* [--config=<file>]
* : Configure the server with a specific .ini file.
*
* [<passthrough>...]
* : Optional arguments to pass to the PHP binary. Any arguments after `--`
* will be passed through to the `php` command.
*
* ## EXAMPLES
*
* # Make the instance available on any address (with port 8080)
* $ wp server --host=0.0.0.0
* PHP 5.6.9 Development Server started at Tue May 24 01:27:11 2016
* Listening on http://0.0.0.0:8080
* Document root is /
* Press Ctrl-C to quit.
*
* # Run on port 80 (for multisite)
* $ wp server --host=localhost.localdomain --port=80
* PHP 5.6.9 Development Server started at Tue May 24 01:30:06 2016
* Listening on http://localhost1.localdomain1:80
* Document root is /
* Press Ctrl-C to quit.
*
* # Configure the server with a specific .ini file
* $ wp server --config=development.ini
* PHP 7.0.9 Development Server started at Mon Aug 22 12:09:04 2016
* Listening on http://localhost:8080
* Document root is /
* Press Ctrl-C to quit.
*
* # Pass extra parameters to the PHP binary
* $ wp server --docroot=public -- -dzend_extension=xdebug.so
* PHP 7.4.0 Development Server started at Wed Nov 10 18:00:00 2025
* Listening on http://localhost:8080
* Document root is /var/www/public
* Press Ctrl-C to quit.
*
* @when before_wp_load
*/
public function __invoke( $args, $assoc_args ) {
$defaults = array(
'host' => 'localhost',
'port' => 8080,
'docroot' => ! is_null( WP_CLI::get_runner()->config['path'] ) ? WP_CLI::get_runner()->config['path'] : false,
'config' => get_cfg_var( 'cfg_file_path' ),
);
$assoc_args = array_merge( $defaults, $assoc_args );
$docroot = $assoc_args['docroot'];
if ( ! $docroot ) {
$config_path = WP_CLI::get_runner()->project_config_path;
if ( ! $config_path ) {
$docroot = ABSPATH;
} else {
$docroot = dirname( $config_path );
}
}
// Get the path to the router file
$command_root = Utils\phar_safe_path( dirname( __DIR__ ) );
$router_path = $command_root . '/router.php';
if ( ! file_exists( $router_path ) ) {
WP_CLI::error( "Couldn't find router.php" );
}
// Build the command with passthrough arguments
$cmd_format = '%s';
$cmd_args = array( WP_CLI::get_php_binary() );
// Add passthrough arguments before the -S flag
if ( ! empty( $args ) ) {
foreach ( $args as $arg ) {
if ( '--' === $arg ) {
continue;
}
$cmd_format .= ' %s';
$cmd_args[] = $arg;
}
}
// Add the server flags
$cmd_format .= ' -S %s -t %s -c %s %s';
$cmd_args[] = $assoc_args['host'] . ':' . $assoc_args['port'];
$cmd_args[] = $docroot;
$cmd_args[] = $assoc_args['config'];
$cmd_args[] = Utils\extract_from_phar( $router_path );
$cmd = Utils\esc_cmd( $cmd_format, ...$cmd_args );
$descriptors = array( STDIN, STDOUT, STDERR );
// https://bugs.php.net/bug.php?id=60181
$options = array();
if ( Utils\is_windows() ) {
$options['bypass_shell'] = true;
}
// @phpstan-ignore argument.type
exit( proc_close( proc_open( $cmd, $descriptors, $pipes, null, null, $options ) ) );
}
}