Php 存储不变数据的最佳方法

Php 存储不变数据的最佳方法,php,mysql,Php,Mysql,在我制作游戏时,我经常使用MySQL数据库 但最近我在Memcache中放入了很多SELECT结果,因为它们不太可能改变 这让我想知道,仅仅有一个定义数据数组的PHP文件不是更好吗?当然,这意味着我必须加载整个数组才能访问一行,但我相信这与不必等待MySQL节省的时间相比是微不足道的 我的想法对吗?我应该将我不变的游戏数据(如角色库统计、兼容性图表、项目数据等)移动到PHP文件中吗?还是应该继续使用MySQL+Memcache 哪一个更好,为什么呢?似乎有些基准是正确的 我编写了一些脚本来测试将

在我制作游戏时,我经常使用MySQL数据库

但最近我在Memcache中放入了很多
SELECT
结果,因为它们不太可能改变

这让我想知道,仅仅有一个定义数据数组的PHP文件不是更好吗?当然,这意味着我必须加载整个数组才能访问一行,但我相信这与不必等待MySQL节省的时间相比是微不足道的

我的想法对吗?我应该将我不变的游戏数据(如角色库统计、兼容性图表、项目数据等)移动到PHP文件中吗?还是应该继续使用MySQL+Memcache


哪一个更好,为什么呢?

似乎有些基准是正确的

我编写了一些脚本来测试将数据存储为PHP数组、CSV文件和通过PDO访问的MySQL数据库

阵列测试

以下是阵列测试的脚本:

array-inc.php:

$data = array(
    array(
        "key"   => "something",
        "value" => "something else"
    ),
    array(
        "key"   => "something",
        "value" => "something else"
    ),
    array(
        "key"   => "something",
        "value" => "something else"
    ),
    array(
        "key"   => "something",
        "value" => "something else"
    ),
    array(
        "key"   => "something",
        "value" => "something else"
    )
);
array-test.php

$start = microtime( TRUE );

for( $i = 0; $i < 10000; ++$i ) {
    include( "array-inc.php" );
    $retrieve = $data[2];
}

$finish = microtime( TRUE );

print $finish - $start;
csv.php:

$start = microtime( TRUE );

for( $i = 0; $i < 10000; ++$i ) {
    $fp = fopen( "values.csv", "r" );

    $data = array();
    while(( $line = fgetcsv( $fp )) !== FALSE ) {
        $data[] = $line;
    }

    $retrieve = $data[2];
}

$finish = microtime( TRUE );

print $finish - $start;
$start=microtime(真);
对于($i=0;$i<10000;++$i){
$fp=fopen(“values.csv”、“r”);
$data=array();
而(($line=fgetcsv($fp))!==FALSE){
$data[]=$line;
}
$retrieve=$data[2];
}
$finish=microtime(真);
打印$finish-$start;
MySQL测试

下面是MySQL测试的脚本(该表有一个id、key和value列,其中的五行和值与上述两行相同):

mysql.php:

$start = microtime( TRUE );

for( $i = 0; $i < 10000; ++$i ) {
    $query = "SELECT * FROM `values` WHERE id = :id";
    $result = $pdo->prepare( $query );
    $result->execute( array( ":id" => 2 ));
    $retrieve = $result->fetch( PDO::FETCH_ASSOC );
}

$finish = microtime( TRUE );

print $finish - $start;
$start=microtime(真);
对于($i=0;$i<10000;++$i){
$query=“从'values'中选择*,其中id=:id”;
$result=$pdo->prepare($query);
$result->execute(数组(“:id”=>2));
$retrieve=$result->fetch(PDO::fetch_ASSOC);
}
$finish=microtime(真);
打印$finish-$start;
每一个都被设置为从存储的数据中访问一个元素,并在过程中循环10000次,以便更准确地测量时间。结果如下:

我对每个测试运行了三次,得到了以下值:

  • 数组:
    • 1.050,1.020,1.114秒
  • CSV:
    • 1.264,1.232,1.105秒
  • MySQL:
    • 1.038,1.149,1.171秒

看起来CSV显然是输家,但是Array和MySQL非常接近,Array可能在性能上稍有领先。请随意调整上面的代码,以提供更符合您的环境的结果。

您的问题的答案是特定于问题的。这是性能、内存和可维护性之间的权衡。即使您想指出候选解决方案的利弊,也需要假设一些参数。以下是影响您做出决策的参数:

  • 数据大小:您拥有的数据的总大小是多少。i、 你的数据库文件大小

  • 加载数据的请求所需的平均内存大小:考虑上面命名的参数和并发请求的平均数量,它们需要多少内存

  • 每个请求所需总数据的平均比率:每次加载数据时,将处理多少数据,以及选择这部分数据的容易程度

  • 从集合中提取数据的目标部分需要多少(CPU)时间:从一个简单的PHP数组到一个MySQL
    SELECT
    query,它的变化很大

  • 了解这些参数后,您可以问这样一个问题:一个解决方案更好还是另一个更好。在任何情况下,您的解决方案将是以下之一:

    • 包含在代码中
    • 配置文件(
      XML
      INI
      CSV
      JSON
      等)
    • 数据库服务器(
      MySQL
    • 本地数据库(
      SQLite
    • 缓存在内存中(缓存服务器,如
      memcached
      ,或者可能)

    我知道我没有回答您的问题,但那是因为除非您指定所提到的参数,否则无法回答它。

    为什么要使用PHP文件?您还可以使用CSV、JSON、XML或您自己的一些文本格式,所有这些格式都可能比MySQL更快,并且比PHP更易于维护。@MikeW-Hmm。。。PHP和JSON一样可维护,尤其是PHP5.4中的
    […]
    语法。使用PHP意味着无需进行任何处理,只需读取数组即可。在这里,我们可能会有不同的意见,因此我将相应地标记问题。您是否使用了任何配置文件?如果是这样的话,使用相同的方法来存储不变的数据。找到一个适合您使用数据方式的数据库。感谢您花时间如此彻底地回答。我还怀疑MySQL是从查询缓存中获得的:p还有一些因素需要考虑,比如“如果MySQL不必提供不变的数据,它可以将更多的资源用于更复杂的查询”。我也考虑过MySQL缓存,我怀疑你是对的。考虑到这一点以及您的其他评论,将数据存储为数组(即使是每次需要时都包含的外部文件)似乎是最好的选择。
    $start = microtime( TRUE );
    
    for( $i = 0; $i < 10000; ++$i ) {
        $query = "SELECT * FROM `values` WHERE id = :id";
        $result = $pdo->prepare( $query );
        $result->execute( array( ":id" => 2 ));
        $retrieve = $result->fetch( PDO::FETCH_ASSOC );
    }
    
    $finish = microtime( TRUE );
    
    print $finish - $start;