首页 > 编程技术 > php

几个简单的php数据文件缓存类

发布时间:2016-11-25 15:48

数据文件缓存的做法我们常用的有php文件缓存与利用memcache来缓存数据,下面面我分别总结了memcache缓存数据与数据文件缓存有需要的朋友可参考参考。

1.对于一般的变量,把该变量变成php语言的格式,写到文件中,用时只要include这个文件就相当于加载了cache了;
2.对于array型的变量,把array转化为php语言定义array的字符串,写到文件中,用时也只要include就相当于加载了cache了;
3.缓存cache时间上的控制,通过获取缓存文件的创建时间和现在的时间进行对比,如果没有到更新时间,直接读取缓存,如果到了更新时间,查询数据库,

文件缓存类:

 代码如下 复制代码

<?php
class DataCache
{
 
 /**
  * 数组转换
  *
  * @param array $array
  * @param string $arrayName
  * @param array $level
  *
  * @return string
  */
 private function arrayEval($array, $arrayName = '', $level = 0)
 {
  $space = str_repeat("t", $level);
 
  if (empty($arrayName))
  {
   $evaluate = "arrayn$space(n";
  }
  else
  {
   $evaluate = "${$arrayName} = arrayn$space(n";
  }
 
  $space2 = str_repeat("t", $level + 1);
  $comma = $space2;
  if (!empty($array))
  {
   foreach ($array as $key => $val)
   {
    $key = is_string($key) ? ''' . addcslashes($key, ''\') . ''' : $key;
    $val = !is_array($val) && (!preg_match('/^-?[1-9]d*$/', $val) || strlen($val) > 12) ? ''' . addcslashes($val, ''\') . ''' : $val;
    if (is_array($val))
    {
     $evaluate .= "$comma$key => " . arrayEval($val, '', $level + 1);
    }
    else
    {
     $evaluate .= "$comma$key => $val";
    }
    $comma = ",n$space2";
   }
  }
  $evaluate .= "n$space)";
 
  // 最后才需要一个“;”
  if ($level == 0)
  {
   $evaluate .= ";";
  }
  return $evaluate;
 }
 
 /**
  * 写入缓存
  *
  * @param string $path
  * @param string $arrayName
  * @param array  $data
  *
  * @return boolean
  */
 public static function writeCache($path, $arrayName, $data)
 {
  if ($handle = fopen($path, 'w+'))
  {
   $data = self::arrayEval($data, $arrayName);
 
   $dataConvert = "<?phpn" . $data;
 
   flock($handle, LOCK_EX);
   $rs = fputs($handle, $dataConvert);
   flock($handle, LOCK_UN);
   fclose($handle);
   if ($rs !== false)
   {
    return true;
   }
  }
  return false;
 }
 
}

调用方法

 代码如下 复制代码

/**
* 生成文件缓存
*
* @param string $filePath 缓存文件的保存路径
* @param string $arrayName 存放在缓存文件中的数组名称
* @param array $data 数据
*
* @return boolean
*/
DataCache::writeCache($filePath, $arrayName, $data);


memcache来缓存数据


面提供这个文件缓存的类,希望大家可以看看。

 代码如下 复制代码

  

<?php
/**
 * 文件缓存类
 * 提供文件缓存
 * @author guoyubin(263421949@qq.com)
 */
class Cache_FileCache{
   
    /**
     * 设置缓存
     * @param $key 缓存的关键字key
     * @param $data 缓存的内容
     * @param $cacheLife 缓存时间(单位为秒)如果为0 则表示无限时间
     * @return Bool
     */
    public static function setCache($key,$data,$cacheLife)
    {
            if(file_exists(__SITE_FILE_CACHE))
            {
                @$file                =  __SITE_FILE_CACHE . "/" . $key .".php";
                $cache                  =  array();
                $time                =  __SYS_TIME;
                $cache['content']    =  $data;
                $cache['expire']    =  $cacheLife === 0 ? 0 : $time+$cacheLife;
                $cache['mtime']        =  $time;
                $cache                =  serialize($cache);
                $setReslut            =  @file_put_contents($file,$cache) or self::error(__line__,"文件写入出错");
                $chmodReslut        =  @chmod($file,0777) or self::error(__line__,"设定文件权限失败");
                if($setReslut && $chmodReslut)
                {
                    return true;
                }
                else
                {
                    return false;
                }
               
            }
       
    }

