PHP值圈PHPPHP实战

自己做工具--封装PHP的工具类

2018-08-26  本文已影响1人  whmblog

更多精彩请访问:https://github.com/whm19940308/phpTools
转载请标明原文链接:https://www.jianshu.com/p/8ab3dce8d6f1

一、使用示例

// 引入两个核心文件
require_once './_autoload.php';
require_once './functions.php';

// 使用示例
// 如调用DateTools工具类里的方法,调用示例如下
$date_tools = new DateTools();
var_dump($date_tools->getSomeZeroTimeStamp($str=''));

二、代码目录

自己做工具--封装PHP的工具类.png

主要有几大工具类:
ArrayTools.php —— 数组工具类
CharacterTools.php —— 英文字母工具类
CurlTools.php —— 跟curl相关的工具类
DateTools.php —— 时间工具类
EncryptTools.php —— 加密工具类
FileTools.php —— 文件工具类
HttpTools.php —— 与http协议相关的工具类
ImageTools.php —— 图片工具类
MapTools.php —— 地图工具类
NumberTools.php —— 数字工具类
SendCodeTools.php —— 聚合数据发送手机验证码工具类
ServerTools.php —— 与服务器相关的工具类
StringTools.php —— 字符串相关操作的工具类
UploadTools.php —— 上传文件工具类
VerifyTools.php —— 校验工具类,如验证ip、手机、邮箱等
XmlTools.php —— 操作xml相关的工具类
ZipTools.php —— Zip压缩解压工具类

三、ArrayTools.php —— 数组工具类

<?php

header('content-type:text/html;charset=utf-8');

/**
 * 跟curl相关的工具类
 * Class CurlsTools
 */

class CurlsTools{


    /**
     * PHP get请求之发送数组
     * @param $url
     * @param array $param
     * @return mixed
     * @throws Exception
     */
    public function httpGet($url){

        //初始化一个 cURL 对象
        $ch  = curl_init();
        //设置你需要抓取的URL
        curl_setopt($ch, CURLOPT_URL, $url);
        // 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        //是否获得跳转后的页面
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;

    }


