分类: PHP

php hex加密解密工具方法

没有评论

2014 年 05 月 14 日 at 上午 9:35分类:PHP

//Hex(Hex(Md5((原文+密钥).getBytes(“utf-8”))).getBytes(“utf-8”))
function String2Hex($string){
    $hex='';
    for ($i=0; $i < strlen($string); $i++){
        $hex .= dechex(ord($string[$i]));
    }
    return $hex;
}

function Hex2String($hex){
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2){
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}

// example:

$hex = String2Hex("test sentence...");

$data = array(
    'appId' => 'SHAN-GUO-CHI-BI', 
    'data' =>'{"appId":"SHAN-GUO-CHI-BI","cardNo":"6006012000000001"}', 
    'sig'=>'4331443139334331313645464642444544364334343742374236364335454243',
);

$key = '111111111111111111111111';

$data['sig'] = String2Hex(strtoupper(md5($data['data'] . $key)));

PHP与JAVA或者C#的3DES加密代码

没有评论

2014 年 05 月 12 日 at 下午 1:12分类:PHP

<?php
/**
 * 3DES加密处理类
 *
 * @author fbbin <fbbin@gmail.com>
 * @version 1.0 beta
 * @created 2013/04/26
 * @logs
 */
class SecretUtilTools    
{       
    //加密算法         
    function encryptForDES($input,$key)     
    {           
       $size = mcrypt_get_block_size('des','ecb');    
       $input = $this->pkcs5_pad($input, $size);    
       $td = mcrypt_module_open(MCRYPT_3DES, '', 'ecb', '');    
       $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);    
       @mcrypt_generic_init($td, $key, $iv);    
       $data = mcrypt_generic($td, $input);    
       mcrypt_generic_deinit($td);    
       mcrypt_module_close($td);    
       $data = base64_encode($data);    
       return $data;    
    }     
    //解密算法        
    function decryptForDES($encrypted,$key)    
    {           
       $encrypted = base64_decode($encrypted);    
       $td = mcrypt_module_open(MCRYPT_3DES,'','ecb','');     
       //使用MCRYPT_DES算法,cbc模式    
       $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);    
       $ks = mcrypt_enc_get_key_size($td);    
       @mcrypt_generic_init($td, $key, $iv);    
       //初始处理                   
       $decrypted = mdecrypt_generic($td, $encrypted);    
       //解密    
       mcrypt_generic_deinit($td);    
       //结束                 
       mcrypt_module_close($td);    
       $y=$this->pkcs5_unpad($decrypted);    
       return $y;       
    }  
               
    function pkcs5_pad ($text, $blocksize)     
    {           
       $pad = $blocksize - (strlen($text) % $blocksize);    
       return $text . str_repeat(chr($pad), $pad);    
    }   
          
    function pkcs5_unpad($text)     
    {           
       $pad = ord($text{strlen($text)-1});    
       if ($pad > strlen($text))    
       {    
           return false;    
       }    
       if (strspn($text, chr($pad), strlen($text) - $pad) != $pad)    
       {    
          return false;    
       }    
       return substr($text, 0, -1 * $pad);    
    }    
}

PHP与.NET的3DES加密代码

没有评论

2014 年 05 月 12 日 at 下午 1:10分类:PHP

<?php
if (! function_exists('mcrypt_generic_init')) {
	echo ('Snda needs the mcrypt_generic_init PHP extension.');
	exit();
}
if (! function_exists('mcrypt_module_open')) {
	echo ('Snda needs the mcrypt_module_open PHP extension.');
	exit();
}

class Crypt3Des {
  /**
   * 使用3DES加密源数据
   * @param string $oriSource 源数据
   * @param string $key       密钥
   * @param string $defaultIV 加解密向量
   * @return string $result   密文
   */
  public function encryptByTDES($oriSource, $key, $defaultIV='') {
    $key = base64_decode ( $key ); //结果为24位
    $iv = base64_decode ( $defaultIV ); //结果为8位
    $oriSource = $this->addPKCS7Padding ( $oriSource );
    $td = mcrypt_module_open ( MCRYPT_3DES, '', MCRYPT_MODE_ECB, '' );
    @mcrypt_generic_init ( $td, $key, $iv );
    $result = mcrypt_generic ( $td, $oriSource );
    mcrypt_generic_deinit ( $td );
    mcrypt_module_close ( $td );
    $result = base64_encode ( $result );
    return $result;
  }

