Feb 7
最近我的网站访问在直线上升,因为动态会员游戏网站,一直在想办法做些优化,今天想到如果把php的session放在内存,可能会提升网站的访问速度。于是开始搜索资料。经过一天的摸索,终于搞定。问题主要出在php有两个memcache模块,一个是php-memcache,一个是php-memcached,php-memcached是最新的,也是比较稳定的,网上的资料都是关于php-memcache的,而没有提到php-memcached,而php-memcached的配置跟php-memcache是有所不同的。大致的整个安装过程:

1、安装libevent  1.4.10

wget http://monkey.org/~provos/libevent-1.4.10-stable.tar.gz

tar xzvf libevent-1.4.9-stable.tar.gz
cd libevent-1.4.10-stable

./configure --prefix=/usr
make && make install



2、安装memcached1.2.8

wget http://memcached.googlecode.com/files/memcached-1.2.8.tar.gz

tar -zxvf  memcached-1.2.8.tar.gz

cd memcached-1.2.8
./configure --with-libevent=/usr

make && make install



3、安装zlib

wget http://www.zlib.net/zlib-1.2.3.tar.gz

tar -zxvf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure --prefix=/usr --shared
make && make install

4、安装libmemcached

wget http://download.tangent.org/libmemcached-0.26.tar.gz

tar zxvf libmemcached-0.26.tar.gz

cd libmemcached-0.26
./configure --prefix=/usr/local/libmemcached/

make && make install



5、安装php-memcached模块

wget http://pecl.php.net/get/memcached

tar -zxvf  memcached-0.1.5.tgz

cd  memcached-0.1.5

phpize
./configure --with-php-config=/usr/bin/php-config --enable-memcache --with-libmemcached-dir=/usr/local/libmemcached

make && make install

6、启动memcached

/usr/local/bin/memcached -p 11211 -l 127.0.0.1 -d

执行后,可以用以下办法查看执行状态

telnet 127.0.0.1 11211

stats

STAT pid 11568
STAT uptime 5910
STAT time 1241876672
STAT version 1.2.8
STAT pointer_size 32
STAT rusage_user 0.751885
STAT rusage_system 1.584759
STAT curr_items 2615
STAT total_items 36753
STAT bytes 244835
STAT curr_connections 3
STAT total_connections 18427
STAT connection_structures 36
STAT cmd_flush 0
STAT cmd_get 18388
STAT cmd_set 38334
STAT get_hits 15717
STAT get_misses 2671
STAT evictions 0
STAT bytes_read 4924864
STAT bytes_written 1992526
STAT limit_maxbytes 134217728
STAT threads 2
STAT accepting_conns 1
STAT listen_disabled_num 0
END
有以上信息出现,表明启动成功!



7、加入开机启动

nano /etc/rc.d/local.d
加一行

/usr/local/bin/memcached -p 11211 -l 127.0.0.1 -d

8、编辑php.ini

nano /etc/php.ini

在文件最后加入:

extension = "memcached.so"
修改

session.save_handler = files  -> session.save_handler = memcached
session.save_path = "/var/lib/php/session" -> session.save_path = "127.0.0.1:11211"

9、重启apache

service httpd restart



大功告成!



需要注意的地方主要有2点,

1、安装libmemcached需用到zlib,我机器没有这个,花了很多时间找编译libmemcached时出错的原因。

2、php.ini文件的配置,php-memcached模块跟php-memcache不同,要设成是memcached,这个在phpinfo页面的Registered save handlers可以看到。如果设置不正确,会有"Cannot find save handler memcache"的错误提示。

3、session.save_path几乎所有的资料都是session.save_path = "tcp://127.0.0.1:11211",但这可能在memcaceh是这样用的,我没有验证,我一开始也是这样设置,但一直出现"Failed to write session data (memcached)"的错误,找了很入也没找到是什么原因,后来在php.net上找到
session.save_path string
Defines a comma separated of hostname:port entries to use for session server pool, for example "sess1:11211, sess2:11211".


这段说明,于是去掉tcp://再试,才终于成功!



最后:因为网站一直在运行的,建议不要直接动php.ini,

直接用一个php文件来测试



ini_set("session.save_handler","memcached");
ini_set("session.save_path","127.0.0.1:11211");

session_start();
if (!isset($_SESSION['TEST'])) {
$_SESSION['TEST'] = time();
}
$_SESSION['TEST3'] = time();
print $_SESSION['TEST'];
print "

";
print $_SESSION['TEST3'];
print "

";
print session_id();
?>



只要这个文件没有出现错误提示了,就可以直接修改php.ini相应的内容,然后重启apache,就样就不影响会员访问网站。
Feb 7
//开启session 存储地址,session名称
function open($save_path, $session_name)
{
  global $sess_save_path, $sess_session_name;
      
  $sess_save_path = $save_path;
  $sess_session_name = $session_name;
  return(true);
}

function close()
{
  return(true);
}

function read($id)
{
  global $sess_save_path, $sess_session_name;

  $sess_file = "$sess_save_path/sess_$id";
  if ($fp = @fopen($sess_file, "r")) {
    $sess_data = fread($fp, filesize($sess_file));
    return($sess_data);
  } else {
    return(""); // Must return "" here.
  }

}

function write($id, $sess_data)
{
  global $sess_save_path, $sess_session_name;

  $sess_file = "$sess_save_path/sess_$id";
  if ($fp = @fopen($sess_file, "w")) {
    return(fwrite($fp, $sess_data));
  } else {
    return(false);
  }

}

function destroy($id)
{
  global $sess_save_path, $sess_session_name;
      
  $sess_file = "$sess_save_path/sess_$id";
  return(@unlink($sess_file));
}

/*********************************************
* WARNING - You will need to implement some *
* sort of garbage collection routine here.  *
*********************************************/
function gc($maxlifetime)
{
  return true;
}

// 开启、关闭、读取、写入、销毁、垃圾回收(失效)
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");

session_start();

// proceed to use sessions normally

?>
Dec 1
1.PHP 读取XML

2.PHP GD库使用

3.PHP 读取大文件
fseek

4.MYSQL INNODB和MyISAM区别

1.INNODB支持事务,MyISAM不支持事务

2.索引上的差别

3....
Nov 20
思路来自网上资料:

如第一轮
数组第一个与最后一个元素对应,第二个与倒数第二个对应,其余类推
如果遇到与自身对应,则定为自身与最后一个元素对应
以上为除最后一个元素外其他元素的对应,最后一个元素的对应算法等下再说

第二轮
数组第一个元素现在将与倒数第二个元素对应,相似,第2则与倒数第3对应,其他类推,与自己对应的时候仍然遵循第一轮说到的那个处理规则

说到这里,就可以写出获取最后一个元素以前的其他元素每一轮的对阵信息了

现在来说最后一个元素的对阵信息获取
最后一个元素每轮的对阵元素有一个规律,就是除了第一轮是固定与第一个元素对应后,从第二轮开始,将整个数组除了最后一个元素和第一个元素外的其他元素拆分成两个数组,都是以在原来数组中的index的降序排列,然后以一隔一的方式合并这两个数组,如10个元素为例,拆分的两个数组为5,4,3,2和 9,8,7,6
再一隔一合并它们,变成5,9,4,8,3,7,2,6,这个8个元素就分别是原来数组中最后一个元素在除了第一轮后每轮的对阵对手了

所以,最后一个元素的对阵情况是这样获得的,如果是第一轮,它遵循其他元素的对阵获取规则,否则,按上面说的获取对阵队伍信息


--------------------------------------------------------------------------------------------------------------------------------------------------------
下面用PHP实现,处理的结果是半程的比赛,下半程比赛只需要将每场的主客场顺序换一下就可以。

//下面是赛程算法
             $nums = 20; //20个球队
    //球队临时序列
    $numsSort = array();
    for($i=1;$i<=$nums;$i++){
      $numsSort[] = $i;
    }  
  
for($i = $nums/2,$j=1;$i>1;$i--,$j++){
      $tmpArr[] = $numsSort[$i-1];
      $tmpArr[] = $numsSort[$nums-$j-1];
    }

    for ($i=1;$i<$nums;$i++){
      $tmp = $numsSort;
      $zd = 1;
      $kd = $nums-($i-1);
      echo 'NO.',$i,':';
      while ($zd<$kd) {
        echo $zd,'vs',$kd,'|';
        unset($tmp[$zd-1]);
        unset($tmp[$kd-1]);
        $zd ++;
        $kd --;
      }
      if($i!=1){
        echo $tmpArr[$i-2],'vs',$nums,'|';
        unset($tmp[$tmpArr[$i-2]-1]);
        unset($tmp[$nums-1]);
      }
      //以上规则都不匹配的剩余球队,可以直接使用 头尾元素对战
      if(!empty($tmp)){
        sort($tmp);
        $count = count($tmp);
        for($ci=0;$ci<$count;$ci++){
          if($tmp[$ci]<$tmp[$ci+$count/2])
          echo $tmp[$ci],'vs',$tmp[$ci+$count/2],'|';  
                  }
      }
      echo '<br/>';
    }
Nov 17
一、安装Coreseek
由于本机是vista,所以先安装一个coreseek win32版本
1.安装Microsoft Visual C++ 运行环境 Microsoft Visual C++ 2005 运行环境 (x86)
2.将

