Etarus
Новичок
С РНР я знаком относительно недавно, знаю язык поверхностно, но изучаю по мере возможности.
В принципе как это все работает - понятно. Но дьявол в деталях... и подобных каверзных вопросов вполне много.
Но перейдем к конкретному вопросу. Точнее вопросам.
Каково время жизни статического параметра класса? Предполагаю, что пока идет сессия.
Тестируя скорость работы заметил, что функции file_exists() и fopen() крайне времязатратные, но без них никуда. Попробовал разные варианты, в итоге пришел к такому варианту.
150 000 записей у меня записались в файл за 14 секунд.
Если открывать и закрывать файл после каждой записи - время вырастит в 10 раз.
Что крайне медленно. Но безопасен ли мой способ? Не будет ли ошибок доступа к файлу при попытке параллельной записи разными пользователями?
Насколько корректен в принципе мой способ? Может я чего-то не учел по-незнанию, или оно в принципе работает только пока у сайта 1 пользователь?
Проще говоря меня беспокоит потокобезопасность и возможность незакрытых хвостов, а от этого проблемы доступа и утечки памяти.
В принципе как это все работает - понятно. Но дьявол в деталях... и подобных каверзных вопросов вполне много.
Но перейдем к конкретному вопросу. Точнее вопросам.
Каково время жизни статического параметра класса? Предполагаю, что пока идет сессия.
Тестируя скорость работы заметил, что функции file_exists() и fopen() крайне времязатратные, но без них никуда. Попробовал разные варианты, в итоге пришел к такому варианту.
PHP:
<?php
class Logger
{
public static $handle;
public static $home = "C:";
public static function open()
{
$year = date("Y");
$month = date("m");
$day = date("d");
$path = self::$home . "\\$year\\$month";
if (!file_exists($path))
mkdir($path, 0777, true);
$fileName = "$year-$month-$day.log";
if (empty(self::$handle)) {
$fullPath = "$path\\$fileName";
self::$handle = fopen($fullPath, "ab");
}else {
$meta_data = stream_get_meta_data(self::$handle);
$streamFileUri = explode("\\", $meta_data["uri"]);
$index = count($streamFileUri) - 1;
$streamFileName = $streamFileUri[$index];
if ($streamFileName != $fileName) {
$fullPath = "$path\\$streamFileName";
self::$handle = fopen($fullPath, "ab");
}
}
}
public static function write($message, $type = "INFO")
{
self::open();
$time = date("H:i:s");
fwrite(self::$handle, "$time\t$type\t$message" . PHP_EOL);
fflush(self::$handle);
}
public static function setHome($home)
{
self::$home = $home;
}
}
Если открывать и закрывать файл после каждой записи - время вырастит в 10 раз.
Что крайне медленно. Но безопасен ли мой способ? Не будет ли ошибок доступа к файлу при попытке параллельной записи разными пользователями?
Насколько корректен в принципе мой способ? Может я чего-то не учел по-незнанию, или оно в принципе работает только пока у сайта 1 пользователь?
Проще говоря меня беспокоит потокобезопасность и возможность незакрытых хвостов, а от этого проблемы доступа и утечки памяти.