start()需要很长时间

Mys网站的工作速度非常缓慢(我对此没有任何想法)。 它基于Zend Application,我曾经制作过大约几十个这样的网站,所以我确信我的代码是可以的。

我在服务器上安装了xdebugger,试图分析它并猜测是什么? php :: session_start()花了48.675秒。 四十八点五秒! 这太不可思议了! 这可能是什么原因? 这是常见的操作,为什么它可以执行很长时间? 如何解决这种行为,配置编辑? 搜索谷歌,但没有找到好的答案(几乎在任何地方都有一个问题,但没有答案)。 感谢之前!

xdebugger分析结果


我的猜测是垃圾收集例程,它运行在本地session_start()函数内部。 也许你做了一些能够保留很多旧的会话文件的东西,比如改变了最长的生命时间? 或者,也许你已经决定将它们存储在数据库中是一个好主意,但忘了创建一个合适的索引? 本地GC例程stat()的每个会话文件都会检查是否到期。 如果建立了很多文件,这将非常耗时。

编辑帮助您进行调试 ,通过临时设置session.gc -perp来禁用垃圾收集:

session.gc-probability = 0

确保设置保持不变,我不知道zend框架可能在这里做什么。

PS在不知道原因的情况下很难提出修复建议。 我的答案旨在引导您找出原因。


session_start (会话存储在文件中)在PHP中被阻塞,因此如果您尝试为同一浏览器会话(AJAX或多个浏览器选项卡/窗口)启动多个服务器会话,则会出现此问题。 每个session_start都会等到其他会话关闭。

看到这里:http://konrness.com/php5/how-to-prevent-blocking-php-requests/

尝试从文件更改为会话的数据库存储。


我有这个问题,并且很惊讶没有人发布这个具体的回应。 它可能不是这样,但它值得检查。

PHP在页面正在处理时锁定会话文件,以便页面可以独占访问它。 考虑一下,sess_184c9aciqoc文件不是数据库,因此同一会话中的两个调用不能同时访问它。 所以如果你有很多Ajax电话,你可能会遇到“堵车”。 一旦你开始做高级脚本,这是一个需要注意的问题。 顺便说一句,这里是一个函数来存储一个时间戳数组。 我用这个算出会话开始是罪魁祸首:

//time function for benchmarking
if( function_exists('gmicrotime')){
    function gmicrotime($n=''){
        #version 1.1, 2007-05-09
        //store array of all calls
        global $mT;
        list($usec, $sec) = explode(' ',microtime());
        if(!isset($mT['_base_']))$mT['_base_']=$sec;
    $t=round((float)$usec + (float)(substr($sec,-4)),6);
    $mT['all'][]=$t;
    if($n){
        if(isset($mT['indexed'][$n])){
            //store repeated calls with same index.  If in a loop, add a $i if needed
            if(is_array($mT['indexed'][$n])){
                $mT['indexed'][$n][]=$t;
            }else{
                $mT['indexed'][$n]=array($mT['indexed'][$n],$t);
            }
        }else $mT['indexed'][$n]=$t;    
    }
    //return elapsed since last call (in the local array)
    $u=$mT['all'];
    if(count($u)>1){
        $mT['_total_']=$u[count($u)-1] - $u[0];
        return round(1000*($u[count($u)-1]-$u[count($u)-2]),6);
    }
}
gmicrotime('pageStart');
}

然后我打电话如下:

gmicrotime('beforeSessionStart');
session_start();
gmicrotime('afterSessionStart');

do_something_slow();
gmicrotime('afterSlowProcess');
//etc..
echo '<pre>';
print_r($mT);  

希望这有帮助!

链接地址: http://www.djcxy.com/p/85447.html

上一篇: start() takes VERY LONG TIME

下一篇: g++ giving errors where visual studio was happy