    /**
     * PHP post请求之发送数组
     * @param $url
     * @param array $param
     * @return mixed
     * @throws Exception
     */
    public function httpsPost($url, $param = array())
    {

        $ch = curl_init(); // 初始化一个 cURL 对象
        curl_setopt($ch, CURLOPT_URL, $url); // 设置需要抓取的URL
        curl_setopt($ch, CURLOPT_HEADER, 0); // // 设置header
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
        // 如果你想PHP去做一个正规的HTTP POST,设置这个选项为一个非零值。这个POST是普通的 application/x-www-from-urlencoded 类型,多数被HTML表单使用。
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param)); // 传递一个作为HTTP “POST”操作的所有数据的字符串。//http_build_query:生成 URL-encode 之后的请求字符串
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Content-type:application/x-www-form-urlencoded;charset=utf-8'
        ));
        $result = curl_exec($ch); // 运行cURL,请求网页
        if ($errno = curl_errno($ch)) {
            throw new Exception ('Curl Error(' . $errno . '):' . curl_error($ch));
        }
        curl_close($ch); // 关闭URL请求
        return $result; // 返回获取的数据

    }



    /**
     * 使用curl获取远程数据
     * @param  string $url url连接路径
     * @return string      获取到的数据
     */
    function curlGetContents($url){

        $ch=curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);                //设置访问的url地址
        curl_setopt($ch, CURLOPT_HEADER,1);               //是否显示头部信息
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);               //设置超时
        curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);   //用户访问代理 User-Agent
        curl_setopt($ch, CURLOPT_REFERER,$_SERVER['HTTP_HOST']);        //设置 referer
        curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);          //跟踪301
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        //返回结果

        //这个是重点,加上这个便可以支持http和https下载
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

        $result = curl_exec($ch);
        curl_close($ch);
        return $result;

    }


    /**
     * 异步将远程链接上的内容(图片或内容)写到本地
     * @param $url    远程地址
     * @param $saveName    保存在服务器上的文件名
     * @param $path    保存路径
     * @return boolean
     */
    function putFileFromUrlContent($url, $saveName, $path) {

        // 设置运行时间为无限制
        set_time_limit ( 0 );
        $url = trim ( $url );
        $curl = curl_init ();
        // 设置你需要抓取的URL
        curl_setopt ( $curl, CURLOPT_URL, $url );
        // 设置header
        curl_setopt ( $curl, CURLOPT_HEADER, 0 );

        // 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
        curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 );

        //这个是重点,加上这个便可以支持http和https下载
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

        // 运行cURL,请求网页
        $file = curl_exec ( $curl );

        // 关闭URL请求
        curl_close ( $curl );

        // 将文件写入获得的数据
        $filename = $path . $saveName;
        $write = @fopen ( $filename, "w" );
        if ($write == false) {
            return false;
        }
        if (fwrite ( $write, $file ) == false) {
            return false;
        }
        if (fclose ( $write ) == false) {
            return false;
        }
        return true;

    }
    //    $url = "https://www.52linmin.wang/upload/portal/20171104/cb1511a3b30ef088c358286110823309.jpg";
    //    $saveName = 'whm.jpg';
    //    $path = "./"; //保存在当前目录下
    //    $res = putFileFromUrlContent($url,$saveName,$path);
    //    var_dump($res);// 当返回为true时,代表成功,反之,为失败


    // 使用代理抓取页面
    // 为什么要使用代理进行抓取呢?以google为例吧,如果去抓google的数据,短时间内抓的很频繁的话,你就抓取不到了。
    // google对你的ip地址做限制这个时候,你可以换代理重新抓。
    public function httpProxy($url){

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        //是否通过http代理来传输
        curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
        // curl_setopt($ch, CURLOPT_PROXY, 125.21.23.6:8080);
        curl_setopt($ch, CURLOPT_PROXY, 'ip:端口号');
        //url_setopt($ch, CURLOPT_PROXYUSERPWD, 'user:password');如果要密码的话,加上这个
        $result = curl_exec($ch);
        curl_close($ch);

    }


    // 继续保持本站session的调用
    // 在实现用户同步登录的情况下需要共享session,如果要继续保持本站的session,那么要把sessionid放到http请求中
    public function httpSession($url){

        $session_str = session_name().'='.session_id().'; path=/; domain=.explame.com';
        session_write_close(); //将数据写入文件并且结束session
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_COOKIE, $session_str);
        $result = curl_exec($ch);
        curl_close($ch);

    }

}

四、VerifyTools.php —— 校验工具类,如验证ip、手机、邮箱等

<?php

header('content-type:text/html;charset=utf-8');

/**
 * 校验工具类,如验证ip、手机、邮箱等
 * Class VerifyTools
 */

class VerifyTools{


    /**
     * 说明:判断是否为合法的ip地址
     * 判断是否为合法的ip地址
     * @param string $ip ip地址
     * @return bool|int 不合法则返回false,合法则返回4(IPV4)或6(IPV6)
     */
    function isIPAddress($ip)
    {
        $ipv4Regex = '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/';

        $ipv6Regex = '/^(((?=.*(::))(?!.*\3.+\3))\3?|([\dA-F]{1,4}(\3|:\b|$)|\2))(?4){5}((?4){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i';

        if (preg_match($ipv4Regex, $ip))
            return 4;

        if (false !== strpos($ip, ':') && preg_match($ipv6Regex, trim($ip, ' []')))
            return 6;

        return false;
    }


    // 说明: 验证邮箱格式
     function isValidEmail($email)
    {
        $check = false;
        if(filter_var($email,FILTER_VALIDATE_EMAIL))
        {
            $check = true;
        }
        return $check;
    }
    /**
    $email = "blog@koonk.com";
    $check = is_validemail($email);
    echo $check;
    //If the output is 1, then email is valid.
    */


