PHP重写包含的文件-这是有效的脚本吗?

PHP重写包含的文件-这是有效的脚本吗?,php,mutex,atomic,Php,Mutex,Atomic,我提出了这个问题: 正如上面所说,我希望有几个来源每隔一段时间发送一次他们的统计数据,这些统计数据将显示在网站的主页上。 我的问题是,我希望这是一个原子的方式来完成,所以没有更新的统计数据将重叠另一个运行在后台 现在,我提出了这个解决方案,我希望各位PHP专家来评判它 stats.php <?php define("my_counter", 12); ?> index.php <?php include "stats.php"; echo constant("my_co

我提出了这个问题:

正如上面所说,我希望有几个来源每隔一段时间发送一次他们的统计数据,这些统计数据将显示在网站的主页上。
我的问题是,我希望这是一个原子的方式来完成,所以没有更新的统计数据将重叠另一个运行在后台

现在,我提出了这个解决方案,我希望各位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);
?>

您可能会发现,像Memcache这样的解决方案可能比每次更新值时重写PHP文件更直观、更快、更有用

然后在数据库中对其进行排序,是的,我知道这很慢,但它是持久的


最后,与其将PHP写入文件,为什么不将值本身写入共享文件并读取它呢?这将很好地与您的锁定机制配合使用,并且不需要将“有效”PHP写入一个我认为是错误的文件。

您可能会发现像Memcache这样的解决方案可能比每次更新值时重写PHP文件更直观、更快、更有用

然后在数据库中对其进行排序,是的,我知道这很慢,但它是持久的


最后,与其将PHP写入文件,为什么不将值本身写入共享文件并读取它呢?这将很好地与您的锁定机制配合使用,并且不需要将“有效”的PHP写入一个我认为是错误的文件。

我这样做的逻辑是:包含的PHP文件被缓存在PHP解析器的内存中,更不用说使用常量在解析(字符串到数字)方面更快。因此,如果我按照你的方式来做,即写入一个共享文件,然后在每次需要时读取它(而且每次访问页面时,我都需要它),那么我访问硬盘的次数会比将其缓存在PHP内存中的次数多得多。我错了吗?至于你的其他解决方案(memcached/数据库):它涉及到一整套软件,甚至硬件。此外,它还涉及网络(查询/响应),这需要时间。请记住,对stats.php文件的读取要比写入多得多。Memcache提供了一些性能提升,而网络开销是最小的。它的伸缩性也非常好。在我开始相信这一点之前,您必须备份一次PHP缓存通过require_包含的文件的语句。我仍然坚信你这样做是不正确的。听起来好像只有一台服务器托管页面,这意味着您不需要分布式缓存。查看APC(),这可能会为您的情况提供最佳性能。将PHP写入加载的文件只是一个问题的温床。我这样做的逻辑是:包含的PHP文件被缓存在PHP解析器的内存中,更不用说使用常量在解析(字符串到数字)方面更快。因此,如果我按照你的方式来做,即写入一个共享文件,然后在每次需要时读取它(而且每次访问页面时,我都需要它),那么我访问硬盘的次数会比将其缓存在PHP内存中的次数多得多。我错了吗?至于你的其他解决方案(memcached/数据库):它涉及到一整套软件,甚至硬件。此外,它还涉及网络(查询/响应),这需要时间。请记住,对stats.php文件的读取要比写入多得多。Memcache提供了一些性能提升,而网络开销是最小的。它的伸缩性也非常好。在我开始相信这一点之前,您必须备份一次PHP缓存通过require_包含的文件的语句。我仍然坚信你这样做是不正确的。听起来好像只有一台服务器托管页面,这意味着您不需要分布式缓存。查看APC(),这可能会为您的情况提供最佳性能。将PHP写入加载的文件只是解决问题的温床。