mwwdfl 发布的文章

你程序向一个字段或一条语句中用超大的数据存储,但你的mysql的max_allowed_packet又没设置这么大的参考,所在就出现了这样的问题
命令行下:set global max_allowed_packet=524288000;
然后service mysql stop和service mysql start重启下
(在Linux下的,用xshell)

一、使用laravel前的准备工作:

二、laravel框架安装:

1、composer的使用:下载 安装
    进入getcomposer.org 去现在windows系统版本 它会自动下载安装并为你添加环境变量 让你直接在cmd中使用
安装过程中 找到PHP运行文件 PHP.exe 初次以外还可以设置代理服务器(跳过)安装完成运行composer会输出帮助信息
2、使用composer安装laravel
    administrator> cd ~\www
    使用中文镜像下载和安装 进入laravel中文网 golaravel.com 点击右边镜像关键字 进入后搜索命令 composer config -g repo.packagist composer https://packagist.phpcomposer.com
    ~\www> composer create-project laravel/laravel --prefer-dist(使用压缩的框架文件) la
    如果提示composer命令不可用 则重启    
    安装完成后 产生序列号 KEY 
执行 php -S localhost -t App/public 查看欢迎页
如果使用linux或者unix等系统 需要修改store和vendor的owner为Apache
3、查看安装文件 查找首页 并运行

三、laravel的基本使用


1、路由的使用: 
路由设置在app->HTTP目录的routes.php文件中 添加各种不同的路由规则:
Route:请求方式(访问地址,执行代码);
1-1 GET请求地址 映射到控制器中的操作
Route::get("/", "WelcomeController@index");    
可以使用某个匿名函数 写入执行代码
Route:get("test", function () {
    return "这是GET请求!";
});

1-2 POST请求 
Route:post("test", function () {
    return "这是POST请求";
});

POST请求的模拟可以使用FF的HTTP REQUEST插件 laravel中的POST请求需要携带TOKEN参数 防止CSRF(cross site request forage)

1-3 ANY不区分请求的类型
Route:any("test", function () {
    return "不区分请求的形式";
});



2、控制器创建:
自动创建:
~\la > php artisan make::controller UserController    
自动产生UserController.php文件 并生成增删改查的一套方法

手动创建 
Http->Controller目录中 创建一个 UserController.php 
class UserController extends Controller {
    public function index(){}
}
Route::get("user", "UserController@index");

资源器使用:
Route::resource("user", "UserController");
~\la >php artisan make:controller UserController

3、驱动模板
在控制器中调度模板和发送数据使用views函数
return view("user.add")->with("name", "Lucy");   
多数据发送
$data = array(
    "name" => "Lucy",
    "sex" => "female",
    "age" => 23,
);
views("user", $data);
 如果数据只有一个变量值 则使用compact(变量名字符串)生成数据
$name = "Lucy";
view("user", compact("name"));
view()函数 其实本质上是View对make()方法的调用 View::make("user");

4、模板使用
视图模板存放在 resource->view 目录下 模板文件需要.blade后缀 创建 user.blade.php模板文件

4-1:变量输出
模板中直接嵌入PHP脚本:<?php echo $name; ?>
使用模板标签:
        {{ $name }}   默认值设置 {{$name or "无名大侠"}}
        {{ "hello world" }}
非转移输出    
        @{{ some text }} @中的内容 总是作字符常量解析  因此可以用@来界定模板和原值
转义输出:
        {{ "<h4>原样显示的HTML</h4>" }}

4-2:控制流和循环
@if($name) 
    $name;
@else
    "无名大侠";
@endif

$user = array(
    "name" => "Lucy",
    "sex" => "female",
    "age" => 23
);
<ul>
@foreach ($user as $tmp)
    <li></li>  
@endforeach

@for($i = 0; $i < 10; $i++)
    
@endfor

@while()

@endwhile;
</ul> 

4-4 子视图模型的使用
使用@include引入存放在views/abc/header.blade.php
@include("abc.header");    

第二天:环境配置与基本操作