    /**
     * 得到缓存数据
     * @param $key 缓存的关键字key
     * @return array
     */
    public static function getCache($key)
    {
            @$file                =      __SITE_FILE_CACHE . "/" . $key .".php";
            if(file_exists($file))
            {
                     $data        =    @file_get_contents($file);
                     $data        =   unserialize($data);
                     if($data['expire']==0 || $data['expire'] > __SYS_TIME)
                     {
                         return $data['content'];
                     }
                     else
                     {
                         unlink($file);
                         return array();
                     }
            }       
    }
   
    /**
     * 删除缓存文件
     * @param $key 缓存$key
     * @return Bool
     */
    public static function delCache($key)
    {       
        if (@unlink(__SITE_FILE_CACHE."/".$key.".php"))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
   
    /**
     * 清除所有缓存文件
     * @return Bool
     */
   
    public static function clearAllCache()
    {
        $files = scandir(__SITE_FILE_CACHE);
        foreach ($files as $val)
        {
            @unlink(__SITE_FILE_CACHE."/".$val);

        }
    }
   
    /**
     * 出错处理函数
     * @param $line 行数
     * @param $msg  信息
     */
    public static function error($line,$msg)
    {
        die("出错文件:".__file__."/n出错行:$line/n错误信息:$msg");
    }
}

?>

在我们phper去面试时都会碰到一些小算法题,下面我来总结一下可能碰到的一些PHP面试常出现的小算法总结
 代码如下 复制代码

 

<?php
  //打印一个三角形
  for($i=0;$i<=3;$i++)
  {
  for($j=0;$j<=3-$i;$j++){
  echo ‘&nbsp;’;
  }
  for($k=0;$k<=2*$i;$k++)
  {
  echo “*”;
  }
  echo ‘<br>’;
  }
  ?>
  <?php
  //杨辉三角
  for($i=0;$i<6;$i++)
  {
  //第一个和最后一个都为1
  $a[$i][0]=1;
  $a[$i][$i]=1;
  }
  for($i=2;$i<6;$i++){
  for($j=1;$j<$i;$j++)
  {
  $a[$i][$j]=$a[$i-1][$i-1]+$a[$i-1][$j];
  }
  }
  for($i=0;$i<6;$i++)
  {
  for($j=0;$j<=$i;$j++){
  echo $a[$i][$j].’&nbsp;’;
  }
  echo ‘<br/>’;
  }
  ?>
  <?php
  //合并多个数组
  function t(){
  $c=func_num_args()-1;//返回传递给函数的参数个数
  $a=func_get_args();//返回一个数组,包括函数的参数列表
  for($i=0;$i<=$c;$i++){
  if(is_array($a[$i])){
  for($j=0;$j<count($a[$i]);$j++){
  $r[]=$a[$i][$j];
  }
  }else{
  die(‘Not a array’);
  }
  }
  return $r;
  }
  print_r(t(range(1,4),range(1,4),range(1,4)));
  ?>
  <?php
  //求牛
  function cow($num,$y)
  {
  for($j=1;$j<$y;$j++)
  {
  if($j>=4 && $j<15)
  {
  $num++;
  cow($num,$y-$j);
  }
  if($j==20)
  $num–;
  }
  return $num;
  }
  echo cow(2,2);
  ?>
  <?php
  //顺序查找(数组里查找某个元素)
  function seq_sch($array,$n,$k)//在某个位置之前查找某元素(不包括指定位置)
  {
  $array[$n]=$k;
  for($i=0;$i<$n;$i++)
  {
  if($array[$i]==$k)
  break;
  }
  if($i<$n)
  return $i;
  else
  return -1;
  }
  $array=array(‘a’,'b’,'c’);
  echo seq_sch($array,2,’b');
  ?>
  <?php
  function show($i)
  {
  if($i==1)
  return 1;
  else
  return $i*show($i-1);
  }
  echo “<br>”;
  echo show(3);
  ?>
  <?php
  //裴波那挈数列
  function b($n)
  {
  if($n<2)
  return $n;
  else
  return b($n-1)+show($n-2);
  }
  echo b(2);
  ?>

使用php的朋友会发现如果你刚安装好apache与php环境,会发现你系统的时间与我们中国时间是有区别的,一般情况是相隔8小时哦,下面我来介绍PHP设置时区设置方法总结。

方法一,在php页面设置时区

在页面最前面加上下面应用一种都是可以的

date_default_timezone_set用法如下
date_default_timezone_set
(PHP 5 >= 5.1.0RC1)
date_default_timezone_set -- 设定用于一个脚本中所有日期时间函数的默认时区
说明
bool date_default_timezone_set ( string timezone_identifier )
date_default_timezone_set() 设定用于所有日期时间函数的默认时区。


用法

 代码如下 复制代码

1 date_default_timezone_set('Asia/Shanghai');//'Asia/Shanghai'   亚洲/上海

2 date_default_timezone_set('Asia/Chongqing');//其中Asia/Chongqing'为“亚洲/重庆”

3 date_default_timezone_set('PRC');//其中PRC为“中华人民共和国”

4 ini_set('date.timezone','Etc/GMT-8');

5 ini_set('date.timezone','PRC');

6 ini_set('date.timezone','Asia/Shanghai');

7 ini_set('date.timezone','Asia/Chongqing');

Asia/Shanghai – 上海
Asia/Chongqing – 重庆
Asia/Urumqi – 乌鲁木齐
Asia/Hong_Kong – 香港
Asia/Macao – 澳门
Asia/Taipei – 台北
Asia/Singapore – 新加坡


如果你有服务器管理权限,我们可以在在PHP.INI中设置时区

 代码如下 复制代码

date.timezone = PRC

去掉前面的分号 然后重启apache

可能碰到的一些问题

1.Warning: strftime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function.

2.Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function.

3.Notice: date_default_timezone_set(): Timezone ID 'Asia/Shanghai' is invalid

解决办法

 代码如下 复制代码

date_default_timezone_set('Asia/Shanghai');//'Asia/Shanghai' 亚洲/上海

date_default_timezone_set('Asia/Chongqing');//其中Asia/Chongqing'为“亚洲/重庆”

date_default_timezone_set('PRC');//其中PRC为“中华人民共和国”

伪造IP来源这个东西在对很多朋友都有用,有的朋友喜欢利用php curl来伪造IP来源,让自己觉得很多IP了,下面我们以伪造IP来源实例来介绍php中curl的用法。

curl默认是未被启用的,启用方法。

启用 cURL 设置


如果你是在Windows平台下,那么非常简单,你需要改一改你的php.ini文件的设置,找到php_curl.dll,并取消前面的分号注释就行了。如下所示:

//取消下在的注释

 代码如下 复制代码

 extension=php_curl.dll 

如果你是在Linux下面,那么,你需要重新编译你的PHP了,编辑时,你需要打开编译参数——在configure命令上加上“–with-curl” 参数。

简单测试实例

 代码如下 复制代码

<?php
// 初始化一个 cURL 对象
$curl = curl_init(); 
 
// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_URL, 'http://coolshell.cn');
 
// 设置header
curl_setopt($curl, CURLOPT_HEADER, 1);
 
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 
// 运行cURL,请求网页
$data = curl_exec($curl);
 
// 关闭URL请求
curl_close($curl);
 
// 显示获得的数据
var_dump($data);

模仿post数据

 代码如下 复制代码

<?php
    $phoneNumber = '13912345678';
    $message = 'This message was generated by curl and php';
    $curlPost = 'pNUMBER='  . urlencode($phoneNumber) . '&MESSAGE=' . urlencode($message) . '&SUBMIT=Send';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/sendSMS.php');
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
    $data = curl_exec();
    curl_close($ch);
?>

现在进入正题,CURL伪造IP和来源

1.php代码:

 代码如下 复制代码

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://localhost/2.php");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8'));//IP
curl_setopt($ch, CURLOPT_REFERER, "http://www.111cn.net/ ");   //来路
curl_setopt($ch, CURLOPT_HEADER, 1);
$out = curl_exec($ch);
curl_close($ch);

2.php代码:

 

 代码如下 复制代码
function getClientIp() {
    if (!empty($_SERVER["HTTP_CLIENT_IP"]))
        $ip = $_SERVER["HTTP_CLIENT_IP"];
    else if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    else if (!empty($_SERVER["REMOTE_ADDR"]))
        $ip = $_SERVER["REMOTE_ADDR"];
    else
        $ip = "err";
    return $ip;
}
echo "IP: " . getClientIp() . "";
echo "referer: " . $_SERVER["HTTP_REFERER"];

用1.php 请求 2.php,输出结果:

关于SSL也就是HTTPS协议,你只需要把CURLOPT_URL连接中的http://变成https://就可以了。当然,还有一个参数叫CURLOPT_SSL_VERIFYHOST可以设置为验证站点。

关于Cookie,你需要了解下面三个参数:

CURLOPT_COOKIE,在当面的会话中设置一个cookie
CURLOPT_COOKIEJAR,当会话结束的时候保存一个Cookie
CURLOPT_COOKIEFILE,Cookie的文件。

在php程序开中发很多朋友把握isset与empty搞混或搞不清楚什么时候用isset,什么时候用empty函数,下面我来介绍两者的区别。

isset  — 检测变量是否设置
PHP isset() 用于检测一个或多个变量是否设置,如果被检测的变量存在则返回 TRUE,否则返回 FALSE。

例子:

 代码如下 复制代码
<?php
$var = 1;
if(isset($var)){
    echo '变量 $var 已经被设置';
} else {
    echo '变量 $var 还未被设置';
}
?>

运行该例子输出:

变量 $var 已经被设置

数组中的元素也同样有效:

 

 代码如下 复制代码

<?php

$a = array ('test' => 1, 'hello' => NULL);

var_dump( isset ($a['test') ); // TRUE
var_dump( isset ($a['foo') ); // FALSE
var_dump( isset ($a['hello') ); // FALSE

// 'hello' 等于 NULL,所以被认为是未赋值的。
// 如果想检测 NULL 键值,可以试试下边的方法。
var_dump( array_key_exists('hello', $a) ); // TRUE

注意

•isset() 只能用于检测变量,传递任何其它参数都将造成解析错误。
•isset() 是一个语言结构而非函数,因此它无法被变量函数调用。

empty  — 检查一个变量是否为空

如果 变量 是非空或非零的值,则 empty() 返回 false

如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。

除了当变量没有置值时不产生警告之外,empty() 是 (boolean) var 的反义词

 代码如下 复制代码


<?php
$var = 0;

// 结果为 true,因为 $var 为空
if (empty($var)) { 
    echo '$var is either 0 or not set at all';
}

// 结果为 false,因为 $var 已设置
if (!isset($var)) {
    echo '$var is not set at all';
}
?>


实例对比

 代码如下 复制代码

$is_var = '';

if(isset($is_var)) {
    echo "变量存在!<br />";
} else {
    echo "变量不存在!<br />";
}

if(empty($is_var)) {
    echo "变量为空!<br />";
} else {
    echo "变量不为空!<br />";
}

?>

标签:[!--infotagslink--]

您可能感兴趣的文章: