FreeBSD 安裝Gitlab 4.1


logoGitLab 是一套webbase的管理系統,與有名的github 非常類似.
特性 快速, 安全與穩定的方案使用 Rails & Gitolite開發,並且使用MIT License授權.
如果這樣還沒有概念那就看看官網的 screenshots.
FreeBSD官網不支援,觀玩建議安裝使用Debian/Ubuntu 其他如RedHat linux bases都有人安裝成功過.

Read More


說明現在公司因為支前專案採用PHP4 APACHE1.3  要轉換到PHP5 APACHE22 其中又不使服務中斷 只好再一台系統上同時安裝兩種

以下只說明 另外安裝的PHP5 APACHE22

cd /usr/ports/www/apache22
make config PREFIX=/usr/local/apache22 install clean
cd /usr/ports/lang/php5
make config PREFIX=/usr/local/php5 APXS=/usr/local/apache22/sbin/apxs APACHE_VERSION=22 install clean
安裝 PHP5-extions 模組
cd /usr/ports/lang/php5-extensions/
make config PREFIX=/usr/local/php5 LOCALBASE=/usr/local/php5 install

安裝中間如有模組卡住  須先到其模組安裝的PORT  重新安裝

並使用 make PREFIX=/usr/local/php5 LOCALBASE=/usr/local/php5 install FORCE_PKG_REGISTER="yes"

強制安裝  有點暴力@@

Freebsd 安裝 iftop



cd /usr/ports/net-mgmt/iftop

make install clean

# iftop -i eth0

-i: 監控網路卡介面
-B: 以bytes為單位
-n: 以IP顯示不用DNS反解
-N: 只顯示port不顯示服務名稱
-F: 堅看某一網段的網路狀態



Host display:

n – 切換解析來源DNS
s – 切換顯示目的ip
d – 切換顯示來源ip
t – 切換進出顯示模式
Port display: N – 切換解析主機port
S – 切換顯示主機port
D – 切換顯示來源port
p – 切換顯示port
Sorting: 1/2/3 – 排列 1/2/3 欄位
< – 排列流量由大至小
> – 排列流量由小至大
o – 凍結目前排列
General: P – 暫停/開始
h – 切換顯示help
b – 切換顯示流量條
B – 切換流量條2/10/40秒的平均數
T – 切換顯示總流量欄位
j/k – j:往下查看 k:往上查看
f – 編輯filter碼
l – set screen filter
L – lin/log scales
! – 執行shell命令
q – 離開



Date: Wed, 27 Feb 2008 17:19:52 -0500
From: Ken Smith <>
Subject: [FreeBSD-Announce] FreeBSD 7.0-RELEASE Available

The FreeBSD Release Engineering Team is pleased to announce the availability of FreeBSD 7.0-RELEASE. This is the first release from the 7-STABLE branch which introduces many new features along with many improvements to functionality present in the earlier branches. Some of the highlights:

  • Dramatic improvements in performance and SMP scalability shown by various database and other benchmarks, in some cases showing peak performance improvements as high as 350% over FreeBSD 6.X under normal loads and 1500% at high loads. When compared with the best performing Linux kernel (2.6.22 or 2.6.24) performance is 15% better. Results are from benchmarks used to analyze and improve system performance, results with your specific work load may vary. Some of the changes that contribute to this improvement are:
    • The 1:1 libthr threading model is now the default.
    • Finer-grained IPC, networking, and scheduler locking.
    • A major focus on optimizing the SMP architecture that was put in place during the 5.x and 6.x branches.

    Some benchmarks show linear scaling up to 8 CPUs. Many workloads see a significant performance improvement with multicore systems.

  • The ULE scheduler is vastly improved, providing improved performance and interactive response (the 4BSD scheduler is still the default for 7.0 but ULE may become the default for 7.1).
  • Experimental support for Sun’s ZFS filesystem.
  • gjournal can be used to set up journaled filesystems, gvirstor can be used as a virtualized storage provider.
  • Read-only support for the XFS filesystem.
  • The unionfs filesystem has been fixed.
  • iSCSI initiator.
  • TSO and LRO support for some network drivers.
  • Experimental SCTP (Stream Control Transmission Protocol) support (FreeBSD’s being the reference implementation).
  • Much improved wireless (802.11) support.
  • Network link aggregation/trunking (lagg(4)) imported from OpenBSD.
  • JIT compilation to turn BPF into native code, improving packet capture performance.
  • Much improved support for embedded system development for boards based on the ARM architecture.
  • jemalloc, a new and highly scalable user-level memory allocator.
  • freebsd-update(8) provides officially supported binary upgrades to new releases in addition to security fixes and errata patches.
  • X.Org 7.3, KDE 3.5.8, GNOME 2.20.2.
  • GNU C compiler 4.2.1.
  • BIND 9.4.2.

For a complete list of new features and known problems, please see the online release notes and errata list, available at:

For more information about FreeBSD release engineering activities, please see:


FreeBSD 7.0-RELEASE is now available for the amd64, i386, ia64, pc98, and powerpc architectures. The version for the sparc64 architecture will become available in a few days. Some of the package builds are still in progress.

FreeBSD 7.0 can be installed from bootable ISO images or over the network; the required files can be downloaded via FTP or BitTorrent as described in the sections below. While some of the smaller FTP mirrors may not carry all architectures, they will all generally contain the more common ones, such as i386 and amd64.