1、.env 文件里面设置 设置键值对形式的配置信息
DB_CONNECTION = mysql
config里面读取环境配置的键值 env("DB_CONNECTION", "mysql");
一般要配置的是:
    部署模式:APP_DEBUG=true
    数据库DB配置
    SESSION配置
    DOWN/UP        执行php artisan down 进入维护页面 在resources->views->errors->503.blade.php
                php artisan up 恢复服务

2、Eloquent 用来和数据库交互的一个工具和机制
    2-1 创建表模型:
    php artisan make:model User 在APP目录中产生一个 User.php
    配置表模型:
        $table = "think_admin_user";    表名
        $primaryKey = "uid";        主键
        $hidden    = ["password","createtime"];    查询隐藏的字段
        $fillable = [];            可自动填充的字段
        $guarded = [];            不可自动转换的字段

    2-2 模型的使用:    
        控制器中直接调用
        $userModel = new \App\User();
        $userModel->all();

        添加模型方法
        public function read()
        {
            return $this->all();
        }
        控制器中调用自定义模型方法
        $userModel->read();
        
    2-2 模型的使用 基本增删改查

        查询结果集
        public function read() 
        {
            查一条 主键ID 为 1的这条 找不到返回空
            $this->find(1);    
            找不到进行报错
            $this>findOrFail(1);
            连贯操作
            $this->where("uid", "1")->get();
            非等于查找
            $this->where("uid", ">", 1)->get();
        }
     
        添加一条数据
        public function userAdd() 
        {    
            动态写入字段值
            $this->uname = "hello";
            $this->password = md5(rand(1,100));

            已有的储备数据
            $data = ["uname" => "hello", "password" => md5(rand(1, 100))];
            $this->fill($data);
            写入数据时 默认会有一个修改和创建时间 要不设置该字段 要不关闭验证 通过模型中设置 public $timestamps = false 关闭
            
            return $this->save();
        }

        修改数据
        public function userUpdate() 
        {
            设置要修改的用户
            $user = $this->find(5);
            设置数据值
            $user->uname = "world";
            保存新数据
            $user->save();

            批量修改数据
            $users = $this->where("uid", ">", 10);
            $user->update(["nickname" => "Lautinggg"]);
        }

        删除数据
        public function userDel()
        {
            $user = $this->find(10);
            $user->delete();
        }
        
    2-3 模型数据的查看和格式转化
        每条数据默认以对象形式存在,多条数据则是对象的集合(collection对象),可以使用dd()辅助函数插件, 如果希望转化成数组则可以使用toArray()方法
        function () {
            $userModel = new \App\User();
            $users = $userModel->all();
            dd($users->all());    输出collection
            使用toArray()方法 将对象转化成数组形式
            dd($users->all()->toArray());

            关于collection对象的方法 使用collect将数据封装成collection对象
            $arr = ["name" => "Lucy", "sex" => "female", "age" => 23];
            $collection = collect($arr);
            dd(get_class_methods($collection));
        }
        collection的常见方法:
        all()    查看所有数据
        first()    查看第一个数据
        last()    返回最后一个数据
        contains("Lucy") 检测某个数据值
        has("sex")    检测某个索引或者属性
        get("age")    获取某个值
        toArray()    将结果转化成数组形式
        toJson()    将结果转化成json数据格式
        each( function () {})        循环执行动作


3、获取用户提交数据
function () {
    return Input::get("name");
    获取某个get参数值
    return Request::get("title", ["noTitle"]);
    获取查询字符串的值
    return Request::query(["name"]);
    获取所有请求参数的值
    return Request::all();

    检测请求参数
    return Rquest::has("name");    检测name值是否存在
    return Request::exists("name");    检测name键是否存在

    请求检索
    return Request::only("name", "sex");
    return Request::except("age");
    return Request::url();        请求的URL
    return Request::fullUrl();    完整的URL地址
    
    请求历史        
    return Request::flash();    存值 session中
    return Request::old();        取值
    return Request::flashOnly("name");    只存name
    return Request::flashExcept("sex");    除了sex都存
}

