PHP fastcgi模式运行的PHP上传文件MaxRequestLen错误解决

 更新时间:2016年11月25日 17:37  点击:2197
在fastcgi模式下上传文件比较大时都会提示mod_fcgid: HTTP request length 135024 (so far) exceeds MaxRequestLen (131072)错误了,看意思是长度限制了,下面来给各位介绍解决办法。

刚装好的apache2.4.9+php5.4,在使用phpmyadmin导入数据时出现服务器500错误。查看日志后发现

mod_fcgid: HTTP request length 135024 (so far) exceeds MaxRequestLen (131072)

意思应该是请求太长了,但以前从没见过MaxRequestLen这玩意,到httpd.conf中查找,没有;又到php.ini中查找,还是没有。只好百度,原因貌似是高版本的apache的默认请求数据改小了,也有说是fcgi运行的原因,反正不管怎么样,解决方法只有一个:

在httpd.conf中添加一条

# 修改fgci请求限制
MaxRequestLen 5242880

例子
<IfModule mod_fcgid.c>
        AddHandler    fcgid-script .fcgi
        FcgidConnectTimeout  20
        # to get around upload errors when uploading images increase the MaxRequestLen size to 15MB
        MaxRequestLen  15728640
</IfModule>

然后重启apache,就不再提示错误了。

注意:如果你只需要修改单个虚拟主机的MaxRequestLen,只需要添加到 virtualhost中就行了。如果是全局的,添加到 httpd.conf

PHPMailer在SAE上无法发送邮件怎么回事呢,我们以前在php5.2.7版本中使用了PHPMailer是可以发,但移到sae中发现无法发邮件了,那么此问题如何解决

在SAE上直接用5.2.7之前版本的PHPMailer发送邮件会出现错误,原因在于PHPMailer默认使用stream_socket_client()来建立socket,而SAE禁用了这个函数。WordPress使用的就是5.2.7版本的PHPMailer,因此也会出现同样的问题。

解决方法很简单,修改class.smtp.php (WordPress中是wp-includes/class-smtp.php)中

$this->smtp_conn = @stream_socket_client(
$host . ":" . $port,
$errno,
$errstr,
$timeout,
STREAM_CLIENT_CONNECT,
$socket_context
);

$this->smtp_conn = fsockopen($host, $port, $errno, $errstr);
即可。

最新的5.2.8版PHPMailer已经解决了这个问题。

下面来看看在使用php5.3时碰到的Fatal error: Undefined class constant MYSQL_ATTR_INIT_COMMAND错误解决办法。


今天帮朋友做了个简单的信息录入程序,本地调试一切OK。

传到朋友的服务器后,死活不能用,一涉及数据库的读写就出现一个Fatal error.

Fatal error: Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' 查来查去,原来是PHP5.3.0的BUG
http://bugs.php.net/bug.php?id=47224

解决办法有两种,一是改代码

$pdb = new PDO("mysql:host=localhost;dbname=test", 'root');
$pdb->exec("SET NAMES utf8");

二就是升级你的PHP到更高的版本喽~~
所以,要从PHP5.2升级到PHP5.3的同学,要注意一下你的代码呀~~

今天在帮助一个朋友配置一台服务器时发现网站配置好了缓存目录读写不成功,在打开错误时发现提示 Warning: file_exists() [function.file-exists]: open_basedir restriction in effect. File(../license.php) is not within the allowed path(s): 错误了,下面一起来看此问题解决办法

先来看配置文件

$cache = new Cache(43200,'D:/wwwroot/cache/tmp/anzhuo/');//参数1 秒,参数2内容
$page = intval(isset($_GET['page'])?$_GET['page']:1);
$key = 'anzhuo_data_4'.$page;
$values = $cache->display($key);

这个是生成缓存文件了,但是发现生成是提示

Warning: file_exists() [function.file-exists]: open_basedir restriction in effect. File(../license.php) is not within the allowed path(s):

这个百度直接搜索 open_basedir restriction in effect 错误看到如下图所示答案

问题是出现在了PHP.INI上面了
 原因是php.ini里设置了  

opendir=/var/web/w0895/:/tmp:/usr/lib/php

解答:
其实open_basedir 这个是用来限制php的目录访问权限什么的,如果不在允许的范围内,php就不能访问。
这个 open_basedir 在 php.ini 里可以设定,也可以在 apache的httpd.conf 里面设定

例如:

php_admin_value open_basedir "D:/wwwroot/cache/tmp/anzhuo/"

再比如:

php_admin_value open_basedir =/var/web/w0895/:/tmp:/usr/lib/php

好了再重启apache问题解决了。

 

下面一起来看看在php开发中碰到PHP Fatal error: Cannot use object of type stdClass as array in错误问题的解决办法吧。

普通的数组出现如下错误

 代码如下 复制代码

<?php
Array (
 [0] => stdClass Object (
  [id] => 1
  [title] =>精彩推荐
  [size] => 280*150
  [pic] => ./uploadfiles/201402160422.jpg
  [state] => 0 )
 [1] => stdClass Object (
  [id] => 2
  [title] =>企业要闻
  [size] => 280*150
  [pic] => ./uploadfiles/201402160533.jpg
  [state] => 0 )
 )
?>

后来百度搜索一个关于差不多的问题,但对方是json数据

php再调用json_decode从字符串对象生成json对象时,如果使用[]操作符取数据,会得到下面的错误:

Cannot use object of type stdClass as array

产生原因:

 代码如下 复制代码

$res = json_decode($res);
$res['key']; //把 json_decode() 后的对象当作数组使用。

解决方法(2种):

1、使用 json_decode($d, true)。就是使json_decode 的第二个变量设置为 true。
2、json_decode($res) 返回的是一个对象, 不可以使用 $res['key'] 进行访问, 换成 $res->key 就可以了。


好了现在回到我们原问题发现

原来是不能直接用[]来显示导致的,上面代码的输出是用的:$pic[0][title],改为$pic[0]->title后正常了

[!--infotagslink--]

相关文章