MD5 and SHA256 hashes for the release ISO images are included at the bottom of this message.

The contents of the ISO images provided as part of the release has changed for most of the architectures. Using the i386 architecture as an example, there are ISO images named “bootonly", “disc1″, “disc2″, “disc3″, “livefs", and “docs". The “bootonly" image is suitable for booting a machine to do a network based installation using FTP or NFS. The “disc1″, “disc2″, and “disc3″ images are used to do a full installation that includes a basic set of packages and does not require network access to an FTP or NFS server during the installation. To boot into a “live CD-based filesystem" and system rescue mode “disc1″ and “livefs" are needed. The “docs" image has all of the documentation for all supported languages. Most people will find that “disc1″, “disc2″ and “disc3″ are all that are needed if you want to install some packages during the initial install, and just “disc1″ if you prefer to install packages after the initial install is completed.

FreeBSD 7.0-RELEASE can also be purchased on CD-ROM from several vendors. One of the vendors that will be offering FreeBSD 7.0-based products is:


7.0-RELEASE ISOs are available via BitTorrent. A collection of torrent files to download the images is available at:


The primary mirror site is:

However, before trying the central FTP site, please check your regional mirror(s) first by going to:


Any additional mirror sites will be labeled ftp2, ftp3 and so on.

More information about FreeBSD mirror sites can be found at:

For instructions on installing FreeBSD, please see Chapter 2 of The FreeBSD Handbook. It provides a complete installation walk-through for users new to FreeBSD, and can be found online at:

Updating Existing Systems

An upgrade of any existing system to FreeBSD 7.0-RELEASE constitutes a major version upgrade, so no matter which method you use to update an older system you should reinstall any ports you have installed on the machine. This will avoid binaries becoming linked to inconsistent sets of libraries when future port upgrades rebuild one port but not others that link to it. This can be done with:

# portupgrade -faP

after updating your system. Note some of the tools to help with this or the instructions below for FreeBSD Update are not installed by default (e.g. portupgrade, gpg, or similar tools like portmaster).

Updates from Source

The procedure for doing a source code based update is described in the FreeBSD Handbook:

The branch tag to use for updating the source is RELENG_7_0.

FreeBSD Update

Starting with FreeBSD 6.3, the freebsd-update(8) utility supports binary upgrades of i386 and amd64 systems systems running earlier FreeBSD releases, release candidates, and betas. Users upgrading to FreeBSD 7.0 from older releases (in particular, older than 7.0-RC1) will need to download an updated version of freebsd-update(8) that supports upgrading to a new release.

# fetch

Downloading and verifying the digital signature for the tarball (signed by the FreeBSD Security Officer’s PGP key) is highly recommended.# fetch

# gpg --verify freebsd-update-upgrade.tgz.asc freebsd-update-upgrade.tgz

The new freebsd-update(8) can then be extracted and run as follows:# tar -xf freebsd-update-upgrade.tgz

# sh -f freebsd-update.conf -r 7.0-RELEASE upgrade

# sh -f freebsd-update.conf install

The system must be rebooted with the newly installed kernel before continuing.# shutdown -r now

Next, needs to be run again to install the new userland components, after which all ports should be recompiled to link to new libraries:

# sh -f freebsd-update.conf install

# portupgrade -faP

Finally, needs to be run one last time to remove old system libraries, after which the system should be rebooted in order that the updated userland and ports will be running:

# sh -f freebsd-update.conf install

# shutdown -r now

For more information, see:


The FreeBSD Security Team currently plans to support FreeBSD 7.0 until February 28th, 2009. For more information on the Security Team and their support of the various FreeBSD branches see:


Many companies donated equipment, network access, or man-hours to support the release engineering activities for FreeBSD 7.0 including The FreeBSD Foundation, FreeBSD Systems, Hewlett-Packard, Yahoo!, Network Appliances, and Sentex Communications.

The release engineering team for 7.0-RELEASE includes:

Ken Smith <> Release Engineering, amd64, i386 sparc64 Release Building, Mirror Site Coordination
Robert Watson <> Release Engineering, Security
Maxime Henrion <> Release Engineering
Bruce A. Mah <> Release Engineering, Documentation
George Neville-Neil <> Release Engineering
Hiroki Sato <> Release Engineering, Documentation
Murray Stokely <> Release Engineering
Marcel Moolenaar <> ia64, powerpc Release Building
Takahashi Yoshihiro <> PC98 Release Building
Kris Kennaway <> Package Building
Joe Marcus Clarke <> Package Building
Erwin Lansing <> Package Building
Mark Linimon <> Package Building
Pav Lucistnik <> Package Building
Colin Percival <> Security Officer
Simon Nielsen <> Deputy Security Officer
Peter Wemm <> Bittorrent Coordination


FreeBSD is a registered trademark of The FreeBSD Foundation.

ISO Image Checksums

MD5 (7.0-RELEASE-amd64-bootonly.iso) = 60ff91f3a0851077a2c335f830e1e028
MD5 (7.0-RELEASE-amd64-disc1.iso) = 0232f1b6ffde0e3e76034c9f10791acd
MD5 (7.0-RELEASE-amd64-disc2.iso) = 17be33da3bdddfce3b32e697724e021e
MD5 (7.0-RELEASE-amd64-disc3.iso) = 3d001985149acc50a5857626f20ddb93
MD5 (7.0-RELEASE-amd64-docs.iso) = b0877e52f08aecd2e70ce86bd1ceb554
MD5 (7.0-RELEASE-amd64-livefs.iso) = 6fea83a3679e8ac785c685f0e446788b

