分类 Php 下的文章

phpExcel的安装与使用

1、安装命令:composer require phpoffice/phpexcel

2、基本使用步骤

`
//实例化phpexcel对象
$objPHPExcel = new PHPExcel();

//设置Excel属性
$objPHPExcel->getProperties()

        ->setCreator("Maarten Balliauw")                    //创建人
        ->setLastModifiedBy("Maarten Balliauw")                //最后修改人
        ->setTitle("Office 2007 XLSX Test Document")        //设置标题
        ->setSubject("Office 2007 XLSX Test Document")        //设置主题
        ->setDescription("Test document ")                    //设置备注
        ->setKeywords( "office 2007 openxml php")            //设置关键字
        ->setCategory( "Test result file");                    //设置类别

// 给表格添加数据
$objPHPExcel->setActiveSheetIndex(0) //设置第一个内置表(一个xls文件里可以有多个表)为活动的

        ->setCellValue( 'A1', 'Hello' )         //给表的单元格设置数据
        ->setCellValue( 'B2', 'world!' )      //数据格式可以为字符串
        ->setCellValue( 'C1', 12)            //数字型
        ->setCellValue( 'D2', 12)            //
        ->setCellValue( 'D3', **true** )           //布尔型
        ->setCellValue( 'D4', '=SUM(C1:D2)' );//公式

//激活当前表
$objPHPExcel->setActiveSheetIndex(0);
ob_end_clean();//清除缓冲区,避免乱码

//最后只需要生成Excel或者提示下载即可
//生成Excel,并自定义保存路径
//"Excel2007"生成2007版本的xlsx,"Excel5"生成2003版本的xls
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5');
$objWriter->save($path);

//弹出提示下载文件
header('pragma:public');
header("Content-Disposition:attachment;filename=$expFileName");
header('Cache-Control: max-age=0');
$objWriter = PHPExcel\_IOFactory:: *createWriter*($objPHPExcel, 'Excel2007');
$objWriter->save( 'php://output');
`

3、设置Excel样式