    /**
     * 判断是否为手机访问
     * @return  boolean
     */
    function isMobile() {

        $sp_is_mobile = false;

        if ( empty($_SERVER['HTTP_USER_AGENT']) ) {
            $sp_is_mobile = false;
        } elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false // many mobile devices (all iPhone, iPad, etc.)
            || strpos($_SERVER['HTTP_USER_AGENT'], 'Android') !== false
            || strpos($_SERVER['HTTP_USER_AGENT'], 'Silk/') !== false
            || strpos($_SERVER['HTTP_USER_AGENT'], 'Kindle') !== false
            || strpos($_SERVER['HTTP_USER_AGENT'], 'BlackBerry') !== false
            || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== false
            || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mobi') !== false ) {
            $sp_is_mobile = true;
        } else {
            $sp_is_mobile = false;
        }

        return $sp_is_mobile;

    }

    /**
     * 判断是否为微信访问
     * @return boolean
     */
    function isWeiXin(){

        if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) {
            return true;
        }
        return false;

    }


    /**
     * 检查手机号码格式
     * @param $mobile 手机号码
     */
    function checkMobile($mobile){

        if(preg_match('/1[0123456789]\d{9}$/',$mobile))
            return true;
        return false;

    }


    /**
     * 检查固定电话
     * @param $mobile
     * @return bool
     */
    function checkTelephone($mobile){

        if(preg_match('/^([0-9]{3,4}-)?[0-9]{7,8}$/',$mobile))
            return true;
        return false;

    }

    /**
     * 当前请求是否是https
     * @return type
     */
    function isHttps()
    {
        return isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] && $_SERVER['HTTPS'] != 'off';
    }

}

五、UploadTools.php —— 上传文件工具类

<?php


header("Content-Type:text/html; charset=utf-8");

/**
 * 上传文件工具类
 * Class Upload
 */

class UploadTools{

    public $upload_name;                    //上传文件名
    public $upload_tmp_name;                //上传临时文件名
    public $upload_final_name;              //上传文件的最终文件名
    public $upload_target_dir;              //文件被上传到的目标目录
    public $upload_target_path;             //文件被上传到的最终路径
    public $upload_filetype ;               //上传文件类型
    public $allow_uploadedfile_type;        //允许的上传文件类型
    public $upload_file_size;               //上传文件的大小
    public $allow_uploaded_maxsize=10240000;//允许上传文件的最大值,单位为字节,现在相当于允许上传 10M 的文件

    //构造函数
    public function __construct()
    {
        $this->upload_name = $_FILES["file"]["name"]; //取得上传文件名
        $this->upload_filetype = $_FILES["file"]["type"];
        $this->upload_tmp_name = $_FILES["file"]["tmp_name"];
        $this->allow_uploadedfile_type = array('jpeg','jpg','png','gif','bmp','doc','xls','csv','zip','rar','txt','wps');
        $this->upload_file_size = $_FILES["file"]["size"];
        $this->upload_target_dir="./upload";
    }


