PHP5.6以上的是fast_cgi(cgi只是http服务器与动态脚本语言之间的一个通信端口,Fast-cgi是由cgi发展而来,是http服务器(http,nginx等)和动态脚本语言(php,perl等)之间的的通信接口,只是一个接口而已,他以socket的形式存在(可以是文件socket,也可以是ip socket),可以将http服务器和动态脚本解析服务器分离(二者可以部署在不同的服务器上),让http服务器专一处理静态请求和转发动态请求到脚本解析服务器;脚本解析服务器则专一处理动态脚本的请求)模式,而在某些情况下,不能正确识别path_info所造成的错误,这个时候,你只需要更改.htaccess文件index.php后加个问号
thinkphp Excel上传、读取Excel、数据导出Excel功能
首先安装composer
在thinkphp根目录执行安装命令 composer require phpoffice/phpexcel
安装phpExcel类
Excel上传
public function exportExcel()
{
$file = request()->file('excel');
if (!file_exists($_SERVER['DOCUMENT_ROOT'] .'/uploads/excel/')) {
mkdir($_SERVER['DOCUMENT_ROOT'] .'/uploads/excel/', 0777, true);
}
$info = $file->move($_SERVER['DOCUMENT_ROOT'] .'/uploads/excel/');
if ($info->getExtension() != 'xlsm' && $info->getExtension() != 'xls')
{
return '格式不正确';
}
$saveUrl = str_replace('\\', '/', $_SERVER['DOCUMENT_ROOT'] . '/uploads/excel/' . $info->getSaveName());
//调用excel读取数据
$res = $this->getExcelData($saveUrl, $info->getExtension());
if (empty($res))
{
return '数据为空';
}
return $res;
}
Excel读取数据
public function getExcelData($filePath, $type){
try
{
header("content-type:text/html;charset=utf-8");
if ($type == 'xlsm')
{
$reader = PHPExcel_IOFactory::createReader('Excel2007');
}
else
{
$reader = PHPExcel_IOFactory::createReader('Excel5');
}
//载入excel文件
$excel = $reader->load($filePath,$encode = 'utf-8');
//读取第一张表
$sheet = $excel->getSheet(0);
//获取总行数
$row_num = $sheet->getHighestRow();
//获取总列数
$data = [];
for ($i = 2; $i <= $row_num; $i ++) {
$data[$i-2]['brand_name'] = $sheet->getCell("A".$i)->getValue();
$data[$i-2]['brand_mark'] = $sheet->getCell("B".$i)->getValue();
$data[$i-2]['brand_num'] = $sheet->getCell("C".$i)->getValue();
$data[$i-2]['brand_money'] = $sheet->getCell("D".$i)->getValue();
}
return $data;
}
catch (Exception $exception)
{
return null;
}
}
excel导出
public function excel($data, $sheetArr)
{
try
{
// $sheetArr = [
// 'p_num' => '商品ID',
// 'p_name' => '商品名称',
// 'p_money' => '专柜价(元)',
// ];
$sArr = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P"];
$PHPExcel = new PHPExcel();//实例化phpexcel
$PHPSheet = $PHPExcel->getActiveSheet()
->setTitle("货品信息");//设置表内部名称
$PHPSheet->setCellValue("A1", "序号");
$i = 1;
foreach ($sheetArr as $s)
{
$PHPSheet->setCellValue($sArr[$i] . 1, $s);
$PHPSheet->getStyle($sArr[$i])->getAlignment()->setWrapText(true);//是否换行
$i++;
}
$num = 2;
//数据
foreach ($data as $k => $v) {
if (empty($v))
{
continue;
}
$PHPSheet->setCellValue("A" . $num, $num-1);
$i2 = 1;
foreach ($sheetArr as $index => $s)
{
$PHPSheet->setCellValue($sArr[$i2] . $num, $v[$index]);
$i2++;
}
// 图片生成
$objDrawing[$k] = new PHPExcel_Worksheet_Drawing();
$imgArr = unserialize($this->mb_unserialize($v['p_url']));
$imgPath = str_replace("http://www.luxuryscm.com/","/", $imgArr[0]);
$objDrawing[$k]->setPath($_SERVER['DOCUMENT_ROOT'] . $imgPath);
// 设置宽度高度
$objDrawing[$k]->setHeight(100);//照片高度
$objDrawing[$k]->setWidth(100); //照片宽度
/*设置图片要插入的单元格*/
$objDrawing[$k]->setCoordinates($sArr[$i2].$num);
// 图片偏移距离
$objDrawing[$k]->setOffsetX(0);
$objDrawing[$k]->setOffsetY(0);
$objDrawing[$k]->setWorksheet($PHPExcel->getActiveSheet());
$PHPSheet->getRowDimension($num)->setRowHeight(100);//设置高度
$num++;
}
$PHPWriter = PHPExcel_IOFactory::createWriter($PHPExcel, "Excel2007");//创建生成的格式
ob_end_clean();//清除缓冲区,避免乱码
header('Content-Disposition: attachment;filename="商品信息.xlsx"');//下载下来的表格名
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header("Content-Type:application/force-download");
header("Content-Type:application/vnd.ms-excel");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");;
header("Content-Transfer-Encoding:binary");
$PHPWriter->save("php://output");
exit();
}
catch (Exception $ex)
{
exit($ex->getMessage());
}
}
PHP实现文件压缩打包下载
public function downZip($imgArr, $zipName)
{
//设置脚本的最大执行时间,设置为0则无时间限制
set_time_limit(0);
$name = iconv('utf-8', 'GBK', $zipName);
ini_set('max_execution_time', '0');
$filePath = $_SERVER['DOCUMENT_ROOT'] . '/uploads/zip';
if (!is_dir($filePath)){
mkdir($filePath,0777,true);
}
$filename = $filePath . '/' . $name . '.zip';
$downName = $name . '.zip';
$zip = new \ZipArchive();
if ($zip->open($filename, \ZIPARCHIVE::CREATE) !== TRUE) {
exit('无法打开文件,或者文件创建失败');
return 0;
}
foreach ($imgArr as $key => $val) {
$res = @file_get_contents($val);
if (empty($res))
{
continue;
}
$zip->addFromString($zipName.'_'.$key . '.jpg', $res);
}
$zip->close();
$fp = fopen($filename, "r");
$file_size = filesize($filename);//获取文件的字节
header("Content-type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Accept-Length:" . $file_size);
header("Content-Disposition: attachment; filename=$downName");
$buffer = 1024; //设置一次读取的字节数,每读取一次,就输出数据(即返回给浏览器)
$file_count = 0; //读取的总字节数
while (!feof($fp) && $file_count < $file_size) {
$file_con = fread($fp, $buffer);
$file_count += $buffer;
echo $file_con;
}
fclose($fp);
}
如何安装composer 工具
composer 是 PHP 的一个依赖管理工具,用来辅助安装一些PHP依赖的库文件。现在不少PHP框架都是可以用composer来安装依赖(例如 yii,laraver,thinkphp等)
安装composer前请确定你的电脑已经安装了PHP(需要 PHP 5.3.2+ 以上版本;win+r
打开运行窗口->打开cmd命令->输入 php -v
就可以查看当前php版本)且需要开启 openssl(开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。),如果没有安装的话推荐安装phpstudy(是个非常好用的php调试环境的程序集成包)
这里写一下windows和linux的安装教程(贫穷的我买不起苹果,所以请忽略为啥没有Mac OS 系统安装案例)
windows 环境下
首先找到php.ini
(phpstudy环境下可以其它选项菜单->配置文件->php-ini打开)把 extension=php_openssl.dll
前边的分号(;)去掉,打开openssl配置
然后前往composer官网下载exe安装包,打开安装包一路下一步,狂点不回头啊(๑乛◡乛๑
当然你可以自己选择一下路径 ,还有php版本)。
安装完成后查看是否安装成功 win+r
打开运行窗口->打开cmd命令->输入 composer -v
,出现一下图案表示安装成功。
最后我们可以更改 Packagist 为国内镜像(避免安装一些国外的依赖文件被墙安装不下来或者慢情况,我安装laraver时就发现vendor没有安装成功_(:3」∠❀)
):
composer config -g repo.packagist composer https://packagist.phpcomposer.com
linux环境下
shell 执行以下命令
php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
php composer-setup.php
移动 composer.phar,这样 composer 就可以进行全局调用:
mv composer.phar /usr/local/bin/composer
切换国内镜像的命令同win一样。当lnmp安装或者切换镜像出现 Warning: putenv() has been disabled for security reasons in…
的问题是LNMP 禁用了部分存在危险的PHP函数。
解决办法:打开php.ini
找到disable_functions
将后面的putenv
删除
查看命令 composer -v
更新composer命令
composer selfupdate
简易的token验证机制
大概的原理是:登录插入表中token信息,每次操作更改token表中的时间,判断失效是根据表中时间判断。下面展示其中一部分代码:
public function adminCheck($userId, $token)
{
if (empty($userId) || empty($token))
{
return new Result(false, false, '没有权限');
}
// 检验token
$checkRes = $this->checkToken($userId, $token);
if (!$checkRes->Success)
{
//清除网站登录的一些信息(代码就不用放出来了)
$this->clearAdminSessions();
return new Result(false, false, $checkRes->Message);
}
return new Result(true, true, '');
}
private function checkToken($userId, $token)
{
if (empty($token) || empty($userId))
{
return new Result(false, false, 'token失效!');
}
$data = ['user_id' => $userId, 'token' => $token];
//数据库获取token方法我判断的是add_time距离当前时间要小于1小时(token时效设置的1小时)
$res = $this->DB->getTokenByCondition($data);
if (empty($res))
{
return new Result(false, false, 'token失效!');
}
$data['add_time'] = 'NOW()';
$res = $this->DB->updateToken($data);
if (!$res)
{
return new Result(false, false, '修改token时间失败!');
}
return new Result(true, true, "修改token时间成功");
}
php-xpath抓取页面相关信息(简易的爬虫)
公司要求做个输入连接抓取连接相关信息的功能,最初用正则开发的,但是不懂技术的人配置起来很吃力,后来发现xpath可以完美的解决这个问题,一些浏览器(如谷歌,火狐)审查元素可以直接复制xpath语句,如下图:
function getWebImg($url, $xpathStr)
{
$webContent = file_get_contents($url);
$r = "<meta.*?charset=[\"']*(.*?)[\"'>;\\s]";
preg_match_all("/".$r."/is", $webContent, $codeMatch);
$webContent = '<meta http-equiv="content-type" content="text/html; charset='.$codeMatch[1][0].'" />'.$webContent;
$dom = new DOMDocument();
//从一个字符串加载HTML
@$dom->loadHTML($webContent);
//使该HTML规范化
$dom->normalize();
$xpath = new DOMXPath($dom);
$values = @$xpath->query($xpathStr);
return trim($values->item(0)->getAttribute('src'));
}
echo getWebImg('https://www.yuankezhan.com', "/html/body/section/div[1]/div/article/p/img");
php根据链接生成静态页
//判断目录不存在则创建目录
if (!is_dir($path)){
//第三个参数是“true”表示能创建多级目录,iconv防止中文目录乱码
mkdir(iconv("UTF-8", "GBK", $path), 0777, true);
}
if (!file_exists($filePath))
{
$content = file_get_contents($_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . '/index.php?r=home/lost-retrieved/index&language=' . $language);
$handle = fopen ($filePath, "w");//打开文件指针,创建文件
if (!is_writable ($filePath)){
die ("文件:".$filePath."不可写,请检查其属性后重试!");
}
if (!fwrite ($handle, $content)){
die ("生成文件".$filePath."失败!");
}
fclose ($handle); //关闭指针
}
php 根据网络url把图片存到本地服务器
$img_url = 'http://XXXXX.jpg';
$jpg = file_get_contents($img_url);
$file = fopen($_SERVER["DOCUMENT_ROOT"]."/upload/111.jpg", "w");
fwrite($file,$jpg);//写入
fclose($file);//关闭