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

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

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

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

Это вызывает запросы на /js/* а также /css/* войти в консоль; тогда как запросы на любые другие URL просто пропускают регистрацию запроса.

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

13

Решение

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;
}
3

Другие решения

В вашем журнале вы можете видеть ошибки со встроенного сервера php, так что вы можете делать как @cske, но я думаю, что вы должны придерживаться другого подхода. Вы можете использовать собственный регистратор и явно записывать информацию в этот журнал. Лучший регистратор сейчас это монолог, так что вам не нужно показывать колесо. Вот мой пример:

<?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 в производстве

2

По вопросам рекламы [email protected]