  /**
   * 使用3DES解密密文
   * @param string $encryptedData 密文
   * @param string $key           密钥
   * @param string $defaultIV     加解密向量
   * @return string $result       解密后的原文
   */
  public function decryptByTDES($encryptedData, $key, $defaultIV) {
    $key = base64_decode ( $key ); //结果为24位
    $iv = base64_decode ( $defaultIV ); //结果为8位
    $encryptedData = base64_decode ( $encryptedData );
    $td = mcrypt_module_open ( MCRYPT_3DES, '', MCRYPT_MODE_CBC, '' );
    mcrypt_generic_init ( $td, $key, $iv );
    $result = mdecrypt_generic ( $td, $encryptedData );
    mcrypt_generic_deinit ( $td );
    mcrypt_module_close ( $td );
    $result = $this->stripPKSC7Padding ( $result );
    return $result;
  }

  /**
   * 为字符串添加PKCS7 Padding
   * @param string $source    源字符串
   */
  private function addPKCS7Padding($source) {
    $block = mcrypt_get_block_size ( 'tripledes', MCRYPT_MODE_ECB );
    $pad = $block - (strlen ( $source ) % $block);
    if ($pad <= $block) {
      $char = chr ( $pad );
      $source .= str_repeat ( $char, $pad );
    }
    return $source;
  }

  /**
   * 去除字符串末尾的PKCS7 Padding
   * @param string $source    带有padding字符的字符串
   */
  public function stripPKSC7Padding($source) {
    $block = mcrypt_get_block_size ( 'tripledes', MCRYPT_MODE_ECB );
    $char = substr ( $source, - 1, 1 );
    $num = ord ( $char );
    if ($num > 8) {
      return $source;
    }
    $len = strlen ( $source );
    for($i = $len - 1; $i >= $len - $num; $i --) {
      if (ord ( substr ( $source, $i, 1 ) ) != $num) {
        return $source;
      }
    }
    $source = substr ( $source, 0, - $num );
    return $source;
  }
}

?>

根据IP库读取IP信息

没有评论

2014 年 01 月 26 日 at 下午 5:20分类:PHP