MD5 (7.0-RELEASE-i386-bootonly.iso) = cb4f8d05d07aa74f2038050e53673455
MD5 (7.0-RELEASE-i386-disc1.iso) = 5f185a688ef2e0db59105e8f439c8620
MD5 (7.0-RELEASE-i386-disc2.iso) = bb59156b4fc1f9c148095b8c239c827a
MD5 (7.0-RELEASE-i386-disc3.iso) = 44de27d5f6bcdbf14e3db38c84f12348
MD5 (7.0-RELEASE-i386-docs.iso) = bcf16778ecc73975024a8e6450ee4ba4
MD5 (7.0-RELEASE-i386-livefs.iso) = abe6773601feda1dc56dade0022fca59

MD5 (7.0-RELEASE-ia64-bootonly.iso) = 0acd75c4c191609bd5d39428c556f59c
MD5 (7.0-RELEASE-ia64-disc1.iso) = f79c20fcf15d084d1b1bc47023678ecf
MD5 (7.0-RELEASE-ia64-disc2.iso) = 517ae3572002f7deba02f5f35799bcee
MD5 (7.0-RELEASE-ia64-disc3.iso) = 2d6c64c4f3e166e8e329977c94c6ea72
MD5 (7.0-RELEASE-ia64-docs.iso) = 262a7dda8a7e0747807f1c32c293eb4b
MD5 (7.0-RELEASE-ia64-livefs.iso) = 1b4daa26d5a89130f7e45e85fd1501a7

MD5 (7.0-RELEASE-pc98-bootonly.iso) = 0359f519b7185b1747524d3a3a433f52
MD5 (7.0-RELEASE-pc98-disc1.iso) = 90889420c8afc72d8a3dbce45c21c716
MD5 (7.0-RELEASE-pc98-livefs.iso) = 583e4d51629a0c644495e56eb899b917

MD5 (7.0-RELEASE-powerpc-bootonly.iso) = ba968855e8ccfcdfce0657cf591307fa
MD5 (7.0-RELEASE-powerpc-disc1.iso) = b553330bd7ccc1683559a6507ab0e304
MD5 (7.0-RELEASE-powerpc-disc2.iso) = bb58530a5b623fad5f55d17cc382cc2d
MD5 (7.0-RELEASE-powerpc-disc3.iso) = d1dd0645b24f16aa01e2e3f6c88f189a
MD5 (7.0-RELEASE-powerpc-docs.iso) = 84a164f4795894b9bb247ea16c97c645

SHA256 (7.0-RELEASE-amd64-bootonly.iso) = 596bc89d0926fd15ae16d8f3c4c5735289c7553bdac8062284940830c26d2555
SHA256 (7.0-RELEASE-amd64-disc1.iso) = d3b206eb74df7559041dd9054de7352b9a67d4f350e75f433c7fb001bf4b5c6f
SHA256 (7.0-RELEASE-amd64-disc2.iso) = 296e02387794b06992c294450b4c6c07cc6a5530f415901492dcd721809d96b5
SHA256 (7.0-RELEASE-amd64-disc3.iso) = 683545d8768a3f7fa1ae5a2c0f2586e88a09b43b9b1f57da384c30339fd889e5
SHA256 (7.0-RELEASE-amd64-docs.iso) = 6d69c5c27a4e5891fed9a88e5825af803558c14281257bc3b325b00a2a62a966
SHA256 (7.0-RELEASE-amd64-livefs.iso) = 596b5f69d7f2c4e17f66e0fd1306a192cc03a700b0dce3532e95abffd5e5344a

SHA256 (7.0-RELEASE-i386-bootonly.iso) = 3184674f1833c7abdc687672188e1189f61d5f7239ba48df584787b8e1d0273b
SHA256 (7.0-RELEASE-i386-disc1.iso) = 7480c74dda9a78805ab0d647b23eb71cac43f4afce83ff65ad9f2019423583af
SHA256 (7.0-RELEASE-i386-disc2.iso) = 55c12b9c7239ee22e84594e07736c4b73e5788a6330cd76a199c1b99bd4bea51
SHA256 (7.0-RELEASE-i386-disc3.iso) = 2812afd48559c5b38338eee0697c33b25d9127f60b03eb04c77799ac6523dde0
SHA256 (7.0-RELEASE-i386-docs.iso) = 428fc1d0fc820326be04c673bd8c228fbccd0761d59e50b11dfd8e508820a661
SHA256 (7.0-RELEASE-i386-livefs.iso) = 6ca035fa860f6942b983de628fc1df829c22e7c55a7ab4d0bb342a5c53792f94

