Skip to content

Commit de1af6a

Browse files
authored
refactor: use composer/xdebug-handler (felixfbecker#616)
1 parent e10896f commit de1af6a

File tree

4 files changed

+50
-17
lines changed

4 files changed

+50
-17
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,6 @@ The project parses PHPStorm's PHP stubs to get support for PHP builtins. It re-p
211211

212212
To debug with xDebug ensure that you have this set as an environment variable
213213

214-
COMPOSER_ALLOW_XDEBUG=1
214+
PHPLS_ALLOW_XDEBUG=1
215215

216216
This tells the Language Server to not restart without XDebug if it detects that XDebug is enabled (XDebug has a high performance impact).

bin/php-language-server.php

+22-15
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?php
22

3-
use LanguageServer\{LanguageServer, ProtocolStreamReader, ProtocolStreamWriter};
3+
use LanguageServer\{LanguageServer, ProtocolStreamReader, ProtocolStreamWriter, StderrLogger};
44
use Sabre\Event\Loop;
5-
use Composer\{Factory, XdebugHandler};
5+
use Composer\XdebugHandler\XdebugHandler;
66

77
$options = getopt('', ['tcp::', 'tcp-server::', 'memory-limit::']);
88

@@ -24,22 +24,27 @@
2424
throw new \ErrorException($message, 0, $severity, $file, $line);
2525
});
2626

27+
$logger = new StderrLogger();
28+
2729
// Only write uncaught exceptions to STDERR, not STDOUT
28-
set_exception_handler(function (\Throwable $e) {
29-
fwrite(STDERR, (string)$e);
30+
set_exception_handler(function (\Throwable $e) use ($logger) {
31+
$logger->critical((string)$e);
3032
});
3133

3234
@cli_set_process_title('PHP Language Server');
3335

3436
// If XDebug is enabled, restart without it
35-
(new XdebugHandler(Factory::createOutput()))->check();
37+
$xdebugHandler = new XdebugHandler('PHPLS');
38+
$xdebugHandler->setLogger($logger);
39+
$xdebugHandler->check();
40+
unset($xdebugHandler);
3641

3742
if (!empty($options['tcp'])) {
3843
// Connect to a TCP server
3944
$address = $options['tcp'];
4045
$socket = stream_socket_client('tcp://' . $address, $errno, $errstr);
4146
if ($socket === false) {
42-
fwrite(STDERR, "Could not connect to language client. Error $errno\n$errstr");
47+
$logger->critical("Could not connect to language client. Error $errno\n$errstr");
4348
exit(1);
4449
}
4550
stream_set_blocking($socket, false);
@@ -53,29 +58,30 @@
5358
$address = $options['tcp-server'];
5459
$tcpServer = stream_socket_server('tcp://' . $address, $errno, $errstr);
5560
if ($tcpServer === false) {
56-
fwrite(STDERR, "Could not listen on $address. Error $errno\n$errstr");
61+
$logger->critical("Could not listen on $address. Error $errno\n$errstr");
5762
exit(1);
5863
}
59-
fwrite(STDOUT, "Server listening on $address\n");
60-
if (!extension_loaded('pcntl')) {
61-
fwrite(STDERR, "PCNTL is not available. Only a single connection will be accepted\n");
64+
$logger->debug("Server listening on $address");
65+
$pcntlAvailable = extension_loaded('pcntl');
66+
if (!$pcntlAvailable) {
67+
$logger->notice('PCNTL is not available. Only a single connection will be accepted');
6268
}
6369
while ($socket = stream_socket_accept($tcpServer, -1)) {
64-
fwrite(STDOUT, "Connection accepted\n");
70+
$logger->debug('Connection accepted');
6571
stream_set_blocking($socket, false);
66-
if (extension_loaded('pcntl')) {
72+
if ($pcntlAvailable) {
6773
// If PCNTL is available, fork a child process for the connection
6874
// An exit notification will only terminate the child process
6975
$pid = pcntl_fork();
7076
if ($pid === -1) {
71-
fwrite(STDERR, "Could not fork\n");
77+
$logger->critical('Could not fork');
7278
exit(1);
7379
} else if ($pid === 0) {
7480
// Child process
7581
$reader = new ProtocolStreamReader($socket);
7682
$writer = new ProtocolStreamWriter($socket);
77-
$reader->on('close', function () {
78-
fwrite(STDOUT, "Connection closed\n");
83+
$reader->on('close', function () use ($logger) {
84+
$logger->debug('Connection closed');
7985
});
8086
$ls = new LanguageServer($reader, $writer);
8187
Loop\run();
@@ -94,6 +100,7 @@
94100
}
95101
} else {
96102
// Use STDIO
103+
$logger->debug('Listening on STDIN');
97104
stream_set_blocking(STDIN, false);
98105
$ls = new LanguageServer(
99106
new ProtocolStreamReader(STDIN),

composer.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,13 @@
2222
],
2323
"require": {
2424
"php": "^7.0",
25-
"composer/composer": "^1.3",
25+
"composer/xdebug-handler": "^1.0",
2626
"felixfbecker/advanced-json-rpc": "^3.0.0",
2727
"jetbrains/phpstorm-stubs": "dev-master",
2828
"microsoft/tolerant-php-parser": "0.0.*",
2929
"netresearch/jsonmapper": "^1.0",
3030
"phpdocumentor/reflection-docblock": "^4.0.0",
31+
"psr/log": "^1.0",
3132
"sabre/event": "^5.0",
3233
"sabre/uri": "^2.0",
3334
"webmozart/glob": "^4.1",

src/StderrLogger.php

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
declare(strict_types = 1);
3+
4+
namespace LanguageServer;
5+
6+
/**
7+
* Simple Logger that logs to STDERR
8+
*/
9+
class StderrLogger extends \Psr\Log\AbstractLogger implements \Psr\Log\LoggerInterface
10+
{
11+
/**
12+
* Logs with an arbitrary level.
13+
*
14+
* @param mixed $level
15+
* @param string $message
16+
* @param array $context
17+
*
18+
* @return void
19+
*/
20+
public function log($level, $message, array $context = array())
21+
{
22+
$contextStr = empty($context) ? '' : ' ' . \json_encode($context, \JSON_UNESCAPED_SLASHES);
23+
\fwrite(\STDERR, \str_pad(\strtoupper((string)$level), 10) . $message . $contextStr . \PHP_EOL);
24+
}
25+
}

0 commit comments

Comments
 (0)