将数组保存到php文件

时间:2014-02-26 11:04:32

标签: php arrays file security include

我需要保存并读取数组到文件。我知道有序列化或JSON编码/解码等功能,保存到csv的各种方法,但我希望尽可能快地读取数组。所以我想写一下我生成变量代码的php文件,然后将它包含在我当前的代码中。这是一个好主意吗?我知道这可能是一个安全问题。但是即使我将htmlspecialchars应用于值吗?它更快吗?

generated.php

<?php
$array = array("a","b","c");

包括

include 'generated.php'; 

我只对这种方法读取速度比其他方法更快感兴趣,并且如果有任何安全问题。

4 个答案:

答案 0 :(得分:2)

您正在寻找的功能是var_export,您可以像这样使用它:

file_put_contents($filename, '<?php $arr = ' . var_export($arr, true) . ';');

答案 1 :(得分:1)

为了测试的目的,我把它拼凑在一起 - 因为我很好奇(我没有理解XML解析,因为它甚至比json_encode()慢):

<?php

header('Content-Type: text/plain;charset=utf-8');
set_time_limit(120);

//define variables
$iLoopCount = 10000;
$aTheArray = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
$fStartTime = microtime(true);

//function to convert an array into a string used to create a PHP include file
function convertArrayToInclude(array $aIn) {
  $sOut = 'array(';
  foreach($aIn as $key => $value) {
    $formattedKey = is_string($key) ? "'{$key}'" : $key;
    $formattedValue = is_string($value) ? "'{$value}'" : $value;

    $sOut .= "{$formattedKey} => {$formattedValue},"; 
  }
  $sOut = substr($sOut, 0, -1) . ');';

  return $sOut;
}

//test serialize
for($i = 0; $i < $iLoopCount; $i++) {
  file_put_contents("serialize.txt", serialize($aTheArray), LOCK_EX);
  $aReadArray1 = unserialize(file_get_contents("serialize.txt"));
}

$fStopTime1 = microtime(true);
echo "serialize execution time ({$iLoopCount} iterations) : " . ($fStopTime1 - $fStartTime) . "s\n\n";

//test json_encode
for($i = 0; $i < $iLoopCount; $i++) {
  file_put_contents("json_encode.txt", json_encode($aTheArray), LOCK_EX);
  $aReadArray2 = json_decode(file_get_contents("serialize.txt"));
}

$fStopTime2 = microtime(true);
echo "json_encode execution time ({$iLoopCount} iterations) : " . ($fStopTime2 - $fStopTime1) . "s\n\n";

//test native using fixed data
for($i = 0; $i < $iLoopCount; $i++) {
  file_put_contents("include.php", 
  '<?php $aReadArray3 = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); ?>'  
  , LOCK_EX);

  include 'include.php';
}

$fStopTime3 = microtime(true);
echo "native include execution time with fixed data ({$iLoopCount} iterations) : " . ($fStopTime3 - $fStopTime2) . "s\n\n";

//test native using dynamic data
for($i = 0; $i < $iLoopCount; $i++) {
  file_put_contents("include2.php", 
  '<?php $aReadArray4 = ' . convertArrayToInclude($aTheArray) . ' ?>'  
  , LOCK_EX);

  include 'include2.php';
}

$fStopTime4 = microtime(true);
echo "native include execution time with dynamic data ({$iLoopCount} iterations) : " . ($fStopTime4 - $fStopTime3) . "s\n\n";

?>

点击刷新几次以查看合理一致的结果,但这正是您所看到的:

  • 序列化执行时间(10000次迭代):4.6746249198914s

  • json_encode执行时间(10000次迭代):5.132187128067s

  • native包含固定数据的执行时间(10000次迭代):4.863872051239s

  • native包含动态数据的执行时间(10000次迭代):5.5474679470062s

所以,简而言之:如果您可以将php include作为字符串(本机固定数据)构建,那么重复编写和包含该文件可能最快的方法(见笔记)。但是,如果您想要包含一些健全性检查或将数组转换为可以在其中使用的字符串(本机动态数据),那么您将进入一个受伤的整个世界 - 您将获得功能和处理开销以及您“自己动手”解决方案引入的任何/所有安全漏洞。这是最慢和最糟糕的方式。

非常短中:PHP具有将变量存储为文本(serialize())并检索它们(unserialize())的功能...只需使用它们而不是尝试重新发明轮子。


注意:使用serialize()fixed native data之间执行时间的差异随着每次刷新而摇摆不定,有时一个更快,有时另一个 - 实际上它与实际速度差别很小。

答案 2 :(得分:0)

使用 CSV 作为文件。

这是一个示例代码:

$fileContent = 'a,b,c'; // Read it from file
$array = explode(',' , $fileContent);
echo '<pre>';
print_r($array);
echo '</pre>';

答案 3 :(得分:0)

您可以将数组存储为JSON或XML。 JSON是一种用于交换文本数据的轻量级方法。它比 更轻,但它不能存储除文本和数字之外的任何内容,其中XML可以存储任意数量的不同类型的数据。

JSON方法

如果您发现JSON更适合您的数据存储需求,那么我建议使用PHP的json_encode()方法。这是一个将数据存储到文件中的快速功能。

function storeData( $path, $data ) {
    // Get data currently in file and convert it to a PHP array
    $contents = json_decode( file_get_contents( $path ) );
    // Update data
    $currentData = array_merge( $contents, $data );
    // Rewrite file with updated content
    file_put_contents( json_encode( $data ) );
}

这是过于简单化,是为了传达最简单的观点。但是,与其他一切一样,必须进行适当的卫生和放置内容的验证。您还必须确保该文件是可写的。

XML方法

如果您因任何原因不喜欢JSON方法,那么您可以使用PHP的SimpleXMLElement进行数组到XML的转换。 More on that hereand here。这将遵循上面我们的JSON函数所遵循的几乎相同的过程,只有您将使用XML进行编码,解码,读取和写入。