@defect00
Идущий за мечтой.

Поведение PHP На разных ОС?

Имеется функция, задача которой записывать лог файл на сервере.
Задача тренировочная, так что нельзя изменять решения, условия или отклоняться от вопроса.
Код:
function logRequest()
{
    $filename = 'today.log';
    $data     = "{$_SERVER['REQUEST_METHOD']}," . time() . ',' . $_SERVER['HTTP_USER_AGENT'] . ',' . http_response_code() . "\n";

    if(is_writable($filename)) {

        if(!$handle = fopen($filename, 'a')) {
            echo "Cannot open the file ($filename)";
            exit;
        }

        if(!$valid = fwrite($handle, $data)) {
            echo "Cannot write to the file ($filename)";
            exit;
        }
        exit;
    }
}

logRequest();


Данный код был написан на windows, позже запустил его на mac и на ubuntu.
Удивлению не было передела, когда винда записала без лишних проблем строку, а вот unix пишут 1 строку дважды.
Как и почему эти платформы записывают информацию иначе? какие настройки надо поменять, что бы работало всё, как я ожидал изначально? (записывается информация 1 раз, в 1 строку, а не дублируется 1 информация дважды, в 2 строки)?
  • Вопрос задан
  • 943 просмотра
Решения вопроса 2
orlov0562
@orlov0562 Куратор тега PHP
I'm cool!
Могу предположить, что проблема тут не в скрипте, а в том, что было два запроса.

Попробуй использовать в $data microtime() или rand() чтобы понять что это не запись была два раза, а именно был вызван метод два раза

Кроме этого, погуглить советую про flock и fclose
Ответ написан
DevMan
@DevMan
запустил ваш код на макоси (в cli и браузере) – пишет одну строку.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
smilingcheater
@smilingcheater
Вы вызываете файл с этим кодом через браузер? Веб-окружение на винде настроено через что-то типа OpenServer?

Скорее всего причина в том, что браузер автоматически делает ещё 1 запрос, на favicon.ico. На винде у вас настроено вероятно так, что статика типа иконки отдаётся через nginx, и запрос на иконку не попадает в этот Index.php, а на маке и убунте запрос обрабатывается апачем и попадает в index.php. Это можно проверить несколькими способами, например:
1. через инструменты разработчика посмотреть запросы к серверу
2. в логировании дополнительно записывать и запрашиваемый файл/урл. Либо весь $_SERVER для наглядности.
3. положить рядом файл favicon.ico, и посмотреть не прекратились ли доп. записи
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Во первых у вас не пишется какой урл вы при этом запрашиваете. Чего гадать, больше данных вставьте в свой логгер.
Во вторых - окружение на всех машинах разное 100%, поставьте докер и поднимите какой-нибудь ламп одинаковый для всех, если у вас так криво все настроено.
Ответ написан
Комментировать
@t5199
fclose забыли. )
Ответ написан
Комментировать
@lubezniy
А там нет такого, что в одной строке записан REQUEST_METHOD OPTIONS, а в другой - GET или POST? Если да, то нужно обрабатывать конкретные методы соответствующим образом.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы