美文网首页
PHP进阶(二)

PHP进阶(二)

作者: yzw12138 | 来源:发表于2017-07-25 23:22 被阅读0次

    一、会话控制

    • 1、cookie
    • 简介:Cookie是存储在客户端浏览器中的数据,我们通过Cookie来跟踪与存储用户数据。一般情况下,Cookie通过HTTP headers从服务端返回到客户端。多数web程序都支持Cookie的操作,因为Cookie是存在于HTTP的标头之中,所以必须在其他信息输出以前进行设置,类似于header函数的使用限制。
      PHP通过setcookie函数进行Cookie的设置,任何从浏览器发回的Cookie,PHP都会自动的将他存储在$_COOKIE的全局变量之中,因此我们可以通过$_COOKIE['key']的形式来读取某个Cookie值。
      PHP中的Cookie具有非常广泛的使用,经常用来存储用户的登录信息,购物车等,且在使用会话Session时通常使用Cookie来存储会话id来识别用户,Cookie具备有效期,当有效期结束之后,Cookie会自动的从客户端删除。同时为了进行安全控制,Cookie还可以设置域跟路径
    • 设置:PHP设置Cookie最常用的方法就是使用setcookie函数

    setcookie(name,value,expire,path,domain,secure):
    name 必需( Cookie名)可以通过$_COOKIE['name'] 进行访问
    value 必需(Cookie的值)
    expire(过期时间)Unix时间戳格式,默认为0,表示浏览器关闭即失效
    path(有效路径)如果路径设置为'/',则整个网站都有效
    domain(有效域)默认整个域名都有效,如果设置了'www.imooc.com',则只在www子域中有效

    • PHP中还有一个设置Cookie的函数setrawcookie,setrawcookie跟setcookie基本一样,唯一的不同就是value值不会自动的进行urlencode,因此在需要的时候要手动的进行urlencode。
    setrawcookie('cookie_name', rawurlencode($value), time()+60*60*24*365);
    
    • cookie的删除与过期时间
      php中没有删除Cookie的函数,在PHP中删除cookie也是采用setcookie函数来实现。
    setcookie('test', '', time()-1); 
    

    可以看到将cookie的过期时间设置到当前时间之前,则该cookie会自动失效,也就达到了删除cookie的目的

    • cookie的有效路径
      cookie中的路径用来控制设置的cookie在哪个路径下有效,默认为'/',在所有路径下都有,当设定了其他路径之后,则只在设定的路径以及子路径下有效。
    • 2、session与cookie的异同
      cookie将数据存储在客户端,建立起用户与服务器之间的联系,通常可以解决很多问题,但是cookie仍然具有一些局限:
      cookie相对不是太安全,容易被盗用导致cookie欺骗
      单个cookie的值最大只能存储4k
      每次请求都要进行网络传输,占用带宽
      session是将用户的会话数据存储在服务端,没有大小限制,通过一个session_id进行用户识别,PHP默认情况下session id是通过cookie来保存的,因此从某种程度上来说,seesion依赖于cookie。但这不是绝对的,session id也可以通过参数来实现,只要能将session id传递到服务端进行识别的机制都可以使用session。
    • 3、session的使用
      先执行session_start方法开启session,然后通过全局变量$_SESSION进行session的读写。默认情况下,session是以文件形式存储在服务器上的,因此当一个页面开启了session之后,会独占这个session文件,这样会导致当前用户的其他并发访问无法执行而等待。可以采用缓存或者数据库的形式存储来解决这个问题,
    <?php
    //开始使用session
    session_start();
    //设置一个session
    $_SESSION['test'] = time();
    //显示当前的session_id
    echo "session_id:".session_id();
    echo "<br>";
    //读取session值
    echo $_SESSION['test'];
    //销毁一个session
    unset($_SESSION['test']);
    echo "<br>";
    var_dump($_SESSION);
    

    session会自动的对要设置的值进行encode与decode,因此session可以支持任意数据类型,包括数据与对象等。

    session_start();
    $_SESSION['ary'] = array('name' => 'jobs');
    $_SESSION['obj'] = new stdClass();
    var_dump($_SESSION);
    
    • 4、删除与销毁session
      删除某个session值可以使用PHP的unset函数,删除后就会从全局变量$_SESSION中去除,无法访问。
    session_start();
    $_SESSION['name'] = 'jobs';
    unset($_SESSION['name']);
    echo $_SESSION['name']; //提示name不存在
    

    如果要删除所有的session,可以使用session_destroy函数销毁当前session,session_destroy会删除所有数据,但是session_id仍然存在。

    session_start();
    $_SESSION['name'] = 'jobs';
    $_SESSION['time'] = time();
    session_destroy();
    
    • 5、使用session来存储用户的登录信息
    <?php
    session_start();
    //假设用户登录成功获得了以下用户数据
    $userinfo = array(
        'uid'  => 10000,
        'name' => 'spark',
        'email' => 'spark@imooc.com',
        'sex'  => 'man',
        'age'  => '18'
    );
    header("content-type:text/html; charset=utf-8");
    /* 将用户信息保存到session中 */
    $_SESSION['uid'] = $userinfo['uid'];
    $_SESSION['name'] = $userinfo['name'];
    $_SESSION['userinfo'] = $userinfo;
    var_dump($_SESSION);
    //* 将用户数据保存到cookie中的一个简单方法 */
    $secureKey = 'imooc'; //加密密钥
    $str = serialize($userinfo); //将用户信息序列化
    //用户信息加密前
    $str = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), $str, MCRYPT_MODE_ECB));
    //用户信息加密后
    //将加密后的用户数据存储到cookie中
    setcookie('userinfo', $str);
    //当需要使用时进行解密
    $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), base64_decode($str), MCRYPT_MODE_ECB);
    $uinfo = unserialize($str);
    echo "解密后的用户信息:<br>";
    print_r($uinfo);
    

    二、文件系统

    • 1、读取文件内容
    • 1、file_get_contents:将整个文件读取到一个字符串中,也可以通过参数控制读取内容的开始点以及长度。
    $content = file_get_contents('./test.txt');
    $content = file_get_contents('./test.txt', null, null, 100, 500);
    

    file_get_contents(path,include_path,context,start,max_length)
    path 必需。规定要读取的文件。
    include_path 可选。如果也想在 include_path 中搜寻文件的话,可以将该参数设为 "1"。
    context
    可选。规定文件句柄的环境。
    context 是一套可以修改流的行为的选项。若使用 null,则忽略。
    start 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 新加的。
    max_length 可选。规定读取的字节数。该参数是 PHP 5.1 新加的。

    • 2、PHP也提供类似于C语言操作文件的方法,使用fopen,fgets,fread等方法,fgets可以从文件指针中读取一行,freads可以读取指定长度的字符串。使用fopen打开的文件,最好使用fclose关闭文件指针,以避免文件句柄被占用。

    r 打开文件为只读。文件指针在文件的开头开始。
    w 打开文件为只写。删除文件的内容或创建一个新的文件,如果它不存在。文件指针在文件的开头开始。
    a 打开文件为只写。文件中的现有数据会被保留。文件指针在文件结尾开始。创建新的文件,如果文件不存在。
    x 创建新文件为只写。返回 FALSE 和错误,如果文件已存在。
    r+ 打开文件为读/写、文件指针在文件开头开始。
    w+ 打开文件为读/写。删除文件内容或创建新文件,如果它不存在。文件指针在文件开头开始。
    a+ 打开文件为读/写。文件中已有的数据会被保留。文件指针在文件结尾开始。创建新文件,如果它不存在。
    x+ 创建新文件为读/写。返回 FALSE 和错误,如果文件已存在。

    $fp = fopen('./text.txt', 'rb');//rb表示文件打开模式
    while(!feof($fp)) {//是否读到文件末尾
          echo fgets($fp); //读取一行
          $contents='';
          $contents .= fread($fp, 4096); //一次读取4096个字符
    }
    fclose($fp);
    
    • 2、判断文件是否存在
      is_file和file_exists用来判断文件是否存在。如果只是判断文件存在,使用file_exists就行,file_exists不仅可以判断文件是否存在,同时也可以判断目录是否存在,从函数名可以看出,is_file是确切的判断给定的路径是否是一个文件。
    $filename = './test.txt';
    if (is_file($filename)) {
        echo file_get_contents($filename);
    }
    

    更加精确的可以使用is_readable与is_writeable在文件是否存在的基础上,判断文件是否可读与可写。

    $filename = './test.txt';
    if (is_writeable($filename)) {
        file_put_contents($filename, 'test');
    }
    if (is_readable($filename)) {
        echo file_get_contents($filename);
    }
    
    • 3、取得文件的修改时间
      文件有很多元属性,包括:文件的所有者、创建时间、修改时间、最后的访问时间等。

    fileowner:获得文件的所有者
    filectime:获取文件的创建时间
    filemtime:获取文件的修改时间
    fileatime:获取文件的访问时间

    <?php
    $filename = '/data/webroot/usercode/code/resource/test.txt';
    echo '所有者:'.fileowner($filename).'<br>';
    echo '创建时间:'.filectime($filename).'<br>';
    echo '修改时间:'.filemtime($filename).'<br>';
    echo '最后访问时间:'.fileatime($filename).'<br>';
    //给$mtime赋值为文件的修改时间
    $mtime = filemtime($filename); 
    //通过计算时间差 来判断文件内容是否有效
    if (time() - $mtime > 3600) {
        echo '<br>缓存已过期';
    } else {
        echo file_get_contents($filename);
    }
    
    • 4、取得文件的大小
      通过filesize函数可以取得文件的大小,文件大小是以字节数表示的。
    $filename = '/data/webroot/usercode/resource/test.txt';
    $size = filesize($filename);
    

    可以通过自己定义函数来实现,转换文件大小的单位。

    function getsize($size, $format = 'kb') {
        $p = 0;
        if ($format == 'kb') {
            $p = 1;
        } elseif ($format == 'mb') {
            $p = 2;
        } elseif ($format == 'gb') {
            $p = 3;
        }
        $size /= pow(1024, $p);
        return number_format($size, 3);
    }
    $filename = '/data/webroot/usercode/code/resource/test.txt';
    $size = filesize($filename);
    $size = getsize($size, 'kb'); //进行单位转换
    echo $size.'kb';
    

    三、异常处理

    • 1、抛出异常
      从PHP5开始,PHP支持异常处理,异常处理是面向对象一个重要特性,PHP代码中的异常通过throw抛出,异常抛出之后,后面的代码将不会再被执行。
    //创建可抛出一个异常的函数
    function checkNum($number){
         if($number>1){
             throw new Exception("异常提示-数字必须小于等于1");
         }
         return true;
     }
    //在 "try" 代码块中触发异常
     try{
         checkNum(2);
         //如果异常被抛出,那么下面一行代码将不会被输出
         echo '如果能看到这个提示,说明你的数字小于等于1';
     }catch(Exception $e){
         //捕获异常
         echo '捕获异常: ' .$e->getMessage();
     }
    
    • 2、异常处理类
      PHP具有很多异常处理类,其中Exception是所有异常处理的基类。
      Exception具有几个基本属性与方法,其中包括了:
      message 异常消息内容
      code 异常代码
      file 抛出异常的文件名
      line 抛出异常在该文件的行数
      其中常用的方法有:
      getTrace 获取异常追踪信息
      getTraceAsString 获取异常追踪信息的字符串
      getMessage 获取出错信息
      如果必要的话,可以通过继承Exception类来建立自定义的异常处理类。
    //自定义的异常类,继承了PHP的异常基类Exception
    class MyException extends Exception {
        function getInfo() {
            return '自定义错误信息';
        }
    }
    try {
        //使用异常的函数应该位于 "try"  代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
        throw new MyException('error');//这里规定如何触发异常。注意:每一个 "throw" 必须对应至少一个 "catch",当然可以对应多个"catch"
    } catch(Exception $e) {//"catch" 代码块会捕获异常,并创建一个包含异常信息的对象
        echo $e->getInfo();//获取自定义的异常信息
        echo $e->getMessage();//获取继承自基类的getMessage信息
    }
    

    四、数据库操作

    相关文章

      网友评论

          本文标题:PHP进阶(二)

          本文链接:https://www.haomeiwen.com/subject/atoekxtx.html