作者归档:℃冻番茄

改写thinkphp内置分页类,使之支持ajax分页

在网上下了一个在原thinkphp分页类基础上添加了多种样式的分页类,但是项目要使用ajax分页,所以在它的基础上做了一点小改动,以支持ajax分页

类文件及css文件下载

page.class.php.rar

演示代码

/Lib/Action/test2Action.class.php

 

PHP代码
  1. <?php   
  2. class test2Action extends Action{   
  3.     public function index()   
  4.     {   
  5.         $this->display();   
  6.     }   
  7.   
  8.     public function ajax()   
  9.     {   
  10.         if($_GET[‘do’]==‘list’){   
  11.             $_GET[‘page’]=$_POST[‘page’];   
  12.             $perapective_=D(‘Perapective’);   
  13.             import("@.ORG.Page"); //导入分页类      
  14.             C(‘PAGE_NUMBERS’,’10’); //Discuz分布是显示前后共10页的按钮   
  15.             C(‘VAR_PAGE’,‘page’);   
  16.             C(‘AJAX_FUNCTION’,‘getlist’);   
  17.             $total = $perapective_->count();   
  18.             $pnew Page($total,5);   
  19.   
  20.             if($data=$perapective_->findAll(,,‘pid desc’,$p->firstRow.‘,’.$p->listRows)){   
  21.                 $status=0;   
  22.                 $info[‘page’] = $p->show();   
  23.                 $info[‘style’]="manu";//分页样式   
  24.             }else{   
  25.                 $status=1;   
  26.             }   
  27.             $this->ajaxReturn($data,$info,$status);    
  28.         }   
  29.     }   
  30. }   
  31. ?>  

 

前台模板文件:

 

