`
sealbird
  • 浏览: 570490 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

随记yii

    博客分类:
  • yii
 
阅读更多
系统管理
1、文件同步备份
   a、磁盘分配情况
   b、同步方案
   c、巨大数量的文件复制
      Linux(CentOS)挂载移动硬盘,实现文件拷贝、备份
   d、linux系统挂载移动硬盘,用来备份数据
2、cron
2-1、远程执行程序(通过脚本)
3、防火墙,(命令行配置)
4、端口更改
    ssh
    ftp
    桌面
5、远程桌面
6、磁盘管理 LVM
7、网络配置

1、mysql安装、备份,命令行操作
    select *  from jj_index_updateloglist where u_for_id=110916\G;
2、apache http (Web站点,其他域名(用以分流))
   以apache作为入口,两个后端apache作为分流作用,并且使用其他域名(考滤分流)
   2-1、apache的一些配置(对web的一些管理)
3、php及插件安装
4、tomcat
5、ftp服务器
6、memcahe及 memcacheDB




1、下载准备各种软件

32位
64位

centos
apache-https
tomcat
java
rsync
php
mysql


1、snmpd
2、linux watchdog
   使用watchdog 构建高可用性的 Linux 系统及应用
本文首先介绍 Linux 内核对硬件、软件 watchdog 的支持;然后通过一个开源项目watchdog daemon介绍如何在一个系统监控应用中加入 watchdog 的使用以提高系统的可用性



1、
  pdf文件转html


2、mapreduce 的研究







1、hadoop 启动脚本的研究,是一种比较好的部署与远程控操控机器的方法,可以借鉴




2011-12-08
plupload 上传组件的使用,主页:http://www.plupload.com/example_jquery_ui.php
   0、一开始,最好只限制“增加文件”按钮
   1、增加第一文件后,按妞改写成“续继增加文件” ok
   2、文件个数限制 ok
   3、文件名重复限制 这个可能要看swf代码了
   4、点开始上传时,触发一个事件,调出填写文件的详细信息
   5、“确定”按钮,post填写的信息到服务端  <input type="hidden" id="uploader_count" name="uploader_count" value="?">
   6、点击上传后,如果是大文件,没有任何提示,需加上提示
   7、点击上传后,即要触发填写上传的文件详细信息输入框显示,需要改动jquery.plupload.queue.js 即每加入一文件都需要及生成一个input(在一个新的form中)
     在全部文件上传完毕后,“提交”按钮可用
     并且具体提交时需检证文件上传状态,假某个文件没有上传成功,则提交时需删该元素(即用js的方式删除该input标记)
     
   8、文件上传成功后返回的id在哪里能反映
   9、返回来的id怎样与原来生成的input对应呢
response返回来的值希望包括原始文件名,数据库id号,这样前端通过返回来的文件名与input匹配,提交时,根据id再进行一次更新就ok了
    
   10、上传文件时,最好能把用户的id传到服务器端,这样用户上传的文档在没有提交时而出现问题,能得到保存到 。可以加上参数,与文件一起上传到服务端
        这样就能很好的满足要求了
   11、解决中文问题,做如下处理
//$fileName = preg_replace('/[^\w\._]+/', '', $fileName);
$fileName= mb_convert_encoding($fileName, "GBK", "UTF-8");

   12、上传等待提示,因为大文件需要较长时间

   13、分类的处理

   14、创建文件夹成功时,返回的代码,用其他方式处理
<script type="text/javascript">
alert("创建成功!");
document.getElementById("addfloder0").value = "";
on_addFolder(false,'0');
</script>

<script type="text/javascript">
document.getElementById("addfloderSpan0").style.display = "none";

var lengthArray = document.getElementsByName("addToFolderSelect");
if(lengthArray != null && lengthArray.length>0){
for(var j = 0 ; j < lengthArray.length; j++){
var iLength = lengthArray[j].options.length ;
var option = lengthArray[j];

if (newFolderName == "2323"){
option[iLength] = new Option("2323",137340);
if(option.id == 'addToFolderSelect0'){
option.value=137340;
selectflot("0");
}
}

if (newFolderName == "dddd"){
option[iLength] = new Option("dddd",113511);
if(option.id == 'addToFolderSelect0'){
option.value=113511;
selectflot("0");
}
}

if (newFolderName == "eeeeee"){
option[iLength] = new Option("eeeeee",136752);
if(option.id == 'addToFolderSelect0'){
option.value=136752;
selectflot("0");
}
}

}
}
</script>

     
还要解决的问题
15、当删除文件时,需要把编辑的div去除 ok
16、提交时,判断文件还没有上传完成,如果没有一个文件上传成功,则不允许提交 ok

17、修改上传失败与成功的状态到具体(即与显示文件那里一致)
18、对于上传失败的文件,也需要把编辑的div去除
19、界面的进一步调整,最好能把上传

20、当选择文件时,一次性选择多个文件时,还会选到重复的文件(需要改进) ok
21、展开与收缩时,实际文件名的处理 ok
22、服务端对多input name='name' 的处理 ok
23、上传数量控制,vip会员可以一次性上传5-10个,普通会员只能上传2个 ok
24、提示上传成功的,上传失败的(接受了id的表示上传成功,否则没有id的表示上传失败)
25、文件在服务器上传成功后,传回json格式的数据,检查code值,然后重改plupload jquery.plupload.queue.js中的div部分
    其回返回廖li 的id,需据此修改状态


26、上传等待提示,因为大文件需要较长时间(做适当提示)
















读写分离作为重点

1、mysql配置最大内存
2、php配置最大内存
3、apache配置最大内存
4、yii处理多个从数据库
5、yii与apc apc(可缓存代码)
6、Redis
a\Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很 ...
相对于Memcache的区别
b\支持的数据类型多样化。支持字符串、列表、集合、有序集合、Hash数组这几种数据类型。

c\可以灵活的指定key存储在哪台服务器上
7、rest webservice 的使用
9、Lighttpd+Squid+Apache搭建高效率Web服务器
   静态文件的处理
   探索出一个,能根据访问时生成静态页面,而且能够处理比较大的请求数据的架构

10、静态页面与广告
11、fastdfs_module_apache与c的lur(缓存系统)
12、nginx 的使用

13、静态面,nginx,apache,fastdfs_module_nginx,fastdfs  的使用   
     安装nginx 及写一个nginx module
     fastdfs的最新版安装了解
   
apache和nginx扩展模块在下载文件时支持断线续传

    反向代理 负载均衡 动静分离

    负载均衡双机高可用

    静态页面使用rewrite重定向 ,解决yii静态页面的处理问题(能否访问时生成静态页面),即如下流程
   
     1\访问域名网址 ,是否存在静态页,不存(或不命中)则访问后端apache yii应用
     2\生成静态页
     3\如果重新访问yii应用,则nginx会检测如果存在静态页,则直接访问静态页



14、分两步以更多步
     a\用nginx apache搭起基本应用
     b\加入fastdfs 与nginx集群

8、c语言加密算法





2011-12-14
1、php的页面静态化策略
   http://www.google.com.hk/search?q=php+yii+%E9%9D%99%E6%80%81%E9%A1%B5%E9%9D%A2&hl=zh-CN&newwindow=1&safe=strict&biw=1069&bih=685&prmd=imvns&tbs=clir:1,clirtl:en,clirt:en+php+yii+static+page&sa=X&ei=Ol_oTte8C4KZiQf059TKCA&ved=0CHEQ_wEwCg
   a、http://translate.google.com.hk/translate?hl=zh-CN&langpair=en%7Czh-CN&u=http://www.yiiframework.com/wiki/22/how-to-display-static-pages-in-yii/
2、php性能较好的前端框架



网站建设中利用PHP自动执行任务代码自动生成静态页面
网站建设中利用PHP自动执行任务代码是很有用的,如让程序定期自动生成静态页面等。如果您是PHP程序员,学习Javascript、Ajax、DIV+CSS、这些都是很有必要的。
1.在某个固定的时间执行的PHP代码:
//计划执行时间
if($job=="cron"){
check_method();
//查询数据库的下一个时间是否小于现在的时间
if($maxrecord["deltemptime"]<$nowtime["timestamp"]){
$crondb = array();
//day为0为每日 week周 minute时间断 hour什么时侯开始
$rt["cron"] = array("day"=>"0","week"=>$config["cron_week"],"m"=>$config["cron_minute"],"hour"=>$config["cron_hour"]);
$crondb[] = $rt;
}
foreach ($crondb AS $key => $cron_val){
//设置了允许分钟段
if (!empty($config["cron_minute"])){
$m = explode(" ", $config["cron_minute"]);
$m_now = intval(local_date("i",$nowtime["timestamp"]));
if (!in_array($m_now, $m)) {//不包含此分钟的跳出
continue;
}
}
$next_time = get_next_time($cron_val["cron"]);
$DB->query("UPDATE `maxrec` SET `deltemptime`={$next_time}");
}
exit;
}
>
2.隔时生成首页的PHP代码:
set_time_limit(0);
$baseCmsUrl = "http://www.kz27.com";//你网站的根网址,结束不要加 /
$dmPageName = "index.php";//动态主页的名称
$stPageName = "index.html";//生成静态主页的名称
$mkTime = 3600;//你希望多长时间更新一次,单位是秒
//下面是执行的代码
$tureStFile = dirname(__FILE__)."/".$stPageName;
$ftime = @filemtime($tureStFile);
if(!file_exists($tureStFile) || ($ftime < time()-$mkTime))
{
$body = file_get_contents($baseCmsUrl."/".$dmPageName);
$fp = fopen($tureStFile, "w");
fwrite($fp, $body);
fclose($fp);
}
>
将上面代码保存为task.php
在经常访问的页面调用:
深圳英文外贸网站建设应该避免的5个误区
如何让客户信任企业的网站
到底什么是网络营销,企业和个人如何做网络营销
深圳网站优化之图片ALT标签的应用
深圳网站设计:如何做到简约而不简单
专业网站建设必不可少的重网站环节-网站策划
3.PHP自动执行任务,关掉页面或浏览器也会自动定时执行:
ignore_user_abort();



怎样在Yii Framework中显示静态页
在web应用中,我们经产更需要显示静态页,如“关于我们”等,这些文件通常是静态页,通常有如下几种处理方法:

1.把独立的html文件存在Web服务器能直接访问的目录下。这种方案的缺点是很难维护网页布局以及和动态页的连接.

2.可以自己写action赖渲染view文件处理每一个静态页,这样解决了layout问题,但是为每一个页写一个单独的action,特别是这个action仅仅处理一个静态文本,非常麻烦。

3.使用Yii内置的一个CViewAction来服务所有这些页。

下面就介绍第三种方法:
首先,建立以个controller类如DocController,覆盖actions方法
public function actions()
{
    return array(
        'page'=>array(
            'class'=>'CViewAction',
        ),
    );
}

根据官方指南,以上代码声明了一个外部action类CViewAction.

然后,生成目录protected/views/site/pages.

最后,在该目录下存储一个文件叫about.php,内容为:"about this site" ,此时这些页将使用应用的默认布局文件。因此该文件仅仅描述本页相关内容。

http://www.yourhost.com/index.php?r=doc/page&view=about

如果有很多静态页,可以将其放在子目录里,假设有一个有静态页在protected/views/site/pages/help/contact.php:

http://www.yourhost.com/index.php?r=site/page&view=help.contact

当然,我们也可以定制CViewAction的行为,察看API文档了解更多有关于CViewAction











二、配置rsync服务
  配置一个简单的rsync服务并不复杂,你需要修改或建立一些配置文件。
  1.rsyncd.conf
  # vi /etc/rsyncd.motd
  rsyncd.con是rsync服务的主要配置文件,它控制rsync服务的各种属性,下面给出一个
rsyncd.conf文件的例子:
  #先定义整体变量
  secrets file = /etc/rsyncd.secrets
  motd file = /etc/rsyncd.motd
  read only = yes
  list = yes
  uid = nobody
  gid = nobody
  hosts allow = 192.168.100.90 #哪些电脑可以访问rsync服务
  hosts deny = 192.168.100.0/24 #哪些电脑不可以访问rsync服务
  max connections = 2
  log file = /var/log/rsyncd.log
  pid file = /var/run/rsyncd.pid
  lock file = /var/run/rsync.lock
  #再定义要rsync目录
  [terry]
  comment = Terry 's directory from 192.168.100.21
  path = /home/terry
  auth users = terry,rsync
  [test]
  comment = test rsync
  path = /home/test
  在上面的配置文件中,限定了192.168.100.0/24这个子网中,只有192.168.100.90的机器可以来访问这台rsync服务器的rsync服务。配置文件的后面部分定义了两个rsync的目录,terry目录是只有知道terry、rsync两个账号的人才能使用的,而text目录是无需账号就可以访问的。rsync在定义目录时还提供了一些其它选项,可以作更严格的控制。

  2.rsyncd.secrets
  # vi /etc/rsyncd.secrets
  rsyncd.secrets是存储rsync服务的用户名和密码的,它是一个明文的文本文件,下面给出一个rsyncd.secrets文件的例子:
  terry:12345
  rsync:abcde
  因为rsyncd.secrets存储了rsync服务的用户名和密码,所以非常重要,因此文件的属性必须
设为600,只有所有者可以读写:
  # chmod 600 /etc/rsyncd.secrets

  3.rsyncd.motd
  # vi /etc/rsyncd.motd
  rsyncd.motd记录了rsync服务的欢迎信息,你可以在其中输入任何文本信息,如:
  Welcome to use the rsync services!

  4.services
  # vi /etc/services
  services并不是rsync的配置文件,这一步也可以不做。而修改了services文件的好处就在于
系统知道873端口对就的服务名为rsync。修改services的方法就是确保services中有如下两行,
没有的话就自行加入:
  rsync  873/tcp  # rsync
  rsync  873/udp  # rsync
  5./etc/xinetd.d/rsync
  # vi /etc/xinetd.d/rsync
  建立一个名为/etc/xinetd.d/rsync文件,输入以下内容:
  service rsync
  {
    disable = no
    socket_type  = stream
    wait      = no
    user      = root
    server     = /usr/local/rsync/bin/rsync
    server_args  = --daemon
    log_on_failure += USERID
  }
  保存后,就可以运行rsync服务了。输入以下命令:
  # /etc/rc.d/init.d/xinetd reload
  这样rsync服务就在这台机器上(192.168.100.21)运行起来了,接下来就是如何来使用它了。

  三、rsync命令的用法
  在配置完rsync服务器后,就可以从客户端发出rsync命令来实现各种同步的操作。rsync有很
多功能选项,下面就对介绍一下常用的选项:
  rsync的命令格式可以为:
  1. rsync [OPTION]... SRC [SRC]... [USER@]HOST : DEST]
  2. rsync [OPTION]... [USER@]HOST:SRC DEST]
  3. rsync [OPTION]... SRC [SRC]... DEST]
  4. rsync [OPTION]... [USER@]HOST::SRC [DEST]
  5. rsync [OPTION]... SRC [SRC]... [USER@]HOST :: DEST]
  6. rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

  rsync有六种不同的工作模式:
  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST
路径地址包含单个冒号":"分隔符时启动该模式。
  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC
地址路径包含单个冒号":"分隔符时启动该模式。
  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
  下面以实例来说明:
  # rsync -vazu -progress terry@192.168.100.21:/terry/ /home
  v详细提示
  a以archive模式操作,复制目录、符号连接
  z压缩
  u只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时
  -progress指显示
  以上命令是保持客户机192.168.100.90上的/home/terry目录和rsync服务器上的terry目录同
步。该命令执行同步之前会要求你输入terry账号的密码,这个账号是我们前面在rsyncd.secrets
文件中定义的。如果想将这条命令写到一个脚本中,然后定时执行它的话,可以使用--password-file
选项,具体命令如下:
  # rsync -vazu -progress --password-file=/etc/rsync.secret
  terry@192.168.100.21:/terry/ /home
  要使用--password-file选项,就得先建立一个存放密码的文件,这里指定为/etc/rsync.secret。
其内容很简单,如下:
  terry:12345
  同样要修改文件属性如下:
  # chmod 600 /etc/rsyncd.secrets

  四、利用rsync保持Linux服务器间的文件同步实例
  现在假设有两台Linux服务器A(192.168.100.21)和B(192.168.100.90),服务器A中的
/home/terry和服务器B中的/home/terry这两个目录需要保持同步,也就是当服务器A中文件发生
改变后,服务器B中的文件也要对应去改变。
  我们按上面的方法,在服务器A上安装rsync,并将其配置为一台rsync服务器,并将/home/terry
目录配置成rsync共享出的目录。然后在服务器B上安装rsync,因为B只做客户端,所以无需配置。
然后在服务器B,建立以下脚本:
  #!/bin/bash
  /usr/loca/rsync/bin/rsync -vazu -progress --delete
  --password-file=/etc/rsync.secret terry@192.168.100.21:/terry/ /home
  将这个脚本保存为AtoB.sh,并加上可执行属性:
  # chmod 755 /root/AtoB.sh
  然后,通过crontab设定,让这个脚本每30分钟运行一次。执行命令:
  # crontab -e
  输入以下一行:
  0,30 * * * * /root/AtoB.sh
  保存退出,这样服务器B每个小时的0分和30分时都会自动运行一次AtoB.sh,AtoB.sh是负责
保持服务器B和服务器A同步的。这样就保证了服务器A的所有更新在30钟后,服务器B也一样取
得了和服务器A一样的最新的资料。

  五、其它应用
  rsync除了同步文件及目录之外,还可以利用它来实现对远程网站的远程备份。如果再结合脚本和Crontab就能实现定时自动远程备份。其可以实现与商业化的备份和镜象产品的类似效果,但完全免费。

         附:rsync有六种不同的工作模式:
  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST
路径地址包含单个冒号":"分隔符时启动该模式。
  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC
地址路径包含单个冒号":"分隔符时启动该模式。
  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可























1、cms
2、论坛
3、后台服务
4、1,2,3的整合

1、手机阅读器的了解及相关要考虑到的问题



其他
  要有一个统计策略,就是看的用户很多的情况下,调整相关信息




对每一项记录下详细的操作记录










2011-12-20

积分
 
调查问卷

http://xiazaiadmin.dichan.com/gg/diaocha/admin_index.aspx






LVS
hadoop sh 研究
apache
fastdfs的使用情况

可以找到rpm很多包
http://rpmfind.net/linux/rpm2html/search.php?query=apxs&submit=Search+...
与 www.finajar.com 一样
1、
http default 安装在哪呢

1.我们得到一个新软件,在安装之前,一般都要先查看一下这个软件包里有什么内容,假设这个文件是:Linux-1.4-6.i368.rpm,我们可以用这条命令查看:

  rpm -qpi Linux-1.4-6.i368.rpm

  系统将会列出这个软件包的详细资料,包括含有多少个文件、各文件名称、文件大小、创建时间、编译日期等信息。

  2.上面列出的所有文件在安装时不一定全部安装,就像Windows下程序的安装方式分为典型、完全、自定义一样,Linux也会让你选择安装方式,此时我们可以用下面这条命令查看软件包将会在系统里安装哪些部分,以方便我们的选择:

  rpm -qpl Linux-1.4-6.i368.rpm

  3.选择安装方式后,开始安装。我们可以用rpm-ivh Linux-1.4-6.i368.rpm命令安装此软件。在安装过程中,若系统提示此软件已安装过或因其他原因无法继续安装,但若我们确实想执行安装命令,可以在 -ivh后加一参数“-replacepkgs”:

  rpm -ivh -replacepkgs Linux-1.4-6.i368.rpm

  4.有时我们卸载某个安装过的软件,只需执行rpm-e <文件名>命令即可。

  5.对低版本软件进行升级是提高其功能的好办法,这样可以省去我们卸载后再安装新软件的麻烦,要升级某个软件,只须执行如下命令:rpm -uvh <文件名>,注意:此时的文件名必须是要升级软件的升级补丁

  6.另外一个安装软件的方法可谓是Linux的独到之处,同时也是RMP强大功能的一个表现:通过FTP站点直接在线安装软件。当找到含有你所需软件的站点并与此网站连接后,执行下面的命令即可实现在线安装,譬如在线安装Linux-1.4-6.i368.rpm,可以用命令:

  rpm -i ftp://ftp.pht.com/pub/linux/redhat/...-1.4-6.i368.rpm

  7.在我们使用电脑过程中,难免会有误操作,若我们误删了几个文件而影响了系统的性能时,怎样查找到底少了哪些文件呢?RPM软件包提供了一个查找损坏文件的功能,执行此命令:rpm -Va即可,Linux将为你列出所有损坏的文件。你可以通过Linux的安装光盘进行修复。

  8.Linux系统中文件繁多,在使用过程中,难免会碰到我们不认识的文件,在Windows下我们可以用“开始/查找”菜单快速判断某个文件属于哪个文件夹,在Linux中,下面这条命令行可以帮助我们快速判定某个文件属于哪个软件包:

  rpm -qf <文件名>

  9.当每个软件包安装在Linux系统后,安装文件都会到RPM数据库中“报到”,所以,我们要查询某个已安装软件的属性时,只需到此数据库中查找即可。注意:此时的查询命令不同于1和8介绍的查询,这种方法只适用于已安装过的软件包!命令格式:

  rpm -参数 <文件名>



LoadModule helloworld_module modules/helloworld.so
<Location /helloworld>
    SetHandler helloworld
</Location>


LoadModule download_module modules/download.so
<Location /test>
    SetHandler download
</Location>



sealbird 发表于 2011-05-24 22:10:12

问fastdfs-apache-module增加功能的设想[加防盗链功能]
happy_fish100,你好,以前提过一个 地址为 http://bbs.chinaunix.net/thread-2287944-1-2.html
     现在想问一下,能不能在fastdfs-apache-module加入防盗链的功能呢[分布式,链接往往暴露在外],等待你的回答.谢谢
sealbird 发表于 2011-05-24 22:17:59

自已先顶起来:lol:
happy_fish100 发表于 2011-05-25 09:24:48

回复 1# sealbird

已经支持了啊!
通过token的方式来实现的防盗链。
看一下配置文件 mod_fastdfs.conf,里面包含了http.conf,在http.conf中进行防盗链相关设置。
sealbird 发表于 2011-05-25 10:07:05

谢谢你及时回复,可能我没有说明白,具体如下
1、客户端用如下链接进行访问服务器端的文件
    http://xxx.xx.xx/00/00/wKgAgk1_M36eGCazAAHAC_MLulA790.doc ?filename=540个活动营销策略.doc&key=adlkfjskdoefrlcvexcvkas
     说明:这个key是在客户端(运用端)用某种算法得到的(即时通过算法求得),而想在fastdfs-apache-module中实现与客户端(运用端)一样的算法,而这个算法可以通过配置文件经常调整
  
   再加上 http.conf 中 使用mod_rewrite.so HTTP_REFERER   达到两级防盗,通过HTTP_REFERER好像有人可以破的,所以想再加一层安全

  不知道在fastdfs-apache-module能不能有这个功能
  就如下面这个文章中说的那样子 http://sealbird.iteye.com/admin/blogs/897537
sealbird 发表于 2011-05-26 09:06:39

自已先顶一下
happy_fish100 发表于 2011-05-26 10:19:45

回复 5# sealbird

目前已经提供带时效的token机制。
如果还不能满足你们的需求,你可以根据你们的业务逻辑直接修改扩展模块代码,嘿嘿。
sealbird 发表于 2011-05-28 12:10:24

谢谢happy_fish100
页: [1] 查看完整版本: 问fastdfs-apache-module增加功能的设想[加防盗链功能]



有时候,运行 Nginx、PHP-CGI(php-fpm) Web服务的 Linux 服务器,突然系统负载上升,使用 top 命令查看,很多 php-cgi 进程 CPU 使用率接近100%。后来,我通过跟踪发现,这类情况的出现,跟 PHP 的 file_get_contents() 函数有着密切的关系。

  大、中型网站中,基于 HTTP 协议的 API 接口调用,是家常便饭。PHP 程序员们喜欢使用简单便捷的 file_get_contents("http://example.com/") 函数,来获取一个 URL 的返回内容,但是,如果 http://example.com/ 这个网站响应缓慢,file_get_contents() 就会一直卡在那儿,不会超时。

  我们知道,在 php.ini 中,有一个参数 max_execution_time 可以设置 PHP 脚本的最大执行时间,但是,在 php-cgi(php-fpm) 中,该参数不会起效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的以下参数:

view plaincopy to clipboardprint?
1.The timeout (in seconds) for serving a single request after which the worker process will be terminated  
2.Should be used when 'max_execution_time' ini option does not stop script execution for some reason  
3.'0s' means 'off'  
4.<value name="request_terminate_timeout">0s</value> 
The timeout (in seconds) for serving a single request after which the worker process will be terminated
Should be used when 'max_execution_time' ini option does not stop script execution for some reason
'0s' means 'off'
<value name="request_terminate_timeout">0s</value>  默认值为 0 秒,也就是说,PHP 脚本会一直执行下去。这样,当所有的 php-cgi 进程都卡在 file_get_contents() 函数时,这台 Nginx+PHP 的 WebServer 已经无法再处理新的 PHP 请求了,Nginx 将给用户返回“502 Bad Gateway”。修改该参数,设置一个 PHP 脚本最大执行时间是必要的,但是,治标不治本。例如改成 <value name="request_terminate_timeout">30s</value>,如果发生 file_get_contents() 获取网页内容较慢的情况,这就意味着 150 个 php-cgi 进程,每秒钟只能处理 5 个请求,WebServer 同样很难避免“502 Bad Gateway”。

  要做到彻底解决,只能让 PHP 程序员们改掉直接使用 file_get_contents("http://example.com/") 的习惯,而是稍微修改一下,加个超时时间,用以下方式来实现 HTTP GET 请求。要是觉得麻烦,可以自行将以下代码封装成一个函数。

view plaincopy to clipboardprint?
1.<?php  
2.$ctx = stream_context_create(array(  
3.   'http' => array(  
4.       'timeout' => 1 //设置一个超时时间,单位为秒  
5.       )  
6.   )  
7.);  
8.file_get_contents("http://example.com/", 0, $ctx);  
9.?> 
<?php
$ctx = stream_context_create(array(
   'http' => array(
       'timeout' => 1 //设置一个超时时间,单位为秒
       )
   )
);
file_get_contents("http://example.com/", 0, $ctx);
?>  当然,导致 php-cgi 进程 CPU 100% 的原因不只有这一种,那么,怎么确定是 file_get_contents() 函数导致的呢?

  首先,使用 top 命令查看 CPU 使用率较高的 php-cgi 进程。


top - 10:34:18 up 724 days, 21:01,  3 users,  load average: 17.86, 11.16, 7.69
Tasks: 561 total,  15 running, 546 sleeping,   0 stopped,   0 zombie
Cpu(s):  5.9%us,  4.2%sy,  0.0%ni, 89.4%id,  0.2%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   8100996k total,  4320108k used,  3780888k free,   772572k buffers
Swap:  8193108k total,    50776k used,  8142332k free,   412088k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                              
10747 www       18   0  360m  22m  12m R 100.6 0.3    0:02.60 php-cgi                                                                                                             
10709 www       16   0  359m  28m  17m R 96.8  0.4    0:11.34 php-cgi                                                                                                              
10745 www       18   0  360m  24m  14m R 94.8  0.3    0:39.51 php-cgi                                                                                                              
10707 www       18   0  360m  25m  14m S 77.4  0.3    0:33.48 php-cgi                                                                                                              
10782 www       20   0  360m  26m  15m R 75.5  0.3    0:10.93 php-cgi                                                                                                              
10708 www       25   0  360m  22m  12m R 69.7  0.3    0:45.16 php-cgi                                                                                                              
10683 www       25   0  362m  28m  15m R 54.2  0.4    0:32.65 php-cgi                                                                                                              
10711 www       25   0  360m  25m  15m R 52.2  0.3    0:44.25 php-cgi                                                                                                              
10688 www       25   0  359m  25m  15m R 38.7  0.3    0:10.44 php-cgi                                                                                                              
10719 www       25   0  360m  26m  16m R  7.7  0.3    0:40.59 php-cgi

  找其中一个 CPU 100% 的 php-cgi 进程的 PID,用以下命令跟踪一下:

strace -p 10747

  如果屏幕显示:

select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)

  那么,就可以确定是 file_get_contents() 导致的问题了。

fastdfs

现在遇到一个问题,有时候会因为碰到这样形式的文件 file.a.b,如果上传后返回的文件名为 xxx.b,这样的话会出现文件不能使用的情况,比如说两个这样的文件 sample.part1.rar 和 sample.part2.rar 只有两个在一起时才能正常解压,如果用fastdfs上传后文件名都会改变。下载后不能正常解压。能不能不让文件名改变或者后缀名是否可以保存第一个点出现时以后的部分

哈哈。最近刚好实现了主从文件。正在测试阶段。
slave文件的文件名根据master文件名生成,生成规则为:
master文件名去除文件后缀 + slave前缀名 + slave文件后缀名。
例如,master文件名为:
M00/00/01/wKjReUsKNqEAAAAAAAAADy96xyo28.txt

slave前缀名为-memo,则slave文件名为:
M00/00/01/wKjReUsKNqEAAAAAAAAADy96xyo28-memo.txt

参考 http://bbs.chinaunix.net/thread-1948414-1-1.html
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics