Подтвердить что ты не робот

Включить журнал запросов, даже если маршрутизатор script используется для встроенного веб-сервера PHP

PHP, встроенный в веб-сервер, позволяет использовать "скрипты маршрутизатора", позволяя внутренне переписывать URL-адреса.

Проблема с таким маршрутизатором script заключается в том, что всякий раз, когда он фактически обрабатывает файл, а не позволяет PHP обрабатывать его, это приводит к подавлению вывода журнала запросов для этого запроса. Например, рассмотрим следующий script:

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

Это приводит к тому, что запросы на /js/* и /css/* регистрируются на консоли; тогда как запросы на любые другие URL-адреса просто пропускают протоколирование запроса.

Как включить ведение журнала всех запросов в консоли?

4b9b3361

Ответ 1

router.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>&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;
}

Ответ 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, и вы будете наблюдать за поведением вашего script, как в окне с встроенным сервером php.

PS: Надеюсь, вы не используете сервер сборки php в производстве