MYS网站运行很慢(我没有,为什么任何想法)。 它基于Zend的应用程序,我用来做大约几十这样的网站,所以我敢肯定,我的代码就可以了。
我安装在服务器xdebugger,试图剖析它,你猜怎么着? PHP ::在session_start()把48.675秒。 四十八年半秒! 这太不可思议了! 什么可能是什么原因呢? 这是常见的操作,它为什么能执行这么长时间? 如何解决这样的行为,这CONFIGS编辑? 搜索在谷歌,但没有发现很好的答案(几乎无处不有一个问题,但没有答案)。 由于在之前!
MYS网站运行很慢(我没有,为什么任何想法)。 它基于Zend的应用程序,我用来做大约几十这样的网站,所以我敢肯定,我的代码就可以了。
我安装在服务器xdebugger,试图剖析它,你猜怎么着? PHP ::在session_start()把48.675秒。 四十八年半秒! 这太不可思议了! 什么可能是什么原因呢? 这是常见的操作,它为什么能执行这么长时间? 如何解决这样的行为,这CONFIGS编辑? 搜索在谷歌,但没有发现很好的答案(几乎无处不有一个问题,但没有答案)。 由于在之前!
我的猜测是垃圾收集例程,它获取本机内运行session_start()
函数。 也许你已经做了一些保持周围很多老会议文件,如改变最大续航时间? 或者,也许你已经决定这将是一个好主意,将它们存储在数据库中,而忘记了创建一个合适的索引? 本机GC常规统计()的每一个会话文件来检查到期。 这是耗时的,如果有建立了很多文件。
编辑 :帮你,只用于调试 ,暂时禁止设置垃圾收集session.gc概率 :
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);
希望这是有帮助的!
另一种方法可能是你设置了一个大memory_limit
在php.ini中。
我这样做,上传巨大的MySQL转储到的phpMyAdmin和加载时间飙升,或许(如上面说的)很多的会议文件,现在PHP有剩余空间堆放。 默认为128M
,我想。 我翻了两番说。
避免这个问题的方法之一是要求PHP存储会话数据库表,而不是文件。
首先,我会给你几个环节,作为该解决方案真正的学分:
http://www.tonymarston.net/php-mysql/session-handler.html
http://shiflett.org/articles/storing-sessions-in-a-database
http://culttt.com/2013/02/04/how-to-save-php-sessions-to-a-database/
然后,代码实现,我从这些读数得出:
<?php
class TLB_Sessions_in_Database
{
private $debug;
private $dbc;
function __construct()
{
$this->debug = false;
session_set_save_handler(
array($this, '_open'),
array($this, '_close'),
array($this, '_read'),
array($this, '_write'),
array($this, '_destroy'),
array($this, '_clean')
);
}
function _open()
{
if( $this->debug ) echo '_open:'.PHP_EOL;
if( ($this->dbc = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD)) !== false )
{
$select_db = mysql_select_db(DB_NAME, $this->dbc);
$set_charset = mysql_set_charset(DB_CHARSET, $this->dbc);
if( $this->debug ) echo '- return: '.(( $select_db && $set_charset ) ? 'true' : 'false').PHP_EOL;
return( $select_db && $set_charset );
}
else
{
if( $this->debug ) echo '- error: '.mysql_error($this->dbc).PHP_EOL;
}
return( false );
}
function _close()
{
if( $this->debug ) echo '_close:'.PHP_EOL;
return( mysql_close($this->dbc) );
}
function _read($session_id)
{
if( $this->debug ) echo '_read:'.PHP_EOL;
$session_id = mysql_real_escape_string($session_id);
$sql = "SELECT `session_data` FROM `".DB_NAME."`.`php_sessions` WHERE `session_id` = '".$session_id."'";
if( $this->debug ) echo '- query: '.$sql.PHP_EOL;
if( ($result = mysql_query($sql, $this->dbc)) !== false )
{
if( !in_array(mysql_num_rows($result), array(0, false), true) )
{
$record = mysql_fetch_assoc($result);
return( $record['session_data'] );
}
}
else
{
if( $this->debug ) echo '- error: '.mysql_error($this->dbc).PHP_EOL;
}
return( '' );
}
function _write($session_id, $session_data)
{
if( $this->debug ) echo '_write:'.PHP_EOL;
$session_id = mysql_real_escape_string($session_id);
$session_data = mysql_real_escape_string($session_data);
//$sql = "REPLACE INTO `php_sessions` (`session_id`, `last_updated`, `session_data`) VALUES ('".$session_id."', '".time()."', '".$session_data."')";
$sql = "INSERT INTO `".DB_NAME."`.`php_sessions` (`session_id`, `date_created`, `session_data`) VALUES ('".$session_id."', NOW(), '".$session_data."') ON DUPLICATE KEY UPDATE `last_updated` = NOW(), `session_data` = '".$session_data."'";
if( ($result = mysql_query($sql, $this->dbc)) === false )
{
if( $this->debug ) echo '- error: '.mysql_error($this->dbc).PHP_EOL;
}
return( $result );
}
function _destroy($session_id)
{
if( $this->debug ) echo '_destroy:'.PHP_EOL;
$session_id = mysql_real_escape_string($session_id);
$sql = "DELETE FROM `".DB_NAME."`.`php_sessions` WHERE `session_id` = '".$session_id."'";
if( ($result = mysql_query($sql, $this->dbc)) === false )
{
if( $this->debug ) echo '- error: '.mysql_error($this->dbc).PHP_EOL;
}
return( $result );
}
function _clean($max)
{
if( $this->debug ) echo '_clean:'.PHP_EOL;
$sql = 'DELETE FROM `'.DB_NAME.'`.`php_sessions` WHERE `last_updated` < DATE_SUB(NOW(), INTERVAL '.$max.' SECOND)';
if( ($result = mysql_query($sql, $this->dbc)) === false )
{
if( $this->debug ) echo '- error: '.mysql_error($this->dbc).PHP_EOL;
}
return( $result );
}
}
new TLB_Sessions_in_Database();
结束。
如果你有在同一页面上的多个并发的Ajax调用这种情况可能会导致您的问题。
在我的情况下,它是不正确的内存缓存服务器设置在/etc/php.d/memcached.ini
这里是memcache的属性信息,并在这里是如何设置内存缓存中存储。
我只是有这个问题。 在session_start正在采取约5秒。
我的问题我已经宣布它上面的一些变量。
我搬到在session_start到顶部,现在只需几毫秒。