Laravel踩坑汇总(一)

Laravel踩坑汇总(一)

[TOC]

大文件上传问题

问题

最近在做视频部分的功能,在上传视频的时候,遇到了一些问题,有文件上传信息,但是某些信息获取不到,比如:

1
2
3
4
5
6
7
8
9
public function store($request){
if($request->has('videos')){
$videos = $request->file('videos');

foreach($videos as $file){
dd($file->getRealPath(),$file->getPathName());
}
}
}

上面程序在打印getRealPath()getPathName(),这两个方法时发现是空,正常情况下getRealPath()方法会返回临时文件的路径,后来偶尔间发现,是需要修改php.ini的一些参数

方案

打开php.ini文件

1
2
post_max_size=128M
upload_max_size=128M

  1. post_max_size这个参数,如果你上传的文件(我的文件是45M,默认是32M)超过默认的设置,它会报一个异常,但是没有错误信息,但顺着错误堆栈信息,发现有一个错误是:Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize,根据字面意思就是在校验post请求的数据大小时,发生异常了,去google了发下是需要设置下post_max_size即可。
  2. post_max_size设置好之后,虽然没有报错,但是文件的一些文件的信息获取不到,比如临时文件路径什么的,这就头大了。后来偶然发现,还有一个upload_max_size,设置完就OK了。

Put请求中有文件上传,获取不到相应数据的问题

背景

目前所有的项目都是基于Vue+Laravel前后端分离,有一个功能在添加的时候,有个封面图片,而编辑的时候,同样也可能会修改封面图片,而根据restfull api的格式要求,一般来说更新操作一般是用的put操作,但是在put请求下如果有文件上传,则没办法获取到相关的文件上传信息

方案

实际上之前在做开发的时候遇到过,只是理解的没有那么深刻,那时候还没有做前后端分离,还是传统的在blade模板里做相应的渲染输出,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# routes/web.php

Route::resource('user,'UserController')

# resource/view/user/edit.blade.php

...

<form action="{{route('user.update',['id'=>$id])}}" method="post">

<input type="hidden" name="_method" value="put">

</form>

...

上面是之前做功能的时候,使用的处理方法,实际上同样的方法也适用于delete方法。

这次在使用vue前后端分离的时候,也同样遇到问题了,一时半会儿没想起来,在网上查了下,上面的解决办法也同样适合用vue.

参考资料:
https://github.com/laravel/framework/issues/13457

关于proc_open的一些问题

背景

最近遇到两次关于proc_open的错误,两次都是在composer的情况下遇到的,如果下

通过图片里的异常我们可以得到,是因为proc_open这个函数被禁用掉了

  1. 最近买了一台阿里云的主机,是低配版的,在上面安装laravel,使用composer install 安装某个扩展包的时候,抛出proc_open(): fork failed - Cannot allocate memory 这个异常。从字面理解,就是不能分配更多内存的意思,于是在linux下使用 free -m 发现基本上内存被占完了。而且也没有设置swap内存

方案

1.如果proc_open函数被禁用掉,则打开php.ini文件,查找disable_functions,把这个函数从禁用列表里去掉

2.如果是内存不足,则调整下swap内存

1
2
3
4
5
6
7
8
9
10
11
12
13

free -m

total used free shared buffers cached
Mem: 2048 357 1690 0 0 237
-/+ buffers/cache: 119 1928
Swap: 0 0 0 //交换内存未设置
To enable the swap you can use for example:

//设置交换分区
/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1

注: proc_open函数是一个很敏感的函数,在使用的时候,一定要多注意。

proc_open介绍:http://php.net/manual/zh/function.proc-open.php

Laravel设置redi为缓存,页面打开报错的处理办法

背景

新的项目在部署的时候,在.env里设置了cache_driver=reids,刷新页面报了一大堆错误,顺着堆栈找到了一段错误信息,MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.意思就是Redis被配置为保存数据库快照,但它目前不能持久化到硬盘。

方案

1
2
3
4
5
6
7
8
9
10
11
# 两种方案
# 方法一
redis-cli host port
127.0.0.1> config set stop-writes-on-bgsave-error no

# 方法二
vi /usr/local/redis/conf/redis.conf
stop-writes-on-bgsave-error yes
wq // 保存退出

#重启redis即可

Larave连接mssql乱码

背景

公司的一些老项目还是使用的mssql数据库,目前使用的框架是laravel,而服务器是centos,环境搭建成功之后,出现乱码,

方案

其实linuxphp连接mssql,是通过pdo_sqlsrvpdo_dblib,而pdo_dblib则依赖一个freetds的东西,而乱码的问题就是出在freetds上。

1
2
3
4
5
6
7
# /etc/freetds.conf
vi /etc/freetds.conf

[global] //注意,是这个节点

//默认情况下,这一行是注释的,而且版本号是一个其它数字,比如我的是4.2
tds version = 8.0

网上的其它方法说要在[global]段加一行client charset = UTF8,如果上面还不行,就把这行加上试下,不过我的没有加,直接修改好了之后,乱码就解决了