PHP переписывает включенный файл - это допустимый скрипт?

Я задал этот вопрос: Взаимное исключение PHP (мьютекс)

Как сказано там, я хочу, чтобы несколько источников время от времени присылали свою статистику, и эта статистика отображалась на главной странице веб-сайта.
Моя проблема в том, что я хочу, чтобы это делалось атомарно, поэтому никаких обновлений статистика будет перекрывать другую, работающую в фоновом режиме.

Я придумал это решение и хочу, чтобы вы, эксперты PHP, оценили его.

статистика.php

<?php
define("my_counter", 12);
?>

index.php

<?php
include "stats.php";

echo constant("my_counter");
?>

update.php

<?php
$old_error_reporting = error_reporting(0);

include "stats.php";

define("my_stats_template",'
<?php
define("my_counter", %d);
?>
');

$fd = fopen("stats.php", "w+");
if($fd)
{
    if (flock($fd, LOCK_EX))
    {
        $my_counter = 0;

        try
        {
            $my_counter = constant("my_counter");
        }
        catch(Exception $e) { }

        $my_counter++;

        $new_stats = sprintf(constant("my_stats_template"), $my_counter);

        echo "Counter should stand at $my_counter";
        fwrite($fd, $new_stats);
    }
    flock($fd, LOCK_UN);
    fclose($fd);
}

error_reporting($old_error_reporting);
?>

Несколько клиентов будут вызывать файл «update.php» один раз каждые 60 секунд. «index.php» будет использовать файл «stats.php» все время, как вы можете видеть.

Каково твое мнение?


person Poni    schedule 27.05.2010    source источник


Ответы (1)


Вы можете найти такое решение, как Memcache, которое может быть более интуитивно понятным, быстрым и полезным, чем перезапись файла PHP каждый раз, когда вы хотите обновить значение.

Тогда есть идея поместить его в базу данных, да, я знаю, что это медленно, но это постоянно.

Наконец, вместо того, чтобы записывать PHP в файл, почему бы не записать само значение в общий файл и просто прочитать его? Это будет хорошо работать с вашим механизмом блокировки и не потребует записи «действительного» PHP в файл, что мне кажется неправильным.

person Matt S    schedule 27.05.2010
comment
Логика того, как это сделал я, такова: включенный PHP-файл кэшируется в памяти синтаксического анализатора PHP, не говоря уже о том, что использование констант еще быстрее с точки зрения синтаксического анализа (строка в число). Итак, если я сделаю это по-вашему, то есть запишу в общий файл, а затем прочитаю каждый раз, когда мне это нужно (а мне это понадобится часто, с каждым посетителем страницы), я сильно ударю по жесткому диску. больше раз, чем кэширование в памяти PHP. Я ошибся? - person Poni; 27.05.2010
comment
Что касается других ваших решений (memcached/база данных): это включает в себя целую кучу программного обеспечения и, возможно, даже аппаратного обеспечения. Кроме того, это включает в себя сетевое взаимодействие (запросы/ответы), что требует времени. Имейте в виду, что у меня будет гораздо больше чтений, чем записей в файле stats.php. - person Poni; 27.05.2010
comment
Memcache предлагает несколько приростов производительности, при этом накладные расходы на сеть минимальны. Он также очень хорошо масштабируется. Вам придется сделать резервную копию утверждения о том, что PHP кэширует файл, включенный через require_once, прежде чем я даже поверю в это. Я все еще твердо верю, что то, как вы это делаете, неверно. Похоже, у вас есть один сервер, на котором размещены ваши страницы, что означает, что вам не нужен распределенный кеш. Загляните в APC (php.net/manual/en/book.apc.php) это, вероятно, даст вам наилучшую производительность для вашей ситуации. Запись PHP в файл, который вы загружаете, — это просто горячая кровать для проблем. - person Matt S; 29.05.2010