SHA256 (7.0-RELEASE-ia64-bootonly.iso) = a133c1acf597dc7a36ec0239cb4aa93ca08e85a95f47f3bad8e9eed4f494928e
SHA256 (7.0-RELEASE-ia64-disc1.iso) = 1d2c1de094705f095adf5ffc76e34da3ed8a881409766e5450b22a33a3c8626e
SHA256 (7.0-RELEASE-ia64-disc2.iso) = c628e4abfac5f87ea6a0ba899db023b21115ce817620d2a48a261e2af6daae56
SHA256 (7.0-RELEASE-ia64-disc3.iso) = 22b7192b52f7765a5f42fff284fe58eaaad068f2021ddcecbf11b9bd02a3db49
SHA256 (7.0-RELEASE-ia64-docs.iso) = a103f78ab620120c0fc945ad7b07b85c4a182f8e045b17dcfc8ba5faf9d21a88
SHA256 (7.0-RELEASE-ia64-livefs.iso) = 3adcd9e3afd3b52f75b1f4b0c0a02dbb6af4bcbc016b3837bd527a01702af847

SHA256 (7.0-RELEASE-pc98-bootonly.iso) = 8e6ee4327af57ed6ddb3c890c5cc8e8b051bbc51cfa7a1c7cd53bd4685dbc01d
SHA256 (7.0-RELEASE-pc98-disc1.iso) = c4ec9b975f68ea7f278462fff0db8f6138d57effa462e3b20035994155e93c4b
SHA256 (7.0-RELEASE-pc98-livefs.iso) = 20f6cc867590798c79716e771abf4c6880452defd5dcd0aed21161d54ab3d40e

SHA256 (7.0-RELEASE-powerpc-bootonly.iso) = 86a6398f34e9f933adfd717024dd3eefd4e209f940cc3487c047cb979ec8dbfa
SHA256 (7.0-RELEASE-powerpc-disc1.iso) = b75e61be2f3daac9898e61c7e00086fcc039bf894211800bd40335424e5afc7d
SHA256 (7.0-RELEASE-powerpc-disc2.iso) = 69ffdea7850aa2ebd609851ca22dfe2c92d1d7606ac621e99de3b6e2998be553
SHA256 (7.0-RELEASE-powerpc-disc3.iso) = 1f1cacb35e647e3480c120ba19e8b3b55b8d02f98b7672784a5e729ced840a48
SHA256 (7.0-RELEASE-powerpc-docs.iso) = e6c2965dbced365738c7816dfaf47ab2eec450aff2dd8d9ae4ee10d015458785



2007 年 6 月 08 日

PHP V5.2 為開發人員添加了 hook 以利用實時跟蹤文件上傳進度的功能。本文是  系列文章(共五部分)的第 5 部分,將向您展示如何監視文件上傳並相應地編寫代碼,以及如何創建 PHP 進度條。

Web 2.0 是 Internet 上最炙手可熱的時髦字眼,投資者紛紛把資金投入到涉及這項技術的投資項目中。數以百萬計的 Web 站點和應用程序覆蓋的描述性術語有很多。使用 Web 2.0,我們將描述一類 Web 站點,這些站點都提供了瞭解 Internet 上數以百萬計用戶心聲的途徑。與眾不同之處在於它們全都為用戶提供了交流和分享與共同利益相關的觀點和數據的場所,這些站點可以快速生成大量內容。

每個用戶都將提供某種內容 —— 評論咖啡店、上班路線等。YouTube 在這點上是一個優秀示例,為人們提供一個空間可以上傳視頻並使其他用戶可以觀看這些視頻並提供反饋。YouTube 是 Web 2.0 奉行者的新寵,值得關注的是到目前為止 YouTube 的流行度上升得比 Internet 中的任何一個站點都要快。這種流行度可以歸因於大量各式各樣的內容,以及能夠讓用戶以留言的形式發表自己對內容的看法。並且不僅可以留言,用戶甚至還可以 上傳與視頻相對應的視頻留言。


許多接收文件的 Web 站點都會在文本框旁邊安置令人厭惡的 Browse 按鈕,強制要求用戶一次上傳一個文件。這可能要花費很長時間,尤其是在以小型文件組的形式提供視頻、甚至照片或其他項目的情況下。由於每個文件都必須單獨 上傳,因此可能會十分繁瑣。假定上傳超大型文件所花的時間會使耐心不足的用戶感到難以容忍,那麼給這些用戶提供積極反饋避免他們放棄並走開將十分重要。

幸運的是,PHP V5.2 引入到文件上傳過程中的新 hook 使我們可以向用戶實時顯示上傳的進展情況。在本文中,將使用 PHP V5.2 為用戶創建一個進度條。


如果安裝並配置了正確的庫,則 PHP V5.2 中的新 「hook」 實際上是在文件傳輸過程中可獲得的數據點。這些新 hook 將使用一種稱為 Alternative PHP Cache 的功能。當 PHP 腳本收到一個上傳文件時,解釋程序將自動檢查 $_POST array 以查找名為 APC_UPLOAD_PROGRESS 的隱藏字段,它將成為緩存變量,存儲關於上傳的信息以便腳本可以訪問上傳文件。當此信息已被緩存並且隨時可以訪問後,可以給用戶提供可視化反饋,從而提高用戶體驗。

我們將介紹 HTML 表單中的 APC 代碼的實現,以及如何在 PHP 中識別該實現及如何訪問緩存的信息。表示此數據有很多方法:從 Ajax 到 FLEX,但是我們要關注的是準備這些前端技術所需的訪問數據的方法。


默 認情況下,PHP V5.2 中的 APC 不啟用。由於新 hook 是 APC 的一部分,因此需要確保安裝擴展並使其可用於 PHP 解釋程序。這將通過下載 php_apc 擴展文件來完成。在我們的例子中,將使用 WAMP 安裝,這是包括 Apache 和 MySQL 的免費獲得打包的 PHP for Windows®。它提供了友好的用戶界面並且由於擁有支持配置選項的菜單而十分易於管理。

