<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
   <channel>
      <title>Gccgle BLOG</title>
      <link>http://www.gccgle.com/</link>
      <description></description>
      <language>en</language>
      <copyright>Copyright 2008</copyright>
      <lastBuildDate>Fri, 29 Feb 2008 17:13:46 +0800</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

            <item>
         <title>利用AJAX技术提高搜索引擎排名</title>
         <description>　　描述 嵌入在你的web页面中的导航元素能够降低你的搜索引擎评价排名并且降低你的网站的响应性能。本文作者想同你一起探讨如何使用AJAX技术来解决这两个问题。

　　许多设计良好的web站点都包含大量的与实际内容相联系的可导航信息。用于导航的HTML标记能影响你的搜索引擎评价，而且能够改进访问者的页面下载体验感。在本文中，你会看到如何使用AJAX来创建更为集中的更快速加载的web页面。

　　一、 分离导航与内容

　　让我们使用一个例子作为开始。请考虑你现在阅读的文章，它有下列一些内容：

　　· 一个其上有一些预定义的到Informit的各个部分的链接的页眉。 

　　· 在页眉下有一行，把本文放到Informit的目录结构之中（实际上，这是唯一的与目录相关的可导航元素）。

　　· 一个位于右首的侧栏，其中有一些连接到流行文章和推荐内容的链接。

　　· 一个页脚，还有一些永远不会改变的链接。

　　上面的&quot;混合&quot;很可能会影响搜索引擎索引你的数据的方式：

　　· 因为搜索引擎不能区别内容与导航文本，所以它们会把它们在你的页面中找到的一切进行索引。既然目录中的关键字与不相关的可导航关键字混合在一起，那么内容之间的关联大大减少。一些搜索引擎宣称，它们能够在被搜索到的页面(例如，固定的页眉和页脚)中发现重复的文本并且删除它们。但是，不要依赖这种可能性；即使它们实现了这种技术，也很可能不会一直可靠。

　　· web页面中的外向链接影响你的内容的页面评价。尽管这可能提高流行的文章的评价排名（因为许多页面都链接到它们），但是所有的页面都链接到的内容(例如，隐私策略)通常得到最高的页面评价-这可能不是你一直关心的问题。在我的一个web站点中，最高的评价页面是用于把消息发送到web管理员的表单-而不是你想让用户首先在Google上找到的内容。

　　注意

　　即使你不使用站点地图，你也可以通过Google的站点地图用户接口来了解一下你的页面的页面排名情况。

　　添加到一个web页面的可导航元素还可能影响使用低速互联网存取的用户，而如果web页面不使用DIV元素（Informit使用之）而使用表格时更是如此。在这种情况中，在把它显示给用户之前，整个表格必须被加载到一些web浏览器中。

　　传统地，web设计者一般都使用框架集或通过构建整套的导航架构（广泛使用JavaScript代码）来实现导航与内容的分离。这两条途径都存在其缺点；因此，许多大型网站避免使用框架集就不足为奇了。

　　借助于在AJAX框架中使用的技术，你可以为这一问题提供一种方案：

　　· 每一个web页面仅包含可导航元素和实际内容的占位符。

　　· 在web页面通过嵌入式框架(IFRAME)或使用XmlHttpRequest对象加载后，再装载这些可导航元素。

　　· 然后，可导航元素的内容被合并到web页面内容中，从而产生一个不嵌入任何帧的干净的页面。

　　在使用这种方法重新设计你的web页面之前，你需要考虑下列问题：

　　· 搜索引擎仅将看到初始的web页面。你必须确保，该页面中包含到相关页面或到一个网站地图的链接。Informit网站中文章页眉上方的导航线和在页面的文章信息部分中的链接正好可以较好地实现这一目的。 

　　· 在他们的浏览器中禁止调用JavaScript的访问者将具有与搜索引擎相同的页面视图。你必须确保他们有受限的视图不会给你的网站的功能造成较大影响。

　　· 你可能想在你的页面上保留一些静态内容。例如，Informit标识和版权信息必须一直显示给所有的访问者。

　　当你确定好应该把你的导航结构哪些部分依附到页面上以及哪些部分应该与之分开之后，你就可以开始下一步骤了。

　　二、 设计你的Web页面

　　实现分离内容和导航的第一步是，在web页面上创建将插入可导航元素的占位符。对于每一个可导航元素的连续区域，你应该创建一个具有唯一id的独立DIV元素；这样以来，以后你可以在你的JavaScript代码中标识它。为了防止过度晃动，在创作页面期间，目录上方或右边的DIV元素的尺寸应该调整到非常接近你的可导航元素的实际大小；这样，当你使用希望的HTML代码来代替它们时内容就不会移动位置。为此，一种最巧妙的方法是把一个空的适当大小的DIV元素插入到该占位符处。

　　对于Informit网站来说，其页面结构已经是良好设计的，且DIV元素已经非常到位，如图1所示。


图1一篇Informit文章的页面结构 

　　你仅需要从可导航DIV元素中删除内容并且插入一个空框，页眉将会出现在这里(为了简短起见，我们将忽略把公司标识和版权信息嵌入到每一个页面中的讨论)。下面是相应的代码：

＜div id=&quot;header&quot;＞
＜div style=&quot;height: 100px; width: 100%&quot;＞＜/div＞
＜/div＞
＜div id=&quot;contentArticle&quot;＞
＜div id=&quot;firstCol&quot;＞
... article content ....
＜/div＞
＜div id=&quot;secondCol&quot; ＞＜/div＞
＜/div＞
＜div id=&quot;footer&quot;＞＜/div＞

　　注意

　　如果你的web页面使用表格来实现所希望的页面布局，那么请不要把表格单元格重用作占位符；而把DIV元素放到表格单元格内比较好一些。

　　已经被从web页面中删除的可导航的元素必须被重新创建为独立的页面。你应该使用静态HTML文件来表达静态内容(这将允许缓冲内容，不管你使用什么样的web服务器)和在加载它们的web页面上创建显示基于动态元素的服务器端脚本。对于Informit来说，每一个web页面都有唯一一个文章标识符(在URL中的&quot;p=&quot;参数)；因此，你需要创建一个能够接受文章标识符并创建右边的栏目的服务器端脚本。在大多数情况中，你可以重用创建嵌入的可导航元素的服务器端代码。

　　在重新设计这些web页面后，接下来，你就可以实现本方案中的AJAX部分了。与通常一样，你可以使用嵌入式框架(IFRAME元素)工作，也可以选用一个XmlHttpRequest对象。

　　三、 嵌入式框架

　　如果你关心浏览器兼容性的话，你应该使用嵌入式框架。一些老式的浏览器支持IFRAME元素，但不支持XmlHttpRequest对象。当然，使用这种方式还有如下一些理由：

　　· 被加载到一个IFRAME中的内容在装载的过程中被显示于浏览器中，这向终端用户显示一个可视化进程。

　　· 页面缓冲总是使用加载到一个IFRAME中的内容工作。一些版本的Opera还不能较好地使用XmlHttpRequest对象处理经缓冲的响应。

　　为此，我们可以把一个空IFRAME插入到每一个DIV容器中，并且在每一个IFRAME后添加一个简短的JavaScript语句，如下所示：

＜div id=&quot;header&quot;＞
＜div style=&quot;height: 100px; width: 100%&quot;＞＜/div＞
＜iframe id=&quot;header_iframe&quot; style=&quot;height: 0px;&quot;＞＜/iframe＞
＜script＞loadIframe(&quot;header&quot;，&quot;/navigation/header.html&quot;)＜/script＞
＜/div＞

　　IFRAME的id应该等于以_iframe为后缀的占位符的id。loadIframe函数使用了两个参数：占位符的id和要加载到其中的URL。

　　技巧

　　如果你想在下载过程中使得IFRAME内容可见，那么你应该使用一个适当大小的IFRAME元素来替换在占位符内的空的DIV框。然而，如果你想使IFRAME保持不可见，那么你应该使用style属性来把它的高度设置为０以克服一些浏览器中的错误。

　　启动装载过程的loadIframe函数是很简单的：

function loadIframe(id，url) {
　try {
　　var iframeObj = document.getElementById(id+&quot;_iframe&quot;);
　　iframeObj.src = url ;
　} catch (err) {
　　alert(&quot;cannot load &quot;+url+&quot; into &quot;+id) ;
　}
}

　　注意

　　本文中所有示例代码都假定，浏览器兼容文档对象模型(DOM)。

　　然而，还没有一种机制来通知请求页面所希望的内容已经被加载到占位符IFRAME中。因此，被装载的内容必须通知父页面(经由一个JavaScript调用)可以使用该内容了。实现这一操作的最好时机是，在页面加载完成以后。因此，在IFRAME内容中的BODY标志应该包含一个onLoad事件:

＜body onload=&quot;contentLoaded(&apos;header&apos;)&quot; style=&quot;margin: 0px 0px;
padding: 0px 0px&quot;＞

　　技巧

　　加载到IFRAME中的内容的body部分应该总是有零边距和填充空白；否则，当把它集成到父页面中时，它将会轻微地迁移。

　　在IFRAME的上下文中执行的contentLoaded函数将提取body部分相应的HTML内容并且把它传递到一个在父页面上下文中执行的函数，此函数将使用它来填充相应的占位符：

　　contentLoaded在IFRAME上下文的上下文中执行：

function contentLoaded(parentID) {
　var myContent = document.body.innerHTML ;
　parent.copyContent(parentID，myContent);
}

copyContent在父web页面的上下文中执行：

function copyContent(id，content) {
　try {
　　var placeholder = document.getElementById(id) ;
　　placeholder.innerHTML = content;
　} catch (err) {
　　alert(&quot;Cannot copy HTML content into &quot;+id);
　}
}

　　现在，细心的读者应该感到疑惑，为什么这么复杂？在IFRAME元素中加载导航元素不是更简单一些吗？事实证明，对于此方法还要加一些防止误解的说明为好：

　　· IFRAME具有固定的高度和宽度。如果内容彼此超出，则内容将被剪掉或者IFRAME要加上滚动条。然而，被复制到一个在父页面中的DIV元素中的HTML标记其大小却总是保持自动调整大小。

　　· 当在一个IFRAME中时，在导航内容中的链接(一个元素)将装载IFRAME中的新页面，除非你把target=&quot;_parent&quot;添加到每一个链接之后。

　　· 依附到导航元素的JavaScript事件处理器将在IFRAME的上下文中工作（如果还保留这个上下文的话）。如果你把导航内容移动主页面上，那么事件处理器能够存取在主页面中定义的函数和变量。

　　四、 使用XmlHttpRequest

　　如果你的用户主要使用Internet Explorer的较新版本或基于Gecko的浏览器(Mozilla，Firefox，Netscape 7)，那么你可以决定使用XmlHttpRequest对象来把其它内容下载到你的web页面中。第一步非常类似于前面描述的方式。对于每一个占位符，你需要一个JavaScript函数调用来启动加载过程：

＜div id=&quot;header&quot;＞
＜div style=&quot;height: 100px; width: 100%&quot;＞＜/div＞
＜script＞loadContent(&quot;header&quot;，&quot;/navigation/header.html&quot;)＜/script＞
＜/div＞

　　然而，loadContent函数是根本不同的：它创建了一个新的XmlHttpRequest对象，然后把一个事件处理器指派给它，并且异步启动装载过程：

function loadContent(id，url) {
　try {
　　var rq = new XMLHttpRequest() ;
　　rq.open(&quot;GET&quot;， url， true);
　　rq.onreadystatechange = function() { contentLoaded(rq，url，id) }
　　rq.send(null);
　} catch (err) {
　　alert(&quot;cannot load &quot;+url+&quot; into &quot;+id) ;
　}
}

　　注意

　　每一种主流浏览器家族都以一种不同的方式实现了XmlHttpRequest对象。处理这种兼容性问题的最容易的方法是，使用一个包装器库，例如Sarissa。我们在本文中示例中就使用了这种库。

　　回调函数contentLoaded负责检查XmlHttpRequest对象是否已经准备好及完成状态(如果请求已完成的话)，并且从响应中提取HTML标记。提取HTML代码(除非你使用XHTML，这种情况下，你可以使用XMLDOM接口)的最容易的方法是，使用字符串处理函数来查找＜body＞和＜/body＞标志之间的文本：

function contentLoaded(rq，url，id) {
　try {
　　if (rq.readyState != 4) { return; }
　　if (rq.status != 200) { alert(&quot;failed to load &quot;+url); return; }
　　var txt = rq.responseText ;
　　//查找＜body＞标记的开始位置
　　var startBodyTag = txt.indexOf(&quot;＜body&quot;)
　　//查找＜body＞标记的结束，跳过任何属性
　　var endOfStartTag = txt.indexOf(&quot;＞&quot;，startBodyTag+1)
　　//查找＜/body＞标记
　　var endBodyTag = txt.indexOf(&quot;＜/body&quot;)
　　if (endBodyTag == -1) { endBodyTag = txt.length ; }
　　//提取实际内容
　　var bodyContent = txt.substring(endOfStartTag+1，endBodyTag)
　　if (bodyContent) {
　　　var placeholder = document.getElementById(id) ;
　　　placeholder.innerHTML = bodyContent;
　　}
　} catch (err) {
　　alert(&quot;cannot load &quot;+url+&quot; into &quot;+id) ;
　}
}

　与前面描述的基于IFRAME的方法相比，使用XmlHttpRequest对象具有下列好处：

　　· 代码更干净，并且不依赖于页面的上下文切换。

　　· XmlHttpRequest对象使你能够检测和处理错误（通过它的readyState和status属性）。而使用IFRAME加载内容时，如果出现错误，则只能显示非常粗略的错误提示，这主要是因为缺乏对回调函数的调用。

　　· 你能够实现内容元素的平行装载(如在这一节中显示的)或顺序化装载请求以最小化带宽利用。
　 
　　五、 小结

　　在本文中，你学习了怎样实现把你的web页面内容与包围该内容的可导航元素分离开来。分离导致更为集中地描述搜索引擎要搜索的页面内容，并且也减少了用户使用低速互联网存取的加载时间（既然是在可导航元素被下载之前把实际内容显示给用户）。

　　当重新设计你的web页面来利用这种方案时，切记，一些基本格式的导航必须保留在页面上以便允许搜索引擎和决定禁止使用JavaScript的用户在你的网站的页面之间进行导航。

　　你可以使用嵌入式框架(IFRAME)或使用在最现代浏览器中实现的XmlHttpRequest对象来实现可导航元素的延迟装载。IFRAME方法能够为较老式的浏览器所支持；因此，它可能是你要考虑使用的方法-如果你非常关心向后兼容问题的话。另一方面，XmlHttpRequest对象的使用使你能够更为紧密地控制装载过程并能够检测和处理下载错误。
</description>
         <link>http://www.gccgle.com/2008/02/ajax.html</link>
         <guid>http://www.gccgle.com/2008/02/ajax.html</guid>
        
        
         <pubDate>Fri, 29 Feb 2008 17:13:46 +0800</pubDate>
      </item>
            <item>
         <title>读取基于 Web 的 Domino 文件的 PHP 函数</title>
         <description><![CDATA[原文地址：<a href="http://www.ibm.com/developerworks/cn/lotus/domino-php/index.html">http://www.ibm.com/developerworks/cn/lotus/domino-php/index.html</a>
PHP 有一些检索基于 Web 的内容的函数。这些函数一开始就包含于 PHP 中，但管理员有时可能不会激活它们。以下函数可检索 Web 文件：

<strong>file_get_contents()。</strong>此函数易于使用，支持 GET 和 POST 请求类型。使用 <strong>file_get_contents() </strong>函数，可将整个 Web 文件作为字符串而一次性地获得它。 
<strong>fopen()。</strong>此方法成块读取 Web 文件。 
<strong>file()。</strong>此方法读取整个 Web 文件，并逐行分隔文件内容。此方法是 file_get_contents() 与 fopen() 的一种交叉。 
<strong>fsockopen()。</strong>此函数最有可能在宿主 Web 服务器上被激活。此函数与其他函数的主要差异在于，使用 fsockopen() 时，您必须自行创建整个 Web 请求，而不能只设置几个不同的参数。 
<strong>CURL。</strong>Client URL Library (CURL) 具有最高级的功能性。使用 CURL，您可以连接到使用多种不同协议的多种服务器。CURL 目前支持 HTTP、HTTPS、FTP、Gopher、Telnet、DICT、File 和 LDAP。它还支持代理、cookies 及身份验证。遗憾的是，Web 托管公司往往会禁用 CURL。 
注意：本文的示例应用程序仅使用 file_get_contents() 函数。

获得 Domino 会话 cookie 是此流程的重要部分，您可将相同的代码用于其他与 Domino 相关的应用程序中。例如，您可以使用 STLinks 检索 cookie，以登录到 IBM Lotus Sametime 服务器。

通过向 Domino 服务器发送 POST 请求获取会话 cookie。在该请求中，需要将您的用户名和口令包含在内。服务器的响应包括一个 cookie，供您在后续向 Domino 服务器发送请求时使用。通过包含会话 cookie，Domino 服务器会将您的脚本视为最近登录过、现正访问数据库的实际人类用户。

之所以使用 POST 方法而不是 GET 方法，是因为 GET 方法的 URL 会被记录到 Domino 日志中，任何访问日志的用户都能看到您的用户名和口令 —— 而且是明文。使用 POST 方法，用户名和口令不被作为 URL 的一部分，因此也不会显示在常规日志中。

您可在 Set-Cookie 响应头中找到 Domino 会话 cookie。会话 cookie 名为 DomAuthSessId 或 LtpaToken。当 Domino 服务器配置为单点登录 (SSO) 时使用 LtpaToken 作为名称。实际上，您不必在意 cookie 的名称，只需保存整个 cookie 字符串即可。

以下代码示例展示了如何检索 cookie。

    $req="username=john+doe&password=john123";
$opts = array(
  "http"=>array(
    "method"=>"POST",
    "content" => $req,
    "header"=>"Accept-language: enrn" . 
    "User-Agent: Mozilla/4.0 (compatible; 
           MSIE 6.0; Windows NT 5.1)rn"
    )
);
$context = stream_context_create($opts);
if (!($fp = fopen("http://server.com/maildb.nsf?login", 
                  "r", false, $context))) {
 die("Could not open login URL");
}
$meta = stream_get_meta_data($fp);
for ($j = 0; isset($meta["wrapper_data"][$j]); $j++)
{
 if (strstr(strtolower($meta["wrapper_data"][$j]), 'set-cookie'))
{
$cookie = substr($meta["wrapper_data"][$j],12); 
break;
}
}
fclose($fp);
$_SESSION["DominoCookie"]=$cookie; 



在代码行 $req="username=john+doe&password=john123" 中，您提供一个有效的用户名和口令，以登录到 Domino 服务器。随后设置附加选项，如 POST 方法类型和其他头。之后，将这些附加选项应用到外发 HTTP 请求：

fopen("http://server.com/mydb.nsf?login", "r", false, $context) 

使用 stream_get_meta_data($fp) 函数从 Domino 服务器返回的响应中获取所有头，遍历直至找到包含 Set-Cookie 字符串的头。随后，将 cookie 存储在会话变量中来保存：

$_SESSION["DominoCookie"]=$cookie 

$_SESSION 在您关闭 Web 浏览器之前一直保存 cookie 值。

现在，将 cookie 应用到您的下一个请求中，该请求从 Domino 邮件数据库中检索 Inbox 视图/文件夹。

$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: enrn" .
    “User-Agent: Mozilla/4.0 (compatible;
          MSIE 6.0; Windows NT 5.1)rn" .
    "Cookie: " . $_SESSION["DominoCookie"] . "rn"
)
);
$context = stream_context_create($opts);
$xml = file_get_contents(
"http://server.com/maildb.nsf/($Inbox)?ReadViewEntries", 
          false, $context); 



