ThinkPHP 框架,redis不能用,extension_loaded('redis') 返回fal
$redis = new \Redis();
$redis->connect('127.0.0.1',6379);
符號'\'不能省
php extension 哪些
php extension就是php的擴展,這個擴展是有很多的,如:
HTTP extension for PHP旨在為PHP應用提供一個方便而強大的功能擴展 。它簡化了處理的HTTP網址,日期,重定向,HTTP 頭信息,消息,客戶的首選語言和字符集,以及提供便捷的數據高速緩存和恢復的方法。它提供了強大的功能,如果和 CURL 一起編譯的話將提供更強大的請求處理功能。PHP5或者更新版本提供并行請求處理;
extension_loaded—檢查一個擴展是否已經加載,說明extension_loaded()使用內置擴展名稱來測試一個擴展是否有效。 大多數內置擴展名稱是小寫的,但也有擴展使用大寫字符。 在 PHP 5 之前,此函數以大小寫敏感的方式對比名稱;
這里我給你看下小部分的截圖,如果你有興趣可以自行去下載一個php的安裝包來看:
PHP可否調用動態鏈接庫
當php.ini中的enable_dl選項為on時,可以使用下面這個函數來加載dll文件:
int dl ( string library ),但是當系統處于安全模式時,即使enable_dl為on,也無法使用.
<?php
// Example loading an extension bad on OS
if (!extension_loaded('sqlite')) {
if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN')) {
dl('php_sqlite.dll');
} el {
dl('sqlite.so');
}
}
// Or, the PHP_SHLIB_SUFFIX constant is available as of PHP 4.3.0
if (!extension_loaded('sqlite')) {
$prefix = (PHP_SHLIB_SUFFIX == 'dll') ? 'php_' : '';
dl($prefix . 'sqlite.' . PHP_SHLIB_SUFFIX);
}
?>
這屬于動態加載dll文件,還有一種方法就是,將你的dll文件放到php的ext目錄下,然后在你的php.ini文件里面找到一大堆:extension=php_xxxx.dll那里,找個空行,按照這個寫法寫上去,注意前面不要有";"號.重啟apache后,就可以調用里面的東西了.
PHP加載IMAP模塊問題
extension_loaded("imap");
用get_extension_funcs("imap"); 函數進行測試,若返回boolean值為空,說明php_imap.dll文件沒有加載進去,
PHP的gzip壓縮方法 ,為什么壓縮了反而更慢了。尤其瀏覽器緩存js以后
壓縮網頁以后,是減少網絡傳輸時間、增加服務器和瀏覽器的CPU占用時間,總時間的影響要區別情況,如果你用高級電腦、慢速網絡,那么肯定是壓縮了的好,如果是高速網絡、低配置電腦,那么肯定是不壓縮的好。
是否采用壓縮,一般是網站管理員決定,網站管理員看服務器的瓶頸是在流量上,還是CPU、內存占用上,根據情況決定是否壓縮,以及壓縮的程度。
另外,測試的網頁大小可能不準確,許多網絡工具是顯示還原后的大小。
如何緩存一個block
magento是基于zend framework的,所以cache的使用基本也繼承了他的一些特性。我們要知道緩存中有幾個重要的概念:
數據本身;數據的標識;緩存生命期;緩存操作接口;
Zend_Cache 的使用比較簡單, 它可以把數據保存到 File, Memcache, SQLite 等介質(稱為后端, Backend)中. 還有前端(Frontend), 主要用來對要緩存的數據進行轉換, 如序列化.
Zend Framework 后端主要有
apc (Zend_Cache_Backend_Apc),
files (Zend_Cache_Backend_File),
memcached (Zend_Cache_Backend_Memcached)
and some more..
Magento 增加了幾種:
databa (Varien_Cache_Backend_Databa)
eaccelarator (Varien_Cache_Backend_Eaccelarator).
為了更深入的理解magento cache,本文就以緩存某個block為例,分析下他的工作流程和原理。在magento中,所有的block都是繼承自Mage_Core_Block_Abstract,當輸出某個block到頁面時,會調用到這個類的toHtml方法,該方法中有如下code片段:
[php] view plaincopy
$html = $this->_loadCache();//加載緩存,假設為第一次加載,還沒有被緩存過,進入if代碼段
if ($html === fal) {
$translate = Mage::getSingleton('core/translate');
/** @var $translate Mage_Core_Model_Translate */
if ($this->hasData('translate_inline')) {
$translate->tTranslateInline($this->getData('translate_inline'));
}
$this->_beforeToHtml();
$html = $this->_toHtml();
$this->_saveCache($html);//這句代碼很簡單,但卻在內部完成了大量的工作,下面進入它內部深入分析
if ($this->hasData('translate_inline')) {
$translate->tTranslateInline(true);
}
}
繼續看本類中的function _saveCache($data)
[php] view plaincopy
function _saveCache($data)
/**
* Save block content to cache storage
*
* @param string $data
* @return Mage_Core_Block_Abstract
*/
protected function _saveCache($data)
{
if (is_null($this->getCacheLifetime()) || !Mage::app()->uCache(lf::CACHE_GROUP)) {
return fal;
}
$cacheKey = $this->getCacheKey();
/** @var $ssion Mage_Core_Model_Session */
$ssion = Mage::getSingleton('core/ssion');
$data = str_replace(
$ssion->getSessionIdQueryParam() . '=' . $ssion->getEncryptedSessionId(),
$this->_getSidPlaceholder($cacheKey),
$data
);
//可以肯定進入了Mage_Core_Model_App 的function saveCache
Mage::app()->saveCache($data, $cacheKey, $this->getCacheTags(), $this->getCacheLifetime());
return $this;
}
打開Mage_Core_Model_App 的function saveCache
[php] view plaincopy
/**
* Saving cache data
*
* @param mixed $data
* @param string $id
* @param array $tags
* @return Mage_Core_Model_App
*/
public function saveCache($data, $id, $tags=array(), $lifeTime=fal)
{
$this->_cache->save($data, $id, $tags, $lifeTime);
return $this;
}
可以看到$this->_cache這個對象調用了save,繼續看$this->_cache到底屬于哪個類的實例,在本類中找到protected function _initCache(),code如下:
[php] view plaincopy
/**
* Initialize application cache instance
*
* @return Mage_Core_Model_App
*/
protected function _initCache()
{
$this->_isCacheLocked = true;
$options = $this->_config->getNode('global/cache');
if ($options) {
$options = $options->asArray();
} el {
$options = array();
}
//實例化Mage_Core_Model_Cache,并傳入參數$options
$this->_cache = Mage::getModel('core/cache', $options);
$this->_isCacheLocked = fal;
return $this;
}
上面Mage::getModel('core/cache', $options)的$options是app/etc/local.xml中節點global/cache下的配置,假設ocal.xml如下:
[html] view plaincopy
<config>
<global>
<cache>
<backend>apc</backend>
<slow_backend>File</slow_backend>
<auto_refresh_fast_cache>1</auto_refresh_fast_cache>
<prefix>MYSHOP_</prefix>
<default_priority>10</default_priority>
</cache>
</global>
</config>
能看到$this->_cache是實例化了實例化Mage_Core_Model_Cache,所以Mage_Core_Model_App 中的$this->_cache->save($data, $id, $tags, $lifeTime)即調用的Mage_Core_Model_Cache的function save。進入Mage_Core_Model_Cache的save:
[php] view plaincopy
/**
* Save data
*
* @param string $data
* @param string $id
* @param array $tags
* @param int $lifeTime
* @return bool
*/
public function save($data, $id, $tags=array(), $lifeTime=null)
{
/**
* Add global magento cache tag to all cached data exclude config cache
*/
if (!in_array(Mage_Core_Model_Config::CACHE_TAG, $tags)) {
$tags[] = Mage_Core_Model_App::CACHE_TAG;
}
return $this->_frontend->save((string)$data, $this->_id($id), $this->_tags($tags), $lifeTime);
}
可以看到$this->_frontend->save(...)這句,那么這里的_frontend是什么呢?繼續看此類的構造函數(只列出部分code):
[php] view plaincopy
$backend = $this->_getBackendOptions($options);
$frontend = $this->_getFrontendOptions($options);
$this->_frontend =Zend_Cache::factory('Varien_Cache_Core', $backend['type'], $frontend, $backend['options'],true, true, true);
沒錯_frontend就是類Varien_Cache_Core的一個實例,因為Varien_Cache_Core是繼承自Zend_Cache_Core,所以這里_frontend實際上實例化的是Zend_Cache_Core,即調用的是Zend_Cache_Core的save,再繼續分析,打開Zend_Cache_Core,找到function save它里面包含了如下代碼片段:
[php] view plaincopy
if (($this->_extendedBackend) && ($this->_backendCapabilities['priority'])) {
$result = $this->_backend->save($data, $id, $tags, $specificLifetime, $priority);
} el {
$result = $this->_backend->save($data, $id, $tags, $specificLifetime);
}
可以看到這里實際上又變成了_backend的來調用的save,(開頭我們已經說了backend是用來保存數據的),那么這里_backend到底是哪個backend(file,db,apc...)呢?繼續分析,在這個類里面有一個方法tBackend:
[php] view plaincopy
/**
* Set the backend
*
* @param Zend_Cache_Backend $backendObject
* @throws Zend_Cache_Exception
* @return void
*/
public function tBackend(Zend_Cache_Backend $backendObject)
{
$this->_backend= $backendObject;
// some options (listed in $_directivesList) have to be given
// to the backend too (even if they are not "backend specific")
$directives = array();
foreach (Zend_Cache_Core::$_directivesList as $directive) {
$directives[$directive] = $this->_options[$directive];
}
$this->_backend->tDirectives($directives);
if (in_array('Zend_Cache_Backend_ExtendedInterface', class_implements($this->_backend))) {
$this->_extendedBackend = true;
$this->_backendCapabilities = $this->_backend->getCapabilities();
}
}
里面有$this->_backend= $backendObject這句,$backendObject是傳入的參數,那么是何時調用的tBackend呢?實際上,這個方法是在上邊Mage_Core_Model_Cache里的save方法中調用$this->_frontend = Zend_Cache::factory('Varien_Cache_Core', $backend['type'], $frontend, $backend['options'], true, true, true);這句的的時候,已經被調用了,可以打開Zend_Cache的factory 方法查看,會發現有一句$frontendObject->tBackend($backendObject);參數$backendObject是factory傳入的參數$backend['type'],$backend['type']到底是什么呢,我們在Mage_Core_Model_Cache的構造函數中看到$backend=$this->_getBackendOptions($options)這句,所以$backend是在本類的_getBackendOptions中被設置的,找到_getBackendOptions,code如下:
[php] view plaincopy
/**
* Get cache backend options. Result array contain backend type ('type' key) and backend options ('options')
*
* @param array $cacheOptions
* @return array
*/
protected function _getBackendOptions(array $cacheOptions)
{
$enable2levels = fal;
$type = ist($cacheOptions['backend']) ? $cacheOptions['backend'] : $this->_defaultBackend;
if (ist($cacheOptions['backend_options']) && is_array($cacheOptions['backend_options'])) {
$options = $cacheOptions['backend_options'];
} el {
$options = array();
}
$backendType = fal;
switch (strtolower($type)) {
ca 'sqlite':
if (extension_loaded('sqlite') && ist($options['cache_db_complete_path'])) {
$backendType = 'Sqlite';
}
break;
ca 'memcached':
if (extension_loaded('memcache')) {
if (ist($cacheOptions['memcached'])) {
$options = $cacheOptions['memcached'];
}
$enable2levels = true;
$backendType = 'Memcached';
}
break;
ca 'apc':
if (extension_loaded('apc') && ini_get('apc.enabled')) {
$enable2levels = true;
$backendType = 'Apc';
}
break;
ca 'xcache':
if (extension_loaded('xcache')) {
$enable2levels = true;
$backendType = 'Xcache';
}
break;
ca 'eaccelerator':
ca 'varien_cache_backend_eaccelerator':
if (extension_loaded('eaccelerator') && ini_get('eaccelerator.enable')) {
$enable2levels = true;
$backendType = 'Varien_Cache_Backend_Eaccelerator';
}
break;
ca 'databa':
$backendType = 'Varien_Cache_Backend_Databa';
$options = $this->getDbAdapterOptions();
break;
default:
if ($type != $this->_defaultBackend) {
try {
if (class_exists($type, true)) {
$implements = class_implements($type, true);
if (in_array('Zend_Cache_Backend_Interface', $implements)) {
$backendType = $type;
}
}
} catch (Exception $e) {
}
}
}
if (!$backendType) {
$backendType = $this->_defaultBackend;
foreach ($this->_defaultBackendOptions as $option => $value) {
if (!array_key_exists($option, $options)) {
$options[$option] = $value;
}
}
}
$backendOptions = array('type' => $backendType, 'options' => $options);
if ($enable2levels) {
$backendOptions = $this->_getTwoLevelsBackendOptions($backendOptions, $cacheOptions);
}
return $backendOptions;
}