preg_*匹配的字符串长度限制问题以及nginx,php上传文件过大问题

  问题背景

     使用插件上传高清图片,用的插件base64转码的,上传失败,接口提示:413 (Request Entity Too Large)

  问题分析与解决

    首先想到的是nginx和php的服务器配置。

    nginx配置:在http{...    ...}添加如下配置

1 #允许客户端上传文件的最大限制单位是M
2 client_max_body_size 20m;

    PHP配置

1 #修改配置文件
2 upload_max_filesize = 20M

    修改之后服务器提示是没了,但是图片也没有上传成功,一步步定位发现,是过滤base64图片数据出了问题。

1 $imgdata=base64_decode(preg_replace('/data(.*?)base64,/','',$data));

     当图片数据过大的时候,$imgdata为空,但是实际图片base64数据是有的,怀疑preg_replace函数匹配的字符串长度有限制,查阅资料确实有相关的问题。

  解决发放①(修改PHP配置):

     php.ini的文件配置

#对于字符串长度的限制
;pcre.backtrack_limit=100000

 

    为了上传图片没必要修改PHP配置文件,在修改控制器的脚本文件修改即可。

ini_set('pcre.backtrack_limit', 9999999999);

 

   解决问题②(修改代码):

    preg_*本身就不是最高效的写法,官方也建议使用其他函数代替。于是修改代码

#用字符串函数代替
$imgdata=base64_decode(str_ireplace('base64,','',strstr($data,'base64,')));

     上传图片成功,问题解决。

posted @ 2017-04-12 17:03  StudyBlog  阅读(995)  评论(1编辑  收藏  举报