PHP学习(一)

PHP学习(一)

Cookie是存储在客户端浏览器中的数据,我们通过Cookie来跟踪与存储用户数据.一般情况下,Cookie通过HTTP headers从服务器端返回到客户端.多数web程序都支持Cookie操作,因为Cookie是存在于HTTP的标头之中,所以必须在其他信息输出以前进行设置,类似于header函数的使用限制.
PHP通过setcookie函数进行Cookie的设置,任何从浏览器发出的Cookie,PHP都会自动的将他存储在 COOKIE, _COOKIE[‘key’]的形式来读取某个Cookie值.
cookie将数据存储在客户端,建立起用户与服务器之间的联系,存在缺陷:
1. 相对不太安全,容易被盗导致cookie欺骗
2. 单个cookie的值最大只能存储4k
3. 每次请求都要进行网络传输,占用宽带

设置cookie

PHP设置Cookie最常用的方法就是使用setcookie函数,setcookie具有7个可选参数,我们常用到的为前5个:
1. name(Cookie名)可以通过$_COOKIE[‘name’]进行访问
2. value(Cookie的值)
3. expire(过期时间)Unix时间戳格式,默认为0,表示浏览器关闭即失效.
4. path(有效路劲)如果路劲设置为”/”,则整个网站都有效
5. domain(有效域)默认整个域名都有效.

$value = 'test';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600);  //有效期一小时
setcookie("TestCookie", $value, time()+3600, "/path/", "imooc.com"); //设置路径与域

PHP中还有一个设置Cookie的函数setrawcookie,setrawcookie跟setcookie基本一样,唯一的不同就是value值不会自动的进行urlencode,因此在需要的时候要手动的进行urlencode。

setrawcookie('cookie_name', rawurlencode($value), time()+60*60*24*365); 

因为Cookie是通过HTTP标头进行设置的,所以也可以直接使用header方法进行设置。

header("Set-Cookie:cookie_name=value");

cookie的删除与过期时间

在php中cookie的删除是通过setcookie函数将cookie的过期时间设置到当前时间之前来实现的.

setcookie('test','',time()-1);

cookie的有效路径

cookie中的路径用来控制设置的cookie在哪个路径下有效,默认为’/’,在所有路径下有效,当设置后,则只在设定的路径以及其子路径下有效.

session

session是将用户的会话数据存储在服务端,没有大小限制,通过一个session_id进行用户识别,php默认情况下session_id是通过cookie来保存的,也可以通过参数来实现,只要能将session_id传递到服务器端的识别机制都可以使用session.

使用session

  1. 执行session_start方法开启session
  2. 通过全局变量$_SESSION进行session的读写

    session_start();
    SESSION[test]=time();vardump( _SESSION);
    session会自动的对要设置的值进行encode与decode,session可以支持任意数据类型.

删除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();

值得注意的是,session_destroy并不会立即的销毁全局变量 SESSION访 _SESSION才为空,因此如果需要立即销毁$_SESSION,可以使用unset函数。

session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
unset($_SESSION);
session_destroy(); 
var_dump($_SESSION); //此时已为空

如果需要同时销毁cookie中的session_id,通常在用户退出的时候可能会用到,则还需要显式的调用setcookie方法删除session_id的cookie值。

文件操作

读取文件内容

PHP具有丰富的文件操作函数,最简单的读取文件的函数为file_get_contents,可以将整个文件全部读取到一个字符串中。

$content = file_get_contents('./test.txt');

file_get_contents也可以通过参数控制读取内容的开始点以及长度。

$content = file_get_contents('./test.txt', null, null, 100, 500);

PHP也提供类似于C语言操作文件的方法,使用fopen,fgets,fread等方法,fgets可以从文件指针中读取一行,freads可以读取指定长度的字符串。

$fp = fopen('./text.txt', 'rb');
while(!feof($fp)) {
    echo fgets($fp); //读取一行
}
fclose($fp);

$fp = fopen('./text.txt', 'rb');
$contents = '';
while(!feof($fp)) {
    $contents .= fread($fp, 4096); //一次读取4096个字符
}
fclose($fp);

使用fopen打开的文件,最好使用fclose关闭文件指针,以避免文件句柄被占用。

