最近不知道怎会回事,公司里的google上不了,这是何等蛋疼的事情啊. 网上搜索,有以为网友给出了一个更新host的bat,这里贴一下,留作以后备用 google_hosts.rar 双击运行,按指令即可更新,这样,google搜索再也不怕"链接被重置了"。 提醒:修改时,国内杀软可能会有警报,忽略即可,保证无毒的。亲测可用.
如何将搜索结果高亮
用sphinx做搜索,结果返回给php,碰到两个问题.一个是如何将搜索高亮.一个是如何将带有关键词的第一段内容截取. 高亮的问题,有了一个思路.首先要将搜索内容进行分词,然后通过正则匹配将分词后的关键词全部匹配,这样的话也不会影响整个关键词的高亮. 比如说,要搜索的关键词为:我爱你中国. 这里会将关键词分词为: 我 爱 你 中国. 如果在全文中有一段是: 我爱你中国,亲爱的母亲. 那么最后的结果就是: 我爱你中国,亲爱的母亲 其次,对于英文的高亮,需要能做到大小写不敏感,即关键词为大写时,全文内的匹配的相应小写也会高亮,而且不会被替换成关键词的大写. mmseg已经可以完美的进行分词了,那接下来的事情就比较简单了:
sphinxapi.php 的一些注释.
sphinxapi.php 的一些注释.和sphinx的配置以及一些常规命令.做备忘.
<?php include_once 'sphinxapi.php'; $s = new SphinxClient(); $s->setServer("localhost", 9312); $s->SetConnectTimeout ( 1 );//设置链接超时 /* $s->AddQuery();//列表查询 $s->RunQueries ();//执行列表查询 $s->ResetFilters();//清除过滤条件 $s->BuildExcerpts($docs, $index, $words);//生成简要 $s->BuildKeywords($query, $index, $hits);//生成关键字 $s->GetLastError();//错误 $s->GetLastWarning();//警告 $s->FlushAttributes();//索引刷入硬盘 $s->IsConnectError();//链接错误 $s->ResetGroupBy();//重设分组 $s->SetFieldWeights(array('sub_title'=>1));//加权最小为1 $s->SetIDRange($min, $max);//ID范围 $s->SetIndexWeights(array('test1'=>1));//索引权重 $s->Status();//服务是否可用 $s->UpdateAttributes($index, $attrs, $values);//更新硬盘索引 */ /* 参考文档:http://www.coreseek.cn/docs/coreseek_4.1-sphinx_2.0.1-beta.html#matching-modes SPH_MATCH_ALL, matches all query words (default mode); SPH_MATCH_ANY, matches any of the query words; SPH_MATCH_PHRASE, matches query as a phrase, requiring perfect match; SPH_MATCH_BOOLEAN, matches query as a boolean expression (see Section 5.2, “Boolean query syntax”); SPH_MATCH_EXTENDED, matches query as an expression in Sphinx internal query language (see Section 5.3, “Extended query syntax”). As of 0.9.9, this has been superceded by SPH_MATCH_EXTENDED2, providing additional functionality and better performance. The ident is retained for legacy application code that will continue to be compatible once Sphinx and its components, including the API, are upgraded. SPH_MATCH_EXTENDED2, matches query using the second version of the Extended matching mode. SPH_MATCH_FULLSCAN, m */ $s->setMatchMode(SPH_MATCH_ANY);//匹配模式 $s->setMaxQueryTime(3);//查询超时 //$s->SetSelect ( $select );//设置返回的字段 /* $cl->SetSelect ( "*, @weight+(user_karma+ln(pageviews))*0.1 AS myweight" ); $cl->SetSelect ( "exp_years, salary_gbp*{$gbp_usd_rate} AS salary_usd, IF(age>40,1,0) AS over40" ); $cl->SetSelect ( "*, AVG(price) AS avgprice" ); */ /* $cl->SetGroupBy ( "category", SPH_GROUPBY_ATTR, "@count desc" ); $cl->SetGroupDistinct ( "vendor" ); == SELECT id, weight, all-attributes, COUNT(DISTINCT vendor) AS @distinct, COUNT(*) AS @count FROM products GROUP BY category ORDER BY @count DESC */ //$s->SetGroupBy ( $groupby, SPH_GROUPBY_ATTR, $groupsort );//汇总 //$s->SetGroupDistinct ( $distinct );//设置不重复字段 $s->SetArrayResult ( true );//结果是否有ID /* SPH_SORT_RELEVANCE mode, that sorts by relevance in descending order (best matches first); SPH_SORT_ATTR_DESC mode, that sorts by an attribute in descending order (bigger attribute values first); SPH_SORT_ATTR_ASC mode, that sorts by an attribute in ascending order (smaller attribute values first); SPH_SORT_TIME_SEGMENTS mode, that sorts by time segments (last hour/day/week/month) in descending order, and then by relevance in descending order; SPH_SORT_EXTENDED mode, that sorts by SQL-like combination of columns in ASC/DESC order; SPH_SORT_EXPR mode, that sorts by an arithmetic expression. */ //$s->SetSortMode ( SPH_SORT_EXTENDED, $sortby );//排序模式 /* $s->SetOverride($attrname, $attrtype, $values); $s->ResetOverrides();*/ /* $s->SetRetries($count);//设置失败重试 $s->SetRankingMode($ranker);//设置排名模式 均适用于SPH_MATCH_EXTENDED2搜索 //第3个参数当为true时,相当于$attribute!=$value,默认值是false $s->SetFilter ( 'target_type', $filtervals );//设置过滤,值列表 $s->SetFilterFloatRange($attribute, $min, $max);//浮动范围 $s->SetFilterRange($attribute, $min, $max);//指定范围 $s->SetGeoAnchor($attrlat, $attrlong, $lat, $long); */ //link //$s->SetFilter ( 'target_type', array(1),true ); $s->SetLimits ( 0, 10 );//显示数量:开始 量 最大量 右偏移量 $result = $s->query("good","team");//查询 print_r($result);
安装phpredis扩展以及phpRedisAdmin工具
看了网上一些教程,大多都有一些老旧,这里重新记录一下,其实都是大同小异. 先从phpredis的git拿到最新的源码包:
https://github.com/nicolasff/phpredis.git
然后进入目录:
cd phpredis
编译,安装扩展:
phpize ./configure --enable-redis make && make install
然后编辑php.ini加入 extension = redis.so 重启服务器发现php提示缺少redis.so, Installing shared extensions: /usr/lib/php5/20090626/ 而我的extension目录是 : /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626 按照提示的目录把redis.so 拷贝过去就OK了.
PHP实现进程间通信:信号量
PHP实现进程间通信:消息队列
实际上,在PHP开发过程中,对于消息队列的应用还是很广泛的。消息队列(message queue)也是Linux系统进程间通信的一种方式。 除了现有的一些消息队列解决方案以外,PHP对共享内存段的操作有两组函数:System V IPC和Shared Memory。 其中System V IPC由AT&T的贝尔实验室对早期的UNIX系统贡献而来,现在的linux系统都完美的继承了下来,该系列函数能够更方便的操作数据,无需像Shared Memory那样必须自己掌握读写时的偏移量、长度等,也不用序列化/反序列化来回转换(因为Shared Memory函数只支持字符串格式的数据参数)。但是System V IPC系列不支持Windows,所以如果要在win环境下使用,只能选Shared Memory。 PHP的System V msg模块是对Linux系统支持的System V IPC中的System V消息队列函数族的封装。我们需要利用sysvmsg模块提供的函数来进进程间通信。
<?php $message_queue_key = ftok(__FILE__, 'a'); $message_queue = msg_get_queue($message_queue_key, 0666); var_dump($message_queue); $message_queue_status = msg_stat_queue($message_queue); print_r($message_queue_status); //向消息队列中写 msg_send($message_queue, 1, "Hello,World!"); $message_queue_status = msg_stat_queue($message_queue); print_r($message_queue_status); //从消息队列中读 msg_receive($message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWAIT); print_r($message."\r\n"); msg_remove_queue($message_queue); ?>
由于System V IPC只支持linux类操作系统,以上演示请在linux中进行.
记一次JQuery的跨站操作实现
公司项目里遇到的一个需求,由于美工将一个活动页面做在了另外的一个系统里,所以就涉及到JS的跨站操作 getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然,究其本质还是通过script标签动态加载js。 需要说明的是,getJSON利用的jsonp需要客户端与服务端作出配合。 客户端传递的URL里要包含callback变量,以形如callback=?的形式结尾。(jquery会随机生成一个字符串替换?传递给服务端) 服务端获取客户端传递的callback的值callbackValue,和需要传递的json字符串构成 callbackValue.’(’.json.’)'传回给客户端(示例为php字符串连接方式,其他语言类似) 这种方式实际上的流程是下面这样的:
一个数组变换问题
做开发的时候遇到一个问题,现在记录一下.顺便说一句,PHP内置的函数能实现的,一定要用内置函数实现,看来还是对php.net了解不够啊~ 需要将如下数组
array(4) { ["id"]=> array(2) { [0]=> string(1) "1" [1]=> string(1) "2" } ["name"]=> array(2) { [0]=> string(7) "这是1" [1]=> string(7) "这是2" } ["spec"]=> array(2) { [0]=> string(1) "x" [1]=> string(1) "y" } ["quan"]=> array(2) { [0]=> string(2) "22" [1]=> string(2) "23" } }
转换成:
array(2) { [0]=> array(4) { [id]=> string(1) "1" [name]=> string(7) "这是1" [spec]=> string(1) "x" [quan]=> string(2) "22" } [1]=> array(4) { [id]=> string(1) "2" [name]=> string(7) "这是2" [spec]=> string(1) "y" [quan]=> string(2) "23" } }
这种格式.其实这个非常简单就可以实现:
function user_array_flip($arr){ $data = array(); foreach($arr as $k => $v){ foreach($v as $id => $val){ $data[$id][$k] = $val; } } return $data; } var_dump(user_array_flip($array));
简单的循环就可以搞定,这里主要是想提一下一种更简便的方式:
总结一些常用的MYSQL查询语句,供备忘
mysql语句基础。
处理wordpress在nginx上500错误一例
在nginx上做wordpress博客,如果你使用了wordpress自带的固定连接功能,那一定会涉及到修改rewrite的地方, 因为wordpress默认是修改仅apache支持的.htaccess的规则. 如果是nginx用户,通常会在conf/nginx.conf内添加如下:
python学习笔记
2012-10-20 00:30 装了ubuntu12.10 AMD64,说实话Linux还是ubuntu用的顺手一些.
12.10装好以后默认就安装好了python.含有2.7.2和3.0以及3.3几个版本.
svn co http://code.djangoproject.com/svn/django/trunk djtrunk 通过SVN拿到最新的django版本
/usr/lib/python2.7/dist-packages 里加入django,pth指向djtrunk 目录
ln -s /path/to/django/bin/django-admin.py /usr/local/bin/django-admin.py 给django-admin.py做个快捷方式
随便进个目录,django-admin.py startproject 建立一个项目
值得一提的,py文件第一句加上#coding=utf8防止乱码
写了个简单的svn在线管理工具
Linux超帅命令:xargs
介绍: 大家常用的Linux命令大概在20多个的样子,除了基本的find、grep、awk啥的,还有一些配合起来有意思的命令,结合起来使用强大,这就是Unix的设计哲学:K.I.S.S 1. 拷贝文件(除了某些文件或目录之外的文件) [heiyeluren@localhost php5]$ ls bin data etc include ini lib logs man old php.ini php.ini.20110505 phplib ral sbin var 上面文件列表里比如我们不想拷贝 data/logs 两个目录,那么就可以使用grep -v 去掉后再调用 xargs 来拷贝其他文件: [heiyeluren @localhost php5]$ ls | grep -v log | grep -v data | xargs -i cp -rf {} /home/heiyeluren /code/php5/ 说明: -i 参数是指定 {} 代表我们当前列出来的文件名字。
OAuth 2.0规范中文翻译版,提供下载
OAuth协议致力于使网站和应用程序(统称为消费方)能够在无须用户透露其认证证书的情况下,通过API访问某个web服务(统称为服务提供方)的受保护资源。更一般地说,OAuth为API认证提供了一个可自由实现且通用的方法。这是OAUTH2.0的规范,新浪微博和人人网都在用。 点击下载 : OAuth_2.0_中文译本
Recent Comments