首页 > 编程技术 > php

PHP中的max_input_vars指令介绍

发布时间:2016-11-25 17:17

max_input_vars在php中一般默认就可以了但是有时会碰到max_input_vars设置导致php出问题了,下面我们来看一篇关于max_input_vars的解决办法吧.


今天接到客服部工作人员反馈的一个客户的问题,产品是允许用户添加一个产品属性的,而每个属性是由多个表单域组成 ,这样当每添加一个属性就等于添加了n个表单域,这个客户添加的非常的多,发现在提交保存的时候总是失败,提示其中一个表单元素的索引值不存在,经测试是发现服务端接收的一些表单域丢失了一部分。起初分析的是服务器接收的数据超出了php设置的max_post_size(其实当时已经设置了8M,足够使用了),修改了测试发现此问题仍然存在。后来将用户原来的一些添加的表单元素进行删除,再重新添加同样数据库表单域可以成功,但一旦超出一定数量的表单域就会发生丢失的情况,这个时候首先怀疑的是apache是否有类似限制接收隐藏域的指令,找了没有找到,紧接着在php中批到一个max_input_vars这个指令,意思就是说php中允许接收的最大表单域数据,到目前为止基本上是确定这个原因引起的了,奖其修改为2000,重启Apache,发现一切正常。

max_input_vars默认值为1000导致多表单提交失败

再看了下php-fpm的日志,有点信息可以参考了。


[25-Sep-2014 15:19:30] WARNING: [pool www] child 28329 said into stderr: "NOTICE: PHP message: PHP Warning:  Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0"

提示input 变量个数超过1000,建议修改php.ini文件中的 max_input_vars,PHP从5.3.9开始增加一个变量 max_input_vars 用来限制提交的表单数量。

妈的,我这个功能(类似于phpmysqladmin功能,读取数据库表,然后能写入编辑,然后数据库字段有128个,然后每个字段有11个input框)大概有1400多个input,(多么痛的领悟,为毛这么吊,研发一个表搞这么多字段),

然后我在php.ini里面加入

max_execution_time = 30     ; Maximum execution time of each script, in seconds
max_input_time = 60     ; Maximum amount of time each script may spend parsing request data
max_input_vars = 2000

重启php-fpm后,功能正常了。看日志很重要。

总结:提起php中的max_input_vars 估计很少人知道这个这个指令,因为他的使用场景实在是太少了,在php.ini中这个指令的定义是指服务端最大可以接收的表单域的数量多少,默认是1000,这足够我们平时使用了。但仍然有一些特殊的情况下需要修改此值的大小。

PHP 写文件加锁有函数了这个可以保证文件同时多人操作时出现数据丢失的问题了,下面我们就一起来看看如何实现PHP 写文件加锁吧.

用 PHP 的 file_put_contents 函数以追加的方式,循环 10 w 次写文件,耗时很多。因为 file_put_contents 函数每次都要打开文件,写入文件,然后关闭文件。

以下是测试:

public function handle()
{
    $testTxt = storage_path('test.txt');
    for ($i = 0; $i < 100000; $i++) {
        $this->comment('writing...');
        file_put_contents($testTxt, 'wo shi tanteng.' . PHP_EOL, FILE_APPEND);
    }
    $this->comment('time:' . round(microtime(true) - LARAVEL_START, 2));
}
如图所示:


耗时 165.76 秒。现在换一种写文件的方式,使用 fwrite 并且加锁的方式同样循环 10w 次写入,代码如下:

public function handle()
{
    $testTxt = storage_path('test2.txt');
    $handle = fopen($testTxt, 'wr');
    flock($handle, LOCK_EX | LOCK_NB);
    for ($i = 0; $i < 100000; $i++) {
        $this->comment('writing...');
        fwrite($handle, 'wo shi tanteng.' . PHP_EOL);
    }
    flock($handle, LOCK_UN);
    fclose($handle);
    $this->comment('time:' . round(microtime(true) - LARAVEL_START, 2));
}
运行效果如图:


如图所示,耗时 40.46 s,大大提高了效率。

跟 file_put_contents 函数比, fwrite 提高了写文件的效率,同时使用 flock 进行写文件加锁,防止并发同时操作一个文件。

PHP去重我们如果数据量小肯定不会考虑到优化了,但是如果碰到量大的话那就必须得用到最好的算法了,今天我们来看关于PHP去重进行算法升级过程吧.

最近公司在做一个项目,需要对爬取到的数据进行去重,方法就是根据数据的id,去除掉id重复的数据。

下面是这个方法的演化过程。

// 去重
$arr_id = array();
$LeTVFeedList = array();
for ($i = 0; $i < count($arrFeedList); $i++){
    if(!in_array($arrFeedList[i]['id'], $arr_id)){
        $LeTVFeedList[] = $arrFeedList[i];
        $arr_id[] = $arrFeedList[i]['id'];
    }
}

从上面的算法中可以看到,上面的算法用了两个数组,两个循环,所以它的时间复杂度为O(n^2),空间复杂度为O(2n)。上面的算法,我们可以从in_array()入手,考虑下面的因素。

用数组的id作数组下标,来存储爬取到的数据值。

// 去重
$tmp_arr = array();
for ($i = 0; $i < min(count($arrFeedList),10); $i++){
    $tmp_arr[$arrFeedList[$i]['id']] = $arrFeedList[$i];
}
$arrLeTVFeedList = array();
foreach ($tmp_arr as $key => $value){
    $arrLeTVFeedList[] = $value;
}

这里用了两个循环,两个数组,时间复杂度是O(2n),空间复杂度是O(2n).

后来又对循环进行了优化,变成如下代码:

// 去重
$tmp_arr = array();
$arrLeTVFeedList = array();
foreach ($arrFeedList as $key => $value){
    if(!isset($tmp_arr[$key['id']])){
        $tmp_arr[$key['id']] = $value;
        $arrLeTVFeedList[] = $value;
    }
}

isset是速度要快于for循环,以上代码是最终版本

本文章为各位介绍关于php 去重累加的例子,希望这篇文章能够让各位了解到关于php 去重累加方法哦,希望文章对各位有帮助.

   
    /**
     * 数据去重累加
     *
     * @param $array
     * @param string $reference_str  参照str
     * @param string $accumulation_str  累加str
     * @return mixed
     */
    public function arrayHeavyAccumulation($array , $reference_str, $accumulation_str)
    {
        $unset = array();

        for ($i = 0; $i < count($array); $i++){
            for ($j = $i+1; $j  $value){
            unset($array[$value]);
        }

        return array_merge($array);
    }

标签:[!--infotagslink--]

您可能感兴趣的文章: