目录
0x00 PHP日期和时间
1.int time(void) 获取当前unix时间戳
unix时间戳是一个10位整数表示距离Unix纪元(1月1日 1970 00:00:00 GMT)的秒数
<?php
echo time();
?>
建议数据库中存时间戳,然后给用户展示的时候,将时间戳转化为正常的时间格式。
2.string date(string format,[,int timestamp])
第一个参数是时间格式,第二个参数为默认时间戳
format
Y-年份的四位数表示
m-月份的数字表示(从01到12) M 英文的月份表示
d-一个月中的第多少天(01到31)D 英文的星期表示
H-24小时制,带前导零(00到23)
i-分,带前导零(00到59)
s-秒,带前导零 (00到59)
<?php
echo date('Y-m-d H:i:s');
echo date('Y-m-d H:i:s',time())
?>
坑:date默认出来的时间 和 中国的时间差8个小时
需要修改时区为中国时区
(1)脚本内配置:
<?php
ini_set('date.timezone','Asia/Shanghai');
//ini_set('date.timezone','PRC');//效果相同
echo date('Y-m-d H:i:s');
?>
(2)php.ini中配置
date.timezone-PRC
重启服务器
3.int strtotime(string time[,int $now = time()])
将表示时间的字符串转化为时间戳。
<?php
echo strtotime('now');
echo time();//这两种方式等价
echo strtotime('+1day');//表示明天这个时候的时间戳。
echo strtotime('+1week');//表示下周这个时候的时间戳
echo strtotime('2018-07-08');
?>
4.int mktime(时,分,秒,月,日,年)
生成特定时间的时间戳
<?php
var_dump(mktime(3,3,3,3,3,2019));
?>
6.mixed microtime()
返回当前时间的微秒级别的数。
可以用来算代码运行的时间。
<?php
echo microtime();//分开表示
echo microtime(true);//合起来表示
?>
0x01 常用的PHP文件处理函数
1.string filetype(文件的路径) 取得文件类型
返回值有:
file 文件。txt文件和视屏都是file
dir 文件夹
2.filesize(文件的路径) 获取文件大小(单位为字节B)
3.bool file_exists(文件的路径) 判断一个文件或者文件夹是否存在
4.bool is_dir(文件的路径) 判断一个文件是不是文件夹
5.bool is_file(文件的路径) 判断是不是文件
6.bool unlink(文件的路径) 删除文件,删除成功返回true,删除失败返回false
7.mkdir(路径(包括目录名)) 创建目录
8.rmdir(路径) 删除目录
9.rename(原路径,新路径) 修改文件或者目录的名字
10.basename(路径) 返回路径中的文件名部分。(包括后缀)
<?php
echo basename('C://test/new.txt') //new.txt
?>
basename(路径,文件后缀),返回路径中文件名部分(不包括后缀)
11.dirname(路径) 是basename(路径)的补集,返回路径中的目录部分。
12.array pathinfo(路径) 返回值是一个数组,返回绝对路径的各种信息。
string pathinfo('路径',PATHINFO_EXTENSION) 只返回文件扩展名
这个函数有个致命地方,它并不会验证文件是否真的存在。只是从传入的路径中截取信息
例如传入 xxx.txt,这个函数直接字符串截取txt返回了。
下面举例说明
<?php
echo '<pre/>';
var_dump(pathinfo('/Applications/MAMP/tmp/php/sess_5tgo5p1u385kme1bcqm7da8d2u'));
echo '<pre/>';
?>
输出:
array(3) {
["dirname"]=>
string(26) "/Applications/MAMP/tmp/php"
["basename"]=>
string(31) "sess_5tgo5p1u385kme1bcqm7da8d2u"
["filename"]=>
string(31) "sess_5tgo5p1u385kme1bcqm7da8d2u"
}
0x02 操作文件的函数
1.resouce fopen(文件路径,打开方式)
- r:可读
- r只读,
- r+读写方式,
- w:覆盖写
- w只写
- w+读写方式
- a:追加写
- a+读写方式
- x:可执行(execute)
2.int fwrite(resoure $handle,string $string [,int $length]) 写入文件.写入成功返回1,写入失败返回0
3.string fread(resoure $handle,int $length) 读取文件,长度的单位是字节。
4.bool fclose(resoure $handle) 关闭文件。只有在fclose·之后,写入的内容才能保存到文件。
<?php
$file = fopen('test.txt','a+');
fwrite($file,"hello world\nxidian university");
fclose($file);
$file = fopen("test.txt",'r');
var_dump(fread($file,filesize("test.txt")));
fclose($file);
?>
5.file_put_contents(文件路径,要写入的内容) 不需要fopen,直接就能往文件中写。默认覆盖写
如果想要追加写:file_put_contents(文件路径,要写入的内容,FILE_APPEND)
如果有这个文件,打开文件直接写,如果没有这个文件,创建文件直接写。
6. string file_get_contents(文件路径) 不需要fopen,直接读取文件中的内容。
这个函数牛逼的地方在于可以输入url路径。
例如:
file_get_contents('https://www.baidu.com');
0x03 文件的上传
文件上传:图片 视屏 文档
图片上传的步骤:
1.获取上传图片的信息 $_FILES
2.验证上传图片的格式
3.验证上传图片的大小:因为上传的图片要占用服务器的存储空间。所以如果不限制上传图片的大小。有人上传很大的图片,可能直接占满服务器的硬盘空间。
4.创建上传目录(如果没有)
5.上传文件到指定目录下。
5.上传文件到指定目录下。
0x04 获取上传图片的信息
index.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset = 'utf-8'>
5 <title>文件上传</title>
6 </head>
7 <body>
8 <form action ="upload.php" method = "POST" enctype = "multipart/form-data">
9 <input type = "file" name = "img"/><br/>
10 <input type = "submit" name="submit" value = "上传"/><br/>
11 </form>
12 </body>
13 </html>
注意点:
1.enctype = "multipart/form-data" 必须有,否则,upload.php中用$_FILE数组收不到文件信息
2.intput type = 'file'中必须设置 name 。因为$_FILE是一个二维数组。以name的值为第一维的键。
upload.php
<?php
echo '<pre>';
var_dump($_FILES);
echo '</pre>';
?>
array(1) {
["img"]=>
array(5) {
["name"]=>
string(7) "url.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(36) "/Applications/MAMP/tmp/php/phpd6k2Rm"
["error"]=>
int(0)
["size"]=>
int(14984)
}
}
$_FILE详解:
假设<input type = 'file' name = 'myFile'/>,则
$_FILES['myFile']['name'] 上传文件的原名称
$_FILES['myFile']['type'] 上传文件的MIME类型,"类型/扩展名"例如:"image/gif" "image/png"”video/mp4“
$_FILES['myFile']['size'] 上传文件的大小,单位为字节
$_FILES['myFile']['tmp_name'] 上传文件的临时文件名(临时文件的绝对路径),一般是系统默认的
$_FILES['myFile']['error'] 该文件上传的错误代码。以下为不同代码的意义:
0:上传文件成功
1:超过了php.ini中upload_max_filesize设置的文件大小
2:超过了php.ini中POST MAX_SIZE中设置的文件大小
3:文件只有部分被上传
4:没有文件被上传
5:上传文件大小为0
如果报错为:413Request Entity Too Large
那么说明是Nginx的配置错误
找到nginx的配置文件:nginx.conf
0x05 验证上传图片的格式
1 <?php
2 /*
3 echo '<pre/>';
4 var_dump($_FILES);
5 echo '<pre/>';
6 */
7 $fileInfo=$_FILES['img'];
8 $ext = pathInfo($fileInfo['name'],PATHINFO_EXTENSION);
9 $allow_ext = ['jpg','png','jpeg','gif'];//白名单
10 if(!in_array($ext,$allow_ext)){
11 exit('该类型文件不可以上传,请上传jpg/png/jpeg/gif类型的图片');
}
12 ?>
0x06 验证文件的大小
1 <?php
2 /*
3 echo '<pre/>';
4 var_dump($_FILES);
5 echo '<pre/>';
6 */
7 $fileInfo=$_FILES['img'];
8 //验证文件的扩展名
9 $ext = pathInfo($fileInfo['name'],PATHINFO_EXTENSION);
10 $allow_ext = ['jpg','png','jpeg','gif'];//白名单
11 if(!in_array($ext,$allow_ext)){
12 exit('该类型文件不可以上传,请上传jpg/png/jpeg/gif类
型的图片');}
13 //验证文件的大小
14 $allow_size = 1024*1024 * 2;//单位字节 2MB
15 if($fileInfo['size'] > $allow_size){
16 exit("文件太大,无法上传");
17 }
18
19 ?>
0x07 创建上传目录
实现效果:所有上传文件都存在uploads文件夹中,哪日上传的文件,存在uploads下以日命名的子文件夹下。
由于windows下和linux下的文件分割符并不相同
win \
linux / 虽然/在window下有时也适用。
所以建议使用 常量DIRECTORY_SEPARATOR来代替分隔符。该常量会根据你的系统来生成分隔符。
1 <?php
2 /*
3 echo '<pre/>';
4 var_dump($_FILES);
5 echo '<pre/>';
6 */
7 $fileInfo=$_FILES['img'];
8 //验证文件的扩展名
9 $ext = pathInfo($fileInfo['name'],PATHINFO_EXTENSION);
10 $allow_ext = ['jpg','png','jpeg','gif'];//白名单
11 if(!in_array($ext,$allow_ext)){
12 exit('该类型文件不可以上传,请上传jpg/png/jpeg/gif类
型的图片');}
13 //验证文件的大小
14 $allow_size = 1024*1024 * 2;//单位字节 2MB
15 if($fileInfo['size'] > $allow_size){
16 exit("文件太大,无法上传");
17 }
18 //创建上传目录
19 $dir = 'uploads';
20
21 //$sub_dir = $dir.'/'.date('Y-m-d');
22 $sub_dir = $dir.DIRECTORY_SEPARATOR.date('Y-m-d');
23
24 if(!is_dir($dir)){
25 mkdir($dir);
26 }
27 if(!is_dir($sub_dir)){
28 mkdir($sub_dir);
29 }
30
31 ?>
0x08 移动文件到指定目录
bool move_uploaded_file(原路径,目的路径)
注意:移动后的图片不要用原来的名字,应该重命名。因为多个人可能上传重名的图片。
一般用日期加上随机数来重命名图片。
1 <?php
2 /*
3 echo '<pre/>';
4 var_dump($_FILES);
5 echo '<pre/>';
6 */
7 $fileInfo=$_FILES['img'];
8 if($file['error']!=0){
9 exit("上传图片有问题");
10 }
11 //验证文件的扩展名
12 $ext = pathInfo($fileInfo['name'],PATHINFO_EXTENSION);
13 $allow_ext = ['jpg','png','jpeg','gif'];//白名单
14 if(!in_array($ext,$allow_ext)){
15 exit('该类型文件不可以上传,请上传jpg/png/jpeg/gif类型的图> 片');}
16 //验证文件的大小
17 $allow_size = 1024*1024 * 2;//单位字节 2MB
18 if($fileInfo['size'] > $allow_size){
19 exit("文件太大,无法上传");
20 }
21 //创建上传目录
22 $dir = 'uploads';
23
24 //$sub_dir = $dir.'/'.date('Y-m-d');
25 $sub_dir = $dir.DIRECTORY_SEPARATOR.date('Y-m-d');
26
27 if(!is_dir($dir)){
28 mkdir($dir);
29 }
30 if(!is_dir($sub_dir)){
31 mkdir($sub_dir);
32 }
33 //$img_name = date('YmsHis').rand(1000,9999).'.'.$ext;
34 $img_name = date('YmsHis').rand(1000,9999).'.'.$ext;
35 move_uploaded_file($fileInfo['tmp_name'],$sub_dir.DIRECTORY_SEPARA TOR.$img_name);
36
37
38 ?>
0x09 改造成类的写法
<?php
class Upload{
private $errorNum;//错误码
private $errorMsg;//错误信息
private $filename;//文件名
private $ext;//文件扩展名
private $allow_ext;//白名单
private $file_size;
private $allow_size;
private $dir;
private $sub_dir;
private $new_name;
private $tmp_path;
public function __construct($file){
$this->errorNum = $file['error'];
$this->filename = $file['name'];
$this->ext = pathInfo($this->filename,PATHINFO_EXTENSION);
$this->allow_ext = ['gif','jpg','png','jpeg'];
$this->file_size = $file['size'];
$this->allow_size = 2*1024*1024;//2M
$this->dir = 'uploads';
$this->sub_dir = 'uploads'.DIRECTORY_SEPARATOR.date('Y-m-d');
$this->new_name = $this->sub_dir.DIRECTORY_SEPARATOR.date('YmdHis').rand(1000,9999).'.'.$this->ext;
$this->tmp_path = $file['tmp_name'];
}
public function upload(){
if($this->checkFile() == false){
return $this->errorMsg;
}
$this->createDir();
$this->move();
return '上传成功!';
}
private function checkFile(){
if($this->checkError() == false){
$this->errorMsg = "上传图片有问题";
return false;
}
if($this->checkExt() == false){
$this->errorMsg = "上传图片的扩展名有问题";
return false;
}
if($this->checkSize()==false){
$this->errorMsg = "上传图片的大小有问题";
return false;
}
return true;
}
//检测上传信息
private function checkError(){
return $this->errorNum == 0;
}
//检测扩展名
private function checkExt(){
return in_array($this->ext,$this->allow_ext);
}
//检测大小
private function checkSize(){
return $this->file_size <= $this->allow_size;
}
//创建目录
private function createDir(){
if(!is_dir('uploads')){
mkdir('uploads');
}
if(!is_dir($this->sub_dir)){
mkdir($this->sub_dir);
}
}
//移动文件到指定目录
private function move(){
move_uploaded_file($this->tmp_path,$this->new_name);
}
public function show_picture(){
echo '<img src = '.$this->new_name.'>';
}
}
$file = $_FILES['img'];
$upload = new Upload($file);
echo $upload->upload();
$upload->show_picture();