function getIp($ip) {
    $ip1num = 0;
    $ip2num = 0;
    $ipAddr1 = "";
    $ipAddr2 = "";
    $dat_path = './qqwry.dat';
    if (!preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) {
        return 'IP Address Error';
    }
    if (!$fd = @fopen($dat_path, 'rb')){
        return 'IP date file not exists or access denied';
    }
    $ip = explode('.', $ip);
    $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
    $DataBegin = fread($fd, 4);
    $DataEnd = fread($fd, 4);
    $ipbegin = implode('', unpack('L', $DataBegin));
    if ($ipbegin < 0) {
        $ipbegin += pow(2, 32);
    }
    $ipend = implode('', unpack('L', $DataEnd));
    if ($ipend < 0) {
        $ipend += pow(2, 32);
    }
    $ipAllNum = ($ipend - $ipbegin) / 7 + 1;
    $BeginNum = 0;
    $EndNum = $ipAllNum;
    while ($ip1num > $ipNum || $ip2num < $ipNum) {
        $Middle = intval(($EndNum + $BeginNum) / 2);
        fseek($fd, $ipbegin + 7 * $Middle);
        $ipData1 = fread($fd, 4);
        if (strlen($ipData1) < 4) {
            fclose($fd);
            return 'System Error';
        }
        $ip1num = implode('', unpack('L', $ipData1));
        if ($ip1num < 0) {
            $ip1num += pow(2, 32);
        }
        if ($ip1num > $ipNum) {
            $EndNum = $Middle;
            continue;
        }
        $DataSeek = fread($fd, 3);
        if (strlen($DataSeek) < 3) {
            fclose($fd);
            return 'System Error';
        }
        $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
        fseek($fd, $DataSeek);
        $ipData2 = fread($fd, 4);
        if (strlen($ipData2) < 4) {
            fclose($fd);
            return 'System Error';
        }
        $ip2num = implode('', unpack('L', $ipData2));
        if ($ip2num < 0) {
            $ip2num += pow(2, 32);
        }
        if ($ip2num < $ipNum) {
            if ($Middle == $BeginNum) {
                fclose($fd);
                return 'Unknown';
            }
            $BeginNum = $Middle;
        }
    }
    $ipFlag = fread($fd, 1);
    if ($ipFlag == chr(1)) {
        $ipSeek = fread($fd, 3);
        if (strlen($ipSeek) < 3) {
            fclose($fd);
            return 'System Error';
        }
        $ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
        fseek($fd, $ipSeek);
        $ipFlag = fread($fd, 1);
    }
    if ($ipFlag == chr(2)) {
        $AddrSeek = fread($fd, 3);
        if (strlen($AddrSeek) < 3) {
            fclose($fd);
            return 'System Error'; 
        }
        $ipFlag = fread($fd, 1);
        if ($ipFlag == chr(2)) {
            $AddrSeek2 = fread($fd, 3);
            if (strlen($AddrSeek2) < 3) {
                fclose($fd);
                return 'System Error';
            }
            $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
            fseek($fd, $AddrSeek2);
        } else {
            fseek($fd, -1, SEEK_CUR);
        }
        while (($char = fread($fd, 1)) != chr(0)) {
            $ipAddr2 .= $char;
        }
        $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
        fseek($fd, $AddrSeek);
        while (($char = fread($fd, 1)) != chr(0)) {
            $ipAddr1 .= $char;
        }
    } else {
        fseek($fd, -1, SEEK_CUR);
        while (($char = fread($fd, 1)) != chr(0)) {
            $ipAddr1 .= $char;
        }
        $ipFlag = fread($fd, 1);
        if ($ipFlag == chr(2)) {
            $AddrSeek2 = fread($fd, 3);
            if (strlen($AddrSeek2) < 3) {
                fclose($fd);
                return 'System Error';
            }
            $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
            fseek($fd, $AddrSeek2);
        } else {
            fseek($fd, -1, SEEK_CUR);
        }
        while (($char = fread($fd, 1)) != chr(0)) {
            $ipAddr2 .= $char;
        }
    }
    fclose($fd);
    if (preg_match('/http/i', $ipAddr2)) {
        $ipAddr2 = '';
    }
    $ipaddr = "$ipAddr1 $ipAddr2";
    $ipaddr = preg_replace('/CZ88.NET/is', '', $ipaddr);
    $ipaddr = preg_replace('/^s*/is', '', $ipaddr);
    $ipaddr = preg_replace('/s*$/is', '', $ipaddr);
    if (preg_match('/http/i', $ipaddr) || $ipaddr == '') {
        $ipaddr = 'Unknown';
    }
    return $ipaddr;
}


echo getIp('60.191.37.34');

IP地址库文件下载地址:戳这里

让laravel的cache支持用connection选择redis服务

没有评论

2014 年 01 月 10 日 at 下午 2:33分类:PHP

前两篇文章都有提到这个cache和session选择redis作为存储机制的时候遇到的一些问题,今天这里着重说明下。
先看下我的database.php中关于redis的配置:

    /*
	|--------------------------------------------------------------------------
	| Redis Databases
	|--------------------------------------------------------------------------
	|
	| Redis is an open source, fast, and advanced key-value store that also
	| provides a richer set of commands than a typical key-value systems
	| such as APC or Memcached. Laravel makes it easy to dig right in.
	|
	*/
	'redis' => array(
		'cluster' => false,
		'default' => array(
			'host'     => '192.168.1.120',
			'port'     => 6379,
			'database' => 0,
		),
		'cache' => array(
			'host'     => '192.168.1.120',
			'port'     => 6379,
			'database' => 1,
		),
		'session' => array(
			'host'     => '192.168.1.120',
			'port'     => 6379,
			'database' => 2,
		),
	),

我这么配置的意图就是想在缓存的时候使用cache这个配置项,session的数据存储在session这个配置项。
那么我们先来看下我在app/config/cache.php中的相关配置

   'driver' => 'redis',
    //.......
   'path' => storage_path().'/cache',
	/*
	|--------------------------------------------------------------------------
	| Database Cache Connection
	|--------------------------------------------------------------------------
	|
	| When using the "database" cache driver you may specify the connection
	| that should be used to store the cached items. When this option is
	| null the default database connection will be utilized for cache.
	|
	*/
	'connection' => 'cache',

