【问题标题】:Enable the request log, even when a router script is used for the PHP built-in web server启用请求日志,即使路由器脚本用于 PHP 内置 Web 服务器
【发布时间】:2016-12-13 11:12:59
【问题描述】:

PHP 的内置网络服务器允许使用“路由器脚本”,允许在内部重写 URL。

这种路由器脚本的问题在于,每当它实际处理一个文件而不是让 PHP 处理它时,这会导致该请求的请求日志输出被抑制。例如,考虑以下脚本:

<?php
if (preg_match('/^\/(js|css)/', $_SERVER['REQUEST_URI']) === 1) {
  return false;
}
else {
  echo 'hello world!'
}

这会导致在控制台上记录对/js/*/css/* 的请求;而对任何其他 URL 的请求只是跳过记录请求。

如何启用将所有请求记录到控制台?

【问题讨论】:

  • 你指的是哪个控制台?

标签: php regex url-routing front-controller


【解决方案1】:

路由器.php:

if (preg_match('/^\/(js|css)/', $_SERVER['REQUEST_URI']) === 1) {
    return false;
}
else {
    $stdErr = fopen("php://stderr",'w+');
    fwrite($stdErr, 'LogRequest:'.$_SERVER['REQUEST_URI']."\n");
    echo 'hello world!1';
}

服务器启动:php -S localhost:8000 router.php 2&gt;&amp;1

记录响应标头:

if (preg_match('/^\/(js|css)/', $_SERVER['REQUEST_URI']) === 1) {
    return false;
}
else {
    ob_start() 
    $stdErr = fopen("php://stderr",'w+');
    fwrite($stdErr, 'Request:'.json_encode($_SERVER)."\n");
    try {
      echo 'hello world!1';
    } catch (\Exception $e) {
        http_response_code(500);
    }
    $response = ob_get_clean();
    fwrite($stdErr, 'Response:'.json_encode([ http_response_code(),headers_list() ])."\n");
    echo $response;
}

【讨论】:

  • 不幸的是,与内置网络服务器的日志记录不同,它不会导致记录响应 HTTP 状态(这有点像日志的重点......)
  • 我认为具有挑战性的部分是从 else 案例写入控制台,如果您想快速了解发生的事情,我建议考虑在 php 之前放置一个真正的网络服务器,无论如何我已经添加了响应代码记录的示例
【解决方案2】:

在您的日志中,您可以看到来自 php 内置服务器的错误,因此您可以像 @cske 那样做,但我认为您应该坚持另一种方法。您可以使用自己的记录器并将显式信息写入此日志。现在最好的记录器是monolog,所以你不必透露轮​​子。这是我的例子:

<?php

require_once __DIR__ . '/vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// Create a log channel.
$log = new Logger('general');
$log->pushHandler(new StreamHandler('/var/log/php/general.log', Logger::INFO));

if (preg_match('/^\/(js|css)/', $_SERVER['REQUEST_URI']) === 1) {
    $log->error('Invalid request.');
    return false;
} else {
    $log->info('Success.');
    echo 'hello world!';
}

我希望你同意它看起来非常清晰和简单。
此外,当您从 php 内置服务器转移到例如 nginx 时,您的代码将正常工作。您只需在另一个窗口中运行到终端tail -f /var/log/php/general.log,您就会观察到脚本的行为,就像在带有 php 内置服务器的窗口中一样。

PS:希望你不要在生产中使用php内置服务器

【讨论】:

  • 如果问题是如何使用 php 记录到文件,我的第一个虽然是类似的日志到文件并合并 tailphp -S 输出,但 sdterr 解决了问题,所以甚至不需要可写的文件路径
猜你喜欢
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 2012-05-01
相关资源
最近更新 更多