XML/HTML代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <title>ajax测试</title>  
  5.   
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  7. <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />  
  8. <SCRIPT LANGUAGE="JavaScript" src="/public/js/jquery.js"></SCRIPT>  
  9. <style>  
  10. body{font-size:12px;}   
  11. a:link,a:visited,a:active{ color:#000; text-decoration:none;}   
  12. a:hover{ color:#87B600; text-decoration:none;}   
  13. #box{margin:20px auto;width:600px;border:1px solid #E6E6E6}   
  14. #menu{clear:both;float:right;}   
  15. #menu ul{list-style:none;clear:both;}   
  16. #menu ul li{float:left;margin:3px;width:70px;text-align:center;}   
  17. #listbox{margin:10px auto;width:580px;display:none;}   
  18. #listbox ul{list-style:none;}   
  19. #listbox ul li{color:blue;padding-top:10px;}   
  20. #page{clear:both;text-align:left;padding-left:35px;}   
  21. .clear{clear:both;}   
  22. </style>  
  23. <link rel="stylesheet" type="text/css" href="/public/css/style2.css" />  
  24. </head>  
  25. <body>  
  26.   
  27. <div id="box">  
  28.     <div id="menu">  
  29.         <ul>  
  30.                
  31.         </ul>  
  32.            
  33.     </div>  
  34.     <div id="listbox"></div>  
  35.        
  36.     <div class="clear"></div>  
  37. </div>  
  38. <SCRIPT LANGUAGE="JavaScript">  
  39. <!–   
  40.     function getlist(page){   
  41.         url="/test2/ajax/do/list";   
  42.         var html="";   
  43.         $.post(url,{page:page},function(data){   
  44.             list=data.data;   
  45.             page=data.info.page;   
  46.             style=data.info.style;   
  47.             status=data.status;   
  48.             if(status==0){   
  49.                 html+="<ul>";   
  50.                 for(var i = 0; i < list.length; i++){   
  51.                     html+="<li>"+list[i].title+"</li>"   
  52.                 }   
  53.                 html+="</ul>";   
  54.                 html+="<div id=‘page’ class=‘"+style+"’>"+page+"</div>";   
  55.             }else{   
  56.                 html+="无数据!";   
  57.             }   
  58.             $("#listbox").html(html);   
  59.             $("#listbox").show();   
  60.         },"json");   
  61.     }   
  62.     getlist(1);   
  63. //–>  
  64. </SCRIPT>  
  65. </body>  

 

效果图

ddd.jpg

ubuntu安装denyhosts防止暴力破解远程SSH

上网被扫描是经常的事,为了避免 ssh 帐号和密码被暴力破解,可以利用 denyhosts 来加强系统安全性。

1.安装
sudo apt-get install denyhosts

2.配置 /etc/denyhosts.conf 。内容参考:

sshd 登录日志文件。不同系统的不一样。
SECURE_LOG = /var/log/auth.log

限制主机访问的文件
HOSTS_DENY = /etc/hosts.deny

移除 HOSTS_DENY 中超过以下时间的旧条目
PURGE_DENY = 1w

阻止的服务。默认是 sshd ,可以设置为其他或全部。
BLOCK_SERVICE  = sshd

当该主机利用无效用户进行登录尝试失败超过以下的次数时,阻止该主机
DENY_THRESHOLD_INVALID = 3

针对有效用户的
DENY_THRESHOLD_VALID = 4

针对 root 用户的
DENY_THRESHOLD_ROOT = 1

针对有限制的用户的
DENY_THRESHOLD_RESTRICTED = 1

DenyHosts 用于写数据用的。在里面可以看到 hosts,hosts-root,offset,users-hosts,users-valid,hosts-restricted,hosts-valid,suspicious-logins,users-invalid 这些记录。
WORK_DIR = /var/lib/denyhosts

当为 YES 时,如果允许的主机在登录时被认为可疑,则对该主机进行记录。当为 NO 时,如果允许的主机在登录时被认为可疑也不对该主机进行记录。在允许的主机范围外的主机的可疑登录全部会被记录。
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES

反向域名解释
HOSTNAME_LOOKUP=NO

这个文件存在表示 Denyhosts 正在运行。用于保证每次只有一个实例在运行。
LOCK_FILE = /var/run/denyhosts.pid

管理员 EMail
ADMIN_EMAIL = root@localhost

SMTP 主机设置。如果有 SMTP 服务支持,可以给管理员发邮件。
SMTP_HOST = localhost
SMTP_PORT = 25
SMTP_FROM = DenyHosts <nobody@localhost>
SMTP_SUBJECT = DenyHosts Report

如果在指定的时间内没有失败的登录尝试,将导致此主机的失败计数重置为0。此值适用于除了 root 之外,所有有效用户(在 /etc/passwd 中的)的登录尝试。如果没有定义,这个计数将永远不会重置。
AGE_RESET_VALID=5d

针对 root 用户的
AGE_RESET_ROOT=25d

针对有限制的用户的
AGE_RESET_RESTRICTED=25d

针对无效用户(不在 /etc/passwd 中的)
AGE_RESET_INVALID=1w

当登录成功时,把登录成功的失败计数重置为0。默认是 NO。
#RESET_ON_SUCCESS = yes

当以后台方式运行时,Denyhosts 的日志文件,留空不记录日志。
#DAEMON_LOG = /var/log/denyhosts

当以后台方式运行时,每读一次日志文件的时间间隔。
DAEMON_SLEEP = 30s

当以后台方式运行时,清除机制在 HOSTS_DENY 中终止旧条目的时间间隔。
DAEMON_PURGE = 1h

3.重启 Denyhosts
sudo /etc/init.d/denyhosts restart

ie通过Adobe Reader控件直接显示pdf文件,并使用js调用打印功能

如果项目需要使用ie来直接显示和打印一份pdf文档的话,下面的代码可以非常方便的达到目的。

XML/HTML代码
  1. <body>    
  2. <a href="javascript:PDF1.printWithDialog();">打印</a><hr>  
  3. <object  classid="clsid:CA8A9780-280D-11CF-A24D-444553540000" name="PDF1"  width="950"  height="633"  border="0">    
  4. <param  name="SRC"  value="a.pdf"/>    
  5. </object>    
  6. <script  language="JavaScript" type="text/javascript">  
  7.   //显示工具栏(false为隐藏)       
  8.   PDF1.SetShowToolbar(true);     
  9. </script>    
  10. </body>    

摇滚巨星迈克尔·杰克逊因心脏停博去世 终年50岁

纽约,2009年6月25日 美国歌星迈克尔·杰克逊逝世 6月25日,美国摇滚巨星迈克尔·杰克逊因心脏停搏在洛杉矶逝世,终年50岁。这是2005年6月3日,迈克尔·杰克逊在加州的资料照片。新华社发  新华网洛杉矶5月25日电 美国著名流行歌星迈克尔杰克逊25日因心脏病发作在洛杉矶的一家医院去世。

  美国《洛杉矶时报》网站援引当地警方的消息称,杰克逊当天下午因心脏病发作深度昏迷被送入洛杉矶加州大学医疗中心,不久该中心的医生正式宣布这位50岁的前流行乐坛巨星不治身亡。

巧用svn实现跨平台多服务器即时文件同步

气象项目,因为气象网站对于数据的实时性非常高,按以往的设计理念,采用多台服务器做负载均衡。文件的同步面临着一个问题,因为如果采用定时更新数据的话,一定会有一个时间上的延迟。这样的话,也许对于一个重点靠实时数据为目的的网站会是一个严重的问题,这类网站损失不起几十秒及至几分钟的数据延时。而且在文件同步的软件选择上也挺麻烦的,因为要做到跨平台,很多同步软件要么是windows的要么只支持linux

后来想来完全可以通过svn为实现文件的同步,svn在windows及linux都能非常快捷的部署,而且文件的同步效率较高,还能保存文件的历史版本,关键的是svn支持命令行操作,可以很方便的集成到网站和其它其它语言开发的软件中。

现初步的思路是(后端服务器的集群):

一台后端主服务器A(安装svn服务器、客户端,mysql服务器,nginx 网站服务器,php-cgi,气象数据的获取分析入库程序,生成html程序)

一台或多台后端分服务器B (安装svn客户端,nginx 网站服务器,php-cgi)

1、外网的一台windows气象服务器svn上传数据至服务器A 的svn【版本库1】。

2、上传完毕后通知A服务器分析气象数据并入库。

3、然后在网站目录生成html文件及图片。

4、接着通过svn客户端把网站目录上传至本身svn服务器的【版本库2】。

5、最后通知后端的分服务器B,在内网从svn服务器获取网站目录全部文件的最新版本。

 

从而实现即时的网站数据同步。

改变饮食结构可以让你拥有一个漂亮的宝贝。

>改善偏黑的肤色
有的父母肤色偏黑,孕妇就可以多吃一些富含维生素C的食物,如番茄、葡萄、柑桔、菜花、冬瓜、洋葱、大蒜、苹果、刺梨、鲜枣等蔬菜和水果,其中尤以苹果为最佳。
>告别粗糙肤质,拥有良好视力
孕妇可以多吃些富含维生素A的食物,如动物肝脏、蛋黄、牛奶、鱼肝油、胡萝卜、苹果、番茄以及绿色蔬菜和干果等。其中尤以鸡肝含维生素A为最多,胡萝卜还可以促进血色素的增加,从而提高血液的浓度,是我国民间常用的补血养血佳品。
>培育光泽油亮的乌发
如果父母头发早白或者略见枯黄、脱落,那么孕妇可多吃些含有维生素B族的食物,如瘦肉、鱼、动物肝脏、牛奶、面包、豆类、鸡蛋、紫菜、核桃、芝麻、玉米以及绿色蔬菜,这些食物可以使孩子发质得到改善,不仅浓密、乌黑、而且光泽油亮。
>让孩子个头长高
如果父母个头儿不高,应吃些富含维生素D的食物,如虾皮、蛋黄、动物肝脏以及蔬菜。
>益脑、补脑、健脑
孕妇在怀孕期间多吃些含碘丰富的食物,如海带等海产品,用以补充胎儿对碘的需要,促进胎儿甲状腺的合成,有利于胎儿大脑的良好发育。
另外孕妇在怀孕期间还应该在饮食生活上注意以下几点:
妊娠后三个月是胎儿脑细胞和脂肪细胞增殖的“敏感期”。在这个时期,孕妇一定要注意增加蛋白质、磷脂、和维生素的摄入,应多吃奶类、蛋类、瘦肉、肝、鱼、豆类和青菜,保证食品的充足供应,酱油利于胎儿的智力发育。
钙和维生素D的摄入量要充足。孕妇严重缺钙时会影响胎儿的骨骼、牙齿的构成,甚至可能导致胎儿畸形。注意补充铁等微量元素,应常吃蔬菜、海虾等。
蜂蜜对于孕妇来说是一种极好的保健品,孕妇经常食用蜂蜜,不仅能够补充各种营养素,还可以润燥通便,使孕妇心情舒畅,增强机体的消化和吸收功能。
还有一些食物是孕妇不适宜食用的,比如:生冷硬的食物,如香蕉、石花、木儿等;辛辣类的食物,比如:肉桂、花椒、丁香、胡椒;影响性功能食物,如菱角、兔肉、蕨菜、大麻仁等

用nginx的反向代理做负载均衡

未命名-1.jpg

最近一个项目,网站的流量会比较大,但具体大到什么程序还没有估计,所以先用二台服务器做集群,实现负载均衡。因为网站是门户网站,都是生成的html静态页面,和少量的php,所以采用nginx做反向代理来处理海量访问,同时也方便增加新的服务器做负载均衡。

前端服务器A,利于nginx的反向代理提供对外网的web服务。

台后端主服务器B,利用nginx为前端服务器B提供反向代理服务,提供数据库服务、数据获取服务、数据同步服务的服务器。

其它后端服务器(以后增加),利用nginx为前端服务器A提供反向代理服务,同时自动从后端主服务器B获取数据。

linux socket 编程

目 录

socket

  1. socket()
  2. bind()
  3. connect()
  4. listen()
  5. accept()
  6. send() 和recv()
  7. sendto() 和recvfrom()
  8. close() 和shutdown()
  9. getpeername()
  10. gethostname()

 

socket


socket()

我们使用系统调用socket()来获得文件描述符:
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain,int type,int protocol);
第一个参数domain设置为“AF_INET”。
第二个参数是套接口的类型:SOCK_STREAM或
SOCK_DGRAM。第三个参数设置为0。
系统调用socket()只返回一个套接口描述符,如果出错,则返回-1。 


 


 

bind()

一旦你有了一个套接口以后,下一步就是把套接口绑定到本地计算机的某一个端口上。但如果你只想使用connect()则无此必要。
下面是系统调用bind()的使用方法:
#include<sys/types.h>
#include<sys/socket.h>
intbind(int sockfd,struct sockaddr*my_addr,int addrlen);
第一个参数sockfd是由socket()调用返回的套接口文件描述符。
第二个参数my_addr是指向数据结构sockaddr的指针。数据结构sockaddr中包括了关于你的地址、端口和IP地址的信息。
第三个参数addrlen可以设置成sizeof(structsockaddr)。
下面是一个例子:
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#defineMYPORT3490
main()
{
int sockfd;
struct sockaddr_inmy_addr;
sockfd=socket(AF_INET,SOCK_STREAM,0);/*do someerror checking!*/
my_addr.sin_family=AF_INET;/*hostbyteorder*/
my_addr.sin_port=htons(MYPORT);/*short,network byte order*/
my_addr.sin_addr.s_addr=inet_addr("132.241.5.10");
bzero(&(my_addr.sin_zero),8);/*zero the rest of the struct*/
/*don’t forget your error checking for bind():*/
bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr));