然后再来看下我在app/config/session.php中的相关配置

    'driver' => 'redis',
    //.......
    'files' => storage_path().'/sessions',
	/*
	|--------------------------------------------------------------------------
	| Session Database Connection
	|--------------------------------------------------------------------------
	|
	| When using the "database" session driver, you may specify the database
	| connection that should be used to manage your sessions. This should
	| correspond to a connection in your "database" configuration file.
	|
	*/
	'connection' => 'session',

这里我把两者的驱动都设置为redis。
经过对以上的设置进行测试,发现一个问题:session的数据可以正常存储到指定的服务中,而cache的数据并没有按照预期的进行了存储,而是存储在了session的服务中。这是为什么呢?请继续往下看。
现在我们换种方法,我们稍微修改下上面的配置,我们把session的驱动改成非redis,比如memcache等,这时我们再进行测试,效果如下:
缓存的数据存储到了default上面,并非我们期望的cache服务。这又是为什么呢?
通过上面我们发现了两个问题,暂且按顺序叫问题A和问题B吧。
这里我们先来解决问题B。
问题B的产生原因是laravel的cache并不支持redis的connection(也就是说当缓存的驱动是redis时,connection的设置没有意义的),只有database驱动时才支持,那么我们怎么改,才能支持呢?,修改起来很简单。
既然是cache那么肯定找cacheManager了: Laravel/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php
修改一下方法的代码为一下:

    /**
	 * Create an instance of the Redis cache driver.
	 *
	 * @return \Illuminate\Cache\RedisStore
	 */
	protected function createRedisDriver()
	{
		$redis = $this->app['redis'];
		// 增加一行获取cache connection值的代码
		$connection = $this->app['config']['cache.connection'];
		// 为RedisStore设置第三个参数
		return $this->repository(new RedisStore($redis, $this->getPrefix(), $connection));
	}

OK,改完了,是不是很简单呢。
这样子一改,就能解决我们的问题B,可以保证当我们的cache的驱动为redis时,缓存的数据是存在connection(cache)指定的服务中的。
那么我们这样子改了之后能否解决A问题呢?很抱歉,不能!!!
那按照酱紫我测试了下,结果还是跟上面没改之前的结果一样(session的数据可以正常存储到指定的服务中,而cache的数据并没有按照预期的进行了存储,而是存储在了session的服务中。)
目前我还没有发现有好的解决方案,为什么,请看下面分析。
其实我们大家都知道,session其实也一种缓存,那么既然是一种缓存,那么肯定是按照缓存的流程来处理的(其实laravel的部分session驱动(redis,memcache,memcached)走的就是缓存的存储流程)
具体来看代码:
文件是:Laravel/vendor/laravel/framework/src/Illuminate/Session/SessionManager.php

    /**
	 * Create an instance of the Redis session driver.
	 *
	 * @return \Illuminate\Session\Store
	 */
	protected function createRedisDriver()
	{
                // 这里会设置当前redis的connection为cache
		$handler = $this->createCacheHandler('redis');
                // 这里会设置当前redis的connection为session(也就是说覆盖了上面的)
		$handler->getCache()->getStore()->setConnection($this->app['config']['session.connection']);
		return $this->buildSession($handler);
	}

这段代码是在应用启动的时候通过booting callbacks启动session时调用的一个方法,这个方法的功能是创建一个redis的session驱动。
我们不妨看下createCacheHandler这个方法:

    /**
	 * Create the cache based session handler instance.
	 *
	 * @param  string  $driver
	 * @return \Illuminate\Session\CacheBasedSessionHandler
	 */
	protected function createCacheHandler($driver)
	{
		$minutes = $this->app['config']['session.lifetime'];
                // 这里最终会调用下面的CacheManager的createRedisDriver方法
		return new CacheBasedSessionHandler($this->app['cache']->driver($driver), $minutes);
	}

我们来看下CacheManager的createRedisDriver方法
文件是: Laravel/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php

    /**
	 * Create an instance of the Redis cache driver.
	 *
	 * @return \Illuminate\Cache\RedisStore
	 */
	protected function createRedisDriver()
	{
		$redis = $this->app['redis'];
		
		$connection = $this->app['config']['cache.connection'];
		// 这里我们设置我们cache的redis connection
		return $this->repository(new RedisStore($redis, $this->getPrefix(), $connection));
	}