要在 WAMP 上設置 APC,請執行以下步驟:

  1. 要下載庫和 WAMP,請參閱。
  2. 安裝 WAMP。
  3. 把 php_apc.dll 文件放到 PHP 的擴展文件夾中。默認情況下,此文件夾為 <wamproot>/php/ext。
  4. 使用系統盤 WAMP 菜單來選擇 PHP settings>PHP Extensions>Add Extension
  5. 在彈出的命令行界面中,鍵入 php_apc.dll 並按 Enter
  6. 使用文本編輯器,打開 <wamproot>/php/php.ini 並添加代碼行 apc.rfc1867 = on(添加到任何位置都可以)。如果要嘗試在本地進行測試並計劃上傳大型文件以便可以實際看到進度,則還需要添加以下指令:apc.max_file_size = 200Mupload_max_filesize = 200Mpost_max_size = 200M。請不要在活動的生成服務器上執行此操作,不過,不這樣做很可能用盡帶寬和磁盤空間配額,更不必說會降低其他人的訪問速度。
  7. 重新啟動 PHP。

APC 現在應當已設置並被初始化。APC 的 RFC1867 特性 —— 使您可以跟蹤文件上傳的特性 —— 現在應當已被啟用為選項,並且應當準備好探究文件上傳以啟用實時狀態。


要接收文件,必須先設置接收文件的表單。很方便的是,HTML 附帶了文件的標準字段類型。同所有 HTML 表單字段一樣,它在邏輯上被命名為類型 file。默認情況下,附帶了顯示在塊右側的便捷 Browse 按鈕。
清單 1. upload.php 的 HTML 表單

   $id = $_GET['id'];

<form enctype="multipart/form-data" id="upload_form"
      action="target.php" method="POST">

<input type="hidden" name="APC_UPLOAD_PROGRESS"
       id="progress_key"  value="<?php echo $id?>"/>

<input type="file" id="test_file" name="test_file"/><br/>

<input onclick="window.parent.startProgress(); return true;"
 type="submit" value="Upload!"/>


需要為此表單創建一個 PHP 頁面,因為需要使用惟一密鑰來跟蹤上傳。最後,它將是用於調用此頁面作為 GET 值的 URL 的一部分。此數字將是稍後將檢索的 APC 緩存條目密鑰的值。要傳遞該值,表單字段需要有一個擁有特殊名稱的隱藏字段,使 APC 知道它需要保存文件上傳狀態。此字段被稱為 APC_UPLOAD_PROGRESS。這是前述的啟動緩存過程的 hook。為確保 PHP 可以訪問緩存中的正確條目,我們使用檢索到的惟一 ID 作為隱藏字段的值,從而創建該值的密鑰。用戶提交表單後 —— 我們將簡短地處理提交按鈕 —— 瀏覽器將把文件和密鑰作為發送給服務器的 POST 數據的一部分進行發送。

裝入到瀏覽器中後,此頁面應當提供一個非常簡單的表單,如圖 1 所示:
圖 1. 上傳表單

要在不重新裝入整個頁面的情況下使用戶可以提交文件,需要把此表單嵌入到另一個文件的 iframe 中。如果嘗試僅使用表單操作頁面 (target.php) 來檢索數據,則無法看到任何緩存信息,因為在上傳完成之前頁面不會返回任何信息。鑑於這個原因,使用此新 hook 的最常見示例都是用 Ajax 編寫的。通過該方法,您可以提交表單並且還可以在同一個窗口中繼續檢查上傳的狀態而無需刷新。

要使腳本運行,需要繼續轉到一個包含頁面,該頁面將設置 iframe 並接收已上傳文件的信息。還需要使用一組 JavaScript 函數來為進度指示器獲得數據以及顯示進度指示器。

提交表單中包括文件時,該文件將發送到服務器的臨時位置中,直至它被保存到永久位置。當它在臨時存儲設備中時,可以通過 $_FILES 關聯數組獲得它。使用 PHP 附帶的標準版本文件上傳函數,可以選擇路徑並將這些函數保存到服務器上,或者按自己的需要處理這些函數。
清單 2. target.php 文件


  "c:\\sw\\wamp\\www\\" . $_FILES["test_file"]["name"]);
  echo "<p>File uploaded.  Thank you!</p>";


首先,查看來自表單的 POST 變量是否已被設定並表示我們已經收到了表單數據。如果收到表單數據,並且但願包括文件,則還應當有一個全局數組 $_FILES。把已上傳的文件移到安全位置,這取決於需要對其採取的操作。在本例中,只需把文件移到 \sw\wamp\www(當然,這是完全任意的位置。請隨意選擇一個所需位置)。完成該操作後,我們將感謝用戶。


還將需要一個返回實際上傳進度的腳本。清單 3 顯示了一個非常簡單的版本。
清單 3. getprogress.php 文件

