mysql 几则

为空(NULL)字段 的不能使用 =  <> 来判断必须使用 is null 或者 is not null
而且只有not null 的列可以建立索引(index)

虽然在php已经习惯了用时间戳来表示时间。但是在mysql 有了专门的类型表示时间为何还要用整形的字段来记录时间呢。
  DATETIME, DATETIMESTAMP
http://dev.mysql.com/doc/refman/5.1/en/date-and-time-type-overview.html

这里还有很多操作时间的函数
http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

判断网页是否使用了gzip

我尝试在shell下用curl -I www.example.com   无果
在php5中使用get_headers();   无果

使用live http headers 这个firefox的扩展倒是可以做到。不过记得要配置好(过滤url),不然复杂的网页会有很多无用的信息。
参看http返回的头里面有没有 Content-Encoding: gzip

httpwatch 这个ie的扩展看不到Content-Encoding这样的头(专业版可以,但是需要钱)。 但是可以通过其他信息推出有没有gzip。performance 里的   HTTP Compression Savings    0    bytes

nginx
默认编译是带有gzip模块的,只需要设置
 gzip  on;
文档http://wiki.codemongers.com/NginxHttpGzipModule

apache使用 mod_deflate 提供gzip功能

这是一个针对心急者的示范配置:
仅仅压缩少数几种类:
AddOutputFilterByType DEFLATE text/html text/plain text/xml

http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_deflate.html

php中 例 1. ob_gzhandler() example

<?php

ob_start("ob_gzhandler");

?>
<html>
<body>
<p>This should be a compressed page.</p>
</html>
<body>

找出暴力破解centos密码的坏蛋ip。

用shell

cat /var/log/secure | grep "Failed password" |sed ‘s/.*from//’|sed ‘s/port.*//’|uniq -c|sort -n


再去 grep 最大量的那些 IP, 看看是不是來亂的, 如果是來亂的, 擋掉這個IP, 或視情況擋掉那個網段(Linux):
擋掉 100.100.1.1 的 IP: iptables -I INPUT -s 100.100.1.1 -j DROP
擋掉 100.100.0.0 整個網段: iptables -A INPUT -s 100.100.0.0/24 -j DROP
解除: iptables -D INPUT -s 100.100.1.1 -j DROP

 

 

或者把这些ip加入到 /etc/hosts.deny 里面。

不改变目前系统架构得情况下,实现高负载

是否因为apache占用太多内存而烦恼。

使用nginx可以解决你一部分的能力,用nginx来处理静态文件。

动态内容通过代理。可以使得不用修改现在的系统架构.

Using Nginx As Reverse-Proxy Server On High-Loaded Sites

http://blog.kovyrin.net/2006/05/18/nginx-as-reverse-proxy/

 

最主要的nginx的配置

server {
        listen       80;
        server_name  some-server.com www.server-name.com;

        access_log  logs/host.access.log  main;

        # Main location
        location / {
            proxy_pass         http://127.0.0.1:8080/;
            proxy_redirect     off;

            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

            client_max_body_size       10m;
            client_body_buffer_size    128k;

            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;

            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }

        # Static files location
        location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
            root   /spool/www/members_ng;
        }

    }

Request.Form和Request.QueryString的区别

asp.net 里面的webform封装很好,让人很容易入手就可以写程序,但是怎么样接受别人post过来的数据呢,就需要用到
Request.Form:获取以POST方式提交的数据(接收Form提交来的数据);

Request.QueryString:获取地址栏参数(以GET方式提交的数据)

Request:包含以上两种方式(优先获取GET方式提交的数据),它会在QueryString、Form、ServerVariable中都搜寻一遍。

       而且有时候也会得到不同的结果。如果你仅仅是需要Form中的一个数据,但是你使用了Request而不是Request.Form,那么程序将在 QueryString、ServerVariable中也搜寻一遍。如果正好你的QueryString或者ServerVariable里面也有同名 的项,你得到的就不是你原本想要的值了。

 

 

参考:http://hi.baidu.com/redtramp/blog/item/35040ed52c85d2c050da4bbb.html

asp.net session 跨子域(subdomain)

通过共享 session 使得 asp.net 在不同子域(subdomain)间实现单点登陆,
但是 asp.net session  默认是不能跨域的。

首先需要让session保存在数据库或者state server ,这样才能共享session信息(默认是保存在服务器内存,不同子域是不通用的).
实现会话状态存储提供程序
http://msdn2.microsoft.com/zh-cn/library/ms178587(VS.80).aspx
在 asp.net 中实现复杂一点
在每个子域 的 global.asax 里面
Application_EndRequest 事件处理函数里面加上
Response.Cookies["ASP.NET_SessionId"].Value = Session.SessionID;
Response.Cookies["ASP.NET_SessionId"].Domain = ".flyy.info";

在php中很容易实现修改session.cookie_domain   /  session.save_handler

参考资料
1.php 手册
2.msdn
3.http://www.velocityreviews.com/forums/t108519-session-cookie-not-accessible-across-subdomains.html

简单仿discuz上传附件定位。

完全仿的discuz。  上传附件的时候排版于内容之中。
实现正文,附件混编 。<?php
if ($_FILES[attach]) {
    echo "<pre>";
    print_r($_POST);
    print_r($_FILES);
    exit();
}

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>