这段代码是我们改过之后的代码,但是没关系。通过上面的分析,我们发现,其实在cache和session同时使用一个驱动的时候最终的驱动是由session的配置文件中的connection值决定的,因为它覆盖了cache设定的驱动值。那么造成这个问题的原因就是我们上面说的,session的所有数据处理是根据cache的流程处理的,因为session也是一种cache。=.=
其实这个要说是个问题,其实也是个问题,因为它没有按照我们的要求进行处理。
要是不是个问题,其实也不是个问题,因为session从某种意义上来说也是缓存,当然后面设置的覆盖了前面设置的。
那么有没有办法解决呢?提供两个侧面的解决方案:
1:两者不要同时使用一种驱动,可以交替者。比如cache用memcache,session用redis等。
2:就是用上次我提到的方案:

$redisCache = App::make('cache'); // Assumes "redis" set as your cache
$redisCache->setConnection('cache'); // Your redis cache connection
$redisCache->put('testtCacheIndex', 'fbbinValue', 10000);

// 或者

$redis = Redis::connection('cache');
$redis->set('fbbin', 'fbbinValue');
var_dump($redis->get('fbbin'))

让laravel支持memcache

一条评论

2014 年 01 月 09 日 at 下午 10:13分类:PHP

默认laravel框架在cache和session方面是不支持memcache的,他提供了一个memcache升级版memcached,但是我们在本地开发的时候,这个拓展很难找到,而memcache却很方便,于是今天看了下源代码,修改了部分东西,让laravel在cache和session方面完美支持memcache,具体修改如下:
1:找到这个文件:
Laravel/vendor/laravel/framework/src/Illuminate/Session/SessionManager.php
这是session的一个管理器文件。
我们增加以下代码:

/**
	 * Create an instance of the Memcached session driver.
	 *
	 * @return \Illuminate\Session\Store
	 */
	protected function createMemcacheDriver()
	{
		return $this->createCacheBased('memcache');
	}

这个主要是正佳一个memcahce的缓存支持,
我们知道在laravel中个,memcahce的驱动逻辑很多都是走的是cache的驱动逻辑实现的,那么接下来我们就要修改cache这块了
2:找到文件:
Laravel/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php
在该文件中增加以下代码:

/**
	 * Create an instance of the Memcache cache driver.
	 *
	 * @return \Illuminate\Cache\MemcachedStore
	 */
	protected function createMemcacheDriver()
	{
		$servers = $this->app['config']['cache.memcached'];

		$memcache = $this->app['memcache.connector']->connect($servers);

		return $this->repository(new MemcacheStore($memcache, $this->getPrefix()));
	}

其实session的memcahce最终的驱动走向还是走这个方法的,那么我们在这个方法中看到了”$this->app['memcache.connector']->”这个代码,
那么这连接器又是在哪里存储进app这个属性里面的呢?
它其实是在我们启动app时,版定相关的serviceProvider的时候注册进去的,那么接下来我们找到文件:
Laravel/vendor/laravel/framework/src/Illuminate/Cache/CacheServiceProvider.php
修改如下:

/**
	 * Register the service provider.
	 *
	 * @return void
	 */
	public function register()
	{
		$this->app['cache'] = $this->app->share(function($app)
		{
			return new CacheManager($app);
		});

		$this->app['memcached.connector'] = $this->app->share(function()
		{
			return new MemcachedConnector;
		});
                // 增加以下代码
		$this->app['memcache.connector'] = $this->app->share(function()
		{
			return new MemcacheConnector;
		});

		$this->registerCommands();
	}

我们看到这个闭包函数中返回了MemcacheContector的对象,那么这个class怎么弄呢?我们创建个吧
文件地址:Laravel/vendor/laravel/framework/src/Illuminate/Cache/MemcacheConnector.php
文件代码如下:其实是拿MemcachedContector的代码改的

<?php namespace Illuminate\Cache;

use Memcache;

class MemcacheConnector {

