标题: 每次都load ini,很耗時,很不爽,怎麼讓它只load一次ini?
zoujinhe
新手上路
Rank: 1



UID 1388
精华 0
积分 0
帖子 7
翻译 0
原创 0
阅读权限 10
注册 2008-6-20
状态 离线
发表于 2008-7-2 19:06  资料  短消息  加为好友 
每次都load ini,很耗時,很不爽,怎麼讓它只load一次ini?

每個request都會load一次ini,硬盤io很慢啊,再說new那些Object也花很多時間的,用zend profiler看,60%的時間花在ini上。

PHP代码如下:

<?php
error_reporting
(E_ALL|E_STRICT);
date_default_timezone_set('Asia/Shanghai');
$ds DIRECTORY_SEPARATOR;//目录分隔符号
$ps PATH_SEPARATOR;//路径分隔符号

define('ABS_ROOT_PATH'realpath(dirname(__FILE__)));
define('REL_ROOT_PATH'substr($_SERVER['PHP_SELF'], strpos($_SERVER['PHP_SELF'],'/index.php')));

set_include_path('.'.PATH_SEPARATOR.'./library'.PATH_SEPARATOR.'./application/models/'.PATH_SEPARATOR.get_include_path());

require_once 
'Zend/Loader.php';

//自动加载类
Zend_Loader::registerAutoload();

//数据库配置
$dbParams = new Zend_Config_Ini('./config/config.ini','SysDB');
$db Zend_Db::factory($dbParams->adapter,$dbParams->toArray());
$db->query("set names {$dbParams->charset};");
Zend_Db_Table::setDefaultAdapter($db);
Zend_Registry::set('sysdb',$db);

//SMARTY配置
$smartyParams = new Zend_Config_Ini('./config/config.ini''SysTpl');
$smarty = new Custom_View_Smarty($smartyParams->toArray());
Zend_Registry::set('systpl',$smarty);

//全局定义
$sysinfoParams = new Zend_Config_Ini('./config/config.ini','SysGlobalInfo');
Zend_Registry::set('sysinfo',$sysinfoParams->toArray());

//初始控制器
$router = new Zend_Controller_Router_Rewrite();
$frontController Zend_Controller_Front::getInstance();
$frontController->setRouter($router);
$frontController->setControllerDirectory(array(
    
'default' => './application/controllers',

));
$frontController->throwExceptions(true);
$frontController->setParam('noViewRenderer',true); 
$frontController->setBaseUrl(REL_ROOT_PATH);

try{
    
$frontController->dispatch();
}catch(
Zend_Controller_Dispatcher_Exception $e){
    echo 
nl2br($e->__toString());
}
unset(
$db);
unset(
$smarty);
?>



顶部
fidy
新手上路
Rank: 1



UID 87
精华 1
积分 10
帖子 16
翻译 0
原创 1
阅读权限 10
注册 2007-6-18
状态 离线
发表于 2008-7-3 02:36  资料  短消息  加为好友  添加 fidy 为MSN好友 通过MSN和 fidy 交谈
//配置文件:
$patams = new Zend_Config_Ini('./config/config.ini');

//数据库配置
$dbParams = $patams->SysDB;


//SMARTY配置
$smartyParams = $patams->SysTpl;


//全局定义
$sysinfoParams = $patams->SysGlobalInfo;

顶部
zoujinhe
新手上路
Rank: 1



UID 1388
精华 0
积分 0
帖子 7
翻译 0
原创 0
阅读权限 10
注册 2008-6-20
状态 离线
发表于 2008-7-3 17:15  资料  短消息  加为好友 
楼上,你这个还不是每次都load了ini!!!

顶部
fidy
新手上路
Rank: 1



UID 87
精华 1
积分 10
帖子 16
翻译 0
原创 1
阅读权限 10
注册 2007-6-18
状态 离线
发表于 2008-7-4 03:22  资料  短消息  加为好友  添加 fidy 为MSN好友 通过MSN和 fidy 交谈
第一,我比你少load了两次ini
第二,我比你少new了两个对象
第三,除非你的配置参数不在硬盘上,而在内存里(写入memcache,严格地说也不能保证你只load一次ini),否则就要load文件和初始化对象
第四,你打那么多叹号啥意思,我欠过你钱还是咋的???

顶部
zoujinhe
新手上路
Rank: 1



UID 1388
精华 0
积分 0
帖子 7
翻译 0
原创 0
阅读权限 10
注册 2008-6-20
状态 离线
发表于 2008-7-4 10:17  资料  短消息  加为好友 
第四,你打那么多叹号啥意思,我欠过你钱还是咋的???

>>>>謝謝您的回答,不過老實說,你的回答並無任何參考價值!

顶部
fidy
新手上路
Rank: 1