这次使用了 GET 方法而不是 POST 方法来下载 Web 页面。该方法在 HTTP 选项数组中的 'method'=>"GET" 代码行中指定。使用 file_get_contents(URL, false, context) 函数读取整个响应，而不仅仅是读取头。此操作的结果是一个 XML 长字符串，它包含 Inbox 视图中的所有列。通过以下代码将会话 cookie 附在头上：

"Cookie: " . $_SESSION["DominoCookie"] . "rn" 

获取 XML 数据后，就可以在 PHP XML 解析器中处理这些数据了。接下来将为 Inbox 视图创建您自己的用户界面。

]]></description>
         <link>http://www.gccgle.com/2008/02/_web_domino_php.html</link>
         <guid>http://www.gccgle.com/2008/02/_web_domino_php.html</guid>
        
        
         <pubDate>Mon, 04 Feb 2008 12:20:52 +0800</pubDate>
      </item>
            <item>
         <title>FreeBSD快速指引</title>
         <description><![CDATA[01.查看网络流量
   a.systat -if 1 （1表示1s刷新屏幕一次）
   b.netstat 1
   # Traffic 流量 peak 峰值 average 平均值 

02.查看硬盘信息
   diskinfo -vt /dev/ad0
   disklable /dev/ad0 (分区信息)
   disklable /dev/ad0s2

03.查看核心信息
   vmstat 1

04.查看进程
   top   ps auxww  ps -ef |grep xxx

05.查看硬盘详细分区信息＆读写状况
   gstat

06.sysctl sysctl -a 查看所有变量（/etc/sysctl.conf）
   sysctl kern.maxproc 查看特定变量
   sysctl kern.maxfiles=5000 设置变量

07.查看磁盘空间使用情形    df 和 du
   指令df用来查看整个档案系统的使用情形，
   如果您需要知道某个目录的使用情形用指令du。
   df -h
   du -h /etc
   du -sh /etc 
   -s 参数来省略指定目录下的子目录
   -h 表示使用GB、MB等易读的格式

08.断电后系统无法启动
   a.启动到sing user模式
   b.fsck
   c.reboot

09.升级内核后无法启动
   a.重启机器到10秒读秒时按enter以外的任意键(新版bsd按6)
   b.unload
   c.boot kernel.old 或其他可以启动的内核
   另外一种方法
   a.使用cd1启动，选择Fixit-->CDROM/DVD
   b.Fixit#mount /dev/ad0s2a /mnt mount硬盘上的文件系统
   c.cd /mnt/boot
   d.rm -rf kernel
   e.cp -R kernel.old kernel
   f.reboot
   
   修改了/boot/loader.conf以后不能正常引导系统了，当机器开始加载
   /boot/defaults/loader.conf的时候(未加载完)机器停止响应，我应该怎么办？
   a.使用cd1启动，选择Fixit-->CDROM/DVD
   b.Fixit#mount /dev/ad0s2a /mnt mount硬盘上的文件系统
   c.cd /mnt/boot
   d.vi loader.conf 去掉错误的加载项
   e.reboot

10.丢失root密码
   
   启动到单用户模式,执行/sbin/mount -a, 然后用passwd更改密码
   /sbin/mount -a=挂接/etc/fstab里所有列出的文件系统
   如果单用户登录也需要密码
   a.使用cd1启动，选择Fixit-->CDROM/DVD
   b.Fixit#mount /dev/ad0s2a /mnt mount硬盘上的文件系统
   c.cd /mnt/etc
   d.vi /ttys 找到when going to single-user mode,更改
     console none unknow off insecure为secure
   e.reboot,启动到单用户模式/sbin/mount -a,passwd

   启动到单用户模式后，ctrl+d进入多用户模式
   ####让单用户登录也需要密码
   a.cd /etc
   b.vi /ttys 找到when going to single-user mode,更改
     console none unknow off secure为insecure

11.用win2000的引导器启动FreeBSD
   我在笔记本上装了双系统，win2000 和freebsd，装完 freebsd后 系统自动设置如下： 
   f1 dos 
   f2 freebsd 
   先起动到dos下，fdisk /mbr，再把FreeBSD光盘上的boot\boot1复制到c:\,
   再编辑c:\boot.ini 加一行c:\boot1="FreeBsd"

12.硬盘分区时shift+F -->NO可以使用全部空间

13.ctrl+alt+backspace 杀掉xwindows

14.alt+F1...F8 或 printscreensysr循环切换控制台

15.shutdown now 切换到单用户模式
   shutdown -p now shutdown -hp now 关闭电源
   shutdown -r now reboot 重新启动机器
   shutdown -p +90 (90分钟后关机)
   shutdown 0203122359(0203122359表示2002年3月12日23:59，格式是yymmddhhmm)

16.挂载ntfs,fat32分区和u盘
   ntfs: mount_ntfs -C eucCN /dev/ad0s5 /mnt/d
   fat32:mount_msdos -L zh_CN.eucCN /dev/ad0s6 /mnt/e
   u盘(scsi盘):  mount_msdos -L zh_CN.eucCN /dev/da0s1 /mnt/u
   cdrom: #mount_cd9660 /dev/acd0 /mnt/cdrom
   NTFS在FreeBSD中只能只读而无法写入

17.卸载分区
   umount /dev/ad0s5 
   umount -f /dev/ad0s5 (强制卸载)

18.在/etc/fstab中挂载fat32分区
   /dev/ad0s5  /mnt/d  msdos  rw,-L=zh_CN.eucCN 2 2

19.如何在FreeBSD5.X以上加载,卸载ISO文件
   mount iso文件： 
   mdconfig -a -t vnode -f myisofile.iso (屏幕输出md0或者类似的设备名) 
   mount -t cd9660 /dev/md0 /cdrom   
   umount：  
   umount /cdrom  
   mdconfig -d -u 0 (上面的-u后面的数字和前面的md?中的数字一致) 
   mdconfig -l 命令可以列出关于配置 md(4) 设备的信息

20.声卡
   vi /boot/defaults/loader.conf
   更改snd_ich_load="NO"->"YES" #intel ich
   检测声卡 kldstat 或 dmesg |grep pcm

21.ls 命令详解
   ls 显示本目录下的文件及目录
   ls -a显示本目录下的所有文件及目录（包括隐藏目录和文件）
   ls -l 显示本目录下所有文件的属性
   ls -l | grep ^d 只显示目录
   ls -l | grep ^- 只显示文件
   ls -l | grep ^d | wc –l  统计当能目录下的子目录数
   ls -l | grep ^- | wc –l  统计当能目录下的文件数
   ls -G  以颜色显示目录名和文件名

22.查找程序或文件
   which 程序名
   whereis 程序名
   find 文件名
   locate 文件名
   locate: database too small: /var/db/locate.database的一种解决方法
   a.这个仅仅是因为你开机时间不够长，看看/etc/periodic/weekly/310.locate
   b.试试运行/usr/libexec/locate.updatedb看
   whatis xxx 要找东西但不知道它是什么
   grep bpf /usr/src/sys/i386/conf/GENERIC 在文件中找指定文本
   #只能对文本进行grep,如是命令,则
   command |grep text
   grep text filename

23.xmms乱码问题 (要拷贝simsun.ttf和taboma.ttf到/usr/X11R6/lib/X11/fonts/TrueType/)
   在用户目录下建立 .gtkrc.mine 文件.代码如下
    style "gtk-default-zh-cn" { 
    fontset = "-*-tahoma-medium-r-normal-*-12-0-0-0-p-0-iso8859-1,
   -misc-simsun-medium-r-normal-*-*-120-*-*-p-*-gbk-0,*-r-*" }
   class "GtkWidget" style "gtk-default-zh-cn" 
   修改xmms中的字体设置，将播放清单及主窗口的字体修改为下面的设置 
   -*-tahoma-medium-r-normal-*-12-0-0-0-p-0-iso8859-1,
   -misc-simsun-medium-r-normal-*-*-120-*-*-p-*-gbk-0,*-r-* 
   
   xorg6.9+xfce4+xmms
   cd /usr/ports/chineses/xmms make install clean
   拷贝simsun.ttf到/usr/X11R6/lib/X11/fonts/TTF/,无需要建立.gtkrc.mine
   只要修改xmms中的字体设置,字体simsun,size 12就好了。
   
24.停止sendmail
   vi /etc/rc.conf 加入
   sendmail_enable="NONE"

25.you have mail
   mail 回车,输入1看第一封邮件...输入?看帮助
   mail 古老的 UNIX 邮件处理程序
   如果我们要寄信给非本机的使用者，可以使用的收件人格式如下：
   mail -s"hi, my friend" jack@mymail.com
   mail -s "hi, my friend" jack@mymail.com < content.txt
   执行了 mail 之后，程序会先要求我们输入邮件主旨，输入后就可以开始打本文了。
   当完成本文的编辑之后，可以按 Ctrl+D 来将信件送出，或是按二次 Ctrl+C 取消。

26.traceroute ＆ping的整合工具my traceroute /mtr
   /usr/ports/net/mtr
   使用: mtr www.163.com

27.使用gnome2的gdm做桌面管理器
   vi /etc/rc.conf 加入
   gdm_enable="YES"
   vi /root/.dmrc 更改Language=zh_CN.UTF-8-->zh_CN.eucCN

28.远程连接windows终端
   rdesktop [-a 16 -f] server'IP[:port]
   -a 16表示16位色,-f表示全屏
   gui，grdesktop (/usr/ports/net/grdesktop)
   
29.播放APE格式音乐
   /usr/ports/chinese/xmms/ /usr/ports/audio/xmms-mac(ape插件)xmms-wma(wma插件)

30.看图
   /usr/ports/graphics/xnview

31.apache22+php5+mysql+postgresql+ZendOptimizer
   a,apache22:
     cd /usr/ports/www/apache22
     make install clean
   b,php5:
     cd /usr/ports/lang/php5
     make install clean 
     选中APACHE，就可以联编出用于与Apache web服务器配合使用的可动态加载的mod_php5模块.
     勿选debug,否则不能装ZendOptimizer
   c,php5扩展:
     cd /usr/ports/lang/php5-extesions
     make install [FORCE_PKG_REGISTER=yes] 强迫安装
     make clean
     (除预设项目还应选中CTYPE,EXIF,GD,ICONV,IMAP,PCRE,SESSION,ZLIB)
     FreeBSD中的PHP支持是高度模块化的，因此基本安装的功能十分有限。增加其他功能非常简单，
     只需通过lang/php5-extensions即可完成。这个port提供了一个菜单驱动的界面来帮助完成PHP
     扩展的安装。另外也可以通过对应的port来单独安装扩展。例如要将对于MySQL数据库服务器
     的支持加入PHP5，只需简单地安装databases/php5-mysql.
   d,cp /usr/local/etc/php.ini.recommended /usr/local/etc/php.ini
   e,ZendOptimizer
     cd /usr/ports/devel/ZendOptimizer
     make install clean
   f,mysql:
     cd /usr/ports/databases/mysql41-server
     make WITH_OPENSSL=yes BUILD_OPTIMIZED=yes WITH_CHARSET=gbk WITH_XCHARSET=all SKIP_DNS_CHECK=yes install
     ./work/mysql-5.0.24/scripts/mysql_install_db
     cd /usr/ports/databases/php5-mysql
     make install clean
   g,postgresql
     cd /usr/ports/databases/postgresql81-server
     make install clean
     /usr/local/etc/rc.d/postgresql initdb
     echo 'postgresql_enable="YES"' >> /etc/rc.conf
     cd /usr/ports/databases/php5-pgsql
     make install clean

32.怎样刷新环境变量值，而不用退出再登陆？
   a,比如要重新设置环境变量ABC的值为abcdef 
     bash$ export ABC=abcdef 
     csh% setenv ABC abcdef
   b,更新了PATH变量指定目录里可执行命令
     rehash
   c,更新配置文件 
     比如你编辑了.cshrc等文件，就需要用source命令 
     source .cshrc

33.检视软件间的关联
   cd /usr/ports/sysutils/pkg_tree
   make install clean
   之后我们就可以使用 pkg_tree | more 来看各个软件之间的关系了 

34.使用 portupgrade 更新软件
   cd /usr/ports/sysutils/portupgrade
   make install clean
   配置文件:/usr/local/etc/pkgtools.conf
   如果您只想要升级某一个软件本身，而非所有相依的软件，只要使用
   portupgrade "pkgname" 即可。如果您要升级所有和该软件相依的其它软件，
   则可以加上参数 -r。如果您要更新包含相依软件的相依软件，则可以使用
   参数 -R。另外，您可以使用参数 -m 来要求编译 (make) ports 时多传入
   一些参数，还可以使用参数 -f 要求就算版本一样也强制更新。portupgrade 
   在更新软件时，会保留您原本的设定档。例如，在更新 Apache 时，它会保留
   httpd.conf的设定。假设我们更新软件perl-5.8，我们可以用下列指令更新：
   # portupgrade -rRf "perl-5.8.*" -m "ENABLE_SUIDPERL=yes"

35.ports安装失败提示
   stop in /usr/ports/lang/ruby18/work 
   删除work目录下所有文件＆文件夹再次安装即可.(make clean)

36.ntop--网络监控软件
   cd /usr/ports/net/ntop
   make install clean
   vi /etc/rc.conf 加入
   ntop_enable="YES"
   在地址栏中输入http://x.x.x.x:3000 即出来管理界面.

37.修改/etc/rc.conf不重启生效
   a.sh /etc/rc
   b./etc/netstart 

38.freebsd启动的时候停到blanktime的解决办法
   可以试试 这个参数:blanktime="NO" 
   etc/rc.conf 中把 default_router 注释掉
   #未验证!!!

39.Bsd 下的QQ 
   eva不错，运行速度飞快。
   /usr/ports/net-im/eva
   gaim-openq
   /usr/ports/net-im/gaim-openq

40.一次性把所有安装的ports删除掉
   a.pkg_delete -a
     以下步骤去掉配置文件，解决一些疑难问题 
     rm -fr /usr/local/ 
     rm -fr /var/db/ports/
     cd /usr/ports && make NOCLEANDEPENDS=yes clean 
     portsnap fetch update
   b.安装pkg_cutleaves它会告诉你，哪些package没有人依赖，并让你决定要不要删除
   c.make deinstall与pkg_delete有什麽不同？ 
   简单来说，make deinstall会移除该port，并且不会叁照其相依相关的ports。 
   pkg_delete在移除该port前，会叁照其相依相关的ports，并且pkg_delete 
   有支援 wild card，如要移除所有p开头的 ports，则： 
   cd /var/db/pkg/ 
   pkg_delete p*  
   要注意的是，如果使用 `make deinstall'，则最好确定系统目前所 
   安装的版本，与 ports collection 中显示的版本符合，否则有可能会出现非预 
   期性错误；而pkg_delete是因为直接删除系统中所安装的版本，所以没有此问题。
   因此，换句话说，当系统所安装的版本符合ports collections中的版本，则可 
   以使用make deinstall或pkg_delete，否则的话最好用pkg_delete。

41.pure-ftp安装
   cd /usr/ports/ftp/pure-ftpd/
   make WITH_LANG=simplified-chinese install clean
   [X] BANNER   Show pure-ftpd welcome upon session start 
   cd /usr/local/etc/
   cp pure-ftpd.conf.sample pure-ftpd.conf
   vi /etc/rc.conf -->加入pureftpd_enable="YES"
   关于pureftpd的编码问题
   在win下登陆ftp然后建立中文文件夹,传中文文件然后用FlashFXP登陆看到这些
   中文文件和文件夹名字全部是乱码.pure-ftpd.conf中强制用gbk就可以了.
   FileSystemCharset       gbk 
   ClientCharset           gbk

42.开机自动校准时间
   vi /etc/rc.conf--->加入
   ntpdate_enable="YES"             # Run ntpdate to sync time on boot (or NO).
   ntpdate_flags="218.75.4.130"     # cn.pool.ntp.org

43.将/usr/ports/distfiles/目录放到/data/disktfiles   
   cd /usr/ports 
   mv distfiles /data/distfiles [移动]
   ln -s /data/distfiles distfiles [链接][要在/usr/ports目录下做]
   ln -s source_file[_dir] target_file[_dir]

44.FreeBSD下面通过串口连接到路由器
   使用cu -s speed -l line，就可以连接到COM口或者家猫的线路上，我用的是COM1口，
   连接Cisco2924XL，使用cu -s 9600 -l ttyd0，即可连接上交换机配置界面。

45.电子书：CHM、PDF的查看
   chmsee,kchmviewer,xpdf,xchm,Acrobat Reader...chmsee对中文支持比较好
   /usr/ports/print/acroread7

46.使用axel或者prozilla加速你的port下载  
   a.axel(据说能搞定文件夹钳套,不错!推荐使用 )
   cd /usr/ports/ftp/axel
   make install clean 
   vi /etc/make.conf 加入
   FETCH_CMD=axel -a 
   DISABLE_SIZE=yes
   vi /usr/local/etc/axelrc 修改代码
   #num_connections = 4
   num_connections = 10 
   4改为10,num_connections前面不留空格,否则出错.
   (-a 交互的进步指示器,num_connections = 10 10线程下载) 
   SIZE参数用来在取得文件之前检查文件的大小.而DISABLE_SIZE则是是否开启这项功能
   b.prozilla(速度快,遇到欠套的文件夹会出问题)
   cd /port/ftp/prozilla
   make install clean 
   vi /etc/make.conf 加入
   FETCH_CMD=proz -s -k=10 -r --no-curses
   DISABLE_SIZE=yes
   (-s 查找最快的境像,-k=10 10个线程下载,-r 重新开始一个被打断的下载)
   c.wget(未测试)
   cd /usr/ports/ftp/wget/ 
   make install clean
   vi /etc/make.conf 加入
   FETCH_CMD=wget -c -t 1
   DISABLE_SIZE=yes #这行是必要的
   d.在其它机器上fetch 
   make fetch-recursive (fetch:取得recursive:递归的)
   然后将/usr/ports/distfiles拿走。

   ###make install设置是/etc/make.conf 
　 ###pkg_add是在~/.cshrc或~/.profile
   e.vi /etc/csh.cshrc
   加上以下一行可以在让pkg_add先从更快的站点下载
   setenv PACKAGEROOT ftp://ftp.cn.freebsd.org
   你可以先设定 PACKAGEROOT，这是用来抓取套件的位置,笔者通常设定 
   setenv PACKAGEROOT ftp://ftp.tw.freebsd.org
   因为这是我认为最稳定的机器，然后就可以透过pkg_add -r 套件名来安装套件，
   他会自动的到pub/FreeBSD/ports/i386/packages-4.9-release/Latest/底下
   寻找套件，而且你不需要知道版本，只要知道套件名称即可，他会自动安 装
   当时的最新版，中文的部分只要加上 zh-，像是 zh-xcin。 
   你也可以直接指定 PACKAGESITE 来指向特定的位置。像是你希望安装的套件是 
   最新的，而不是 release 时的版本。 
   setenv PACKAGESITE ftp://ftp.tw.freebsd.org/pub/Fre ... ages-stable/Latest/
   
   f.vi /etc/make.conf 
   加上以下一行可以在让make先从更快的站点下载ports Distfiles
   MASTER_SITE_OVERRIDE?=http://ports.cn.freebsd.org/${DIST_SUBDIR}/
   
   ####http://ports.cn.freebsd.org/
   Welcome to use FreeBSD Ports Distfiles Mirror.
   This mirror is running on China Telecom 100Mbit network.
   How to use? Set your /etc/make.conf like this:
   MASTER_SITE_OVERRIDE?=http://ports.cn.freebsd.org/${DIST_SUBDIR}/
   or like this:
   MASTER_SITE_OVERRIDE?=http://ports.hshh.org/${DIST_SUBDIR}/

47.星际译王
   辞典程序： /usr/ports/textproc/stardict2/
   简体中文辞典：/usr/ports/chinese/stardict2-dict-zh_CN/

48.控制台调音量
   mixer

49.How to build openoffice
   cd /usr/ports/editors/openoffice.org-2.0
   Building/installing/packaging a localized language package (Japanese version for example)
   make LOCALIZED_LANG=ja install
   去这里ftp://ooopackages.good-day.net/pub/OpenOffice.org/FreeBSD/里面的tbz文件，
   可以直接pkg_add

50.OPERA，支持Flash浏览器
  cd /usr/ports/www/linux-opera　　
（注意是www/linux-opera，www/opera是不支持Flash的。） 
  cd /usr/ports/www/opera
  make config
  选中[X]SHARED Use a shared Qt library(instead of static)[解决在opera中输入汉字的问题]
  make install clean
  安装后的美化:
  A.Tools->Preference->Advanced->Fonts，把所有的字体都改成Simsun，字体大小设成12。
  B.最小字体大小（像素）改为12.[解决一些网站看不清楚的问题]

51.bt客户端
   /usr/ports/net-p2p/py-bittorrent   安装完成后执行bittorrent
   /usr/ports/net-p2p/rtorrent 功能多，速度快，还完美支持中文编码！

52.emule客户端
   /usr/ports/net-p2p/amule2

53.ipguard解决arp攻击
   ipguard->Tool designed to protect LAN IP adress space by ARP spoofing 
   /usr/ports/security/ipguard 
    make install (不要clean参数,否则无ethers.sample文件)
   补充：
   A.以/usr/ports/security/ipguard/work/ipguard-0.04/doc/ethers.sample
   文件为实例，建立/etc/ethers文件。  
   B.And then start ipguard: 
   cd /usr/local/etc/rc.d  
   mv ipguard.sh.sample ipguard.sh     
   /usr/local/etc/rc.d/ipguard.sh start
   ipguard.sh启动脚本里默认有iface=fxp0，这里应该替换为你做NAT的内网网卡名称。

54.一些安装参数
   make fetch 只抓取tarball 
   make fetch-recursive 抓取安装ports所有须要的其他ports的tarball
   make fetch-list 列出port所需的文件
   make clean Ports里面make clean,会附带着make clean依赖的软件的
   make -DBATCH install不需要用户输入任何东西
   make -DINTERACTIVE install 继续上一步
   make configure 
   make distclean，删除不想要的distfiles
   
55.pkg_info
   pkg_info |grep zh-fcitx (查软件版本)
   #ls /var/db/pkg也可以查软件版本
   pkg_info -L zh-fcitx-3.4 (查看软件安装目录和安装的文件)
   pkg_info -xL zh-fcitx (加x了不需要加软件版本号)
   pkg_info -r zh-fcitx-3.4 (查看软件依赖情况)
   pkg_info -W fcitx (查看fcitx属于哪个软件)
   
56.Ports如何清除安装参数
   cd /usr/ports/www/opera
   make distclean移除不是port collections所期望下载的文件   
   make rmconfig清除用户配置的参数
   make showconfig查看当前配置的参数
   make config更改参数 

57.一款好用的网络性能测试工具iperf
  /usr/ports/benchmarks/iperf

58.FreeBSD用户帐户锁定
   a.用vipw把他的shell修改成/sbin/nologin就可以了.
   b.pw lock useri 解锁用pw unlock userid]]></description>
         <link>http://www.gccgle.com/2008/01/freebsd_2.html</link>
         <guid>http://www.gccgle.com/2008/01/freebsd_2.html</guid>
        
        
         <pubDate>Wed, 30 Jan 2008 11:09:02 +0800</pubDate>
      </item>
            <item>
         <title>php curl函数应用方法之模拟浏览器</title>
         <description><![CDATA[curl 是使用URL语法的传送文件工具，支持FTP、FTPS、HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE和LDAP。curl 支持SSL证书、HTTP POST、HTTP PUT 、FTP 上传，kerberos、基于HTT格式的上传、代理、cookie、用户＋口令证明、文件传送恢复、http代理通道和大量其他有用的技巧。<a href="http://www.gccgle.com/book/php/html/function.curl-setopt.html">详见参考手册</a>

原来php默认并不进行此项功能的扩展，但还是有的，只是没有让它生效罢了。打开PHP安装目录，搜索以下三个文件 ssleay32.dll、libeay32.dll和 php_curl.dll，一一拷贝到系统目录下的system32文件夹下，修改php.ini文件，找到;extension= php_curl.dll行，去掉前面的;号，保存，重启服务器。在站点目录下建立一个PHP文件，内容如下

   
    $ch = curl_init("http://www.php.net");     
    curl_exec($ch);     
    curl_close($ch);     


预览如果能打开http://www.php.net的话说明就安装成功了。

至于linux及unix的安装可以要麻烦一些，得从http://curl.haxx.se/或其他网站上下载curl库
____________________________________________________________

以下关于此函数各项使用参数:

bool curl_setopt (int ch, string option, mixed value)

curl_setopt()函数将为一个CURL会话设置选项。option参数是你想要的设置，value是这个选项给定的值。

<strong>下列选项的值将被作为长整形使用(在option参数中指定)：</strong>
　
<ul>
<li><font color="#00FF66">CURLOPT_INFILESIZE</font>: 当你上传一个文件到远程站点，这个选项告诉PHP你上传文件的大小。
<li><font color="#00FF66">CURLOPT_VERBOSE</font>: 如果你想CURL报告每一件意外的事情，设置这个选项为一个非零值。
<li><font color="#00FF66">CURLOPT_HEADER</font>: 如果你想把一个头包含在输出中，设置这个选项为一个非零值。
<li><font color="#00FF66">CURLOPT_NOPROGRESS</font>: 如果你不会PHP为CURL传输显示一个进程条，设置这个选项为一个非零值。注意：PHP自动设置这个选项为非零值，你应该仅仅为了调试的目的来改变这个选项。
<li><font color="#00FF66">CURLOPT_NOBODY</font>: 如果你不想在输出中包含body部分，设置这个选项为一个非零值。
<li><font color="#00FF66">CURLOPT_FAILONERROR</font>: 如果你想让PHP在发生错误(HTTP代码返回大于等于300)时，不显示，设置这个选项为一人非零值。默认行为是返回一个正常页，忽略代码。
<li><font color="#00FF66">CURLOPT_UPLOAD</font>: 如果你想让PHP为上传做准备，设置这个选项为一个非零值。
<li><font color="#00FF66">CURLOPT_POST</font>: 如果你想PHP去做一个正规的HTTP POST，设置这个选项为一个非零值。这个POST是普通的 application/x-www-from-urlencoded 类型，多数被HTML表单使用。
<li><font color="#00FF66">CURLOPT_FTPLISTONLY</font>: 设置这个选项为非零值，PHP将列出FTP的目录名列表。
<li><font color="#00FF66">CURLOPT_FTPAPPEND</font>: 设置这个选项为一个非零值，PHP将应用远程文件代替覆盖它。
<li><font color="#00FF66">CURLOPT_NETRC</font>: 设置这个选项为一个非零值，PHP将在你的 ~./netrc 文件中查找你要建立连接的远程站点的用户名及密码。
<li><font color="#00FF66">CURLOPT_FOLLOWLOCATION</font>: 设置这个选项为一个非零值(象 “Location: “)的头，服务器会把它当做HTTP头的一部分发送(注意这是递归的，PHP将发送形如 “Location: “的头)。
<li><font color="#00FF66">CURLOPT_PUT</font>: 设置这个选项为一个非零值去用HTTP上传一个文件。要上传这个文件必须设置CURLOPT_INFILE和CURLOPT_INFILESIZE选项. 
<li><font color="#00FF66">CURLOPT_MUTE</font>: 设置这个选项为一个非零值，PHP对于CURL函数将完全沉默。
<li><font color="#00FF66">CURLOPT_TIMEOUT</font>: 设置一个长整形数，作为最大延续多少秒。
<li><font color="#00FF66">CURLOPT_LOW_SPEED_LIMIT</font>: 设置一个长整形数，控制传送多少字节。
<li><font color="#00FF66">CURLOPT_LOW_SPEED_TIME</font>: 设置一个长整形数，控制多少秒传送CURLOPT_LOW_SPEED_LIMIT规定的字节数。
<li><font color="#00FF66">CURLOPT_RESUME_FROM</font>: 传递一个包含字节偏移地址的长整形参数，(你想转移到的开始表单)。
<li><font color="#00FF66">CURLOPT_SSLVERSION</font>: 传递一个包含SSL版本的长参数。默认PHP将被它自己努力的确定，在更多的安全中你必须手工设置。
<li><font color="#00FF66">CURLOPT_TIMECONDITION</font>: 传递一个长参数，指定怎么处理CURLOPT_TIMEVALUE参数。你可以设置这个参数为TIMECOND_IFMODSINCE 或 TIMECOND_ISUNMODSINCE。这仅用于HTTP。
<li><font color="#00FF66">CURLOPT_TIMEVALUE</font>: 传递一个从1970-1-1开始到现在的秒数。这个时间将被CURLOPT_TIMEVALUE选项作为指定值使用，或被默认TIMECOND_IFMODSINCE使用。
</ul>
<strong>下列选项的值将被作为字符串：</strong>
　
<ul>
<li><font color="#00FF66">CURLOPT_URL</font>: 这是你想用PHP取回的URL地址。你也可以在用curl_init()函数初始化时设置这个选项。
<li><font color="#00FF66">CURLOPT_USERPWD</font>: 传递一个形如[username]:[password]风格的字符串,作用PHP去连接。
<li><font color="#00FF66">CURLOPT_PROXYUSERPWD</font>: 传递一个形如[username]:[password] 格式的字符串去连接HTTP代理。
<li><font color="#00FF66">CURLOPT_RANGE</font>: 传递一个你想指定的范围。它应该是”X-Y”格式，X或Y是被除外的。HTTP传送同样支持几个间隔，用逗句来分隔(X-Y,N-M)。
<li><font color="#00FF66">CURLOPT_POSTFIELDS</font>: 传递一个作为HTTP “POST”操作的所有数据的字符串。
<li><font color="#00FF66">CURLOPT_REFERER</font>: 在HTTP请求中包含一个”referer”头的字符串。
<li><font color="#00FF66">CURLOPT_USERAGENT</font>: 在HTTP请求中包含一个”user-agent”头的字符串。
<li><font color="#00FF66">CURLOPT_FTPPORT</font>: 传递一个包含被ftp “POST”指令使用的IP地址。这个POST指令告诉远程服务器去连接我们指定的IP地址。这个字符串可以是一个IP地址，一个主机名，一个网络界面名(在UNIX下)，或是‘-’(使用系统默认IP地址)。
<li><font color="#00FF66">CURLOPT_COOKIE</font>: 传递一个包含HTTP cookie的头连接。
<li><font color="#00FF66">CURLOPT_SSLCERT</font>: 传递一个包含PEM格式证书的字符串。
<li><font color="#00FF66">CURLOPT_SSLCERTPASSWD</font>: 传递一个包含使用CURLOPT_SSLCERT证书必需的密码。
<li><font color="#00FF66">CURLOPT_COOKIEFILE</font>: 传递一个包含cookie数据的文件的名字的字符串。这个cookie文件可以是Netscape格式，或是堆存在文件中的HTTP风格的头。
<li><font color="#00FF66">CURLOPT_CUSTOMREQUEST</font>: 当进行HTTP请求时，传递一个字符被GET或HEAD使用。为进行DELETE或其它操作是有益的，更Pass a string to be used instead of GET or HEAD when doing an HTTP request. This is useful for doing or another, more obscure, HTTP request. 注意: 在确认你的服务器支持命令先不要去这样做。下列的选项要求一个文件描述(通过使用fopen()函数获得)：　
<li><font color="#00FF66">CURLOPT_FILE</font>: 这个文件将是你放置传送的输出文件，默认是STDOUT.
<li><font color="#00FF66">CURLOPT_INFILE</font>: 这个文件是你传送过来的输入文件。
<li><font color="#00FF66">CURLOPT_WRITEHEADER</font>: 这个文件写有你输出的头部分。
<li><font color="#00FF66">CURLOPT_STDERR</font>: 这个文件写有错误而不是stderr。用来获取需要登录的页面的例子,当前做法是每次或许都登录一次,有需要的人再做改进了.
</ul>
 
摘几个从别的网站扣过来的例子: 

例一：
$cookie_jar = tempnam('./tmp','cookie');    
$ch = curl_init(); curl_setopt($ch,CURLOPT_URL, 'http://******');    
curl_setopt($ch, CURLOPT_POST, 1);    
$request = 'email_address=&password=&action=';    
curl_setopt($ch, CURLOPT_POSTFIELDS, $request); //把返回来的cookie信息保存在$cookie_jar文件中    
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar); //设定返回的数据是否自动显示    
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //设定是否显示头信息    
curl_setopt($ch, CURLOPT_HEADER, false); //设定是否输出页面内容    
curl_setopt($ch, CURLOPT_NOBODY, false);    
curl_exec($ch);    
curl_close($ch); //get data after login  

例二：
$ch2 = curl_init();    
curl_setopt($ch2, CURLOPT_URL, 'http://*****');    
curl_setopt($ch2, CURLOPT_HEADER, false);    
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);    
curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookie_jar);    
$orders = curl_exec($ch2);    
echo '';    
   
echo strip_tags($orders);    
echo '';    
curl_close($ch2); 实践证明很稳定:)    

例三：
set_time_limit(0);         
function _rand() {        
    $length=26;        
    $chars = "0123456789abcdefghijklmnopqrstuvwxyz";        
    $max = strlen($chars) - 1;        
    mt_srand((double)microtime() * 1000000);        
    $string = '';        
    for($i = 0; $i < $length; $i++) {        
        $string .= $chars[mt_rand(0, $max)];        
    }        
    return $string;        
}        
$HTTP_SESSION=_rand();        
echo $HTTP_SESSION;        
$HTTP_Server="www.baidu.com";        
$HTTP_URL="/";        
$ch = curl_init();        
curl_setopt ($ch,CURLOPT_URL,"http://".$HTTP_Server.$HTTP_URL);        
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);        
curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");        
//curl_setopt($ch,CURLOPT_COOKIE,$HTTP_SESSION);        
$res = curl_exec($ch);        
curl_close ($ch);        
print_r($res);    

<strong>刷论坛代码：</strong>
<strong>1、抓cookies程序：</strong>


$URL="http://www.yoururl.com/bbs/login.asp?action=chk"; 
//填入论坛的登陆页面地址 
$ch = curl_init(); 

curl_setopt($ch,CURLOPT_URL,$URL); 

curl_setopt($ch,CURLOPT_REFERER,"http://www.hxfoods.com/bbs/login.asp"); 
//设置，访问页面的来源地址 


curl_setopt($ch,CURLOPT_POST,1); 
curl_setopt($ch,CURLOPT_POSTFIELDS,'username=→→敢死队→&password=168168'); 
//分析登陆页面，把用户名，密码分别对应起来 
curl_setopt ($ch, CURLOPT_HEADER,true); 
//使能显示http头， 
curl_exec($ch); 
if (curl_errno($ch)) 
{ 
print curl_error($ch); 
} 
else 
{ 
curl_close($ch); 
} 




<strong>2、刷楼了：</strong> 

set_time_limit(0); 
//设置程序执行时间无限制 
$i=10000; 
//耍10000次 
for($j=0;$j<$i;$j++) 
{ 

$URL="http://www.yoururl.com/bbs/savepost.asp"; 
//这个地址是回复表单里面action的url地址 
$ch = curl_init(); 

curl_setopt($ch,CURLOPT_URL,$URL); 

curl_setopt($ch,CURLOPT_REFERER,"http://www.hxfoods.com/bbs/dispbbs.asp?boardid=14&replyid=672709&id=127437&page=1&skin=0&Star=53"); 
//设置来源地址，如果不设置，论坛服务器有可能有验证不允许回复 
curl_setopt($ch,CURLOPT_COOKIESESSION,true); 
//能保存cookie 
curl_setopt($ch,CURLOPT_COOKIE,"DvForum=userid=24122&usercookies=0&userhidden=2&password=w0reu3g775VrY745&userclass=%96%7C&username=%A1%FA%A1%FA%B8%D2%CB%C0%B6%D3%A1%FA&StatUserID=2194783945 "); 
//这儿就是设置cookie了 
curl_setopt($ch,CURLOPT_POST,1); 
curl_setopt($ch,CURLOPT_NOBODY,1); 
//不显示内容，因为有很多论坛回复后要自动跳转。 
curl_setopt($ch,CURLOPT_POSTFIELDS,'Body=gfdfgdfgasdfgdfgdfgdfg&followup=672709&RootID=127437&star=58&TotalUseTable=Dv_bbs3&UserName=→→敢死队→&signflag=1&total=65535'); 
//把你分析的回复表单的参数分别赋值 
curl_setopt ($ch, CURLOPT_HEADER,true); 
curl_exec($ch); 
if (curl_errno($ch)) 
{ 
print curl_error($ch); 
} 
else 
{ 
curl_close($ch); 
} 

} 

curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — Get all the sockets associated with the cURL extension, which can then be "selected"
curl_setopt_array — 以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息

curl_init()函数的作用初始化一个curl会话，curl_init()函数唯一的一个参数是可选的，表示一个url地址。
curl_exec()函数的作用是执行一个curl会话，唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话，唯一的参数是curl_init()函数返回的句柄。


$ch = curl_init("http://www.baidu.com/");
curl_exec($ch);
curl_close($ch);

curl_version()函数的作用是获取curl相关的版本信息，curl_version()函数有一个参数，不清楚是做什么的


print_r(curl_version())

curl_getinfo()函数的作用是获取一个curl连接资源句柄的信息，curl_getinfo()函数有两个参数，第一个参数是curl的资源句柄，第二个参数是下面一些常量：


$ch = curl_init("http://www.baidu.com/");
print_r(curl_getinfo($ch));

可选的常量包括：

CURLINFO_EFFECTIVE_URL
最后一个有效的url地址

CURLINFO_HTTP_CODE
最后一个收到的HTTP代码

CURLINFO_FILETIME
远程获取文档的时间，如果无法获取，则返回值为“-1”

CURLINFO_TOTAL_TIME
最后一次传输所消耗的时间

CURLINFO_NAMELOOKUP_TIME
名称解析所消耗的时间

CURLINFO_CONNECT_TIME
建立连接所消耗的时间

CURLINFO_PRETRANSFER_TIME
从建立连接到准备传输所使用的时间

CURLINFO_STARTTRANSFER_TIME
从建立连接到传输开始所使用的时间

CURLINFO_REDIRECT_TIME
在事务传输开始前重定向所使用的时间

CURLINFO_SIZE_UPLOAD
上传数据量的总值

CURLINFO_SIZE_DOWNLOAD
下载数据量的总值

CURLINFO_SPEED_DOWNLOAD
平均下载速度

CURLINFO_SPEED_UPLOAD
平均上传速度

CURLINFO_HEADER_SIZE
header部分的大小

CURLINFO_HEADER_OUT
发送请求的字符串

CURLINFO_REQUEST_SIZE
在HTTP请求中有问题的请求的大小

CURLINFO_SSL_VERIFYRESULT
Result of SSL certification verification requested by setting CURLOPT_SSL_VERIFYPEER

CURLINFO_CONTENT_LENGTH_DOWNLOAD
从Content-Length: field中读取的下载内容长度

CURLINFO_CONTENT_LENGTH_UPLOAD
上传内容大小的说明

CURLINFO_CONTENT_TYPE
下载内容的“Content-type”值，NULL表示服务器没有发送有效的“Content-Type: header”

curl_setopt()函数的作用是为一个curl设置会话参数。curl_setopt_array()函数的作用是以数组的形式为一个curl设置会话参数。


$ch = curl_init();
$fp = fopen("example_homepage.txt", "w");
curl_setopt($ch, CURLOPT_FILE, $fp);
$options = array(
   CURLOPT_URL => 'http://www.baidu.com/',
   CURLOPT_HEADER => false
   );
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
fclose($fp);

可设置的参数有：

CURLOPT_AUTOREFERER
自动设置header中的referer信息

CURLOPT_BINARYTRANSFER
在启用CURLOPT_RETURNTRANSFER时候将获取数据返回

CURLOPT_COOKIESESSION
启用时curl会仅仅传递一个session cookie，忽略其他的cookie，默认状况下curl会将所有的cookie返回给服务端。session cookie是指那些用来判断服务器端的session是否有效而存在的cookie。

CURLOPT_CRLF
启用时将Unix的换行符转换成回车换行符。

CURLOPT_DNS_USE_GLOBAL_CACHE
启用时会启用一个全局的DNS缓存，此项为线程安全的，并且默认为true。

CURLOPT_FAILONERROR
显示HTTP状态码，默认行为是忽略编号小于等于400的HTTP信息

CURLOPT_FILETIME
启用时会尝试修改远程文档中的信息。结果信息会通过curl_getinfo()函数的CURLINFO_FILETIME选项返回。

CURLOPT_FOLLOWLOCATION
启用时会将服务器服务器返回的“Location:”放在header中递归的返回给服务器，使用CURLOPT_MAXREDIRS可以限定递归返回的数量。

CURLOPT_FORBID_REUSE
在完成交互以后强迫断开连接，不能重用。

CURLOPT_FRESH_CONNECT
强制获取一个新的连接，替代缓存中的连接。

CURLOPT_FTP_USE_EPRT
TRUE to use EPRT (and LPRT) when doing active FTP downloads. Use FALSE to disable EPRT and LPRT and use PORT only.
Added in PHP 5.0.0.

CURLOPT_FTP_USE_EPSV
TRUE to first try an EPSV command for FTP transfers before reverting back to PASV. Set to FALSE to disable EPSV.

CURLOPT_FTPAPPEND
TRUE to append to the remote file instead of overwriting it.

CURLOPT_FTPASCII
An alias of CURLOPT_TRANSFERTEXT. Use that instead.

CURLOPT_FTPLISTONLY
TRUE to only list the names of an FTP directory.

CURLOPT_HEADER
启用时会将头文件的信息作为数据流输出。

CURLOPT_HTTPGET
启用时会设置HTTP的method为GET，因为GET是默认是，所以只在被修改的情况下使用。

CURLOPT_HTTPPROXYTUNNEL
启用时会通过HTTP代理来传输。

CURLOPT_MUTE
讲curl函数中所有修改过的参数恢复默认值。

CURLOPT_NETRC
在连接建立以后，访问~/.netrc文件获取用户名和密码信息连接远程站点。

CURLOPT_NOBODY
启用时将不对HTML中的body部分进行输出。

CURLOPT_NOPROGRESS
启用时关闭curl传输的进度条，此项的默认设置为true

CURLOPT_NOSIGNAL
启用时忽略所有的curl传递给php进行的信号。在SAPI多线程传输时此项被默认打开。

CURLOPT_POST
启用时会发送一个常规的POST请求，类型为：application/x-www-form-urlencoded，就像表单提交的一样。

CURLOPT_PUT
启用时允许HTTP发送文件，必须同时设置CURLOPT_INFILE和CURLOPT_INFILESIZE

CURLOPT_RETURNTRANSFER
讲curl_exec()获取的信息以文件流的形式返回，而不是直接输出。

CURLOPT_SSL_VERIFYPEER
FALSE to stop cURL from verifying the peer's certificate. Alternate certificates to verify against can be specified with the CURLOPT_CAINFO option or a certificate directory can be specified with the CURLOPT_CAPATH option. CURLOPT_SSL_VERIFYHOST may also need to be TRUE or FALSE if CURLOPT_SSL_VERIFYPEER is disabled (it defaults to 2). TRUE by default as of cURL 7.10. Default bundle installed as of cURL 7.10.

CURLOPT_TRANSFERTEXT
TRUE to use ASCII mode for FTP transfers. For LDAP, it retrieves data in plain text instead of HTML. On Windows systems, it will not set STDOUT to binary mode.

CURLOPT_UNRESTRICTED_AUTH
在使用CURLOPT_FOLLOWLOCATION产生的header中的多个locations中持续追加用户名和密码信息，即使域名已发生改变。

CURLOPT_UPLOAD
启用时允许文件传输

CURLOPT_VERBOSE
启用时会汇报所有的信息，存放在STDERR或指定的CURLOPT_STDERR中

CURLOPT_BUFFERSIZE
每次获取的数据中读入缓存的大小，这个值每次都会被填满。

CURLOPT_CLOSEPOLICY
不是CURLCLOSEPOLICY_LEAST_RECENTLY_USED就是CURLCLOSEPOLICY_OLDEST，还存在另外三个，但是curl暂时还不支持。.

CURLOPT_CONNECTTIMEOUT
在发起连接前等待的时间，如果设置为0，则不等待。

CURLOPT_DNS_CACHE_TIMEOUT
设置在内存中保存DNS信息的时间，默认为120秒。

CURLOPT_FTPSSLAUTH
The FTP authentication method (when is activated): CURLFTPAUTH_SSL (try SSL first), CURLFTPAUTH_TLS (try TLS first), or CURLFTPAUTH_DEFAULT (let cURL decide).

CURLOPT_HTTP_VERSION
设置curl使用的HTTP协议，CURL_HTTP_VERSION_NONE（让curl自己判断），CURL_HTTP_VERSION_1_0（HTTP/1.0），CURL_HTTP_VERSION_1_1（HTTP/1.1）

CURLOPT_HTTPAUTH
使用的HTTP验证方法，可选的值有：CURLAUTH_BASIC，CURLAUTH_DIGEST，CURLAUTH_GSSNEGOTIATE，CURLAUTH_NTLM，CURLAUTH_ANY，CURLAUTH_ANYSAFE，可以使用“|”操作符分隔多个值，curl让服务器选择一个支持最好的值，CURLAUTH_ANY等价于CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM，CURLAUTH_ANYSAFE等价于CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM

CURLOPT_INFILESIZE
设定上传文件的大小

CURLOPT_LOW_SPEED_LIMIT
当传输速度小于CURLOPT_LOW_SPEED_LIMIT时，PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。

CURLOPT_LOW_SPEED_TIME
The number of seconds the transfer should be below CURLOPT_LOW_SPEED_LIMIT for PHP to consider the transfer too slow and abort.
当传输速度小于CURLOPT_LOW_SPEED_LIMIT时，PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。

CURLOPT_MAXCONNECTS
允许的最大连接数量，超过是会通过CURLOPT_CLOSEPOLICY决定应该停止哪些连接

CURLOPT_MAXREDIRS
指定最多的HTTP重定向的数量，这个选项是和CURLOPT_FOLLOWLOCATION一起使用的。

CURLOPT_PORT
一个可选的用来指定连接端口的量

CURLOPT_PROXYAUTH
The HTTP authentication method(s) to use for the proxy connection. Use the same bitmasks as described in CURLOPT_HTTPAUTH. For proxy authentication, only CURLAUTH_BASIC and CURLAUTH_NTLM are currently supported.

CURLOPT_PROXYPORT
The port number of the proxy to connect to. This port number can also be set in CURLOPT_PROXY.

CURLOPT_PROXYTYPE
Either CURLPROXY_HTTP (default) or CURLPROXY_SOCKS5.

CURLOPT_RESUME_FROM
在恢复传输时传递一个字节偏移量（用来断点续传）

CURLOPT_SSL_VERIFYHOST
1 to check the existence of a common name in the SSL peer certificate.
2 to check the existence of a common name and also verify that it matches the hostname provided.

CURLOPT_SSLVERSION
The SSL version (2 or 3) to use. By default PHP will try to determine this itself, although in some cases this must be set manually.

CURLOPT_TIMECONDITION
如果在CURLOPT_TIMEVALUE指定的某个时间以后被编辑过，则使用CURL_TIMECOND_IFMODSINCE返回页面，如果没有被修改过，并且CURLOPT_HEADER为true，则返回一个"304 Not Modified"的header，CURLOPT_HEADER为false，则使用CURL_TIMECOND_ISUNMODSINCE，默认值为CURL_TIMECOND_IFMODSINCE

CURLOPT_TIMEOUT
设置curl允许执行的最长秒数

CURLOPT_TIMEVALUE
设置一个CURLOPT_TIMECONDITION使用的时间戳，在默认状态下使用的是CURL_TIMECOND_IFMODSINCE

CURLOPT_CAINFO
The name of a file holding one or more certificates to verify the peer with. This only makes sense when used in combination with CURLOPT_SSL_VERIFYPEER.

CURLOPT_CAPATH
A directory that holds multiple CA certificates. Use this option alongside CURLOPT_SSL_VERIFYPEER.

CURLOPT_COOKIE
设定HTTP请求中“Set-Cookie:”部分的内容。

CURLOPT_COOKIEFILE
包含cookie信息的文件名称，这个cookie文件可以是Netscape格式或者HTTP风格的header信息。

CURLOPT_COOKIEJAR
连接关闭以后，存放cookie信息的文件名称

CURLOPT_CUSTOMREQUEST
A custom request method to use instead of "GET" or "HEAD" when doing a HTTP request. This is useful for doing "DELETE" or other, more obscure HTTP requests. Valid values are things like "GET", "POST", "CONNECT" and so on; i.e. Do not enter a whole HTTP request line here. For instance, entering "GET /index.html HTTP/1.0\r\n\r\n" would be incorrect.
Note: Don't do this without making sure the server supports the custom request method first.

CURLOPT_EGBSOCKET
Like CURLOPT_RANDOM_FILE, except a filename to an Entropy Gathering Daemon socket.

CURLOPT_ENCODING
header中“Accept-Encoding: ”部分的内容，支持的编码格式为："identity"，"deflate"，"gzip"。如果设置为空字符串，则表示支持所有的编码格式

CURLOPT_FTPPORT
The value which will be used to get the IP address to use for the FTP "POST" instruction. The "POST" instruction tells the remote server to connect to our specified IP address. The string may be a plain IP address, a hostname, a network interface name (under Unix), or just a plain '-' to use the systems default IP address.

CURLOPT_INTERFACE
在外部网络接口中使用的名称，可以是一个接口名，IP或者主机名。

CURLOPT_KRB4LEVEL
KRB4(Kerberos 4)安全级别的设置，可以是一下几个值之一："clear"，"safe"，"confidential"，"private"。默认的值为"private"，设置为null的时候表示禁用KRB4，现在KRB4安全仅能在FTP传输中使用。

CURLOPT_POSTFIELDS
在HTTP中的“POST”操作。如果要传送一个文件，需要一个@开头的文件名

CURLOPT_PROXY
设置通过的HTTP代理服务器

CURLOPT_PROXYUSERPWD
连接到代理服务器的，格式为“[username]:[password]”的用户名和密码。

CURLOPT_RANDOM_FILE
设定存放SSL用到的随机数种子的文件名称

CURLOPT_RANGE
设置HTTP传输范围，可以用“X-Y”的形式设置一个传输区间，如果有多个HTTP传输，则使用逗号分隔多个值，形如："X-Y,N-M"。

CURLOPT_REFERER
设置header中"Referer: " 部分的值。

CURLOPT_SSL_CIPHER_LIST
A list of ciphers to use for SSL. For example, RC4-SHA and TLSv1 are valid cipher lists.

CURLOPT_SSLCERT
传递一个包含PEM格式证书的字符串。

CURLOPT_SSLCERTPASSWD
传递一个包含使用CURLOPT_SSLCERT证书必需的密码。

CURLOPT_SSLCERTTYPE
The format of the certificate. Supported formats are "PEM" (default), "DER", and "ENG".

CURLOPT_SSLENGINE
The identifier for the crypto engine of the private SSL key specified in CURLOPT_SSLKEY.

CURLOPT_SSLENGINE_DEFAULT
The identifier for the crypto engine used for asymmetric crypto operations.

CURLOPT_SSLKEY
The name of a file containing a private SSL key.

CURLOPT_SSLKEYPASSWD
The secret password needed to use the private SSL key specified in CURLOPT_SSLKEY.
Note: Since this option contains a sensitive password, remember to keep the PHP script it is contained within safe.

CURLOPT_SSLKEYTYPE
The key type of the private SSL key specified in CURLOPT_SSLKEY. Supported key types are "PEM" (default), "DER", and "ENG".

CURLOPT_URL
需要获取的URL地址，也可以在PHP的curl_init()函数中设置。

CURLOPT_USERAGENT
在HTTP请求中包含一个”user-agent”头的字符串。

CURLOPT_USERPWD
传递一个连接中需要的用户名和密码，格式为：“[username]:[password]”。

CURLOPT_HTTP200ALIASES
设置不再以error的形式来处理HTTP 200的响应，格式为一个数组。

CURLOPT_HTTPHEADER
设置一个header中传输内容的数组。

CURLOPT_POSTQUOTE
An array of FTP commands to execute on the server after the FTP request has been performed.

CURLOPT_QUOTE
An array of FTP commands to execute on the server prior to the FTP request.

CURLOPT_FILE
设置输出文件的位置，值是一个资源类型，默认为STDOUT (浏览器)。

CURLOPT_INFILE
在上传文件的时候需要读取的文件地址，值是一个资源类型。

CURLOPT_STDERR
设置一个错误输出地址，值是一个资源类型，取代默认的STDERR。

CURLOPT_WRITEHEADER
设置header部分内容的写入的文件地址，值是一个资源类型。

CURLOPT_HEADERFUNCTION
设置一个回调函数，这个函数有两个参数，第一个是curl的资源句柄，第二个是输出的header数据。header数据的输出必须依赖这个函数，返回已写入的数据大小。

CURLOPT_PASSWDFUNCTION
设置一个回调函数，有三个参数，第一个是curl的资源句柄，第二个是一个密码提示符，第三个参数是密码长度允许的最大值。返回密码的值。

CURLOPT_READFUNCTION
设置一个回调函数，有两个参数，第一个是curl的资源句柄，第二个是读取到的数据。数据读取必须依赖这个函数。返回读取数据的大小，比如0或者EOF。

CURLOPT_WRITEFUNCTION
设置一个回调函数，有两个参数，第一个是curl的资源句柄，第二个是写入的数据。数据写入必须依赖这个函数。返回精确的已写入数据的大小

curl_copy_handle()函数的作用是拷贝一个curl连接资源的所有内容和参数


$ch = curl_init("http://www.baidu.com/");
$another = curl_copy_handle($ch);
curl_exec($another);
curl_close($another);

curl_error()函数的作用是返回一个包含当前会话错误信息的字符串。
curl_errno()函数的作用是返回一个包含当前会话错误信息的数字编号。

curl_multi_init()函数的作用是初始化一个curl批处理句柄资源。
curl_multi_add_handle()函数的作用是向curl批处理会话中添加单独的curl句柄资源。curl_multi_add_handle()函数有两个参数，第一个参数表示一个curl批处理句柄资源，第二个参数表示一个单独的curl句柄资源。
curl_multi_exec()函数的作用是解析一个curl批处理句柄，curl_multi_exec()函数有两个参数，第一个参数表示一个批处理句柄资源，第二个参数是一个引用值的参数，表示剩余需要处理的单个的curl句柄资源数量。
curl_multi_remove_handle()函数表示移除curl批处理句柄资源中的某个句柄资源，curl_multi_remove_handle()函数有两个参数，第一个参数表示一个curl批处理句柄资源，第二个参数表示一个单独的curl句柄资源。
curl_multi_close()函数的作用是关闭一个批处理句柄资源。


$ch1 = curl_init();
$ch2 = curl_init();

curl_setopt($ch1, CURLOPT_URL, "http://www.baidu.com/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.google.com/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

$mh = curl_multi_init();

curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

do {
   curl_multi_exec($mh,$flag);
} while ($flag > 0);

curl_multi_remove_handle($mh,$ch1);
curl_multi_remove_handle($mh,$ch2);
curl_multi_close($mh);

curl_multi_getcontent()函数的作用是在设置了CURLOPT_RETURNTRANSFER的情况下，返回获取的输出的文本流。

curl_multi_info_read()函数的作用是获取当前解析的curl的相关传输信息。

curl_multi_select()
Get all the sockets associated with the cURL extension, which can then be "selected"

]]></description>
         <link>http://www.gccgle.com/2007/10/php_curl_1.html</link>
         <guid>http://www.gccgle.com/2007/10/php_curl_1.html</guid>
        
        
         <pubDate>Sun, 14 Oct 2007 14:04:28 +0800</pubDate>
      </item>
            <item>
         <title>freebsd常用命令</title>
         <description>第一步 
离线?(exit) 
停止电脑?(shutdown -h now) 
重新激活计算机? (shutdown -r now) 
在单使用者模式下停止系统? (shutdown now) 
切换终端机? (ALT-F*) 

文件 
阅读 manual page? (man) 

使用者管理 (1) 
增加一个使用者? (adduser) 
移除使用者? (rmuser) 
改变我的密码? (passwd) 

&quot;su&quot; 指令 
 &quot;su&quot; 至 root 帐号? (su) 
 &quot;su&quot; 至其它使用者的帐号? (su username) 

四处观察 
我在哪? (pwd) 
观察目录下有什么? (ls) 
看到以点开始的隐藏档? (ls -a) 
看到更多的讯息 (存取许可，拥有者，群组，大小，日期)? (ls -l) 
看出那些档是什么? (ls -F) 
这些是什么档: &quot;..&quot; 与 &quot;.&quot;? (ls -aF) 

四处移动 
改变工作目录? (cd) 
如何回到上一层目录? (cd ..) 
回到自己的工作目录? (cd, cd ~/) 

屏幕控制 
卷回 (在终端机中，非 X)? (The Scroll Lock Key) 
清除屏幕? (clear) 

文章 
不使用文书编辑器就可以观看小的档案? (more) 
最普遍的文书编辑器是? (vi) 
&quot;vi&quot; 看起来有点难，我可以从 &quot;ee&quot; 开始吗? (ee) 

&quot;visual&quot; 编辑器 
学习 &quot;vi&quot; 最有效的方法为何? (vilearn) 
&quot;vi&quot; 是如何工作的? (man vi) 
什么是储存指命? (:w) 
什么是离开指令? (:q) 
什么是可以储存与离开的命令? (:wq) 
如何离开而不使用储存指令? (:q!) 
移动? (h, j, k, and l) 
Esc 键有什么用途? (The Esc Key) 
加入新的文字? (a and i) 
建立新的一行? (o and O) 
删除文字? (x and dd) 
拷贝文章内容? (yy and p) 
替代文章? ? 
使用数个指令? (nCommand) 
搜寻文章? (/text) 
起动 &quot;vi&quot; 于只读模式? (view) 

使用者管理 (2) 
新增使用者至群组? (vi /etc/group) 

计算机信息 
能观看开机记录文件? (dmesg) 
有什么方法可以让我慢慢地观看开机记录文件吗? (dmesg |more) 

谁 
显示谁在系统上? (who) 
他们正在做什么?? (w) 
&quot;w&quot; 可以显示出所有的处理吗? (w) 

何时 
显示或设定日期时间? (date) 
显示月历? (cal) 
有什么方法可以让我慢慢地观看月历吗? (cal | more) 
</description>
         <link>http://www.gccgle.com/2007/09/freebsd_1.html</link>
         <guid>http://www.gccgle.com/2007/09/freebsd_1.html</guid>
        
        
         <pubDate>Fri, 21 Sep 2007 10:40:58 +0800</pubDate>
      </item>
            <item>
         <title>checkbot 学习笔记</title>
         <description><![CDATA[# checkbot --help
Checkbot 1.79 command line options:

  --cookies          Accept cookies from the server
  --debug            Debugging mode: No pauses, stop after 25 links.
  --file file        Use file as basis for output file names.
  --help             Provide this message.
  --mailto address   Mail brief synopsis to address when done.
  --noproxy domains  Do not proxy requests to given domains.
  --verbose          Verbose mode: display many messages about progress.
  --url url          Start URL
  --match match      Check pages only if URL matches `match'
                     If no match is given, the start URL is used as a match
  --exclude exclude  Exclude pages if the URL matches 'exclude'
  --filter regexp    Run regexp on each URL found
  --ignore ignore    Ignore URLs matching 'ignore'
  --suppress file    Use contents of 'file' to suppress errors in output
  --note note        Include Note (e.g. URL to report) along with Mail message.
  --proxy URL        URL of proxy server for HTTP and FTP requests.
  --internal-only    Only check internal links, skip checking external links.
  --sleep seconds    Sleep this many seconds between requests (default 0)
  --style url        Reference the style sheet at this URL.
  --timeout seconds  Timeout for http requests in seconds (default 120)
  --interval seconds Maximum time interval between updates (default 10800)
  --dontwarn codes   Do not write warnings for these HTTP response codes
  --enable-virtual   Use only virtual names, not IP numbers for servers
  --language         Specify 2-letter language code for language negotiation

SYNOPSIS
checkbot [--<strong>cookies</strong>] [--<strong>debug</strong>] [--<strong>file</strong> file name] [--<strong>help</strong>] [--<strong>mailto</strong> email addresses] [--<strong>noproxy</strong> list of domains] [--<strong>verbose</strong>] [--<strong>url </strong>start URL] [--<strong>match</strong> match string] [--<strong>exclude</strong> exclude string] [--<strong>proxy</strong> proxy URL] [--<strong>internal</strong>-<strong>only</strong>] [--<strong>ignore</strong> ignore string] [--<strong>filter</strong> substitution regular expression] [--<strong>style</strong> style file URL] [--<strong>note</strong> note] [--<strong>sleep</strong> seconds] [--<strong>timeout</strong> timeout] [--<strong>interval</strong> seconds] [--<strong>dontwarn</strong> HTTP responde codes] [--<strong>enable</strong>-<strong>virtual</strong>] [--<strong>language</strong> language code] [--<strong>suppress</strong> suppression file] [start URLs]

[--cookies] 是否从服务器接受 cookies 默认是不接受的
[--debug] 调试模式，不是真正在工作了，但会保留一点文件并且被删除。
[--file file name]输出报告页面到某个目录下的某个文件，一般默认是checkbot.html，方便观察。
[--help]帮助命令
[--mailto email addresses]发送报告文件到某个EMAIL地址。
[--noproxy list of domains] 不使用代理的域名，可以使用逗号分开。
[--verbose]运行的时候显示输出，包括环链检查和报告等。
[--url start URL]开始URL。
[--match match string]设置本地链接选项。
[--exclude exclude string]排除选项。
[--proxy proxy URL]使用代理服务器访问网络。
[--internal-only]跳过外部检查尽检查内部链接。
[--ignore ignore string] 使用正则表达式匹配不检查的URL，用于网址过滤。
[--filter substitution regular expression]这个选项定义了字符串过滤 ，这是一个perl的表达式。这种过滤器是运行在每个网址基准上的，因此重写url，然后进入队列进行检查。
[--style style file URL]定义一个风格文件URL，使输出报告更加符合您的网页设计风格。
[--note note]说明包括逐字邮件讯息。
[--sleep seconds]再次请求的延时时间，单位为秒。减少带宽使用。
[--timeout timeout]超时时间，设置多长时间如果没有反馈为超时。
[--interval seconds]网页报告更新时间，默认为3小时，开始的时候每隔一分钟扩大更新时间直到3小时。
[--dontwarn HTTP responde codes]对于某些服务器响应不产生错误报告。如301、404。
[--enable-virtual]这个选项是使爬虫能处理虚拟主机。
[--language language code]语言编码。
[--suppress suppression file]错误代码和URL阻止警告。

以上翻译由于水平有限，请不要转载。如果转载请保持本站链接：
原文出处：http://www.gccgle.com/2007/09/checkbot.html







请尊重作者劳动





]]></description>
         <link>http://www.gccgle.com/2007/09/checkbot.html</link>
         <guid>http://www.gccgle.com/2007/09/checkbot.html</guid>
        
        
         <pubDate>Wed, 05 Sep 2007 21:48:47 +0800</pubDate>
      </item>
            <item>
         <title>雪豹项目喜获“SEE·TNC生态奖 ”</title>
         <description><![CDATA[    新疆自然保育参加了由阿拉善SEE生态协会、美国大自然保护协会（The Nature Conservancy）及阿拉善盟行政公署举办的“和谐”为主题的第二届“SEE·TNC生态奖”评选。本届生态奖全国共有210个项目申报奖项，共有43万人次参加网络评选投票。

    新疆自然保育申报的项目为“新疆雪豹栖息地考察和雪豹非法偷猎贸易调查促进中国雪豹保护的可持续性”， 在专家评分中排名第5名，总排名第13名，喜获生态奖，并获得1万元奖金。

<a href="http://www.gccgle.com/2007/08/09/xb.gif"><img alt="xb.gif" src="http://www.gccgle.com/2007/08/09/xb-thumb.gif" width="500" height="375" /></a>
]]></description>
         <link>http://www.gccgle.com/2007/08/seetnc.html</link>
         <guid>http://www.gccgle.com/2007/08/seetnc.html</guid>
        
        
         <pubDate>Thu, 09 Aug 2007 22:03:31 +0800</pubDate>
      </item>
            <item>
         <title>开启mod_rewrite模块很容易犯的500错误</title>
         <description>在.htaccess文件中加入RewriteEngine On如果访问页面显示500错误,这时候你要去检查配置段中AllowOverride选项,一般apache刚安装的时候出于安全考虑的AllowOverride会处于None状态,而也会处于AuthConfig状态,而这些状态是不适合mod_rewrite运转的,正确的状态应该添加FileInfo指令,具体配置方法可以参考http://apache.w8a.com/mod/core.html#allowoverride 如果是虚拟主机,当然还需要检查虚拟主机的对应目录的AllowOverride是否正确,通过这些检查,500错误应该就没有了,对应的模块也就能使用了.</description>
         <link>http://www.gccgle.com/2007/07/mod_rewrite500.html</link>
         <guid>http://www.gccgle.com/2007/07/mod_rewrite500.html</guid>
        
        
         <pubDate>Sat, 14 Jul 2007 16:51:00 +0800</pubDate>
      </item>
            <item>
         <title>FreeBSD 服务器架设和设置备忘</title>
         <description><![CDATA[本文仅提供自己备查之用，所以很多地方可能由于机器环境的不同和用途不同，设置会有所不同。

#--【Freebsd用光盘最小化安装】
这个不是重点，有很多文章，这里就不重复了。


------------------------------------------------------------------------------
#--【安装sys和ports】
系统安装最小化模式+man+ports+src+sys+perl5.8 
www# /stand/sysinstall
位置：
Configure -- Distributions -- src -- sys
Configure -- Distributions -- Ports
Configure -- Distributions -- man


#--【安装网络系统，使计算机可以上网并准备防火墙、IPNAT和DNS设置】
www# ee /etc/ipf.rules
写入：
pass in all
pass out all

www# ee /etc/ipnat.rules
写入：
map tun0 192.168.1.0/24 -> 0/32 proxy port ftp ftp/tcp
map tun0 192.168.1.0/24 -> 0/32 portmap tcp/udp 10000:65535
map tun0 192.168.1.0/24 -> 0/32
rdr tun0 0/0 port 80 -> 127.0.0.1 port 3128 tcp //这里转发是为了用squid

www# ee /etc/resolv.conf
nameserver 127.0.0.1
nameserver 221.228.255.1
nameserver 202.102.3.141

www# ee /etc/rc.conf
defaultrouter="192.168.1.1" //网关
ifconfig_fxp0="inet 192.168.1.2 netmask 255.255.255.0" //IP地址和子网掩码


------------------------------------------------------------------------------
#--【安装防火墙编译内核】
www# cd /usr/src/sys/i386/conf
www# cp GENERIC mysysknl
www# ee mysysknl

修改为 ident mysysknl

加入语句：
options IPFILTER
options IPFILTER_LOG
options IPFILTER_DEFAULT_BLOCK

www# /usr/sbin/config mysysknl
www# cd ../compile/mysysknl
www# make depend
www# make
www# make install
www# ee /etc/rc.conf
加一条 ipfilter_enable="YES" （这个很重要，如果在本机操作不要紧，如果在SSH操作那重新启动后你就登陆不了了，因为防火墙已经启动了，能把你自己隔在外面，前面事先编辑/etc/ipf.rules就是为了这个）
www# reboot


------------------------------------------------------------------------------
#--【安装cvsup并升级所有ports】
www# cd /usr/ports/net/cvsup-without-gui
www# make install clean
www# mkdir /usr/cvsup
www# cp /usr/share/examples/cvsup/stable-supfile /usr/cvsup
www# cp /usr/share/examples/cvsup/standard-supfile /usr/cvsup
www# cp /usr/share/examples/cvsup/ports-supfile /usr/cvsup
www# ee /usr/cvsup/ports-supfile
修改服务器为 *default host=cvsup3.cn.freebsd.org
www# source ~/.cshrc
www# cvsup -g -L 2 /usr/cvsup/ports-supfile


------------------------------------------------------------------------------
#--【下载内核并更新系统为最新版本（升级系统）】
www# ee /usr/cvsup/standard-supfile
修改下载服务器为 *default host=cvsup3.cn.freebsd.org
修改现在用的版本号 *default release=cvs tag=RELENG_5_2_1_RELEASE
www# source ~/.cshrc
www# cvsup -g -L 2 /usr/cvsup/standard-supfile 
www# /usr/sbin/config 你的内核文件名
www# cd ../complie/你的内核文件名
www# make depend
www# make 
www# make install
www# reboot

另外，如果系统升级过源代码树，按下面方法编译内核：
cd /usr/src
make buildkernel KERNCONF= 你的内核文件名
make installkernel KERNCONF=你的内核文件名 

------------------------------------------------------------------------------
#--【设置缓冲型DNS】
www# ee /etc/resolv.conf
domain xxxxx.com 
nameserver 127.0.0.1 
nameserver xxx.xxx.xxx.xxx.xxx 
nameserver xxx.xxx.xxx.xxx.xxx
www# chmod 744 /etc/namedb/make-localhost
www# cd /etc/namedb
www# ./make-localhost
www# ee /etc/namedb/named.conf
options { 
directory "/etc/namedb"; 
forward only; 
forwarders { 
xxx.xxx.xxx.xxx; xxx.xxx.xxx.xxx; 
}; 
}; 

zone "." { 
type hint; 
file "named.root"; 
}; 

zone "0.0.127.IN-ADDR.ARPA" { 
type master; 
file "localhost.rev"; 
};
注: 上面两个xxx.xxx.xxx.xxx就是/etc/resolv.conf 里面的两个nameserver地址
www# ee /etc/rc.conf 
www# named -g # 测试
使用 rndc reload 命令来重新读入配置文件
named_enable="YES"

------------------------------------------------------------------------------
#--【设置泛解析DNS】
www# cat /var/named/etc/namedb/rndc.key 拷贝下面类似内容
key "rndc-key" {
algorithm hmac-md5;
secret "T+DanPgSUW8GkMQWtng6qZZQvSlaoMVkrS+rOzCRpts=";
};
www# ee /etc/namedb/named.conf
# Use with the following in named.conf, adjusting the allow list as needed:
key "rndc-key" {
algorithm hmac-md5;
secret "T+DanPgSUW8GkMQWtng6qZZQvSlaoMVkrS+rOzCRpts=";
};

controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
# End of named.conf
zone "12345.com" {
type master;
allow-update {
key "rndc-key";
};
file "dynamic/12345.com";
};

www# ee /etc/namedb/dynamic/12345.com
$ttl 1D
@ IN SOA 12345.com. root.12345.com. (

2006048888
3H
15M
1W
1D )

IN NS 12345.com.
IN MX 5 12345.com.
* IN A 127.0.0.1
www# ee /etc/host.conf
bind
hosts
www# named -g # 测试
使用 rndc reload 命令来重新读入配置文件
www# sh /etc/rc.d/named restart

------------------------------------------------------------------------------
#--【 Mysql 】
4.1版本以上就有编码支持了，如果不想麻烦就选4.1以下的MYSQL吧
www# cd /usr/ports/databases/mysql323-server
www# make install
www# ee /etc/rc.conf
mysql_enable="YES"
mysql_limits="NO"
mysql_dbdir="/var/db/mysql"
www# cd /etc 
www# && sh rc
www# mysqladmin -u root password 123456
------------------------------------------------------------------------------
#--【 apache+perl+gzip+fastcgi 】
www# cd /usr/ports/www/apache13-modssl
www# make install
www# cd /usr/ports/www/mod_perl
www# make install
www# cd /usr/ports/www/mod_gzip
www# make install
www# cd /usr/ports/www/mod_fastcgi
www# make install
www# mkdir /usr/local/logs
www# mkdir /usr/local/logs/fastcgi
www# mkdir /usr/local/logs/fastcgi/dynamic
www# chown -R www:www /usr/local/logs

www# ee /usr/local/etc/apache/httpd.conf
LoadModule gzip_module libexec/apache/mod_gzip.so
LoadModule fastcgi_module libexec/apache/mod_fastcgi.so
AddModule mod_gzip.c
AddModule mod_fastcgi.c
www# ee /etc/rc.conf
apache_enable="YES"
www# reboot
------------------------------------------------------------------------------
#--【 php5 】
www# cd /usr/ports/lang/php5
www# make install
[X] CLI Build CLI version 
[X] CGI Build CGI version 
[X] APACHE Build Apache module （这个一定要选，否则装好了整合不了apache和php）
[ ] DEBUG Enable debug 
[X] SUHOSIN Enable Suhosin protection system 
[X] MULTIBYTE Enable zend multibyte support 
[X] IPV6 Enable ipv6 support 
[ ] REDIRECT Enable force-cgi-redirect support (CGI only) 
[ ] DISCARD Enable discard-path support (CGI only) 
[X] FASTCGI Enable fastcgi support (CGI only) 
[X] PATHINFO Enable path-info-check support (CGI only)
www# ee /usr/local/etc/apache/httpd.conf
检查下面2句话而且前面没被#掉，如果上面不选apache模块那么下面2句话是没有的：
LoadModule php5_module        libexec/apache/libphp5.so 
AddModule mod_php5.c

添加下面2句话：
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

www# ee /usr/local/etc/php.ini
register_globals = On 
www# php -v 测试
------------------------------------------------------------------------------
#--【 php5-extensions 】
www# cd /usr/ports/lang/php5-extensions
www# make install
全部选上，如果哪个so安装不了，很垃圾的办法是做个“装不了的文件名.so”骗骗系统，然后继续装，装好了禁用这个so，不过一般不会出现这样的情况的。
www# /usr/local/etc/rc.d/apache.sh restart
如果启动不了就禁用扩展模块，开启需要用的
www# ee /usr/local/etc/php/extensions.ini
---------------------------------------------------------------
接下来装点常用的东西，目的是让系统支持常见的网页程序，PORTS安装的好处就在这里啦，你不用去考虑装什么模块什么的，在这里用PORTS装一次，它已经帮你定制好环境了，这里装的WWW软件一般会默认安装到/usr/local/www下面，当然你不能现在就用，装好了你必须用ln命令连接到能够访问的目录下，这样你就可以使用了。
# cd  /usr/ports/www/phpSysInfo
# make install clean
# ln -s /usr/local/www/phpSysInfo /usr/local/www/data
# cd /usr/local/www/phpSysInfo
# cp config.php.new config.php
好了，到这里127.0.0.1已经可以看到这个目录了（/usr/local/www/data下默认页面可以删除）
# cd  /usr/ports/databases/phpmyadmin
# make install clean
# ln -s /usr/local/www/phpMyAdmin /usr/local/www/data
# ee /usr/local/www/data/phpMyAdmin/libraries/config.default.php
加入一个mysql密码就可以用了
# cd /usr/ports/www/MT
# make install clean
##安装DBI和DBD for mysql 用于提供perl访问mysql数据库的接口规范
# cd /usr/ports/databases/p5-DBD-mysql
# make install 


------------------------------------------------------------------------------
#--【 ZendOptimizer 】
方法1：
# cd /usr/ports/devel/ZendOptimizer
cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini
ee /usr/local/etc/php.ini
加入下面一段文字：
[Zend]
zend_optimizer.optimization_level=15
zend_extension_manager.optimizer="/usr/local/lib/php/20060613/Optimizer"
zend_extension_manager.optimizer_ts="/usr/local/lib/php/20060613/Optimizer_TS"
zend_extension="/usr/local/lib/php/20060613/ZendExtensionManager.so"
zend_extension_ts="/usr/local/lib/php/20060613/ZendExtensionManager_TS.so"
修改：register_globals=On
# /usr/local/etc/rc.d/apache.sh restart
方法2：
上传ZendOptimizer-2.6.2-freebsd5.4-i386.tar.gz到/home/sysop/soft
www# cd /home/sysop/soft
www# tar zxvf ZendOptimizer-2.6.2-freebsd5.4-i386.tar.gz
www# cd ZendOptimizer-2.6.2-freebsd5.4-i386
www# ./install
------------------------------------------------------------------------------
#--【 Squid 】
www# cd /usr/ports/www/squid
www# make install
│ │[ ] SQUID_LDAP_AUTH Install LDAP authentication helpers │ │
│ │[ ] SQUID_SASL_AUTH Install SASL authentication helpers │ │
│ │[X] SQUID_DELAY_POOLS Enable delay pools │ │
│ │[X] SQUID_SNMP Enable SNMP support │ │
│ │[ ] SQUID_CARP Enable CARP support │ │
│ │[ ] SQUID_SSL Enable SSL support for reverse proxies│ │
│ │[ ] SQUID_PINGER Install the icmp helper │ │
│ │[ ] SQUID_DNS_HELPER Use the old 'dnsserver' helper │ │
│ │[ ] SQUID_HTCP Enable HTCP support │ │
│ │[ ] SQUID_VIA_DB Enable forward/via database │ │
│ │[X] SQUID_CACHE_DIGESTS Enable cache digests │ │
│ │[X] SQUID_WCCP Enable Web Cache Coordination Protocol│ │
│ │[X] SQUID_UNDERSCORES Allow underscores in hostnames │ │
│ │[X] SQUID_CHECK_HOSTNAME Do hostname checking │ │
│ │[ ] SQUID_STRICT_HTTP Be strictly HTTP compliant │ │
│ │[X] SQUID_IDENT Enable ident (RFC 931) lookups │ │
│ │[X] SQUID_USERAGENT_LOG Enable User-Agent-header logging │ │
│ │[X] SQUID_CUSTOM_LOG Enable custom log format │ │
│ │[ ] SQUID_ARP_ACL Enable ACLs based on ethernet address │ │
│ │[ ] SQUID_PF Enable transparent proxying with PF │ │
│ │[ ] SQUID_IPFILTER Enable transp. proxying with IPFilter │ │
│ │[ ] SQUID_FOLLOW_XFF Follow X-Forwarded-For headers │ │
│ │[ ] SQUID_ICAP Enable ICAP client functionality │ │
│ │[ ] SQUID_AUFS Enable the aufs storage scheme │ │
│ │[ ] SQUID_COSS Enable the COSS storage scheme │ │
│ │[x] SQUID_LARGEFILE Support log and cache files >2GB │ │
│ │[ ] SQUID_STACKTRACES Create backtraces on fatal errors │ │
│ │[X] SQUID_RCNG Install an rc.d style startup script │ │
www# chown sysop /usr/local/etc/squid
www# ee /usr/local/etc/squid/squid.conf
useragent_log /var/log/useragent.log 
www# reboot
www# squid -k parse
www# squid -zX
www# cat >> /var/log/useragent.log
www# chown squid /var/log/useragent.log
www# /usr/local/etc/rc.d/squid.sh start
www# ee /etc/rc.conf
squid_enable="YES"
www# reboot
------------------------------------------------------------------------------
#--【 设置ipnat 】
www# ee /etc/ipnat.rules
map tun0 192.168.1.0/24 -> 0.0.0.0/32 proxy port ftp ftp/tcp
map tun0 192.168.1.0/24 -> 0.0.0.0/32 portmap tcp/udp 10000:65535
map tun0 192.168.1.0/24 -> 0.0.0.0/32
rdr tun0 0.0.0.0/0 port 80 -> 127.0.0.1 port 3128 tcp
rdr tun0 0.0.0.0/0 port 25 -> 192.168.1.100 port 25 tcp
rdr tun0 0.0.0.0/0 port 110 -> 192.168.1.100 port 110 tcp
rdr fxp0 192.168.1.0/24 port 80 -> 127.0.0.1 port 3128 tcp
www# ipnat -CF -f /etc/ipnat.rules
------------------------------------------------------------------------------
#--【 设置ADSL 】
www# cat > /etc/ppp/ppp.conf
www# ee /etc/ppp/ppp.conf

default:
ident user-ppp VERSION (built COMPILATIONDATE)
set device /dev/cuaa1
set speed 115200
set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \
\"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT"
set timeout 0
set log Phase tun command 
set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.255 
nat same_ports yes 
nat use_sockets yes

adsl:
set device PPPoE:fxp0
set mru 1492 
set mtu 1492 
set speed sync 
enable lqr 
set dial 
set login 
set authname 123456这里的用户名根据自己情况决定修改
set authkey 123456这里的密码根据自己情况决定修改
add default HISADDR 

www# ee /etc/rc.conf
ppp_enable="YES"
ppp_mode="ddial"
ppp_nat="YES"
ppp_profile="adsl"

----------------
www# cd /usr/ports/ftp/wget
www# make install
www# cd /usr/ports/www/lynx
www# make install
www# cd /usr/ports/net/fping
www# make install
www# cd /usr/ports/www/mod_limitipconn
www# make install
www# cd /usr/ports/www/mod_encoding
www# make install

挂接一块硬盘------------------------
www# cat /var/run/dmesg.boot 检查一下有没有找到新的磁盘记下标号ad3
www# mount /dev/ad3s1e /mysql
www# mount /dev/ad3s1f /cache
www# mount /dev/ad3s1g /sites
www# ee /etc/fstab
/dev/ad3s1e /mysql ufs rw 2 2
/dev/ad3s1f /cache ufs rw 2 2
/dev/ad3s1g /sites ufs rw 2 2

---------安装新硬盘---------------------
www# cat /var/run/dmesg.boot 找到硬盘编号 例：ad2
www# dd if=/dev/zero of=/dev/ad2 bs=1k count=1 #准备工作
www# fdisk -BI ad2 #初始化新磁盘
www# disklabel -B -w -r ad2s1 auto #加上标签
www# disklabel -e ad2s1 #现在编辑您刚才创建的磁盘分区

www# mkdir -p /cache # 要挂到根下的分区名，可以自己定义
www# newfs /dev/ad2s1 # 创建这数据结构，为您创建的每个分区重复这个操作
www# mount /dev/ad2s1 /cache2 # 挂上分区
www# ee /etc/fstab # 完成之后，添加合适的记录到您的 /etc/fstab文件。
---------------------------------------------------------------------------------------
No.16 MRTG 流量分析 
//安装MRTG 可谓艰难.查了好多资料.也走了很多弯路.一步一步走出来的..
//在安裝 MRTG 之前，我们先使用 ports 來安装 SNMP：

#cd /usr/ports/net-mgmt/net-snmp
#make install clean
#cd /usr/local/share/snmp
#cp snmpd.conf.example snmpd.conf
#ee /usr/local/share/snmp/snmpd.conf
//添加以下内容
view mib2 included .iso.org.dod.internet.mgmt.mib-2 fc
rocommunity     mrtg
syslocation     Office
syscontact      stuceo@stuhack.com

#/usr/local/etc/rc.d/snmpd start
#netstat -an
udp4       0      0  *.161                  *.*

//接着ports 來安裝 MRTG：
#cd /usr/ports/net-mgmt/mrtg
#make install clean

#################################################
# Please create a MRTG config file in /usr/local/etc/mrtg                                 #
# A configuration file can be automatically generated with cfgmaker              #
# A sample configuration file is installed as mrtg.cfg.sample                           #
#                                                                                                                      #
# To enable MRTG in daemon mode, put the following to your /etc/rc.conf or #
# /etc/rc.conf.local file:                                                                                     #
#      mrtg_daemon_enable="YES"                                                                  #
#################################################

#ee /etc/rc.conf
snmpd_enable="YES"
mrtg_daemon_enable="YES" 

#mkdir /usr/local/www/apache22/data/mrtg
//新建mrtg 为了是用ip可以直接访问mrtg

#cd /usr/ports/distfiles/
#tar -zxvf mrtg-2.14.5.tar
#cd mrtg-2.14.5
#cp images/* /usr/local/www/apache22/data/mrtg
//把mrtg解压一下.再把这些图像文件cp到mrtg下面.

#cd /usr/local/etc/mrtg
# rehash
# cfgmaker mrtg@www.stuhack.com >mrtg.cfg
//上面请特别注意：在 mrtg@www.stuhack.com 也可以换成mrtg@yourip 
//mrtg 是有其意义的（在  snmp 这个通讯服务里面的预设搜寻的一个代码,默认的可能是public,这就是刚才要查看snmpd.conf里的原因了）
//所以，如果你的主机的动态 DNS 名称为 your.domain.name 则你就『一定』要写成  mrtg@your.domain.name 才行！千万不要弄错了！

#ee mrtg.conf
//还需要编辑一下这个文件加入WorkDir这一项，就是你的生成的网页的存放的位置。
WorkDir: /usr/local/www/apache22/data/mrtg
# Options[_]: growright, bits
Language:GB2312
//这个要注意的一点是他们前边不要有空格，否则会有什么” ERROR: Line 8 ( WorkDir: /var/www/html/mrtg) in CFG file (mrtg) does not make sense”的错误。
#whereis mrtg
mrtg: /usr/local/bin/mrtg /usr/local/man/man1/mrtg.1.gz /usr/ports/net-mgmt/mrtg
//为查找mrtg到底在哪..

# /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg.cfg
# /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg.cfg
# /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg.cfg
//这个需要运行3次，前两次都会报错，不用去理会他，第3次就应该没有错误了
//不过，若是有问题的话，就需要修改mrtg.cfg，再执行直到没有错误发生为止。  

//如以下错误:
Rateup WARNING: /usr/local/mrtg2/bin/rateup could not read the primary log file for localhost 
Rateup WARNING: /usr/local/mrtg2/bin/rateup The backup log file for localhost was invalid as well 
Rateup WARNING: /usr/local/mrtg2/bin/rateup Can't remove localhost.old updating log file 
Rateup WARNING: /usr/local/mrtg2/bin/rateup Can't rename localhost.log to localhost.old updating log file 


#whereis indexmaker
indexmaker: /usr/local/bin/indexmaker /usr/local/man/man1/indexmaker.1.gz
/usr/local/bin/indexmaker
//为了查找indexmaker在哪.不要弄错了..

#/usr/local/bin/indexmaker -output=/usr/local/www/apache22/data/mrtg/index.html -title=LL /usr/local/etc/mrtg/mrtg.cfg

//上面这个程序indexmaker是在制作首页。会自动地输出一个index.html的文件中。
//如果说你以后修改了这个文件(比如增加对CPU,硬盘等的侦测,要再重新生成一次,否则图面会出不来的.

#crontab -e
//按下I键 插入的意思!
*/5    *    *    *    *    /usr/local/bin/mrtg  /usr/local/etc/mrtg/mrtg.cfg
//ESC 输入
:wq!
//设定每5分钟执行一次 
//使用手工运行mrtg并不能定时产生适当的统计信息，因此最好还是定时自动运行mrtg来生 成统计信息，默认为五分钟运行一次。  
//ok!到此为止，配置完毕，记得一定要重新启动snmp和httpd服务！

#/usr/local/etc/rc.d/snmpd restart
Stopping snmpd.
Starting snmpd.
#apachectl restart
//現在你可以使用 http://yourserver/mrtg 來連去看看。
//打开http://unix.stuhack.com/mrtg/


■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
常用命令：
/usr/local/etc/rc.d/apache.sh start
/usr/local/etc/rc.d/apache.sh stop
/usr/local/etc/rc.d/apache.sh restart

--------------修改php.ini文件--------------
www# cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini
www# ee /usr/local/etc/php.ini
进行php.ini文件的配置工作 
（0）查找safe_mode=Off,更改为safe_mode=On 
（1）查找max_execution_time = 30，更改为max_execution_time = 600 
（2）查找max_input_time = 60，更改为max_input_time = 600 
（3）查找memory_limit = 8M ，更改为memory_limit = 20M 
（4）查找display_errors = On，更改为display_errors = Off 
（5）查找register_globals = Off，更改为register_globals = On 
（6）查找post_max_size = 8M，更改为post_max_size = 20M 
（7）查找upload_max_filesize = 2M，更改为upload_max_filesize = 20M 
（8）查找session.auto_start = 0，更改为session.auto_start = 1 
保存后退出，从而完成了php.ini文件的配置工作。
www# /usr/local/etc/rc.d/apache.sh restart


------------------使用Squid----------------

www# mkdir /home/sysop/squid
www# mkdir /home/sysop/squid/cache
www# mkdir /home/sysop/squid/var
www# mkdir /home/sysop/squid/var/logs
www# cd /usr/local/etc/squid/
www# mv squid.conf squid.conf.bak
www# ee squid.conf


改变cache目录和logs目录的所有者为squid用户和组：
www# chown –R squid /home/sysop/squid/cache
www# chgrp –R squid /home/sysop/squid/cache
www# chown –R squid /home/sysop/squid/var/logs
www# chgrp –R squid /home/sysop/squid/var/logs
www# /usr/local/sbin/squid –z
www# /usr/local/sbin/squid –NCd1 测试
www# ee /etc/rc.conf 添加squid_enable="YES"
www# cd /etc
www# ee /etc/ipnat.rules
添加rdr tun0 0/0 port 80 -> 127.0.0.1 port 3128 tcp

------------设置透明代理------------------------- 

这里假设你已经设置好squid并已投入使用,如果大家对squid不熟悉的话,我稍后会贴出squid的设置. 
一般网上都是用ipfw做防火墙的,但我觉得ipfilter较ipfw方便而且好用,所以这里采用ipfilter. 

1.编辑/boot/defaults/loader.conf 
在Networking modules段加入: 
ipl_load="YES" 

2.创建/etc/ipfilter.rules (ipfilter规则),这里仅仅给出一个例子,要根据自己的实际需求设定规则. 

block in log on 外网卡名 from any to any 
block out log on 外网卡名 from any to any 
pass out log on 外网卡名 proto icmp all keep state 
pass out log on 外网卡名 proto tcp/udp from any to any keep state 
pass in on 外网卡名 proto tcp from any to any port = ftp-data keep state 
pass in on 外网卡名 proto tcp from any port = ftp-data to any port > 1023 keep state 
pass in on 内网卡名 all 
pass out on 内网卡名 all 
block return-rst in log on 外网卡名 proto tcp from any to any flags S/SA 
block return-icmp(net-unr) in log on 外网卡名 proto udp from any to any 

3.创建/etc/ipnat.rules (NAT规则) 
rdr 内网卡名 0.0.0.0/0 port 80 -> 192.168.0.1 port 3128 tcp/udp 

注: 192.168.0.1 为内网卡ip地址, 并假设你的squid的端口为3128,不是的话改成实际的就可以了.

4.编辑 /etc/rc.conf , 加入: 

ipfilter_enable="YES" 
ipfilter_rules="/etc/ipfilter.rules" 
ipnat_enable="YES" 
ipnat_rules="/etc/ipnat.rules" 

到这里为止,整个设置透明代理设置基本完成, 确保你的squid服务正常并开机自动启动. 然后重新启动服务器.将客户端电脑的网关和DNS服务器地址都改为内网卡ip地址(我那里是192.168.0.1) 就可以了.

---------------在FreeBSD设置ADSL上网---------------------------- 

我曾经发表过一篇这样的文章,在这里我不在罗嗦了. 可以参考下面: 

如何在FreeBSD设置ADSL上网（在FreeBSD 4.4下测试通过） 
网上有部分关于FreeBSD设置ADSL上网的文章有些错误，这里公布葱头的设置文件。 
1。编辑/etc/ppp/ppp.conf 文件 

default: 
set log Phase tun command 
enable dns 

adsl: 
set device PPPoE: 设备名 ；即网卡的设备名 
set speed sync 
set mru 1492 
set mtu 1492 
set dial 
set login 
add default HISADDR 
set authname 帐户名 
set authkey 密码 

Papchap: 
set authname 帐户名 
set authkey 密码 

2。编辑/boot/defaults/loader.conf 
ng_pppoe_load="YES" 


虚拟拨号： ppp -background adsl 
测试： ifconfig -a 看到tun0伪设备捆绑了ISP分配的IP地址即成功 

如果想开机就自动拨号，那就要修改/etc/rc.conf，增加一下字段： 
ppp_enable="YES" 
ppp_mode="ddial" 
ppp_profile="adsl" 

--------ln命令举例---------------
ln -s /myconfig/dynamic /var/named/etc/named
将/myconfig/dynamic目录挂接到/var/named/etc/named目录下

#-------安装proftpd

#cd /usr/ports/ftp/proftpd-mysql
#make install
安装的时候会要求选择proftpd要安装的模块，选择好mysql和quota，其他的根据情况选择
然后系统自动下载proftpd-1.3.0rc2.tar.bz2并完成编译和安装。
#cp /usr/local/etc/proftpd.conf /usr/local/etc/proftpd.conf.sample
#ee /usr/local/etc/proftpd.conf
----------------------------------------
#基本配置
ServerName "Michael's Ftp Site" 
ServerType standalone 
DefaultServer on 

#设置用户登陆时不显示ftp服务器版本信息 
ServerIdent off 

#设置ftp服务使用的端口，可以修改
Port 21 

#设置ftp目录的权限
Umask 022 

#设置系统各种超时时间和重试次数
MaxLoginAttempts 3 
TimeoutLogin 120 
TimeoutIdle 600 
TimeoutNoTransfer 900 
TimeoutStalled 3600 

#允许最大的同时连接用户数
MaxClients 10

#允许每个用户主机最大并发连接数 
MaxClientsPerHost 3 

AllowOverwrite no 
AllowStoreRestart on 
UseReverseDNS off 

#如果shell为空时允许用户登录 
RequireValidShell off 

#将用户限制在自己的主目录下 ，这个设置很重要
DefaultRoot ~

#设置系统最大的进程数，防止dos攻击，默认是30
MaxInstances 10 

#设置系统用于运行proftpd服务的用户和用户组（需要后面自己创建） 
User FTPUSR 
Group FTPGRP 

#设置对全局的文件可以进行改写
<Directory /> 
    AllowOverwrite on 
</Directory> 

#设置系统运行日志和文件传输日志
SystemLog                       /var/log/proftpd.syslog  
TransferLog                     /var/log/proftpd.transferlog 


######################## 下面是匿名登陆部分的设置 #################
#匿名用户登陆后访问的目录为 ftp用户的主目录
<Anonymous ~ftp> 
User ftp 
Group ftpusers 

#设置anonymous用户为系统实际用户ftp的别名
UserAlias anonymous ftp 

#设置匿名用户同时在线最大用户数
#此用户数受限于前面的全局同时在线用户数
MaxClients 5

#设置welcome.msg文件作为用户登陆的提示信息文件
#.message文件作为用户每次进入的目录提示信息
DisplayLogin welcome.msg 
DisplayFirstChdir .message 

#设置一些特殊的权限，比如写文件和登陆限制等 （可以不用）
<Limit WRITE> 
    DenyAll 
</Limit> 

<Limit LOGIN>
    Order deny,allow
    Deny from 61.101.201.0/32 
    Allow from all
</Limit>

</Anonymous> 
######################## 完成匿名登陆的设置 #################


######################## 下面是磁盘限额Quota设置 ############
#启用磁盘限额 
QuotaDirectoryTally on 

SQLHomedirOnDemand on 

#磁盘限额单位 b"|"Kb"|"Mb"|"Gb" 
QuotaDisplayUnits "Mb" 

QuotaEngine on 

#磁盘限额日志记录 
QuotaLog "/var/log/proftpd.quotalog" 

#打开磁盘限额信息 "quote SITE QUOTA"命令 
QuotaShowQuotas on 
####################### 完成磁盘配额设置 ####################


####################### 下面是MySQL数据库部分设置 ###########
#数据库联接的信息
#FTP是数据库名，localhost是MySQL主机名，3306是mysql服务的端口号
#Michael是连接数据库的用户名，testpwd是密码（如果没有密码留空） 
SQLConnectInfo FTP@localhost:3306 Michael testpwd 

#数据库认证的类型 
SQLAuthTypes Backend Plaintext 

#指定用来做用户认证的表的有关信息。(将在后面创建) 
SQLUserInfo FTPUSERS userid passwd uid gid homedir shell 
SQLGroupInfo FTPGRPS groupname gid members 

#数据库认证 
SQLAuthenticate users groups usersetfast groupsetfast 

#proftpd进行的mysql调用语句，别修改任何地方
SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail,files_in_avail, files_out_avail, files_xfer_avail FROM quotalimits WHERE name = '%{0}' AND quota_type = '%{1}'" 

SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM quotatallies WHERE name = '%{0}' AND quota_type = '%{1}'" 

SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" quotatallies 

SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" quotatallies 

QuotaLimitTable sql:/get-quota-limit 
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

----------------------------------------

完成proftpd.conf配置文件后，需要进行数据库表的配置，包括创建表和插入数据
1、登陆mysql或者使用phpmyadmin工具创建数据库 FTP
#mysqladmin create FTP
2、运行下面的sql语句创建表和插入必要数据

-- phpMyAdmin SQL Dump
-- version 2.6.4-pl2
-- http://www.phpmyadmin.net
-- 
-- 主机: localhost
-- 生成日期: 2005 年 11 月 03 日 14:23
-- 服务器版本: 4.1.14
-- PHP 版本: 4.4.0
-- 
-- 数据库: `FTP`
-- 
 
-- --------------------------------------------------------
 
-- 
-- 表的结构 `FTPGRPS`
-- 
 
CREATE TABLE `FTPGRPS` (
  `groupname` text NOT NULL,
  `gid` smallint(6) NOT NULL default '0',
  `members` text NOT NULL
) ENGINE=MyISAM;;
 
-- 
-- 导出表中的数据 `FTPGRPS`
-- 
 
INSERT INTO `FTPGRPS` VALUES ('FTPGRP', 2001, 'FTPUSR');
INSERT INTO `FTPGRPS` VALUES ('ftpusers', 2002, 'ftp');
 
-- --------------------------------------------------------
 
-- 
-- 表的结构 `FTPUSERS`
-- 
 
CREATE TABLE `FTPUSERS` (
  `userid` text NOT NULL,
  `passwd` text NOT NULL,
  `uid` int(11) NOT NULL default '0',
  `gid` int(11) NOT NULL default '0',
  `homedir` text,
  `shell` text
) ENGINE=MyISAM;;
 
-- 
-- 导出表中的数据 `FTPUSERS`
-- 
 
INSERT INTO `FTPUSERS` VALUES ('Michael', 'testftp', 2001, 2001, '/var/ftp/incoming', '');
 
-- --------------------------------------------------------
 
-- 
-- 表的结构 `quotalimits`
-- 
 
CREATE TABLE `quotalimits` (
  `name` varchar(30) default NULL,
  `quota_type` enum('user','group','class','all') NOT NULL default 'user',
  `per_session` enum('false','true') NOT NULL default 'false',
  `limit_type` enum('soft','hard') NOT NULL default 'soft',
  `bytes_in_avail` float NOT NULL default '0',
  `bytes_out_avail` float NOT NULL default '0',
  `bytes_xfer_avail` float NOT NULL default '0',
  `files_in_avail` int(10) unsigned NOT NULL default '0',
  `files_out_avail` int(10) unsigned NOT NULL default '0',
  `files_xfer_avail` int(10) unsigned NOT NULL default '0'
) ENGINE=MyISAM;;
 
-- 
-- 导出表中的数据 `quotalimits`
-- 
-- 设置Michael用户，磁盘配额1G，可以上传下载流量2G，最多文件数10个
INSERT INTO `quotalimits` VALUES ('Michael', 'user', 'false', 'soft', 1.024e+09, 0, 2.048e+09, 10, 0, 0);
 
-- --------------------------------------------------------
 
-- 
-- 表的结构 `quotatallies`
-- 
 
CREATE TABLE `quotatallies` (
  `name` varchar(30) NOT NULL default '',
  `quota_type` enum('user','group','class','all') NOT NULL default 'user',
  `bytes_in_used` float NOT NULL default '0',
  `bytes_out_used` float NOT NULL default '0',
  `bytes_xfer_used` float NOT NULL default '0',
  `files_in_used` int(10) unsigned NOT NULL default '0',
  `files_out_used` int(10) unsigned NOT NULL default '0',
  `files_xfer_used` int(10) unsigned NOT NULL default '0'
) ENGINE=MyISAM;;
如果你想设置quota，只要在ftpquotalimits表里设置一下就行了，这个表里的各个参数分别代表：

代码:
quotalimits表
name： - 用户帐号
quota type： - user, group, class, all (we use user)
per_session： - true or false (we use true)
limit_type： - 硬限制 or 软限制 (我们一般用硬限制)
bytes_in_avail： - 允许上传的字节数
bytes_out_avail： - 允许下载的字节数
bytes_xfer_avail： - 允许传输的字节数（包括上传/下载）
files_in_avail： - 允许上传的文件数
files_out_avail： - 允许下载的文件数
files_xfer_avail： - 允许传输的文件数（包括上传/下载）

五、完成最后的用户、用户组和目录设置
1、创建proftpd服务运行的用户和用户组
#pw groupadd FTPGRP -g 2001
#pw adduser FTPUSR -u 2001 -g 2001 -d /var/ftp/incoming -s /sbin/nologin 

2、创建匿名登陆用户映射的系统用户和用户组
#pw groupadd ftpusers -g 2002
#pw adduser ftp -u 2002 -g 2002 -d /var/ftp/incoming -s /sbin/nologin 

六、运行测试配置系统服务
1、运行proftpd服务
#/usr/local/sbin/proftpd

2、测试
在任何一台可以访问服务器的机器上测试ftp连接，使用Michael用户和testftp口令登陆，然后运行quote SITE QUOTA命令查看设置的磁盘限额信息
然后测试使用anonymous匿名用户登陆测试

3、监控和调试proftpd服务
#/usr/local/sbin/proftpd proftpd -n -d 5 -c /usr/local/etc/proftpd.conf
这样在测试和连接ftp的时候，可以在主机上看到所有的proftpd运行信息

4、日志监控
可以使用下面的命令查看系统日志、传送日志等
#tail -f /var/log/proftpd.syslog
#tail -f /var/log/proftpd.transferlog

5、配置系统自启动proftpd服务
#vi /etc/rc.conf
加入下面一行
proftpd_enable=”YES”
这样系统启动的时候会调用/usr/local/etc/rc.d/proftpd.sh脚本启动proftpd服务

ok
大功告成，大家可以根据自己的需要修改上面任何一个部分的细节，最好在自己理解的基础上进行修改，整个过程包括proftpd的配置都很简单。有问题欢迎大家来和我讨论，经过Michael测试使用，发现proftpd的确是个不错的东东！

----------------------------------------------------------
安全配置：
# ee /etc/ssh/sshd_config
修改22端口为您记得住的端口，防止SSH扫描。

计算机启动时候发现文件系统失效，将以-y参数运行fsck
# ee /etc/rc.conf
fsck_y_enable="YES"

<a href="http://www.toplee.com/blog/archives/278.html">使用mod_dosevasive对抗DDos攻击</a>可参考Michael`s blog

<strong>为什么登录SSH和FTP时有长时间的停顿？</strong>
DNS引起的。 

在proftpd.conf里写入 
UseReverseDNS  off 
IdentLookups                    off 

在sshd_config里写入 
UseDNS no

<strong>FreeBSD下用rsync对网站进行同步镜像备份</strong>

前言
rsync是Linux系统下的数据镜像备份工具，从软件的命名上就可以看出来了——remote sync。rsync支持大多数的类Unix系统，无论是Linux、Solaris还是BSD上都经过了良好的测试。rsync的最新版本可以从 http://rsync.samba.org/rsync/获得。它的特性如下：
1、可以镜像保存整个目录树和文件系统。
2、可以很容易做到保持原来文件的权限、时间、软硬链接等等。
3、无须特殊权限即可安装。
4、优化的流程，文件传输效率高。
5、可以使用rcp、ssh等方式来传输文件，当然也可以通过直接的socket连接。
本文介绍了如何使用rsync服务从Linux到Windows和linux进行远程备份 
软件及平台
FreeBSD 5.2 (Server and Client)

Server IP:192.168.83.80 Hostname: freebsd-1
Client IP:192.168.83.81 Hostname: freebsd-2

apache_1.3.29
rsync-2.5.7
目的
备份Rsync Server(192.168.83.80)上的 /usr/local/apache2/htdocs 目录下所有内容,到Rsync Client(192.168.83.81)的/backup/www 下


安装及配置

一,Rsync Server

Step 1: 安装
freebsd-1#cd /usr/ports/net/rsync
freebsd-1#make install clean

Step 3: 配置rsyncd.conf
freebsd-1#vi /usr/local/etc/rsyncd.conf //加入以下内容

[www]
comment = web server backup
path = /usr/local/apache2/htdocs
auth users = tonny
uid = nobody
gid = nogroup
secrets file = /usr/local/etc/rsyncd.secrets
read only = no

Step 4: 配置rsyncd.secrets
freebsd-1#vi /usr/local/etc/rsyncd.secrets //加入以下内容

tonny:123456 // 认证所需的用户名/密码

freebsd-1#chmod 600 rsyncd.secrets

Step 5: 配置rc.conf
freebsd-1#vi /etc/rc.conf //加入以下内容

rsyncd_enable="YES"

Step 6: 启动 Rsync daemon模式
freebsd-1#vi /usr/local/etc/rc.d/rsyncd.sh //加入以下内容

command_args="-4 --daemon" <<<--- 启用ipv4 协议

freebsd-1#/usr/local/etc/rc.d/rsyncd.sh start

Step 7: 检查Rsync daemon启动状态
freebsd-1# sockstat | grep rsync
root rsync 440 3 dgram -> /var/run/log
root rsync 440 4 tcp4 *:873 *:*

二,Rsync Client

Step 1: 安装
freebsd-2#cd /usr/ports/net/rsync
freebsd-2#make install clean

Step 2: 建立备份目录
freebsd-2#cd /
freebsd-2#mkdir -p backup/www

Step 3: 配置rsyncd.secrets
freebsd-2#vi /usr/local/etc/rsyncd.secrets //加入以下内容

123456 //Rsync Server上的认证密码,不用输入用户名

freebsd-2#chmod 600 rsyncd.secrets

Step 4: 检查备份同步状态
freebsd-2#/usr/local/bin/rsync -avzP --delete
--password-file=/usr/local/etc/rsyncd.secrets tonny@192.168.83.80::www
/backup/www/

--->>> 将Rsync Server的Web页面,备份或同步到了Rsync Client的/backup/www下


Step 5: Auto Rsync Shell:
freebsd-2#cd /usr/local/etc/rc.d/

freebsd-2#chmod a-x rsyncd.sh

freebsd-2#vi rsync.sh //加入以下内容

#!/bin/sh

/usr/local/bin/rsync -avzP --delete
--password-file=/usr/local/etc/rsyncd.secrets tonny@192.168.83.80::www
/backup/www/

freebsd-2#chmod a+x rsync.sh

freebsd-2#crontab -e //加入以下内容(每天下午5点半自动备份同步)

30 17 * * * /usr/local/etc/rc.d/rsync.sh

三,高级应用(Rsync With SSH)

Rsync Server
freebsd-1#/usr/bin/ssh-keygen -d

Rsync Client
freebsd-2#/usr/bin/ssh-keygen -d

freebsd-2#scp ~/.ssh/id_dsa.pub 192.168.83.80:/root/.ssh/authorized_keys

freebsd-2#ssh-agent csh 或 (ssh-agent bash) --->>> #echo $SHELL
查看当前SHELL
freebsd-2#ssh-add id_dsa --->>> 输入 passphase


freebsd-2#/usr/local/bin/rsync -avzP --delete -e ssh 192.168.83.80:/usr/local/apache2/htdocs/ /backup/www
htdocs/不加斜线,会在备备份机上建立一个文件夹

PS: 参数说明

-a, --archive archive mode, equivalent to -rlptgoD
//档案模式
-v, --verbose
//详细模式
-z, --compress compress file data
//压缩文件
-P equivalent to --partial --progress
//显示进度
--delete
This tells rsync to delete any files on the receiving side
that
aren't on the sending side.
//保持远程机器的文件同步性
-e ssh use SSH connection
//使用SSH连接,保证数据安全
-u增量同步，即服务器端有新文件时客户端只同步新文件
]]></description>
         <link>http://www.gccgle.com/2007/07/freebsd.html</link>
         <guid>http://www.gccgle.com/2007/07/freebsd.html</guid>
        
        
         <pubDate>Sat, 14 Jul 2007 16:48:53 +0800</pubDate>
      </item>
            <item>
         <title>Web服务器使用的一些小技巧备忘录</title>
         <description><![CDATA[这个日记会不断更新，主要记录一些简短而且容易忘记的东西.....

1、刚装的PHP5注意register_globals的状态
刚安装好PHP的时候，也许会碰到表单递交变量无法接收的事情。相关问题：为什么我的程序无法得到传递过来的变量？为什么我的表单无法传递数据？

其实问题很简单，刚安装的PHP默认是应该用$_GET['user_name']和$_GET['user_pass']来接受传递过来的值，也就是说register_globals处于Off状态，这个问题我们可以通过写个测试文件如：test.php 来观察register_globals的状态。test.php的全部代码就一句话，很简单的，如：

<？ echo phpinfo(); ？> //注意这里的？不能用中文格式

你可以观察到register_globals处于什么状态，如果要修改这个状态可以修改php.ini来实现。我们这里以FreeBSD系统为例来说明修改方法,其他操作系统雷同：
www# ee /usr/local/etc/php.ini （用^y search prompt 去搜索register_globals在那一行）
www# /usr/local/etc/rc.d/apache22 restart （修改以后重新启动apache就生效了）

2、启用FreeBSD的捏名FTP服务
sysintall---configure---Networking--- Anon FTP（This machine wishes to allow anonymous FTP） 

3、phpinfo()的妙用
phpinfo()是一个可以用来检查PHP的运行状况的函数，但Apache Environment里面有很多变量我们可以在撰写PHP程序的时候用的到，打开phpinfo()你会发现有很多表格，表格前面其实很多是变量名称，你可以用echo来显示这些内容，比如echo $_SERVER["SCRIPT_FILENAME"] ;将返回你请求的文件名的绝对路径。 

4、SQL语句备忘
替换某个字符 update 表名 set 字段名=REPLACE(字段名,'被替换内容','替换成内容')

5、安装和更新prots的方法
www# cd /usr/ports/net/cvsup-without-gui
www# make install clean
www# mkdir /usr/cvsup
www# cp /usr/share/examples/cvsup/stable-supfile /usr/cvsup
www# cp /usr/share/examples/cvsup/standard-supfile /usr/cvsup
www# cp /usr/share/examples/cvsup/ports-supfile /usr/cvsup
www# ee /usr/cvsup/ports-supfile
修改服务器为 *default host=cvsup1.cn.freebsd.org
www# source ~/.cshrc
www# cvsup -g -L 2 /usr/cvsup/ports-supfile //以后只要这一条命令就可以更新了

6、Freebsd安装perl模块的方法（这里针对MT支持环境构建）
一般的方法如下（此方法可以在NT机里使用）：
www#perl -MCPAN -e shell
如果用ports方法安装会更简单
www#cd /usr/ports/databases/p5-DBD-mysql //这里根据你的mysql版本安装相应版本
www# make install clean
www# cd ../p5-DBD-Pg
www# make install clean
其他模块的安装类似上面的，你可以浏览/usr/ports/databases 目录去找相应的模块来安装。

7、寻找一个你要的ports
www# cd /usr/ports
www# make search key=samba3

8、开启mod_rewrite模块很容易犯的错误
在.htaccess文件中加入RewriteEngine On如果访问页面显示500错误,这时候你要去检查配置段中AllowOverride选项,一般apache刚安装的时候出于安全考虑的AllowOverride会处于None状态,而也会处于AuthConfig状态,而这些状态是不适合mod_rewrite运转的,正确的状态应该添加FileInfo指令,具体配置方法可以参考http://apache.w8a.com/mod/core.html#allowoverride 如果是虚拟主机,当然还需要检查虚拟主机的对应目录的AllowOverride是否正确,通过这些检查,500错误应该就没有了,对应的模块也就能使用了.

9、FreeBSD下也用BT下载软件
cd /usr/ports/net-p2p/py-bittorrent-devel
make install clean
如果使用终端模式，编译安装请使用make WITHOUT_GUI=yes install clean，完成之后执行rehash，
下载使用bittorrent-curses *.torrent，也可以是种子文件url。
如何交由后台处理？
请安装/usr/ports/sysutils/screen/，完成之后执行rehash。
简单的用法： 
创建一个screen: 
$ screen 
创建一个后台运行的screen: 
$ screen -d -m -S one YOUR COMMAND 
查看你有几个screen 
$ screen -list 
恢复到一个screen中: 
$ screen -x (如果只有一个screen 的话） 
$ screen -r one(恢复一个session名为one的screen ) 
$ screen -r 2035(恢复一个pid为2035)

例：screen -d -m -S one bittorrent-curses new.torrent 

10、FreeBSD下远程桌面VNC
cd /usr/ports/net/vnc
make install clean

11、FreeBSD日志记录方式设置
ee /etc/newsyslog.conf

12、如何让FreeBSD像RedHat那样在ls时显示多种颜色的目录？
# ee /etc/csh.cshrc
setenv LSCOLORS ExGxFxdxCxegedabagExEx 
setenv CLICOLOR yes
set prompt = '[%B%n@%m%b] %B%~%b%# '
# sed -i.bak -E s/set\ prompt/#set\ prompt/g /root/.cshrc]]></description>
         <link>http://www.gccgle.com/2007/07/web.html</link>
         <guid>http://www.gccgle.com/2007/07/web.html</guid>
        
        
         <pubDate>Sat, 14 Jul 2007 16:48:16 +0800</pubDate>
      </item>
            <item>
         <title>Vi 指令使用简要说明备查</title>
         <description>进入vi的方法
vi filename: 打开或新建文件，并将光标置于第一行首 
vi +n filename: 打开文件，并将光标置于第n行首 
vi + filename: 打开文件，并将光标置于最后一行首 
vi +/pattern filename: 打开文件，并将光标置于第一个与pattern匹配的串处 
vi -r filename: 在上次正用vi编辑时发生系统崩溃，恢复filename 
vi filename....filename: 打开多个文件，依次进行编辑

移动光标类命令
h: 光标左移一个字符 
l: 光标右移一个字符 
space: 光标右移一个字符 
Backspace: 光标左移一个字符 
k或Ctrl+p: 光标上移一行 
j或Ctrl+n: 光标下移一行 
Enter: 光标下移一行 
w或W : 光标右移一个字至字首 
b或B : 光标左移一个字至字首 
e或E : 光标右移一个字至字尾 
): 光标移至句尾 
(: 光标移至句首 
}: 光标移至段落开头 
{: 光标移至段落结尾 
nG: 光标移至第n行首 
n+: 光标下移n行 
n-: 光标上移n行 
n$: 光标移至第n行尾 
H: 光标移至屏幕顶行 
M: 光标移至屏幕中间行 
L: 光标移至屏幕最后行 
0: 光标移至当前行首 
$: 光标移至当前行尾

屏幕翻滚类命令
Ctrl+u: 向文件首翻半屏 
Ctrl+d: 向文件尾翻半屏 
Ctrl+f: 向文件尾翻一屏 
Ctrl＋b: 向文件首翻一屏 
nz: 将第n行滚至屏幕顶部，不指定n时将当前行滚至屏幕顶部。

插入文本类命令
i: 在光标前 
I: 在当前行首 
a: 光标后 
A: 在当前行尾 
o: 在当前行之下新开一行 
O: 在当前行之上新开一行 
r: 替换当前字符 
R: 替换当前字符及其后的字符，直至按ESC键 
s: 从当前光标位置处开始，以输入的文本替代指定数目的字符 
S: 删除指定数目的行，并以所输入文本代替之 
ncw或nCW: 修改指定数目的字 
nCC: 修改指定数目的行

删除命令
ndw或ndW: 删除光标处开始及其后的n-1个字 
do: 删至行首 
d$: 删至行尾 
ndd: 删除当前行及其后n-1行 
x或X: 删除一个字符，x删除光标后的，而X删除光标前的 
Ctrl+u: 删除输入方式下所输入的文本

搜索及替换命令
/pattern: 从光标开始处向文件尾搜索pattern
?pattern: 从光标开始处向文件首搜索pattern
n: 在同一方向重复上一次搜索命令
N: 在反方向上重复上一次搜索命令
:s/p1/p2/g: 将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g: 将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g: 将文件中所有p1均用p2替换

选项设置
all: 列出所有选项设置情况 
term: 设置终端类型 
ignorance: 在搜索中忽略大小写 
list: 显示制表位(Ctrl+I)和行尾标志($) 
number: 显示行号 
report: 显示由面向行的命令修改过的数目 
terse: 显示简短的警告信息 
warn: 在转到别的文件时若没保存当前文件则显示NO write信息 
nomagic: 允许在搜索模式中，使用前面不带“\”的特殊字符 
nowrapscan: 禁止vi在搜索到达文件两端时，又从另一端开始 
mesg: 允许vi显示其他用户用write写到自己终端上的信息

最后行方式命令
:n1,n2 co n3: 将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d: 将 n1行到n2行之间的内容删除
:w: 保存当前文件
:e filename: 打开文件filename进行编辑
:x: 保存当前文件并退出
:q: 退出vi
:q!: 不保存文件并退出vi
:!command: 执行shell命令command
:n1,n2 w!command: 将文件中n1行至n2行的内容作为command的输入并执行之， 若不指定n1，n2，则表示将整个文件内容作为command的输入
:r!command: 将命令command的输出结果放到当前行

寄存器操作
&quot;?nyy: 将当前行及其下n行的内容保存到寄存器？中，其中?为一个字母，n为一个数字 
&quot;?nyw: 将当前行及其下n个字保存到寄存器？中，其中?为一个字母，n为一个数字 
&quot;?nyl: 将当前行及其下n个字符保存到寄存器？中，其中?为一个字母，n为一个数字 
&quot;?p: 取出寄存器？中的内容并将其放到光标位置处。这里？可以是一个字母，也可以是一个数字 
ndd: 将当前行及其下共n行文本删除，并将所删内容放到1号删除寄存器中 

此文本并非本站原创，为了表示对原作者的尊重，我们刊登来源地址，但并不认同此地址是原作者地址。原文来自http://kb.discuz.net/index.php?title=Vi%E6%8C%87%E4%BB%A4%E5%A4%A7%E5%85%A8 如原作者对本站摘录感到反感，请来信告知，我们会在第一时间删除您的作品。

</description>
         <link>http://www.gccgle.com/2007/07/vi.html</link>
         <guid>http://www.gccgle.com/2007/07/vi.html</guid>
        
        
         <pubDate>Sat, 14 Jul 2007 16:46:28 +0800</pubDate>
      </item>
            <item>
         <title>UNIX常用命令介绍</title>
         <description><![CDATA[下面主要讲解UNIX下基本命令的使用，由于时间和篇幅的原因，无法写出所有UNIX命令。你在使用这里没有列出的命令时，可以使用“--help”参数查询该命令所附的帮助．比如: ls -help将显示ls命令的详细信息． 同时，你也可以利用man来查询更详细的使用说明。直接敲入man将显示所有命令的信息．如果你只想看一个命令的信息就用如下格式 man <命令名> 
比如在UNIX系统中敲入man ls将显示ls的详细信息． 按q键退出man界面． 

如下命令介绍按字母顺序排列： 

命令：at 
介绍：at， batch， atq， atrm：安排，检查，删除队列中的工作。 

at [-V]