if(isset($_GET['progress_key'])) {

  $status = apc_fetch('upload_'.$_GET['progress_key']);
  echo $status['current']/$status['total']*100;


此腳本首先將查找 progress_key,它是先前討論的 $id 值(不必擔心,您馬上就將看到它的來源)。這將導致調用從 APC 緩存返回數據的 apc_fetch()。我們需要正確的文件信息,因此需要惟一 ID,在本文中表示為 $_GET['progress_key']。調用帶有 upload_xxxxxx 參數的 apc_fetch(),其中 xxxxxx 是惟一 ID;PHP 將自動預先追加 upload_ part。

獲得數據後,可以使用 JSON 擴展給信息設定一種更便於在 JavaScript 中使用的格式並返回整個對象(如果需要)。$status 對象是擁有以下字段的數組:

PHP 保存文件的臨時副本的位置
上傳是已取消 (1),還是未取消 (0)
上傳是已完成 (1),還是尚未完成 (0)

顯示進度條的 JavaScript

現在已經準備好開始構建實際的進度條。為了簡單起見,腳本將使用 CSS 創建一個用於模擬進度條並可以使用 JavaScript 進行控制的 div,如清單 4 所示:
清單 4. 主文件 progress.php

<head><title>Upload Example</title></head>

<script type="text/javascript">

var counter = 0;

function startProgress(){

function fire(){
   if (counter < 101){
     document.getElementById("progressinner").style.width =


<div id="progressouter" style=
    "width: 500px; height: 20px; border: 6px solid red; display:none;">
   <div id="progressinner" style=
       "position: relative; height: 20px; background-color: purple; width: 0%; ">

<span onclick="startProgress()">Start me up!</span>


此頁面包含了兩個嵌套的 div 元素,外面的那個用作邊框。腳本將調整內部 div 相對於邊框的大小以顯示進度。當用戶單擊 Start me up! 文本時,startProgress() 腳本將調用 fire() 函數。該函數將檢查計數器的值,並且如果該值尚未超過 100,就把內部 div 設為外部 div 寬度的該百分比值。然後它將增加計數器的值並告訴瀏覽器每十分之一秒就執行一次全部上述過程。

結果將與圖 2 非常相似:
圖 2. 進度條腳本




現在剩下的只是要把所有內容 hook 到一起。您可以通過 progress.php 頁面來完成此操作。
清單 5. 最終的 progress.php 頁面

   $id = uniqid("");
<head><title>Upload Example</title></head>

<script src="<yourkeyhere>"

<script type="text/javascript">

function getProgress(){
  GDownloadUrl("getprogress.php?progress_key=<?php echo($id)?>",
               function(percent, responseCode) {
                   document.getElementById("progressinner").style.width = percent+"%";
                   if (percent < 100){
                        setTimeout("getProgress()", 100);


function startProgress(){
    setTimeout("getProgress()", 1000);


<iframe id="theframe" name="theframe"
        src="upload.php?id=<?php echo($id) ?>"
        style="border: none; height: 100px; width: 400px;" >

<div id="progressouter" style=
   "width: 500px; height: 20px; border: 6px solid red; display:none;">
   <div id="progressinner" style=
       "position: relative; height: 20px; background-color: purple; width: 0%; ">


從底層開始向上層工作,我們已經添加了嵌入清單 1 中的 upload.php 腳本的 iframe,給它提供了在頁面頂部生成的惟一 ID。

現在,是否還記得該表單中的 Submit 按鈕?

<input onclick="window.parent.startProgress(); return true;"
 type="submit" value="Upload!"/>

該按鈕將完成兩項工作。提交表單,像普通的 Submit 按鈕一樣;但在執行該操作之前,它將在主窗口中調用 startProgress() 腳本。startProgress() 腳本將告訴進度條顯示自身 —— 開始時無顯示屬性,然後告訴瀏覽器等待一秒,然後再執行 getProgress() 腳本。

現在,getProgress() 腳本將使事情變得有趣。記不記得在前面我說過將需要使用 Ajax 或某種類似的方法來檢查文件的進度?對,在本例中,表單將採用捷徑,調用來自 Google Maps API 庫的 GdownloadUrl() 函數(注意,表單將導入位於頁面頂部的庫。您將需要獲得自己的訪問此庫的密鑰,但是它是從 Google 免費獲取的)。

此 函數將下載 URL 的內容 —— 本例中為 getprogress.php 腳本 —— 並執行在其中定義的匿名函數。函數所接受的第一個參數是從 URL 返回的數據,本例中為百分比,以便使用它更新進度條。最後,如果文件尚未完成下載,則告訴瀏覽器每十分之一秒重試一次(在實際情況中,可能無法那麼快地執 行這些調用,但是瀏覽器將盡其所能進行操作)。

圖 3. Progress.php 的輸出
Progress.php 的输出



在 Web 2.0 的世界裡,我們鼓勵用戶在 Web 站點中彼此提供信息和內容。作為開發人員,我們為人與人之間的這種開放、自由的數據交換創建了一個框架。雖然能實現這種功能的工具很早以前就有了,但是用 戶體驗還沒有達到所能具有的最佳程度。在本文中,您已經看到了向用戶提供實時反饋(尤其是為用戶上傳到站點的信息提供進度條)來提高用戶體驗和應用程序質 量的一些方法。

 關於APC 套件安裝說明

cd /usr/ports/www/pecl-APC
make install clean


You may edit /usr/local/etc/php.ini to change this variables:

^^^ -> Default value

^^^^ -> Default value

* More information on /usr/local/share/doc/APC/INSTALL

Then restart your web server and consult the output of phpinfo().
If there is an informational section for APC, the installation was
遵照說明 編輯PHP.INI

rsync + SSH 遠端備份排程

RSYNC是Linux,UNIX系統下的數據鏡像及備份工具,具有可使本地和遠程兩台主機的文件,目錄之間,快速同步鏡 像,遠程數據備份等功能.在同步 過程中,可根據遠程服務器上的數據變動,相應的刪除或者更新本地機的數據,同步數據不用全部傳送,大大提高同步及備份文件的速度.同時在網絡安全方面,也 可以設置為SSH傳輸模式. 遠程主機(Rsync Server)可為RSYNC daemon模式,開啟之後將開放tcp4 873 port,等待本地主機(Rsync client)的連接,連接時遠程主機會進行認證,確認合法用戶進入,便開始進行資料傳輸,在第一次傳輸時會把整個資料都備份同步到本地主機上,在下一次 傳輸時,添加相應參數則可根據遠程主機的數據變動來相應調整同步操作. 本文只是 RSYNC 軟件的一個簡單應用操作文檔,主要是給初學者一個初步介紹。
以RSYNC 使用SSH 通訊協定 進行遠端異地備援.
將遠端 目錄做備援
Server:FREEBSD 6.2
Client:FREEBSD 6.2

Step1.Trusted SSH Authorized

 # ssh-keygen -d
 Generating public/private dsa key pair.
 Enter file in which to save the key (/home/weithenn/.ssh/id_dsa):預設產生key的路徑
 Enter passphrase (empty for no passphrase):保護key的密碼
 Enter same passphrase again:保護key的密碼
 Your identification has been saved in /home/weithenn/.ssh/id_dsa.
 Your public key has been saved in /home/weithenn/.ssh/
 The key fingerprint is:

保護KEY 密碼 不使用  按ENTER 跳過
這時會在系統下看到兩個檔案…id_dsa與 現在要把id_dsa.pub丟到SERVER端 並且更名為 authorized_keys
#scp server_ip:/root/.ssh/authorized_keys
ssh 設定如有變更
#/etc/rc.d/sshd forcerestart

Step2. 安裝RSYNC
Server Client 皆需安裝
make install clean

cd /usr/local/etc/
ee rsyncd.conf


pid file = /var/run/

# Edit this file before running rsync daemon!!

uid = root
gid = wheel
#use chroot = no
#max connections = 4
#syslog facility = local5
secrets file = /usr/local/etc/rsyncd.secrets
path = /var/www/backup
comment = server backup
auth users = backup
#secrets file = /usr/local/etc/rsyncd.secrets //密碼檔存放路徑
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz    //不要對列出附檔名之檔案做壓縮
read only = no
ee rsyncd.secrets
chmod 600 rsyncd.secrets

編輯 預設執行命令
#ee /usr/local/etc/rc.d/
command_args="–daemon"             //預設值(run IPv6)
command_args="-4 –daemon"          //run IPv4

ee /etc/rc.conf
加入 之後開機將會自動啟動
/usr/local/etc/rc.d/rsyncd start
chmod 600 /usr/local/etc/rsyncd.secrets
/usr/local/bin/rsync -avlr -e “ssh -l root -p 特殊PORT" –password-file=
/usr/local/etc/rsyncd.secrets backup@server.ip::backup /bt/backup

Freebsd 6.2 stable 之路

安裝好 FreeBSD 6.2-RELEASE
確認CVSUP 安裝好如沒有到/usr/ports/net/cvsup-without-gui
去 make install clean
cd /usr/share/examples/cvsup/

2個檔案 cp 到 /usr


 # make -j4 buildworld
 # make installworld
 # make -j4 buildkernel
 # make installkernel
 # reboot

webalizer 分析多網站記錄 note

There are many ways to process multiple virtual hosts on the same machine. The easiest way I have found, provided that each host generates it’s own log file, is as follows:

  1. Create a central directory for your configuration files. (I use /etc/webalizer)
  2. Make a configuration file for each virtual host and place them in the central directory. Each configuration file should have at least the HostName (domain), OutputDir and LogFile configuration settings specified. You probably will want to specify other settings specific to the domain, such as HideReferrer, HideSite and maybe some others as well. Name the file the same as the domain name, and end it with a .conf extension, so you can easily tell what vhost the configuration is for.
  3. To process all your virtual sites with a single command, a simple shell command can now be used:
    for i in /etc/webalizer/*.conf; do webalizer -c $i; done

After you have it set up, to add a new host, all you need to do is create a new configuration file and put it in the directory. It will be automatically picked up the next time you run the command.

Link Aggregation on FreeBSD多網卡合併 頻寬


在研究所的時候就玩過在 FreeBSD 底下用多張網路卡跟 Switch 做 Link Aggregation,最近又有機會碰到,趁這個機會在這邊寫個 Note,順便把測試結果貼上來。

FreeBSD 可以用兩種不同的 Kernel Module 設定 Link Aggregation:ng_one2many 及 ng_fec。其中 ng_fec 在 FreeBSD 5 才有,如果你是使用 FreeBSD 4 的話,只能使用 ng_one2many。

這兩者最大的 不同就是,ng_one2many 不需要 Switch 支援 Link Aggregation,但是 ng_fec 則一定要和 Switch 一起搭配設定。在 FreeBSD 的 man page 中也有提到,建議是使用 Cisco 的 Switch,這應該也是 ng_fec 的名稱來源吧(Fast EtherChannel)!不過其實這邊也說了,這是「Fast」EtherChannel,一般都是用在 bundle 多張 10/100 Mb 的網路卡,但是現在 Gigabit 網路卡已經是普遍到氾濫,所以就拿 Gigabit 網路卡試試看是不是可以提高效能囉!


  • Switch:Cisco 3750G-24TS
  • Server:HP DL380G4 * 4 (t1, t2, t3, t4)
    • CPU:Xeon 3.2DP * 2
    • RAM:4G PC3200 DDR2
    • NIC 1:BCM 5704C Dual Port (on board) (bge driver)
    • NIC 2:Intel PRO / 1000 MT Dual Port (133 MHz PCI-X) (em driver)
  • Media:UTP,1000BaseTX Full-Duplex,Cat-6
  • OS:FreeBSD 5.4-RELEASE-p2
  • 測試軟體:iperf(其實還有很多測試軟體,像 netperf 也很好用,不過這只是大略的測試,不是要求很高啦,所以只用 iperf 測試)。

Config 內容:貼在這篇文章的最後面



bge * 1

em * 1

em * 2 (ng_one2many)

em * 2 (ng_fec)


  1. 關於 iperf 的執行參數都是用預設的,沒有額外指定:
    1. Server:iperf -s
    2. Client:iperf -t 120 -c {IP ADDRESS}
  2. 感覺 Intel 1000MT 的卡確實比 BCM 5704C 的卡效能來的優。
  3. 不過不知道是不是 Intel 卡上的 Chip 也是只有一顆,所以速度卡在 1Gb/s?
  4. 有沒有做 Link Aggregation 感覺差異不大,不知道是我設定有問題?還是這個測試方向根本就是錯的,或是沒意義的?  >_<
  5. 覺 得,除非 Chip 或是電腦處理網路的速度可以更快,不然用 Gigabit 網路卡做 Link Aggregation 除了可以增加 Availability 外,好像沒有多大的好處。看來在 Gigabit 的環境下,用好一點的 Server Adapter 真的比較重要。
  6. 在測試傳輸速度的時候,電腦的 Loading 或是 CPU idle 在相對應的測試下其實是差不多的(相差都在正負 3% 的範圍內),主要還是差在傳輸的效能,不過從我這邊記錄 loading 的資料看起來,bge 也比較吃系統資源(CPU idle 較少)。
  7. 也有測試過用 em0 + bge0 來做成一個 fec0 跑看看,結果測試出來的速度慘不忍睹阿,比單跑一張 bge0 還要來的慘。
  8. 至於為什麼不測試兩張 bge 做成 fec 呢?因為實在是懶得再測試了,覺得很浪費時間,所以就想說,單張卡 bge 比 em 差,兩張卡一起跑應該也是比較差吧?!  >_<

Cisco 3750 的設定檔:

Switch#conf t
Switch(config)#int range gi 1/0/1 – 2  (選要設定的 port)
Switch(config-if-range)#switchport mode access
Switch(config-if-range)#switchport nonegotiate
Switch(config-if-range)#channel-group 1 mode on (設為第1個 channel-group)

ng_one2many 的設定檔:

/usr/sbin/ngctl mkpeer em0: one2many upper one
/usr/sbin/ngctl connect em0: em0:upper lower many0
/usr/sbin/ngctl connect em1: em0:upper lower many1

/usr/sbin/ngctl msg em1: setpromisc 1
/usr/sbin/ngctl msg em1: setautosrc 0

/usr/sbin/ngctl msg em0:upper setconfig
“{ xmitAlg=1 failAlg=1 enabledLinks=[ 1 1 1 1 ] }"

/sbin/ifconfig em0 {IP ADDRESS} netmask 0xffffff00 up
/sbin/route add default {DEFAULT GATEWAY}

ng_fec 的設定檔:


/usr/sbin/ngctl mkpeer fec dummy fec
/usr/sbin/ngctl msg fec0: add_iface ‘"em0″‘
/usr/sbin/ngctl msg fec0: add_iface ‘"em1″‘
/usr/sbin/ngctl msg fec0: set_mode_inet

/sbin/ifconfig em0 promisc
/sbin/ifconfig em1 promisc
/sbin/ifconfig fec0 promisc

/sbin/ifconfig fec0 inet {IP ADDRESS} netmask 0xffffff00 up
/sbin/route add default {DEFAULT GATEWAY}

Portsnap 方式 更新porttree

Portsnap 方式

portsnap(8) 也是更新 Ports Collection 的方式之一。 FreeBSD 6.0 起開始內建 Portsnap 機制,而較舊的系統,則可透過 sysutils/portsnap port 來安裝:

 # pkg_add -r portsnap

Portsnap 細節功能,請參閱 Portsnap 使用篇

  1. /usr/ports 目錄不存在的話,就建立一下吧:
     # mkdir /usr/ports
  2. 接下來,下載壓縮的 Ports Collection 定期更新檔到 /var/db/portsnap 目錄。 完成下載後,要斷線與否都可以。
     # portsnap fetch
  3. 若是第一次跑 Portsnap 的話,則需要先解壓到 /usr/ports
     # portsnap extract

    若已有 /usr/ports 而且只是想更新而已,那麼就照下面作:

     # portsnap update