    //文件上传
    public function upload_file()
    {
        if(!empty($_FILES)){
            $upload_filetype = $this->getFileExt($this->upload_name);//获取文件扩展名
            if(in_array($upload_filetype,$this->allow_uploadedfile_type))//判断文件类型是否符合要求
            {
                if($this->upload_file_size < $this->allow_uploaded_maxsize)//判断文件大小是否超过允许的最大值
                {
                    if(!is_dir($this->upload_target_dir))//如果文件上传目录不存在
                    {
                        mkdir($this->upload_target_dir,true);//创建文件上传目录
                        chmod($this->upload_target_dir,0777);//改权限
                    }
                    $this->upload_final_name = date("YmdHis").rand(0,100).'.'.$upload_filetype;//生成随机文件名
                    $this->upload_target_path = $this->upload_target_dir."/".$this->upload_final_name;//文件上传目标目录
                    if(!move_uploaded_file($this->upload_tmp_name,$this->upload_target_path))//文件移动失败
                    {
                        echo "<p style='color=red'>文件上传失败!</p>";
                    }
                    else
                    {
                        echo "<p style='color=green'>文件上传成功!</p>";
                    }
                }
                else
                {
                    echo("<p style='color=red'>文件太大,上传失败!</p>");
                }
            }
            else
            {
                echo("<p style='color=red'>仅支持一下文件类型,请重新选择:<br>".implode(',',$this->allow_uploadedfile_type)."</p>");
            }
        }else{
            echo("<p style='color=red'>请上传文件!</p>");
        }

    }
    /**
     *获取文件扩展名
     *@param String $filename 要获取文件名的文件
     */
    public function getFileExt($filename){

        $info = pathinfo($filename);
        return @$info["extension"];

    }


}

六、ZipTools.php —— Zip压缩解压工具类

<?php

header('content-type:text/html;charset=utf-8');

/**
 * Class ZipTools
 * Zip压缩解压工具类
 */

class ZipTools{


    /**
     * @desc 对相应目录文件进行压缩
     * @param $path
     * @param $zip
     **/
    //    使用示例
    //    $zip = new ZipArchive();
    //    $path = $_SERVER['DOCUMENT_ROOT'];
    //    $zipName = $_SERVER['DOCUMENT_ROOT']."/20180826.zip";
    //
    //    if($zip->open($zipName, ZipArchive::CREATE) === TRUE){
    //    addFileToZip($path, $zip); // 调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
    //    $zip->close(); // 关闭处理的zip文件
    //    }
    public function addFileToZip($path,$zip){

        // 转化 \ 为 / ,适应 windows
        $file_tools = new FileTools();
        $path = $file_tools->dirPath($path);


        // 判断是不是目录,是的话递归进入
        if(is_dir($path)) {
            $handler = opendir($path); //打开当前文件夹由$path指定。
            while (($filename = readdir($handler)) !== false) {
                if ($filename != "." && $filename != "..") {
                    //文件夹文件名字为'.'和'..',不要对他们进行操作
                    if (is_dir($path . "/" . $filename)) {
                        // 如果读取的某个对象是文件夹,则递归
                        $this->addFileToZip($path . "/" . $filename, $zip);
                    } else { //将文件加入zip对象
                        $zip->addFile($path . "/" . $filename);
                    }
                }
            }
        }else{
            $zip->addFile($path);
        }
        @closedir($path);

        echo 'zip压缩成功';

    }


    /**
     * @desc 对相应目录文件进行压缩
     * @param $path
     * @param $zip
     **/
    // php 从zip压缩文件中提取文件
    // 使用示例:
    // $filename = $_SERVER['DOCUMENT_ROOT'].'/unzip.zip';
    // $path = $_SERVER['DOCUMENT_ROOT'].'/unzip';
    // unZip($filename,$path );
    public function unZip($filename = '', $path = ''){

        //将文件名和路径转成windows系统默认的gb2312编码,否则将会读取不到
        $filename = iconv("utf-8","gb2312",$filename);
        $path = iconv("utf-8","gb2312",$path);

        if (!file_exists($filename)) {
            return false;
        }

        $zip = new ZipArchive;
        if ($zip->open($filename) === TRUE) {//中文文件名要使用ANSI编码的文件格式

            $zip->extractTo($path);//提取全部文件
            $zip->close();
            echo 'zip解压成功';

        } else {

            echo 'zip解压失败或没有这个zip文件';

        }

    }


}

更多精彩请访问: https://github.com/whm19940308/phpTools
转载请标明原文链接:https://www.jianshu.com/p/8ab3dce8d6f1

上一篇下一篇

猜你喜欢

热点阅读