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;
}