UID 87
精华 1
积分 10
帖子 16
翻译 0
原创 1
阅读权限 10
注册 2007-6-18
状态 离线
发表于 2008-7-4 18:46  资料  短消息  加为好友  添加 fidy 为MSN好友 通过MSN和 fidy 交谈
在load ini的问题上,我的效率比你的快三倍,对你还没什么参考价值,我很遗憾,或许你对自己load三次ini有更好的解释,愿闻其详
即便使用memcache,加载相关类文件造成的io开销也不比loadini低,所以没有更好的方案
如果自己不动脑子,任何回答都不会有参考价值

顶部
geel
新手上路
Rank: 1



UID 1469
精华 0
积分 0
帖子 2
翻译 0
原创 0
阅读权限 10
注册 2008-7-5
状态 离线
发表于 2008-7-5 03:43  资料  短消息  加为好友 
第一点:
$ps = PATH_SEPARATOR;//路径分隔符号
set_include_path('.'.PATH_SEPARATOR.'./library'.PATH_SEPARATOR.'./application/models/'.PATH_SEPARATOR.get_include_path());
貌似你把 PATH_SEPARATOR 赋值给了$ps 是为了方便用,但是接下来又用了比较复杂的PATH_SEPARATOR
$ds $ps都没有用到,这么做是为了什么?

第二点:
autoload不怕影响性能吗

第三点:
define('REL_ROOT_PATH', substr($_SERVER['PHP_SELF'], 0 , strpos($_SERVER['PHP_SELF'],'/index.php')));
一个dirname就可以搞定的,写这么麻烦干嘛呢

第四点:
require_once 'Zend/Loader.php';
你include Zend/Controller/Front.php之后,Loader就被加载了,改成require_once 'Zend/Controller/Front.php',少写一句话不好吗

第五点:
你同一个配置文件里的东西,为什么要分3次读文件并且让zend::config来解析三次呢,一次不好吗

第六点:
给zend_register里set了3个配置段,建立了3个引用,要是那么追求性能,为什么不set一个呢,为了以后书写方便吗

第七点:
$router = new Zend_Controller_Router_Rewrite();
$frontController = Zend_Controller_Front::getInstance();
$frontController->setRouter($router);
你没对router做任何特殊处理,为什么要手工new一下呢,frontcontroller会自动实例化rewrite的呀

第八点:
$dbParams = new Zend_Config_Ini('./config/config.ini','SysDB');
$db = Zend_Db::factory($dbParams->adapter,$dbParams->toArray());
$db->query("set names {$dbParams->charset};");
Zend_Db_Table::setDefaultAdapter($db);
你所有的action都需要db吗,如果那么在意性能,为什么不需要的地方才初始化呢

综上所述:你只看到了profiler的数据,却没分析怎么优化,对细节也没有把握。你的题目是怎么只load一次,人家也告诉你怎么load一次了,你又说不对,没办法了。

第一次上phpeye,刚用zf,忍不住多说两句,多包涵

[ 本帖最后由 geel 于 2008-7-5 03:58 编辑 ]

顶部
月黑风高
新手上路
Rank: 1



UID 282
精华 0
积分 0
帖子 2
翻译 0
原创 0
阅读权限 10
注册 2007-8-14
状态 离线
发表于 2008-7-8 10:17  资料  短消息  加为好友 
除非是helloworld,我不相信代码60%时间会在load ini上.

顶部
zoujinhe
新手上路
Rank: 1



UID 1388
精华 0
积分 0
帖子 7
翻译 0
原创 0
阅读权限 10
注册 2008-6-20
状态 离线
发表于 2008-7-9 15:34  资料  短消息  加为好友 
geel:
  Sorry,這段代碼是從一個教學貼抄過來的,沒有修改!

另外:根據java,asp,aspx的經驗,都有application級別的變量(php沒有),並且有static(真正全局共用),所以我可以判斷ini是否加載過了,db連接是否有初始化過了,例:

if (!app['loaded']){
  // loadini
  // init db
}

php如何實現上面的做法?

顶部
jasonqi
PHPEye Developer
Rank: 8Rank: 8



UID 275
精华 0
积分 0
帖子 74
翻译 0
原创 0
阅读权限 1
注册 2007-8-11
状态 离线
发表于 2008-7-11 12:59  资料  短消息  加为好友 


QUOTE:
原帖由 zoujinhe 于 2008-7-9 15:34 发表
geel:
  Sorry,這段代碼是從一個教學貼抄過來的,沒有修改!

另外:根據java,asp,aspx的經驗,都有application級別的變量(php沒有),並且有static(真正全局共用),所以我可以判斷ini是否加載過了,db連接是否有初始化過了,例:

if (! ...



PHP代码如下:
public function getDb()
    {
        if (
null === $this->_services['db']) {
            
$config $this->config->database;
            
$this->_services['db'] = Zend_Db::factory($config->type$config);
        }

        return 
$this->_services['db'];
    }




顶部
 


PHPEye开源社区


当前时区 GMT+8, 现在时间是 2008-12-3 07:31

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.028456 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - PHPEye开源社区 - Archiver