4、文件上传
function () {
    获取所有上传文件 返回对象集合
    dd(Request::file());
    获取指定的上传文件
    dd(Request::file("avartar"));
    获取文件各部分信息
    $file = Request::file("avartar");    hasFile("avartar") 判断和检测文件
    $file->getClientOriginalName();        原始的文件名
    $file->getClientOriginalExtension();    原始的文件后缀
}

5、表单验证
加载validator类
use Request,Validator;
function create() {
    $rq = Request::all();
    添加验证规则
    $validator = Validator::make($rq, [
        账号不能为空、不能重复
        "uname" => "required|unique:admin_user",
        "password" => "min:6|max:15",    "between:6,15",
        "phone" => "numeric"
    ]);
    判断是否通过
    if ($validator->fails()) {
        return  $validator->errors();
    }
    
}


6、会话控制
function () {
    查看所有session数据 默认存储了token和flash的值
    Session::all()
    添加session数据
    Session::put("uname", "Lucy");        session(["uname" => "Lucy"]);
    读取某个session数据
    Session::get("uname");
    销毁session
    Session::forget("uname");
    用完即销毁
    Session::pull("uname");
    检测session的值
    Session::has("uname");
}    

7、Hash加密
function () {
    $password = Request::get("password");
    $hashed = Hash::make($password);
    session(["password" => $password]);
}
验证hash加密的方法
function () {
    $password = Request::get("password");
    if (Hash::check($password, session("password"))) { 验证参数有顺序之分
        return "密码正确";
    } else {
        return "密码错误";
    }
}

8、辅助函数
8-1    关于数组操作的
    $arr = [1,2,3,4];
    $arr2 = ["name" => "Lucy", "sex" => "female", "age" => 23];
    第一个/最后一个元素
    head/last($arr);                1
    返回指定索引元素
    array_only($arr2, ["name", "sex"]);    ["name" => "Lucy", "sex" => "female"]
    返回满足条件第一个元素
    array_first($arr, function ($key, $value) {
        return $value > 2;
    });
    添加一个元素值
    array_add($arr2, "job" => "student");
    返回指定以外的值
    array_except($arr2, "job");
    返回指定条件的元素
    array_where($arr, function ($key, $value) {
        return is_string($value);
    });
     


8-2 关于路径的辅助函数
    app_path()/config_path()/public_path()/storage_path()

8-3 关于字符串操作
    $str = "apple";
    智能转化成复数
    str_plural($str);
    判断起始/终止字符串
    dd(starts_with/ends_with($str, "a"));
    下划线转驼峰
    camel_case("hello_world");
    类名去除空间
    class_basename("\App\User");
    限制长度 剩余以....结尾
    str_limit($str, 4);    
    判断模式 是否以app开头
    str_is("app*", $str)

1.如何开启GD库

    ① phpinfo();  通过访问此函数文件来查看你的服务器上有没有此模块
    
    ② wamp目录 -> bin目录 -> php目录 -> ext目录 -> php_gd2.dll文件
    
    ③ php.ini配置文件,通过搜索 php_gd2.dll 可以找到 extension=php_gd2.dll
       将其前面的分号去掉,即开启了gd库绘图功能
       

    

二、绘画步骤


    1.准备画布(颜料)
        
    2.开始绘画
    
    3.输出图像
    
    4.释放资源


示例:
<?php
    //1.创建一个画布,颜色
    $im = imagecreate(200,200);    
    
    $red = imagecolorallocate($im,255,0,0);  //创建一个颜色:红色
    $blue = imagecolorallocate($im,0,0,255);  //创建一个颜色:蓝色 
    $c1 = imagecolorallocate($im,200,200,200);

    //2.开始绘画
     imagefill($im,0,0,$c1); //填充背景
    //....

    //3.输出图像
     header("Content-Type: image/jpeg");//设置响应头信息为一个jpeg的图片
     imagejpeg($im);//输出一个jpeg图片
     
    //4.销毁
     imagedestroy($im); //

三、图片的具体绘制:

3.1 创建一个画布:
    imagecreate(宽,高)--创建一个基于256色的画布
    imagecreatetruecolor( int x_size, int y_size ) -- 新建一个真彩色图像
    
    //还有基于某个图片的画布(将一张图片放到了画布中)
    imagecreatefromgif( string filename )
    imagecreatefrompng( string filename )
    imagecreatefromjpeg( string filename )
    
3.2 绘画:
    //分配定义颜色
    $red = imagecolorallocate($im,255,0,0); //分配一个颜色
    
    //填充背景
    bool imagefill(resource image,int x,int y, int color ); //填充背景
    
    //画点
    bool imagesetpixel(resource image,int x,int y,int color );//画一个像素点
    
    //画一个线段的函数
    bool imageline ( resource image, int x1, int y1, int x2, int y2, int color )

    //画矩形框(不填充)
    bool imagerectangle ( resource image, int x1, int y1, int x2, int y2, int color )
    //画矩形框(填充)
    bool imagefilledrectangle ( resource image, int x1, int y1, int x2, int y2, int color )

    //绘制多边形
    bool imagepolygon ( resource image, array points, int num_points, int color )
    bool imagefilledpolygon ( resource image, array points, int num_points, int color )
    
    //绘制椭圆(正圆)
    imageellipse ( resource image, int cx, int cy, int w, int h, int color )
    imagefilledellipse ( resource image, int cx, int cy, int w, int h, int color )

    //绘制圆弧
    imagearc ( resource image, int cx, int cy, int w, int h, int s, int e, int color)
    imagefilledarc ( resource image, int cx, int cy, int w, int h, int s, int e, int color, int style )
    
    //绘制字串
    bool imagestring ( resource image, int font, int x, int y, string s, int col )
    bool imagestringup ( resource image, int font, int x, int y, string s, int col )
    
    //绘制文本:
    *array imagettftext ( resource image, float size, float angle, int x, int y, int color, string fontfile, string text )
    
    //当上面的字体出现乱码时,使用下面的函数转换编码
    string iconv ( string in_charset, string out_charset, string str )
    
    $name="张三";
    $str = iconv("ISO8859-1","UTF-8",$name);
    $str = iconv("GBK","UTF-8",$name);
    $str = iconv("GB2312","UTF-8",$name);
    
    
    //图片的裁剪、合成、缩放
    **bool imagecopyresampled ( resource dst_image, resource src_image, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h )
    
    * imagesx — 取得图像宽度
    * imagesy — 取得图像高度
    * array getimagesize ( string $filename [, array &$imageinfo ] )  取得图像大小


    
3.3.输出图
     header("Content-Type: image/jpeg");//设置响应头信息为一个jpeg的图片
     imagejpeg($im);//输出一个jpeg图片
     
     header("Content-Type: image/png");//设置响应头信息为一个png的图片
     imagepng($im);//输出一个png图片
     
      //输出到指定文件中(另存为)
      imagepng($im,"**.png");


3.4.销毁
     imagedestroy($im); //    销毁打开的图片







一、 php.ini的配置信息

file_uploads = On /Off   是否允许文件上传
upload_max_filesize=2M 上传的文件的最大大小
post_max_size = 8M       POST数据所允许的最大大小
upload_tmp_dir           上传文件放置的临时目录

upload_max_filesize的大小一定要小于post_max_size的配置大小。

二、(发送客户端)上传的form表单:

1、 表单必须是post提交
2、 上传的类型:enctype="multipart/form-data"
3、上传使用的表单项
    <input type="file" name=".." />
4.(可选)上传大小限制的表单隐藏域:MAX_FILE_SIZE,
    <input type="hidden" name="MAX_FILE_SIZE" value="大小字节"/>
    注意:此字段必须在文件输入字段之前(常放在form标签后面)
    

三、(接收服务器端):

1. 使用$_FILES全局数组来接收上传信息
    在每个上传的文件里,$_FILES中都会有5个属性:
        error:上传的错误号:0--4
            0:表示没有发生任何错误。
            1:上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
            2:表示上传文件大小超出了HTML表单隐藏域属性的MAX_FILE_SIZE元素所指定的最大值。
            3:表示文件只被部分上传。
            4:表示没有上传任何文件。
            6:找不到临时文件夹
            7:文件写入失败
        name:上传的文件名
        size:文件的大小
        type:文件类型
        tmp_name: 临时文件

