Я задал этот вопрос: Взаимное исключение 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 все время, как вы можете видеть.
Каково ваше мнение?