PHP переписать включенный файл - это действительный скрипт? - PullRequest
2 голосов
/ 27 мая 2010

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

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

Теперь я пришел к этому решению и хочу, чтобы вы, эксперты по PHP, оценили его.

stats.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 все время, как вы можете видеть.

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

1 Ответ

0 голосов
/ 27 мая 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...