2:is_uploaded_file() //是否是上传文件
3:move_uploaded_file() //执行移动上传文件

    

四、 下载设置:

header("Content-Type:类型"); //指定响应类型
header("Content-Disposition:attachment;filename=文件名"); //**执行下载文件名
header("Content-Length:文件大小");

readfile("./uploads/".$picname); //读取并输出图片内容;

查找命令

    1)    命令名称:which    
        命令所在路径:/usr/bin/which
        功能描述:查看命令文件位置和命令可能出现的别名

    2)    命令名称:find
        命令所在路径:/usr/bin/find
        功能描述:搜索系统中的符合条件的文件

    -name 根据文件名查找

通配符

  • 任意多个字符
    ? 1个字符
    [] 指范围值,外侧加引号
    例:find /var –name “*.log”

     find  ./  -name  “[1-3].txt”
    

    -size 根据大小查找
    单位是 block 数据块 一块是512字节

      1M -> 1024k -> 2048块  (1块是0.5k 也就是512字节)

    100M -> 102400k -> 204800块
    例 find /etc -size -10k 查找小于10k的文件

       find /etc -size +2M        查找大于2M的文件

    注意+-号,如果没有,是精确这么大

    -user 根据所有者查找
    例 find /home -user jack

            在/home中,查找所有jack用户的文件
     在系统中需要存在此用户,否则报错
    

    -按时间查找
    按天 ctime atime mtime
    按分钟 cmin amin mmin

     c   change 改变        #表示属性被修改过:所有者、所属组、权限
     a   access  访问    #被访问过(被查看过)
     m  modify 修改        #表示内容被修改过

    例:find /etc -mmin -120 查找120分钟内被修改过的

     find /etc -mtime +7        超过7天没有改过的文件
    

    -type根据文件类型查找
    例: -type f 二进制文件(普通文件)

     -type l 软链接文件
     -type d 目录
    

    -逻辑连接符:
    -a (and 逻辑与 ) -o (or 逻辑或)
    例:find /etc -size +1k -a -size -10k
    在etc目录下查找大于1k并且小于10k的文件

-命令执行连接符(对查找到的文件,进一步处理)

    find  ...  -exec 命令 {}  \;
        {}表示find查询的结果集
        \是转义符,不使用命令别名,直接使用命令本身
        ;分号是表示语句的结束
    注意:固定格式,只能这样写。注意中间的空格。
转义符的作用是什么?

在linux中有一个别名机制,如rm删除文件,执行的却是rm -i(用which rm 可以查看命令别名),使用rm删除文件前会提示,就是因为rm -i这个参数。如果想使用命令原意,可以在加\转义,

  如:\rm test.txt   则不会提示,直接删除

找到文件后查看详情:

find /etc -name inittab -exec ls -l  {}  \;
find /etc -name “init*”-a -type f -exec ls -l {} \;  

通过-type f过滤掉目录,只列出文件,否则ls会列出很多文件


找到testfile后,直接删除
find /test -name testfile -exec rm {}  \;

找samlee用户的所有文件并删除
find /home -user samlee -exec rm –r  {}  \;
rm –r 连带目录一起删除。报错原因:-exec 不适合大量传输,速率慢,导致。

找samlee用户的所有文件并删除,删除前会一个提示确认
find /home -user samlee -ok rm -r {} \;


-根据i节点查找
-inum  i节点号
有一些文件的硬链接数量很多,有相同的i节点,查找其中一个文件的i节点号,一次性删除
find ./ -inum 2310630 -exec rm {} \;


    3)    grep    “字符串”  文件名        
    
        命令所在路径:/bin/grep
        功能描述:在文件内查找符合条件的字串行
        grep  -i  “root”  /etc/passwd
              -v        反向选择
              -i     忽略大小写

