I have been looking for the best method to store data in cache files.
First, I've identified two limitations of var_export verus serialize. It can't store internal references inside of an array and it can't store a nested object or an array containing objects before PHP 5.1.0.
However, I could deal with both of those so I created a benchmark. I used a single array containing from 10 to 150 indexes. I've generate the elements' values randomly using booleans, nulls, integers, floats, and some nested arrays (the nested arrays are smaller averaging 5 elements but created similarly). The largest percentage of elements are short strings around 10-15 characters. While there is a small number of long strings (around 500 characters).
Benchmarking returned these results for 1000 * [total time] / [iterations (4000 in this case)]
serialize 3.656, 3.575, 3.68, 3.933, mean of 3.71
include 7.099, 5.42, 5.185, 6.076, mean of 5.95
eval 5.514, 5.204, 5.011, 5.788, mean of 5.38
Meaning serialize is around 1 and a half times faster than var_export for a single large array. include and eval were consistently very close but eval was usually a few tenths faster (eval did better this particular set of trials than usual). An opcode cache like APC might make include faster, but otherwise serialize is the best choice.
var_export
(PHP 4 >= 4.2.0, PHP 5)
var_export — Imprime o devuelve una representación de cadena, apta para su procesamiento, de una variable
Descripción
var_export() obtiene información estructurada sobre la variable dada. Es similar a var_dump() con una excepción: la representación devuelta es código PHP válido.
Lista de parámetros
- expresion
-
La variable que desea exportar.
- devolver
-
Si es usada y se define como TRUE, var_export() devolverá la representación de la variable en lugar de imprimirla.
Note: This function uses internal output buffering with this parameter so it can not be used inside an ob_start() callback function.
Valores retornados
Devuelve la representación de la variable cuando el parámetro devolver es usado y evalúa a TRUE. De otro modo, esta función devolverá NULL.
Registro de cambios
| Versión | Descripción |
|---|---|
| 5.1.0 | Posibilidad de exportar clases y matrices que contengan clases, usando el método mágico __set_state. |
Ejemplos
Example #1 Ejemplos de var_export()
<?php
$a = array (1, 2, array ("a", "b", "c"));
var_export ($a);
?>
El resultado del ejemplo seria:
array ( 0 => 1, 1 => 2, 2 => array ( 0 => 'a', 1 => 'b', 2 => 'c', ), )
<?php
$b = 3.1;
$v = var_export($b, true);
echo $v;
?>
El resultado del ejemplo seria:
3.1
Example #2 Exportación de clases a partir de PHP 5.1.0
<?php
class A { public $var; }
$a = new A;
$a->var = 5;
var_export($a);
?>
El resultado del ejemplo seria:
A::__set_state(array( 'var' => 5, ))
Example #3 Uso de __set_state (a partir de PHP 5.1.0)
<?php
class A
{
public $var1;
public $var2;
public static function __set_state($una_matriz)
{
$obj = new A;
$obj->var1 = $una_matriz['var1'];
$obj->var2 = $una_matriz['var2'];
return $obj;
}
}
$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';
eval('$b = ' . var_export($a, true) . ';'); // $b =
A::__set_state(array(
// 'var1' => 5,
// 'var2' => 'foo',
// ));
var_dump($b);
?>
El resultado del ejemplo seria:
object(A)#2 (2) { ["var1"]=> int(5) ["var2"]=> string(3) "foo" }
Notes
Note: Las variables de tipo resource no pueden ser exportadas por esta función.
Note: var_export() no maneja referencias circulares ya que sería prácticamente imposible generar código PHP interpretable en tal caso. Si desea trabajar con la representación completa de una matriz u objeto, use serialize().
var_export
30-Jun-2007 02:20
24-May-2007 03:47
Like previously reported, i find var_export() frustrating when dealing with recursive structures. Doing a :
<?php
var_export($GLOBALS);
?>
fails. Interestingly, var_dump() has some logic to avoid recursive references. So :
<?php
var_dump($GLOBALS);
?>
works (while being more ugly). Unlike var_export(), var_dump() has no option to return the string, so output buffering logic is required if you want to direct the output.
21-Mar-2007 03:44
To import exported variable you can use this code:
<?
$str=file_get_contents('exported_var.str');
$var=eval('return '.$str.';')
// Now $val contains imported variable
?>
10-Oct-2006 09:19
Here is a nifty function to export an object with var_export without the keys, which can be useful if you want to export an array but don't want the keys (for example if you want to be able to easily add something in the middle of the array by hand).
<?
function var_export_nokeys ($obj, $ret=false) {
$retval = preg_replace("/'?\w+'?\s+=>\s+/", '', var_export($obj, true));
if ($ret===true) {
return $retval;
} else {
print $retval;
}
}
?>
Works the same as var_export obviously. I found it useful, maybe someone else will too!
30-Aug-2006 01:48
Here is a bit code, what will read an saved object and turn it into an array.
Please note: It is very lousy style. Only an an idea.
$data = file_get_contents("test.txt");
$data = preg_replace('/class .*{/im', 'array (', $data);
$data = preg_replace('/\}/im', ')', $data);
$data = preg_replace('/var /im', '', $data);
$data = preg_replace('/;/im', ',', $data);
$data = preg_replace('/=/im', '=>', $data);
$data = preg_replace('/=>>/im', '=>', $data);
$data = preg_replace('/\$(.*?) /im', '"$1"', $data);
eval('$O = ' . $data . ';');
print_r($O);
05-Sep-2005 09:24
This function can't export EVERYTHING. Moreover, you can have an error on an simple recursive array:
$test = array();
$test["oops"] = & $test;
echo var_export($test);
=>
Fatal error: Nesting level too deep - recursive dependency? in ??.php on line 59
04-Jul-2005 07:50
<roman at DIESPAM dot feather dot org dot ru>, your function has inefficiencies and problems. I probably speak for everyone when I ask you to test code before you add to the manual.
Since the issue of whitespace only comes up when exporting arrays, you can use the original var_export() for all other variable types. This function does the job, and, from the outside, works the same as var_export().
<?php
function var_export_min($var, $return = false) {
if (is_array($var)) {
$toImplode = array();
foreach ($var as $key => $value) {
$toImplode[] = var_export($key, true).'=>'.var_export_min($value, true);
}
$code = 'array('.implode(',', $toImplode).')';
if ($return) return $code;
else echo $code;
} else {
return var_export($var, $return);
}
}
?>
18-Mar-2005 11:46
Function that exports variables without adding any junk to the resulting string:
<?php
function encode($var){
if (is_array($var)) {
$code = 'array(';
foreach ($var as $key => $value) {
$code .= "'$key'=>".encode($value).',';
}
$code = chop($code, ','); //remove unnecessary coma
$code .= ')';
return $code;
} else {
if (is_string($var)) {
return "'".$var."'";
} elseif (is_bool($code)) {
return ($code ? 'TRUE' : 'FALSE');
} else {
return 'NULL';
}
}
}
function decode($string){
return eval('return '.$string.';');
}
?>
The resulting string can sometimes be smaller, that output of serialize(). May be useful for storing things in the database.
24-Nov-2004 09:22
var_export() differs from print_r() for variables that are resources, with print_r() being more useful if you are using the function for debugging purposes.
e.g.
<?php
$res = mysql_connect($dbhost, $dbuser, $dbpass);
print_r($res); //output: Resource id #14
var_export($res); //output: NULL
?>
11-Jun-2004 07:53
This functionality is now implemented in the PEAR package PHP_Compat.
More information about using this function without upgrading your version of PHP can be found on the below link:
http://pear.php.net/package/PHP_Compat
16-Oct-2003 10:43
[john holmes]
True, but that method would require you to open and read the file into a variable and then unserialize it into another variable.
Using a file created with var_export() could simply be include()'d, which will be less code and faster.
[kaja]
If you are trying to find a way to temporarily save variables into some other file, check out serialize() and unserialize() instead - this one is more useful for its readable property, very handy while debugging.
[original post]
If you're like me, you're wondering why a function that outputs "correct PHP syntax" is useful. This function can be useful in implementing a cache system. You can var_export() the array into a variable and write it into a file. Writing a string such as
<?php
$string = '<?php $array = ' . $data . '; ?>';
?>
where $data is the output of var_export() can create a file that can be easily include()d back into the script to recreate $array.
The raw output of var_export() could also be eval()d to recreate the array.
---John Holmes...