<body>发表新主题:<hr />
<form enctype="multipart/form-data" action="" method="POST">

<p>标题:<input type="text" name="note_title"></p>
<p>内容:<textarea id="note_main" name="note_main" cols="40" rows="4"></textarea>
</p>
<p>上传图片:
<br />
<hr />
<div id="attachDiv"  style="display:none" >
            <div id="functions">
                        <input type="file" name="attach[]" />
                        <span id="localfile[]"></span>
                        <input type="hidden" name="localid[]" />
            </div>
            
            
</div>
<hr />
<div id="attachDivBody">  
</div>
<hr />
</p>
<p>上传视频:<input type="text" name="vadio"></p>
<p>是否悬赏:<input name="note_type_xuanshang" type="radio" value="1"> 是   <input name="note_type_xuanshang" type="radio" value="0"> 否 悬赏分数:<input name="note_xuanshang_score" type="radio" value="1">1分 <input name="note_xuanshang_score" type="radio" value="2">2分 <input name="note_xuanshang_score" type="radio" value="5">5分 <input name="note_xuanshang_score" type="radio" value="10">10分 <input name="note_xuanshang_score" type="radio" value="20">20分 </p>
<p>是否使用喊话道具:<input name="note_type_hanhua" type="radio" value="1"> 是 <input name="note_type_hanhua" type="radio" value="0"> 否 </p>
<p><input type="submit" value="提交"></p>
</form>
<script type="text/javascript">
function $(id){
    return document.getElementById(id);
}
var aid = 1;
var attachexts = new Array();
var attachwh = new Array();
function addAttach() {
    newnode = $(‘functions’).cloneNode(true);
    var id = aid;
    var tags;
    newnode.id = ‘functions’ + id;
    tags = newnode.getElementsByTagName(‘input’);
    for(i in tags) {
        if(tags[i].name == ‘attach[]’) {
            tags[i].id = ‘attach_’ + id;
            tags[i].onchange = function() {insertAttach(id)};
            tags[i].unselectable = ‘on’;
            tags[i].value = "";
        }
        if(tags[i].name == ‘localid[]’) {
            tags[i].value = id;
        }
    }
    tags = newnode.getElementsByTagName(‘span’);
    for(i in tags) {
        if(tags[i].id == ‘localfile[]’) {
            tags[i].id = ‘localfile_’ + id;
        }
    }
    aid++;
    $(‘attachDivBody’).appendChild(newnode);
}

addAttach();

function insertAttach(id){
    var path = $(‘attach_’ + id).value;
    var ext = path.lastIndexOf(‘.’) == -1 ? ” : path.substr(path.lastIndexOf(‘.’) + 1, path.length).toLowerCase();
    var re = new RegExp("(^|\\s|,)" + ext + "($|\\s|,)", "ig");
    var localfile = $(‘attach_’ + id).value.substr($(‘attach_’ + id).value.replace(/\\/g, ‘/’).lastIndexOf(‘/’) + 1);
//    attachexts[id] = is_ie && in_array(ext, [‘gif’, ‘jpg’, ‘png’, ‘bmp’]) && typeof supe == ‘undefined’ ? 2 : 1;
    attachexts[id] = false && in_array(ext, [‘gif’, ‘jpg’, ‘png’, ‘bmp’]) && typeof supe == ‘undefined’ ? 2 : 1;
    if(path == ”) {
        return;
    }
    
    $(‘localfile_’ + id).innerHTML = ‘<a href="###delAttach" onclick="delAttach(‘ + id + ‘)">[删除]</a> <a href="###insertAttach" title="插入" onclick="insertAttachtext(‘ + id + ‘);return false;">[插入]</a> ‘+
    (attachexts[id] == 2 ? ‘<span id="localimgpreview_’ + id + ‘" onmouseover="showMenu(this.id, 0, 0, 1, 0)"> <span class="smalltxt">[‘ +id + ‘]</span> <a href="###attachment" onclick="insertAttachtext(‘ + id + ‘);return false;">’ + localfile + ‘</a></span>’ : ‘<span class="smalltxt">[‘ + id + ‘]</span> ‘ + localfile);
    $(‘attach_’ + id).style.display = ‘none’;
    addAttach();
}

function delAttach(id){
    $(‘attachDivBody’).removeChild($(‘attach_’ + id).parentNode);
    //$(‘attachDivBody’).innerHTML == ” && addAttach();
    //$(‘localimgpreview_’ + id + ‘_menu’) ? document.body.removeChild($(‘localimgpreview_’ + id + ‘_menu’)) : null;
}

function insertAttachtext(id){
    insertText(‘[local]’ + id + ‘[/local]’, false)
}
function insertText(text, movestart, moveend, select, sel) {
       
    $("note_main").focus();
    editdoc = $("note_main");
     if(document.selection && document.selection.createRange) {
            sel = document.selection.createRange();
            sel.text = text.replace(/\r?\n/g, ‘\r\n’);
            if(movestart) {
                sel.moveStart(‘character’, -strlen(text) +movestart);
                sel.moveEnd(‘character’, -moveend);
            } else if(movestart !== false) {
                sel.moveStart(‘character’, -strlen(text));
            }
            sel.select();
        } else {
                     editdoc.value += text;
        }
}
 
</script>
</body>
</html>