find:在系统当中搜索符合条件的文件名,如果需要匹配,使用通配符匹配。通配符是完全匹配。
grep:在文件当中搜索符合条件的字符串,如果需要匹配,使用正则表达式匹配,正则表达式是包含匹配

注意事项:

尽量不要在根目录/中查找,查找得慢,会占用太多服务器资源
如果需要在服务器中全盘查找,可以写一条计划任务在凌晨执行
查找范围越小越好,匹配条件,越精准越好


    4)    管道符            
        命令1  |  命令2            将命令1的标准输出作为命令2的标准输入
        例:ls  -l  /etc  |  more            分屏显示ls内容

四、帮助命令

    1)    man  命令名            查看命令的帮助    
        命令名称:man
        命令英文原意:manual
        命令所在路径:/usr/bin/man

    2)    命令  --help            查看命令的常见选项
        命令  --help
        help   命令        

五、压缩和解压缩

    
        .zip  .gz     .bz2     linux可以识别的常见压缩格式    
        .tar.gz    .tar.bz2     常见的压缩和打包格式

(1)压缩&解压缩
zip
压缩格式: zip 压缩文件(生成) 源文件
解压格式: unzip 压缩包名
-r 压缩目录
(2)打包压缩&解包加压缩

            tar  -*cvf  压缩文件名(生成)  源文件
                -z        识别.tar.gz格式

-j 识别.tar.bz2格式

                -c        压缩
                -v        显示压缩过程
                -f        指定压缩包名
            tar  -*xvf  压缩包名
                -x        解压缩
            tar  -*tvf  压缩包名
                -t  只查看,不解压

tar -*xvf 压缩包名 -C 目录

                -C        指定解压目录

六、网络命令

    1)    ping    测试网络连通性
            命令名称:ping
            命令所在路径:/bin/ping
            执行权限:所有用户Ctrl +c 强制终止
        ping  -c  次数  ip        探测网络通畅

    2)    ifconfig      查询本机网络信息
            命令名称:ifconfig
            命令英文原意:interface configure
            命令所在路径:/sbin/ifconfig
            执行权限:root

七、关闭和重启命令

    
          1)关机

shutdown -h now 没有特殊情况,使用此命令
halt
init 0

          2)重启

shutdown -r now
命令名称:shutdown

                命令所在路径:/sbin/shutdown
                执行权限:root    
            reboot
                命令名称:reboot
                命令所在路径:/sbin/reboot
                执行权限:root
        

八、挂载命令

    
    linux所有存储设备都必须挂载使用,包括硬盘
        命令名称:mount
        命令所在路径:/bin/mount

        常见的存储设备:
        /dev/sda1    第一个scsi硬盘的第一分区
        /dev/cdrom    光盘
        /dev/sr0        光盘            centos 6.x
        
        挂载格式:
        mount  -t  文件系统  设备描述文件  挂载点(已经存在空目录)
        mount  -t  iso9660  /dev/cdrom  /mnt/cdrom

        光盘卸载:
        umount  /dev/cdrom 
        umount  /mnt/cdrom         强调:退出挂载目录,才能卸载

        fdisk  -l      查看当前系统下的存储设备
        df        –h       查看存储设备挂载信息
        
        mount  -t  vfat  /dev/sdb1  /mnt/usb

fat32格式的U盘挂载方式

Shell使用小技巧:
1)补齐功能

补齐功能允许用户输入命令名或文件名起始的若干个字母后,按Tab键补齐命令名或文件名。

2)命令历史

命令历史允许用户浏览先前输入的命令并重新
调用它们,用history命令可以显示命令列表,按方向键↑和↓可查找以前执行过的命令。
!命令前缀

3)命令别名定义:
范例:alias copy=cp

           alias  dirrm= ‘rm -rf ’

查看别名信息:alias
删除别名:unalias copy

服务器管理规范:

越是安全等级要求高的服务器,越是严格限制用户等级,不能所有人都是root,远程服务器不能关机。
服务器不允许在负载高峰执行高负载命令。例如杀毒、大数据压缩解压缩,复制,全盘搜索。