判断文件是否存在

一般情况下在对文件进行操作的时候需要先判断文件是否存在,PHP中常用来判断文件存在的函数有两个is_file与file_exists.

$filename = './test.txt';
if (file_exists($filename)) {
    echo file_get_contents($filename);
}

如果只是判断文件存在,使用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);
}

GD库

GD指的是Graphic Device,PHP的GD库是用来处理图形的扩展库,通过GD库提供的一系列API,可以对图像进行处理或者直接生成新的图片。
PHP除了能进行文本处理以外,通过GD库,可以对JPG、PNG、GIF、SWF等图片进行处理。GD库常用在图片加水印,验证码生成等方面。
PHP默认已经集成了GD库,只需要在安装的时候开启就行。

header("content-type: image/png");
$img=imagecreatetruecolor(100, 100);
$red=imagecolorallocate($img, 0xFF, 0x00, 0x00);
imagefill($img, 0, 0, $red);
imagepng($img);
imagedestroy($img);

绘制线条

要对图形进行操作,首先要新建一个画布,通过imagecreatetruecolor函数可以创建一个真彩色的空白图片:

$img = imagecreatetruecolor(100, 100);

GD库中对于画笔所用的颜色,需要通过imagecolorallocate函数进行分配,通过参数设定RGB的颜色值来确定画笔的颜色:

$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);

然后我们通过调用绘制线段函数imageline进行线条的绘制,通过指定起点跟终点来最终得到线条。

imageline($img, 0, 0, 100, 100, $red);

线条绘制好以后,通过header与imagepng进行图像的输出。

header("content-type: image/png");
imagepng($img);

最后可以调用imagedestroy释放该图片占用的内存。

imagedestroy($img);

通过上面的步骤,可以发现PHP绘制图形非常的简单,但很多时候我们不只是需要输出图片,可能我们还需要得到一个图片文件,可以通过imagepng函数指定文件名将绘制后的图像保存到文件中。

imagepng($img, 'img.png');

在图像中绘制文字

GD库可以进行多种图形的基本操作,常用的有绘制线条,背景填充,画矩形,绘制文字等。
跟绘制线条类似,首先需要新建一个图片与初始化颜色。

$img = imagecreatetruecolor(100, 100);
$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);

然后使用imagestring函数来进行文字的绘制,这个函数的参数很多:imagestring ( resource image,int font , int x,int y , string s,int col ),可以通过 fontx,y s是要绘制的文字,$col是文字的颜色。

imagestring($img, 5, 0, 0, "Hello world", $red);
header("content-type: image/png");
imagepng($img);
imagedestroy($img);

生成图像验证码

简单的验证码其实就是在图片中输出了几个字符,通过我们前面章节讲到的imagestring函数就能实现。
但是在处理上,为了使验证码更加的安全,防止其他程序自动识别,因此常常需要对验证码进行一些干扰处理,通常会采用绘制一些噪点,干扰线段,对输出的字符进行倾斜、扭曲等操作。
可以使用imagesetpixel绘制点来实现噪点干扰,但是只绘制一个点的作用不大,因此这里常常会使用循环进行随机绘制。

for($i=0;$i<50;$i++) {
  imagesetpixel($im, rand(0, 100) , rand(0, 100) , $black); 
  imagesetpixel($im, rand(0, 100) , rand(0, 100) , $green);
} 

给图片添加水印

  1. 一种是在图片上面加上一个字符串
  2. 另一种是在图片上加上一个logo或者其他的图片。
    因为这里处理的是已经存在的图片,所以可以直接从已存在的图片建立画布,通过imagecreatefromjpeg可以直接从图片文件创建图像。

    im=imagecreatefromjpeg( filename);

创建图像对象以后,我们就可以通过前面的GD函数,绘制字符串到图像上。如果要加的水印是一个logo图片,那么就需要再建立一个图像对象,然后通过GD函数imagecopy将logo的图像复制到源图像中。

$logo = imagecreatefrompng($filename);
imagecopy($im, $logo, 15, 15, 0, 0, $width, $height);

当将logo图片复制到原图片上以后,将加水印后的图片输出保存就完成了加水印处理。

imagejpeg($im, $filename);

你可能感兴趣的:(PHP)