PHP学习笔记(二)

基本的语法与编写两篇总结应该就差不多了,PHP自带各种强大函数基本都封装好了,学起来也不是很难
这篇记录 cookie、session以及IO和异常等

还有点操作数据库的一些库的使用没整理,框架级开发就先不看了

cookie相关

PHP通过setcookie函数进行Cookie的设置,任何从浏览器发回的Cookie,PHP都会自动的将他存储在$_COOKIE的全局变量之中,因此我们可以通过$_COOKIE['key']的形式来读取某个Cookie值。

设置cookie

PHP设置Cookie最常用的方法就是使用setcookie函数,setcookie具有7个可选参数,我们常用到的为前5个:

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

因为Cookie是通过HTTP标头进行设置的,所以也可以直接使用header方法进行设置。
header("Set-Cookie:cookie_name=value");;在values后面可加分号追加有效期
删除cookie没有专门的函数,也是为了不让请求过于复杂,可以通过设置有效时间来达到删除目的:
setcookie('test', '', time()-1);

session

相比cookie,session是将用户的会话数据存储在服务端,没有大小限制,不像cookie只能是4kb,通过一个session_id进行用户识别,PHP默认情况下session id是通过cookie来保存的,因此从某种程度上来说,seesion依赖于cookie。但这不是绝对的,session id也可以通过参数来实现,只要能将session id传递到服务端进行识别的机制都可以使用session。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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']);

//删除所有数据,但是session_id仍然存在。
session_destroy();
echo "<br>";
//此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。
//数组将递归展开值,通过缩进显示其结构。
var_dump($_SESSION);

session会自动的对要设置的值进行encode与decode,因此session可以支持任意数据类型,包括数据与对象等。
默认情况下,session是以文件形式存储在服务器上的,因此当一个页面开启了session之后,会独占这个session文件,这样会导致当前用户的其他并发访问无法执行而等待。可以采用缓存或者数据库的形式存储来解决这个问题.

关于删除,值得注意的是,session_destroy并不会立即的销毁全局变量$_SESSION中的值,只有当下次再访问的时候,$_SESSION才为空,因此如果需要立即销毁$_SESSION,可以使用unset函数。
如果需要同时销毁cookie中的session_id,通常在用户退出的时候可能会用到,则还需要显式的调用setcookie方法删除cookie中的session_id值。

文件读取

PHP具有丰富的文件操作函数,最简单的读取文件的函数为file_get_contents($src),当然也可以是url,可以将整个文件全部读取到一个字符串中.
一般情况下在对文件进行操作的时候需要先判断文件是否存在,PHP中常用来判断文件存在的函数有两个is_filefile_exists.
如果只是判断文件存在,使用file_exists就行,file_exists不仅可以判断文件是否存在,同时也可以判断目录是否存在
is_file是确切的判断给定的路径是否是一个文件。
更加精确的可以使用is_readableis_writeable在文件是否存在的基础上,判断文件是否可读与可写。
通过filesize函数可以取得文件的大小,文件大小是以字节数表示的。如果需要转换要自己写函数,并且不支持目录级的计算,要用到递归实现

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

当然在PHP也可以使用文件指针的方式进行读写文件

1
2
3
4
5
6
7
8
9
<?php
//die() 函数输出一条消息,并退出当前脚本,该函数是exit()函数的别名。
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
// 输出单字符直到 end-of-file
while(!feof($myfile)) {
//从文件中读取单个字符,文件指针也会下移
echo fgetc($myfile);
}
fclose($myfile);

时间和日期

PHP提供了内置函数time() 来取得服务器当前时间的时间戳。date()函数,来取得当前的日期;date(时间戳的格式, 规定时间戳【默认是当前的日期和时间,可选】)返回值是:函数日期和时间
比如:date("Y-m-d",'1396193923');结果就是2014-03-30;默认第二个参数是当前的时间戳,也就是按照格式打印当前时间
还可以使用strtotime('2014-04-29 00:00:01');类似的获取指定日期的时间戳
strtotime函数预期接受一个包含美国英语日期格式的字符串并尝试将其解析为 Unix 时间戳。参数是要解析的时间字符串, 当然也可以不填,默认是当前的时间

