九个PHP很有用的功能(3)

2014 年 11 月 19 日3820

   

  7. 序列化

  你是否会把一个比较复杂的数据结构存到数据库或是文件中?你并不需要自己去写自己的算法。PHP早已为你做好了,其提供了两个函数:?serialize() 和 unserialize():

  // 一个复杂的数组

  $myvar = array(

  'hello',

  42,

  array(1,'two'),

  'apple'

  );

  // 序列化

  $string = serialize($myvar);

  echo $string;

  /* 输出

  a:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";}

  */

  // 反序例化

  $newvar = unserialize($string);

  print_r($newvar);

  /* 输出

  Array

  (

  [0] => hello

  [1] => 42

  [2] => Array

  (

  [0] => 1

  [1] => two

  )

  [3] => apple

  )

  */

  这是PHP的原生函数,然而在今天JSON越来越流行,所以在PHP5.2以后,PHP开始支持JSON,你可以使用 json_encode() 和 json_decode() 函数

  // a complex array

  $myvar = array(

  'hello',

  42,

  array(1,'two'),

  'apple'

  );

  // convert to a string

  $string = json_encode($myvar);

  echo $string;

  /* prints

  ["hello",42,[1,"two"],"apple"]

  */

  // you can reproduce the original variable

  $newvar = json_decode($string);

  print_r($newvar);

  /* prints

  Array

  (

  [0] => hello

  [1] => 42

  [2] => Array

  (

  [0] => 1

  [1] => two

  )

  [3] => apple

  )

  */

  这看起来更为紧凑一些了,而且还兼容于Javascript和其它语言。但是对于一些非常复杂的数据结构,可能会造成数据丢失。

  8. 字符串压缩

  当我们说到压缩,我们可能会想到文件压缩,其实,字符串也是可以压缩的。PHP提供了?gzcompress() 和 gzuncompress() 函数:

  $string =

  "Lorem ipsum dolor sit amet, consectetur

  adipiscing elit. Nunc ut elit id mi ultricies

  adipiscing. Nulla facilisi. Praesent pulvinar,

  sapien vel feugiat vestibulum, nulla dui pretium orci,

  non ultricies elit lacus quis ante. Lorem ipsum dolor

  sit amet, consectetur adipiscing elit. Aliquam

  pretium ullamcorper urna quis iaculis. Etiam ac massa

  sed turpis tempor luctus. Curabitur sed nibh eu elit

  mollis congue. Praesent ipsum diam, consectetur vitae

  ornare a, aliquam a nunc. In id magna pellentesque

  tellus posuere adipiscing. Sed non mi metus, at lacinia

  augue. Sed magna nisi, ornare in mollis in, mollis

  sed nunc. Etiam at justo in leo congue mollis.

  Nullam in neque eget metus hendrerit scelerisque

  eu non enim. Ut malesuada lacus eu nulla bibendum

  id euismod urna sodales. ";

  $compressed = gzcompress($string);

  echo "Original size: ". strlen($string)."\n";

  /* 输出原始大小

  Original size: 800

  */

  echo "Compressed size: ". strlen($compressed)."\n";

  /* 输出压缩后的大小

  Compressed size: 418

  */

  // 解压缩

  $original = gzuncompress($compressed);

  几乎有50% 压缩比率。同时,你还可以使用?gzencode() 和 gzdecode() 函数来压缩,只不用其用了不同的压缩算法。

  9. 注册停止函数

  有一个函数叫做?register_shutdown_function(),可以让你在整个脚本停时前运行代码。让我们看下面的一个示例:

  // capture the start time

  $start_time = microtime(true);

  // do some stuff

  // ...

  // display how long the script took

  echo "execution took: ".

  (microtime(true) - $start_time).

  " seconds.";

  上面这个示例只不过是用来计算某个函数运行的时间。然后,如果你在函数中间调用?exit() 函数,那么你的最后的代码将不会被运行到。并且,如果该脚本在浏览器终止(用户按停止按钮),其也无法被运行。

  而当我们使用了register_shutdown_function()后,你的程序就算是在脚本被停止后也会被运行:

  $start_time = microtime(true);

  register_shutdown_function('my_shutdown');

  // do some stuff

  // ...

  function my_shutdown() {

  global $start_time;

  echo "execution took: ".

  (microtime(true) - $start_time).

  " seconds.";

  }

0 0