`

//设置宽度
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(200);   //设置单元格宽度
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);   //内容自适应
//设置align(需要引入PHPExcel_Style_Alignment)
$objPHPExcel->getActiveSheet()->getStyle('A18')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY);//水平方向上两端对齐
$objPHPExcel->getActiveSheet()->getStyle( 'A18')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);    //垂直方向上中间居中
//合并拆分单元格
$objPHPExcel->getActiveSheet()->mergeCells('A28:B28');      // A28:B28合并
$objPHPExcel->getActiveSheet()->unmergeCells('A28:B28');    // A28:B28再拆分
//字体大小、粗体、字体、下划线、字体颜色(需引入PHPExcel_Style_Font、PHPExcel_Style_Color)
$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(20);
$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setName('Candara');
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);
//默认字体、大小
$objPHPExcel->getDefaultStyle()->getFont()->setName( 'Arial');
$objPHPExcel->getDefaultStyle()->getFont()->setSize(20);
//背景填充
$objPHPExcel->getActiveSheet()->getStyle( 'A3:E3')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$objPHPExcel->getActiveSheet()->getStyle( 'A4:E4')->getFill()->getStartColor()->setARGB('FFC125');
// 单元格密码保护不让修改
$objPHPExcel->getActiveSheet()->getProtection()->setSheet( **true**);  // 为了使任何表保护,需设置为真
$objPHPExcel->getActiveSheet()->protectCells( 'A3:E13', 'PHPExcel' ); // 将A3到E13保护 加密密码是 PHPExcel
$objPHPExcel->getActiveSheet()->getStyle( 'B1')->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED); //去掉保护
//给单元格内容设置url超链接
$objActSheet->getCell('E26')->getHyperlink()->setUrl( 'http://www.phpexcel.net');    //超链接url地址
$objActSheet->getCell('E26')->getHyperlink()->setTooltip( 'Navigate to website');  //鼠标移上去连接提示信息

`
参考:
[https://www.kancloud.cn/chunyu/php_basic_knowledge/1041088]
[https://blog.csdn.net/jackbon8/article/details/107914628]
[https://blog.csdn.net/jackbon8/article/details/107915006]
[https://blog.csdn.net/jackbon8/article/details/107940638]

接口安全设计

常见的安全问题以及解决方案

1 接口被大规模调用消耗系统资源,影响系统的正常访问,甚至系统瘫痪

  • 解决方案: 获取 timestamp (时间戳), 设置接口失效时间
***验证time*** 

/**
* 验证请求是否超时
 * @param  [array] $arr [包含时间戳的参数数组]
 * @return [json]      [检测结果]
*/
public function check_time($arr) {
    if (!isset($arr['time']) || intval($arr['time']) <= 1) {
        $this->return_msg(400, '时间戳不正确!');
    }
    if (time() - intval($arr['time']) > 60) {
        $this->return_msg(400, '请求超时!');
    }
}

2 接口数据被黑客篡改(伪造请求)

  • 解决方案: 对参数加密, 生成 token , 判断 token 是否正确
***验证token***

/**
* 验证token(防止篡改数据)
 * @param  [array] $arr [全部请求参数]
 * @return [json]      [token验证结果]
*/
public function check_token($arr) {
 
    /*********** api传过来的token  ***********/
    if (!isset($arr['token']) || empty($arr['token'])) {
        $this->return_msg(400, 'token不能为空!');
    }
    $app_token = $arr['token']; // api传过来的token
 
    /*********** 服务器端生成token  ***********/
    unset($arr['token']);
    $service_token = '';
    foreach ($arr as $key => $value) {
        $service_token .= md5($value);
    }
    $service_token = md5('api_' . $service_token . '_api'); // 服务器端即时生成的token
 
    /*********** 对比token,返回结果  ***********/
    if ($app_token !== $service_token) {
        $this->return_msg(400, 'token值不正确!');
    }
}

3 数据被黑客截取

  • 解决方案: 使用 https , 用证书对数据进行加密, 即使数据被截取, 对黑客也没有意义

CGI、FastCGI、PHP-CGI、PHP-FPM

1:CGI与FastCGI

  • CGI与FastCGI都是一种通讯协议,是web Sever(Apache/nginx/iis)与其他程序(此程序通常叫做CGI程序,如PHP脚本解析器)之间通讯的桥梁,CGI是为了保证Web Server传递过来的数据是标准格式的
  • FastCGI是CGI的改良进化版,FastCGI相比CGI更安全、性能更好,所以现在都是使用FastCGI协议进行通讯
  • FastCGI兼容CGI

2:PHP-CGI与PHP-FPM

  • PHP-CGI其实就是PHP脚本解析器,他是CGI协议的实现
  • PHP-FPM就是FastCGI协议的实现
  • PHP-CGI和PHP-FPM都是程序

3:PHP-FPM详解

  • fastcgi和cgi有什么区别

cgi在一个请求过来后,去读取php.ini里的基础配置信息,初始化执行环境,每次都要不停的去创建一个进程,读取配置,初始化环境,返回数据,退出进程,久而久之,启动进程的工作变的乏味无趣特别累;fastcgi可以让cgi一次启动一个主进程(master),让他只读取一次配置,然后在启动多个工作进程(worker),当一个请求来的时候,通过master传递给worker这样就可以避免重复劳动了,当worker不够的时候,master会通过配置里的信息,动态启动worker,等空闲的时候可以收回worker

  • php-fpm 到底是个什么东西

就是来管理启动一个master进程和多个worker进程的程序;PHP-FPM 会创建一个主进程,控制何时以及如何HTTP请求转发给一个或多个子进程处理。PHP-FPM主进程还控制着什么时候创建(处理Web应用更多的流量)和销毁(子进程运行时间太久或不再需要了)PHP子进程。PHP-FPM进程池中的每个进程存在的时间都比单个HTTP请求长,可以处理10、50、100、500或更多的HTTP请求

参考:
参考:
参考:

php目录处理

1:目录相关函数

  • 名称函数:basename(), dirname(), pathinfo()

  • 目录读取:opendir(), readdir(), closedir(), rewinddir()
  • 目录删除:rmdir()
  • 目录创健:mkdir()

2:其他相关函数

  • 文件大小:filesize()

  • 目录大小:disk_free_space(), disk_total_space()
  • 文件拷贝:copy()
  • 删除文件:unlink()
  • 文件类型:filetype()
  • 重命名文件或者目录:rename()
  • 文件截取:ftruncate()截取到指定大小
  • 文件属性:file_exists(),is_readable(),is_writable()

php文件处理

1:文件读取/写入操作

  • 打开:fopen()
  • 写入:fwrite() fputs()
  • 读取:fread() fgets() fgetc()
  • 关闭:fclose()

2:不需要fopen()打开的函数

  • file_get_contents()
  • file_put_contents()

3:其他读取

  • file()//数组

  • readfile()//读取到,并且放置到缓存区

4:访问远程文件

  • 开启allow_url_fopen,http协议连接只能使用只读,ftp协议可以使用只读或者只写

正则表达式

1:正则表达式的作用&要点

  • 分割,查找,匹配,替换字符串
  • 分割符:正斜线(/)、hash符号(#)以及取反符号(~)
  • 通用原子:\d,\D,\w,\W,\s,\S
  • 元字符:. * $ + {n} {n,} {n,m}, [], (), [^] | [-]
  • 模式修正符:i m e s U x A D u

php系统函数

1:时间日期函数:

  • data(),strtotime(),mktime(),time(),microtime()
  • date_default_timezone_set()

2:IP处理函数:

  • ip2long(),long2ip()

3:打印处理函数:

  • print(),printf(输出格式化字符串),print_r(打印关于变量的易于理解的信息)
  • echo,sprintf(Return a formatted string)
  • var_dump(),var_export(输出或返回一个变量的字符串表示)

4:序列化及反序列化函数:

  • serialize(),unserialize()

5:字符串函数:

  • implode(),explode(),join(),strrev(),trim(),
  • strstr(),number_format()...

6:数组处理函数:

  • array_keys(),array_values(),array_diff(),array_intersect(),array_merge(),
  • array_shift(前出栈),array_unshift(前入栈),array_pop(后出栈),array_push(后入栈),//模拟队列的双向处理
  • sort()...

php流程控制优化

1:switch...case....(会生成跳转【索引表】表,直接跳转到case)

  • switch($var)后面的控制表达式的数据类型只能是整形,浮点型或者字符串
  • switch的执行步骤,效率高一些

2:如何优化多个if...elseif语句的情况

  • 把可能性的大的往前放
  • 如果判断的内容比较复杂,且判断的值是整形,浮点型或者字符串,就可以使用switch,提升效率

php运算符

1:运算符的优先级:

  • 递增递减>!>算术>大小比较>
  • (不)相等比较>引用>位运算(^)>位运算(|)>
  • 逻辑与>逻辑或>三目>赋值>
  • and>xor>or
  • 括号的使用可以增加代码可读性,推荐使用

2:比较运算符:

  • ==和===的区别
  • 等值判断(false的七种情况都是相等的)

3:递增、递减运算符:

  • 不影响布尔值
  • 递减NULL值没有效果,递增会加1
  • 递增和递减在前就先运算后返回,反之就先返回后运算

4:逻辑运算符:

  • 短路作用(前面的都正确了,后面就不用执行了

    $a = true || $b == 3
    $b = false && $a ==1

  • ||和&&与or和and的优先级不同

    会导致其结果也不同
    $a = false || true; $a = true;
    $a = false or true; $a = false;

php数据类型

1:浮点类型 不能运用到比较运算中(不能用于相等的判断中)

    $a = 0.1; $b = 0.7;
    if($a + $b == 0.8){
    false =0.7999(二进制,会有损耗)
    }

2:布尔类型 false的七种情况

    0, 0.0, '', '0', false, array(), NULL
    整型0,浮点0.0,空字符串,0字符串,布尔false,空数组,NULL

3:NULL

    直接赋值为NULL、未定义的变量、unset销毁的变量