	/**
	 * Create a new Memcached connection.
	 *
	 * @param array  $servers
	 * @return \Memcache
	 */
	public function connect(array $servers)
	{
		$memcache = $this->getMemcache();

		// For each server in the array, we'll just extract the configuration and add
		// the server to the Memcache connection. Once we have added all of these
		// servers we'll verify the connection is successful and return it back.
		foreach ($servers as $server)
		{
			$memcache->addServer($server['host'], $server['port'], $server['weight']);
		}

		if ($memcache->getVersion() === false)
		{
			throw new \RuntimeException("Could not establish Memcache connection.");
		}

		return $memcache;
	}

	/**
	 * Get a new Memcache instance.
	 *
	 * @return \Memcached
	 */
	protected function getMemcache()
	{
		return new Memcache;
	}
}

那么按照第二步的流程这个文件会执行connect的方法,执行完成之后返回一个Memcache的对象,
这时候第二步那里根据这边来创建了一个MemcacheStore的存储器,那么这个文件也是需要我们创建,很简单,拿一份memcachedSrote改一下就好了。
文件地址:Laravel/vendor/laravel/framework/src/Illuminate/Cache/MemcacheStore.php
拷贝过来之后我们要改以下几个地方:
1:应用的类名:


use Memcache;

class MemcacheStore implements StoreInterface {

构造函数的类型处:

public function __construct(Memcache $memcache, $prefix = '')
	{
		$this->memcache = $memcache;
		$this->prefix = strlen($prefix) > 0 ? $prefix.':' : '';
	}

get方法的修改,我们直接返回值就可以了。

/**
	 * Retrieve an item from the cache by key.
	 *
	 * @param  string  $key
	 * @return mixed
	 */
	public function get($key)
	{
		return $this->memcache->get($this->prefix.$key);
	}

put方法要修改下:

/**
	 * Store an item in the cache for a given number of minutes.
	 *
	 * @param  string  $key
	 * @param  mixed   $value
	 * @param  int     $minutes
	 * @return void
	 */
	public function put($key, $value, $minutes)
	{
		$compress = is_bool($value) || is_int($value) || is_float($value) ? false : MEMCACHE_COMPRESSED;

		$this->memcache->set($this->prefix.$key, $value, $compress, $minutes * 60);
	}

这样子就基本改完了。
那么我么在用cache和session的时候就可以使用memcahe作为驱动了,那么这个memcache的配置信息怎么办呢?
还是跟memcached的配置一样,在cache.php的memcached索引中配置即可。

这里说明下,上篇文章中说到的关于redis无法使用指定的服务器的问题,实际上在cache和session.php的配置文件中,都有一个connection的索引
配置项,那么只要在这里指定就可以了,比如:connection=>session,就说明是用database.php的redis的session这个key指定的配置信息了。

laravel框架缓存使用配置

没有评论

2014 年 01 月 08 日 at 下午 10:48分类:PHP

其实从某种意义来说session也是一种缓存技术,为什么这么说,请看下下面分析。
laravel的缓存支持一下驱动”file”, “database”, “apc”, “memcached”, “redis”, “array”,其他的都不说,这里主要说下memcached和redis,
laravel框架你会发现他没有支持memcache缓存,而是memcached缓存,为什么,其实memcached缓存是memcache的一个升级版,相比而言,加入了一个锁的机制,详细可以去问百度。关于memcached的缓存配置,在cache.php文件中可以找到。
这里说下redis,在cache.php中是找不到redis的配置项的,那么在哪里呢?他在databases.php文件中个,laravel把它当作一种DB来配置的。
同样的session,如果你的驱动选择redis的话,他的配置同样的也是在这里选择。
下面是我的配置代码:

