thinkphp在php5.6以上版本显示 No input file specified 解决办法

张海春阅读(741)

thinkphp在php5.6以上版本显示 No input file specified 解决办法
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在php5.6以上版本显示 No input file specified 解决办法

thinkphp Excel上传、读取Excel、数据导出Excel功能

张海春阅读(407)

首先安装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实现文件压缩打包下载

张海春阅读(389)

    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 工具

张海春阅读(515)

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 ,出现一下图案表示安装成功。
如何安装conposer 工具
最后我们可以更改 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

如何安装conposer 工具
移动 composer.phar,这样 composer 就可以进行全局调用:
mv composer.phar /usr/local/bin/composer
切换国内镜像的命令同win一样。当lnmp安装或者切换镜像出现 Warning: putenv() has been disabled for security reasons in…的问题是LNMP 禁用了部分存在危险的PHP函数。
如何安装conposer 工具
解决办法:打开php.ini找到disable_functions将后面的putenv删除
查看命令 composer -v

更新composer命令
composer selfupdate

简易的token验证机制

张海春阅读(487)

大概的原理是:登录插入表中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抓取页面相关信息(简易的爬虫)

张海春阅读(692)

公司要求做个输入连接抓取连接相关信息的功能,最初用正则开发的,但是不懂技术的人配置起来很吃力,后来发现xpath可以完美的解决这个问题,一些浏览器(如谷歌,火狐)审查元素可以直接复制xpath语句,如下图:

php-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根据链接生成静态页

张海春阅读(348)

//判断目录不存在则创建目录
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把图片存到本地服务器

张海春阅读(365)

$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);//关闭