如果出错,bind()也返回-1。
如果你使用connect()系统调用,那么你不必知道你使用的端口号。当你调用connect()时,它检查套接口是否已经绑定,如果没有,它将会分配一个空闲的端口。 

 

 


 

connect()

系统调用connect()的用法如下:
#include<sys/types.h>
#include<sys/socket.h>
int connect(int sockfd,struct sockaddr* serv_addr,int addrlen);
第一个参数还是套接口文件描述符,它是由系统调用socket()返回的。
第二个参数是serv_addr是指向数据结构sockaddr的指针,其中包括目的端口和IP地址。
第三个参数可以使用sizeof(structsockaddr)而获得。
下面是一个例子:
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#defineDEST_IP"132.241.5.10"
#defineDEST_PORT23
main()
{
intsockfd;
structsockaddr_indest_addr;/*will hold the destination addr*/
sockfd=socket(AF_INET,SOCK_STREAM,0);/*do some error checking!*/
dest_addr.sin_family=AF_INET;/*hostbyteorder*/
dest_addr.sin_port=htons(DEST_PORT);/*short,network byte order*/
dest_addr.sin_addr.s_addr=inet_addr(DEST_IP);
bzero(&(dest_addr.sin_zero),8);/*zero the rest of the struct*/
/*don’tforgettoerrorchecktheconnect()!*/
connect(sockfd,(structsockaddr*)&dest_addr,sizeof(struct sockaddr));

同样,如果出错,connect()将会返回-1。

 


listen()

如果你希望不连接到远程的主机,也就是说你希望等待一个进入的连接请求,然后再处理它们。这样,你通过首先调用listen(),然后再调用accept()来实现。
系统调用listen()的形式如下:
intl isten(int sockfd,int backlog);
第一个参数是系统调用socket()返回的套接口文件描述符。
第二个参数是进入队列中允许的连接的个数。进入的连接请求在使用系统调用accept()应答之前要在进入队列中等待。这个值是队列中最多可以拥有的请求的个数。大多数系统的缺省设置为20。你可以设置为5或者10。当出错时,listen()将会返回-1值。
当然,在使用系统调用listen()之前,我们需要调用bind()绑定到需要的端口,否则系统内核将会让我们监听一个随机的端口。所以,如果你希望监听一个端口,下面是应该使用的系统调用的顺序:
socket();
bind();
listen();
/*accept()goeshere*/ 



accept()

系统调用accept()比较起来有点复杂。在远程的主机可能试图使用connect()连接你使用
listen()正在监听的端口。但此连接将会在队列中等待,直到使用accept()处理它。调用accept()
之后,将会返回一个全新的套接口文件描述符来处理这个单个的连接。这样,对于同一个连接
来说,你就有了两个文件描述符。原先的一个文件描述符正在监听你指定的端口,新的文件描
述符可以用来调用send()和recv()。
调用的例子如下:
#include<sys/socket.h>
intaccept(intsockfd,void*addr,int*addrlen);
第一个参数是正在监听端口的套接口文件描述符。第二个参数addr是指向本地的数据结构
sockaddr_in的指针。调用connect()中的信息将存储在这里。通过它你可以了解哪个主机在哪个
端口呼叫你。第三个参数同样可以使用sizeof(structsockaddr_in)来获得。
如果出错,accept()也将返回-1。下面是一个简单的例子:
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#defineMYPORT3490/*theportuserswillbeconnectingto*/
#defineBACKLOG10/*howmanypendingconnectionsqueuewillhold*/
main()
{
intsockfd,new_fd;/*listenonsock_fd,newconnectiononnew_fd*/
structsockaddr_inmy_addr;/*myaddressinformation*/
structsockaddr_intheir_addr;/*connector’saddressinformation*/
intsin_size;
sockfd=socket(AF_INET,SOCK_STREAM,0);/*dosomeerrorchecking!*/
my_addr.sin_family=AF_INET;/*hostbyteorder*/
my_addr.sin_port=htons(MYPORT);/*short,networkbyteorder*/
my_addr.sin_addr.s_addr=INADDR_ANY;/*auto-fillwithmyIP*/
bzero(&(my_addr.sin_zero),8);/*zerotherestofthestruct*/
/*don’tforgetyourerrorcheckingforthesecalls:*/
bind(sockfd,(structsockaddr*)&my_addr,sizeof(structsockaddr));
listen(sockfd,BACKLOG);
sin_size=sizeof(structsockaddr_in);
new_fd=accept(sockfd,&their_addr,&sin_size);

下面,我们将可以使用新创建的套接口文件描述符new_fd来调用send()和recv()。

 


send() 和recv()

系统调用send()的用法如下:
int send(int sockfd,const void* msg,int len,int flags);
第一个参数是你希望给发送数据的套接口文件描述符。它可以是你通过socket()系统调用返回的,也可以是通过accept()系统调用得到的。
第二个参数是指向你希望发送的数据的指针。
第三个参数是数据的字节长度。第四个参数标志设置为0。
下面是一个简单的例子:
char*msg="Beejwashere!";
intlen,bytes_sent;
..
len=strlen(msg);
bytes_sent=send(sockfd,msg,len,0);

系统调用send()返回实际发送的字节数,这可能比你实际想要发送的字节数少。如果返回的字节数比要发送的字节数少,你在以后必须发送剩下的数据。当send()出错时,将返回-1。
系统调用recv()的使用方法和send()类似:
int recv(int sockfd,void* buf,int len,unsigned int flags);
第一个参数是要读取的套接口文件描述符。
第二个参数是保存读入信息的地址。
第三个参数是缓冲区的最大长度。第四个参数设置为0。
系统调用recv()返回实际读取到缓冲区的字节数,如果出错则返回-1。
这样使用上面的系统调用,你可以通过数据流套接口来发送和接受信息。 



sendto() 和recvfrom()

因为数据报套接口并不连接到远程的主机上,所以在发送数据包之前,我们必须首先给出目的地址,请看:
int sendto(int sockfd,const void* msg,int len,unsigned int flags,
conststruct sockaddr*to,inttolen);
除了两个参数以外,其他的参数和系统调用send()时相同。
参数to是指向包含目的IP地址和端口号的数据结构sockaddr的指针。
参数tolen可以设置为sizeof(structsockaddr)。
系统调用sendto()返回实际发送的字节数,如果出错则返回-1。
系统调用recvfrom()的使用方法也和recv()的十分近似:
int recvfrom(int sockfd,void* buf,int len,unsigned int flags
struct sockaddr* from,int* fromlen);
参数from是指向本地计算机中包含源IP地址和端口号的数据结构sockaddr的指针。
参数fromlen设置为sizeof(struct sockaddr)。
系统调用recvfrom()返回接收到的字节数,如果出错则返回-1。

 


close() 和shutdown()

你可以使用close()调用关闭连接的套接口文件描述符:
close(sockfd);
这样就不能再对此套接口做任何的读写操作了。
使用系统调用shutdown(),可有更多的控制权。它允许你在某一个方向切断通信,或者切断双方的通信:
int shutdown(int sockfd,int how);
第一个参数是你希望切断通信的套接口文件描述符。第二个参数how值如下:
0—Furtherreceivesaredisallowed
1—Furthersendsaredisallowed
2—Furthersendsandreceivesaredisallowed(likeclose())
shutdown()如果成功则返回0,如果失败则返回-1。

 


getpeername()

这个系统的调用十分简单。它将告诉你是谁在连接的另一端:
#include<sys/socket.h>
int getpeername(int sockfd,struct sockaddr* addr,int* addrlen);
第一个参数是连接的数据流套接口文件描述符。
第二个参数是指向包含另一端的信息的数据结构sockaddr的指针。
第三个参数可以设置为sizeof(structsockaddr)。
如果出错,系统调用将返回-1。
一旦你获得了它们的地址,你可以使用inet_ntoa()或者gethostbyaddr()来得到更多的信息。

 


gethostname()

系统调用gethostname()比系统调用getpeername()还简单。它返回程序正在运行的计算机的名字。系统调用gethostbyname()可以使用这个名字来决定你的机器的IP地址。
下面是一个例子:
#include<unistd.h>
int gethostname(char*hostname,size_tsize);
如果成功,gethostname将返回0。如果失败,它将返回-1。