	'redis' => array(
		'cluster' => false,
		'default' => array(
			'host'     => '202.109.72.87',
			'port'     => 6379,
			'database' => 0,
		),
		'cache' => array(
			'host'     => '202.109.72.87',
			'port'     => 6379,
			'database' => 0,
		),
	),

这里不得不说的一个问题在配置以redis为驱动的缓存服务还是session服务,我们都只能使用default这个配置项目,而不能指定特有的配置项,比如我想给我cache配置cache这个key指定的服务器,session也制定其他的,但是,laravel不支持酱紫(可能是我还不知道怎么弄,如果有大牛晓得了,请赐教,谢谢),那么我们要想我们的缓存服务器用我们指定的cache索引所指定的服务该怎么办呢?我们可以试试laravel的IOC,如下:
方案1:

$redisCache = App::make('cache'); // Assumes "redis" set as your cache
$redisCache->setConnection('cache'); // Your redis cache connection
$redisCache->put('testtCacheIndex', 'fbbinValue', 10000);

方案2:

$redis = Redis::connection('cache');
$redis->set('fbbin', 'fbbinValue');
var_dump($redis->get('fbbin'))

酱紫就可以了。

laravel框架中环境设置

没有评论

2014 年 01 月 08 日 at 下午 10:34分类:PHP

一般一个项目的开发需要经历开发,测试,预发布,发布这四个流程。
因此在larave中对这个功能的支持也做的非常好来看代码。laravel默认使用的是production环境,也就是生产环境,那么我们怎么修改呢?
我们找到bootstrap文件夹下面的start.php文件的这几行代码:

$env = $app->detectEnvironment(array(
    'local' => array('your-mechine-name'),
));

那么这个该怎么配置呢?
加入我们这个项目的生产域名为:www.fbbin.com,那么我们在本地开发,我个人习惯可以改为:www.fbbin.dev,那么测试环境可以改为:www.fbbin.test,

$env = $app->detectEnvironment(array(
    'local' => array('www.fbbin.dev'),
    'test'  => array('www.fbbin.test'),
    'production' => array('www.fbbin.com'),
 ));

其实后面的数组可以指定多个域名了,这样就很方便的解决了 多个人同时在本地开发但是域名根据自己喜好配置的问题了。
如果你还有其他的开发流程,同样的方法添加就好了。
那么现在环境指定了,我们该怎么为当前的环境之前配置项呢?
我们看到我们的app/config目录下面都是配置项,那么我们只要在当前目录建立一个以当前环境名字命名的文件夹,然后把相关的配置文件写在里面就好了。
比如我们现在的本地的开发环境,那么我们建立文件夹:app/config/local,那么这个里面可以配置我本地的databases.php的数据库配置文件,session.php session的配置,cache缓存的配置,等等,
那么系统在加载配置项的时候,会优先加载我们环境的配置项。
这样,问题搞定了。
如果要获取当前的运行环境,可通过如下代码:

app()->enviroment()

apache 链接包含”%2F”导致mod_rewrite失效的解决方法

没有评论

2013 年 12 月 29 日 at 下午 4:46分类:PHP

最近碰到url中带有%2f导致url重写出错 apache 报404错误的情况,找了很多资料才发现,这个问题是由apache引起。原来 Apache 有一个配置项”AllowEncodedSlashes“, 默认是”Off”, 也就是不允许请求路径(上例是 /tag/Unix%2FLinux)中包含编码后的斜杠’/’(在某些平台是反斜杠’\’).
apache在最近的版本中会在url重写模块启用之前把%2f转化为/,所以url导致了重写后跳转到错误的不存在的页面上。

下面是我使用这个参数的配置文件(httpd-vhosts.conf)里面的内容:


ServerAdmin fbbin@foxmail.com
DocumentRoot “/usr/local/apache/www/”
AllowEncodedSlashes NoDecode
ServerName www.test.com
ServerAlias www.test.com
ErrorLog “test-error_log”
CustomLog “test-access_log” common

用PHP去除重复图片文件

没有评论

2013 年 12 月 29 日 at 下午 4:15分类:PHP

因为整理图标, 所以需要去除重复图片的功能. 通过md5来判断是否重复. 最开始, 我用md5sum工具求md5, 然后再用PHP读取结果去重. 后来一想, 为什么不完全用PHP来做呢? 可以节省大量进程开销. 简单几行代码, 就实现了这个功能.

文件数: 80510, 大小: 452,496,873 字节

只查找不删除的速度:
第一次耗时: 122s
第二次耗时: 44s
第三次耗时: 44s

在查找多次之后, 立即查找并删除的速度:
耗时: 83秒, 删除了54406个文件

<?php
exec("find . -type f", $lines);

$arr = array();
$del = array();

$n = 0;
foreach($lines as $line){
	$line = trim($line);
	if(!$line){
		continue;
	}
	$n ++;
	$md5 = md5_file($line);

	if(isset($arr[$md5])){
		$del[] = $line;
		//echo "$n del $line\n";
		unlink("{$line}");
	}else{
		$arr[$md5] = 1;
	}
}

echo "del " . count($del) . " files\n";
//echo join("\n", $del);