echo strtotime("now");//相当于将英文单词now直接等于现在的日期和时间,并把这个日期时间转化为unix时间戳。这个效果跟echo time();一样。
echo strtotime("+1 seconds");//相当于将现在的日期和时间加上了1秒,并把这个日期时间转化为unix时间戳。这个效果跟echo time()+1;一样。
echo strtotime("+1 day");//相当于将现在的日期和时间加上了1天。
echo strtotime("+1 week");//相当于将现在的日期和时间加上了1周。
echo strtotime("+1 week 3 days 7 hours 5 seconds");//相当于将现在的日期和时间加上了1周3天7小时5秒。

gmdate('Y-m-d H:i:s', time())函数能格式化一个GMT的日期和时间,返回的是格林威治标准时(GMT),我们是在GMT+8区,所以时间会比现在慢八小时
设置时区可以使用date_default_timezone_set("Asia/Shanghai");函数完成

图形图像操作

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

PHP默认已经集成了GD库,只需要在安装的时候开启就行。

1
2
3
4
5
6
7
8
9
10
11
12
13
header("content-type: image/png");
$img=imagecreatetruecolor(100, 100); //创建一个真彩色的空白图片:
$red=imagecolorallocate($img, 0xFF, 0x00, 0x00); //进行分配画笔颜色
imageline($img,0,0,100,100,$red); //进行线条的绘制,通过指定起点跟终点来最终得到线条。
//imagefill($img, 0, 0, $red); 区域填充,相邻点都会被填充,填充背景
//imagesetpixel (resource $image ,int $x ,int $y ,int $color)绘制点

imagepng($img); //得到一个图片文件,输出到网页
//如果想保存成文件,使用imagejpeg将图片保存成jpeg格式,imagegif将图片保存成gif格式
//需要说明的是,imagejpeg会对图片进行压缩,因此还可以设置一个质量参数。
//imagejpeg($img, $filename, 80);
//imagepng($img, 'img.png');
imagedestroy($img); //销毁图片

然后使用imagestring函数来进行文字的绘制,这个函数的参数很多:imagestring ( resource $image , int $font , int $x , int $y , string $s , int $col ),可以通过$font来设置字体的大小,x,y设置文字显示的位置,$s是要绘制的文字,$col是文字的颜色。例子:imagestring($img, 5, 0, 0, "Hello world", $red);

通过imagecreatefromjpeg可以直接从图片文件创建图像。

1
$im = imagecreatefromjpeg($filename);

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

1
2
3
4
5
6
$logo = imagecreatefrompng($filename);
//将im图像中坐标从0,0开始,宽度为width,高度为height的一部分拷贝到logo图像中坐标为15和15的位置上。
imagecopy($im, $logo, 15, 15, 0, 0, $width, $height);

$size = getimagesize('logo.png');
//$size[0]是宽度,1是高度,2是格式

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

异常

Exception具有几个基本属性与方法,其中包括:

message —- 异常消息内容
code —- 异常代码
file —- 抛出异常的文件名
line —- 抛出异常在该文件的行数

其中常用的方法有:
getTrace —- 获取异常追踪信息
getTraceAsString —- 获取异常追踪信息的字符串
getMessage —- 获取出错信息

当然也是可以进行自定义异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
class MyException extends Exception {
function getInfo() {
return '自定义错误信息';
}
}

try {
throw new MyException('error');
} catch(Exception $e) {
echo $e->getInfo();
// echo $e->getMessage();
}

//一般处理方案
try {
throw new Exception('wrong'); //可能出现问题的代码
} catch(Exception $ex) {
$msg = 'Error:'.$ex->getMessage()."\n";
$msg.= $ex->getTraceAsString()."\n";
$msg.= '异常行号:'.$ex->getLine()."\n";
$msg.= '所在文件:'.$ex->getFile()."\n";
//将异常信息记录到日志中
file_put_contents('error.log', $msg);
}
喜欢就请我吃包辣条吧!

评论框加载失败,无法访问 Disqus

你可能需要魔法上网~~