二、测试(我只进行mysql测试,其实coreseek还支持很多数据源,详见官网)

测试对象:mysql数据源,中文分词与搜索
对应配置:etc/csft_mysql.conf
测试数据:var/test/documents.sql
PHP程序:api/test_coreseek.php
测试说明:请先将测试数据导入数据库,并设置好配置文件中的MySQL用户密码数据库
在线说明:http://www.coreseek.cn/products-install/mysql/

1.mysql 数据源配置 (etc/csft_mysql.conf)
数据表:


CREATE TABLE IF NOT EXISTS `documents` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `content` text NOT NULL,
  `date_added` datetime NOT NULL,
  `author_id` int(11) NOT NULL,
  `group_id` int(2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;


------------------
以下为配置文件内容
------------------

source mysql
{
    type                    = mysql
    sql_host                = localhost
    sql_user                = root
    sql_pass                = 123456
    sql_db                  = blog
    sql_port                = 3306
    sql_query_pre           = SET NAMES utf8
    sql_query               = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents                
    sql_attr_uint      = group_id
    sql_attr_timestamp    = date_added      
    sql_query_info_pre      = SET NAMES utf8                                      
    sql_query_info          =  SELECT * FROM documents WHERE id=$id  
}

index mysql
{
    source            = mysql            
    path            = g:/tools/coreseek-4.1-win32/var/data/mysql
    docinfo            = extern
    mlock            = 0
    morphology        = none
    min_word_len        = 1
    html_strip                = 0
    charset_dictpath = g:/tools/coreseek-4.1-win32/etc/                            
    charset_type        = zh_cn.utf-8
}


indexer
{
    mem_limit            = 128M
}

searchd
{
    listen              =   9312
    read_timeout        = 5
    max_children        = 30
    max_matches         = 1000
    seamless_rotate     = 0
    preopen_indexes     = 0
    unlink_old          = 1
    pid_file = g:/tools/coreseek-4.1-win32/var/log/searchd_mysql.pid  
    log = g:/tools/coreseek-4.1-win32/var/log/searchd_mysql.log      
    query_log = g:/tools/coreseek-4.1-win32/var/log/query_mysql.log
    binlog_path =   g:/tools/coreseek-4.1-win32/var/log/                            
}


2.服务进程开启

//使用配置文件

bin\indexer -c etc\csft_mysql.conf --all

//开启searchd

bin\searchd -c etc\csft_mysql.conf


三、测试文件

require ( "sphinxapi.php" );

$cl = new SphinxClient ();
$cl->SetServer ( '127.0.0.1', 9312);
$cl->SetConnectTimeout ( 3 );
$cl->SetArrayResult ( true );
$cl->SetMatchMode ( SPH_MATCH_ANY);

//分页显示
$p = isset($_GET['p']) ? $_GET['p']:0;
$cl->SetLimits($p*40,40);
$res = $cl->Query ( 'php', "*" );

echo '<pre>';
print_r($res['matches']);
echo '</pre>';



运行http://localhost/test_coreseek.php
输出结果:
Array ( [error] => [warning] => [status] => 0 [fields] => Array ( [0] => title [1] => content ) [attrs] => Array ( [group_id] => 1 [date_added] => 2 ) [matches] => Array ( [0] => Array ( [id] => 3 [weight] => 1 [attrs] => Array ( [group_id] => 3 [date_added] => 1270094460 ) ) ) [total] => 1 [total_found] => 1 [time] => 0.002 [words] => Array ( [方便] => Array ( [docs] => 1 [hits] => 2 ) ) )

很明显一切都OK!

————————————总结————————————

下面对整个流程进行步骤总结:

1.下载安装Coreseek
其实只要下载好正确版本,解压到指定文件夹就可以
注意本机要有vc运行环境,一般系统都自带了,但是我的vista机子自带了2005,无奈我只有卸载了重新安装2008

2.配置数据源(记得在支持utf8编辑器下编辑)
配置文件地址:etc/csft_mysql.conf
注意点:
2.1 source{..} 中:
sql_query               = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents                 #第一个字段ID为表自增变量
sql_attr_uint   = group_id  #整数分组属性
sql_attr_timestamp   = date_added  #时间分组属性


2.2 index mysql{...}各个路径最好写绝对路径
path            = g:/tools/coreseek-4.1-win32/var/data/mysql #最后的mysql为文件前缀,一般使用索引名称

2.3  searchd{ ..} 中路径最好写绝对地址

3.运行守护脚本
3.1 编译配置文件 bin\indexer -c etc\csft_mysql.conf --all
3.2 开启搜索服务端 bin\searchd -c etc\csft_mysql.conf

4.测试脚本
运行测试脚本……


分页: 6/61 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]