夕口技術錄

專業上的小常識,備而用之~

Monthly Archives: 一月 2009

[PHP][rewind] – 重置檔案指標

在使用 fopen + while 進行迴圈運算時,

如要再重覆進行while進行回圈運算,

則需要將第一次 while 所使用 fopen 取得的指標指回變數的開始處,

這時就要使用 rewind(ary) function 來達到。

例:

$handle = fopen($_FILES[“file"][“tmp_name"], “r");
$size = filesize($_FILES[“file"][“tmp_name"])+1;

//->SIKO : Check Format  <- 第一次使用於迴圈
while($csv = fgetcsv($handle,$size, “,")){
if(!isip($csv[2]) or !ismac($csv[3]) or count($csv) != “11″)
show_alert_err($msg[“filetype"]);
}
//此時 $handle 指標已停在最後

//->SIKO : DO IT  <- 第二次使用於迴圈
rewind($handle);
while ($csv = fgetcsv($handle,$size, “,")){
———————————————————-
語法 : int rewind (int fp)
說明 :
設定檔案指標fp到檔案的開始處
如果發生錯誤則傳回0。
檔案指標必須是有效的,而且是以fopen( )成功開啟時的指標。

[PHP][__FILE__] – 如何取得 現在檔案的目錄 與 上層目錄

PHP 要如何取得現在的檔案 路徑 + 檔名 或直接取得路徑呢?
搭配 __FILE__ 、 dirname()、basename() 就可以作到…

例    * /var/www/project/test.php

取的現在檔案、目錄、上層目錄
於 test.php 內, 要做取得路徑、目錄等, 可見下述:
取得 路徑 + 檔名 (要取得 /var/www/project/test.php)

echo __FILE__;

取得 檔名 (要取得 test.php)
echo basename(__FILE__);

取得 不含附檔名的檔名 (要取得 test)
echo basename(__FILE__, ‘.php’);

取得 到此目錄前的完整 PATH, 不含檔名 (要取得 /var/www/project)
echo dirname(__FILE__);

取得 到上層目錄前的完整 PATH (要取得 /var/www)
echo dirname(dirname(__FILE__));

而應用於網址上,
也可以做同樣的事,
就與 CakePHP 的網址來示範
http://www.example.com/myweb/cake/news/view/1

取得 http://www.example.com/myweb/cake
echo dirname(dirname(dirname(‘http://www.example.com/myweb/cake/news/view/1&#8217;)));

[MySQL][import] – ERROR 1062 (23000) at line 43238: Duplicate entry '?' for key 2

ERROR 1062 (23000) at line 43238: Duplicate entry ‘?’ for key 2

相信不少有使用 mysql -uroot -p  xxx_db_name < back_db_name.sql

指令的人,

都遇到過 Duplicate entry 的問題而無法繼續往下匯入,

這時不是把 back_db_name.sql 打開來先打問題行刪除,

就是先暫時調整 pk 的方式,

那如何我要使用強迫匯入不去管這個訊息呢?

mysql -u root xxx_db_name –force < back_db_name.sql

[JavaScript][reload] – 網頁定時自動重新整理


<script type="text/javascript">
    //每5分自動重新整理網頁
    setTimeout("location.reload();",50000);
</script>

[Linux][ps aux] – COMMAND 過長被截斷、掉問題

習慣使用 ps aux 指令的人們,

在 COMMAND 內容過長時,

就會出現字串內容被被截斷、掉的問題?

所以這時只要多加 ww 就可以顯示全部內容了

指令 ps auxww < — auxww 是連在一起的哦^^

[root@NetSecure bin]# ps aux
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root      2669  0.0  0.0  8712  808 ?        Ss   Jan15   0:00 xinetd -stayalive -pidfile /var/run/xinetd.pid
root      2698  0.0  0.1 53836 1324 ?        S    Jan15   0:00 /bin/sh /usr/bin/mysqld_safe –datadir=/var/lib/mysql –socket=/var/lib/mysql/mysql.sock –err    <– 被截斷、掉了

[root@NetSecure bin]# ps auxww
root      2698  0.0  0.1 53836 1324 ?        S    Jan15   0:00 /bin/sh /usr/bin/mysqld_safe –datadir=/var/lib/mysql –socket=/var/lib/mysql/mysql.sock –err-log=/var/log/mysqld.log –pid-file=/var/run/mysqld/mysqld.pid <– 正常字串長度

[root@NS64 bin]# ps –help
********* simple selection *********  ********* selection by list *********
-A all processes                      -C by command name
-N negate selection                   -G by real group ID (supports names)
-a all w/ tty except session leaders  -U by real user ID (supports names)
-d all except session leaders         -g by session OR by effective group name
-e all processes                      -p by process ID
T  all processes on this terminal     -s processes in the sessions given
a  all w/ tty, including other users  -t by tty
g  OBSOLETE — DO NOT USE             -u by effective user ID (supports names)
r  only running processes             U  processes for specified users
x  processes w/o controlling ttys     t  by tty
*********** output format **********  *********** long options ***********
-o,o user-defined  -f full            –Group –User –pid –cols –ppid
-j,j job control   s  signal          –group –user –sid –rows –info
-O,O preloaded -o  v  virtual memory  –cumulative –format –deselect
-l,l long          u  user-oriented   –sort –tty –forest –version
-F   extra full    X  registers       –heading –no-heading –context
********* misc options *********
-V,V  show version      L  list format codes  f  ASCII art forest
-m,m,-L,-T,H  threads   S  children in sum    -y change -l format
-M,Z  security data     c  true command name  -c scheduling class
-w,w  wide output n  numeric WCHAN,UID  -H process hierarchy

[Linux][DMA] – DMA 關掉(disabled)、irq timeout

機器:HP ProLiant DL580 G5
作業系統:CentOS 5.0
光碟機hda是8X的DVD

Message:
Oct 19 05:48:29 mpix-server kernel: ide-cd: cmd 0x3 timed out
Oct 19 05:48:29 mpix-server kernel: hda: irq timeout: status=0xd0 { Busy }
Oct 19 05:48:29 mpix-server kernel: ide: failed opcode was: unknown
Oct 19 05:48:29 mpix-server kernel: hda: ATAPI reset complete

推斷問題點在於 hda 的 DMA 無法 support ,

所以才會一直顯示這個訊息,

因此建議在 BIOS 及 Linux 上把相關設定關掉

Linux :

# hdparm -d0 /dev/hda

———————————– hdparm 指令說明參考

如果你的硬碟是 IDE 介面的,那麼這個指令可以幫助你設定一些進階參數!
如果你是使用 SATA 介面的, 那麼這個指令就沒有多大用途了!
另外,目前的 Linux 系統都已經稍微最佳化過,
所以這個指令最多是用來測試效能啦!
而且建議你不要隨便調整硬碟參數,檔案系統容易出問題喔!
除非你真的知道你調整的資料是啥!

[root@www ~]# hdparm [-icdmXTt] 裝置名稱
選項與參數:
-i  :將核心偵測到的硬碟參數顯示出來!
-c  :設定 32-bit (32位元)存取模式。這個 32 位元存取模式指的是在硬碟在與
      PCI 介面之間傳輸的模式,而硬碟本身是依舊以 16 位元模式在跑的!
      預設的情況下,這個設定值都會被打開,建議直接使用 c1 即可!
-d  :設定是否啟用 dma 模式, -d1 為啟動, -d0 為取消;
-m  :設定同步讀取多個 sector 的模式。一般來說,設定此模式,可降低系統因為
      讀取磁碟而損耗的效能~不過, WD 的硬碟則不怎麼建議設定此值~
      一般來說,設定為 16/32 是最佳化,不過,WD 硬碟建議值則是 4/8 。
      這個值的最大值,可以利用 hdparm -i /dev/hda 輸出的 MaxMultSect
      來設定喔!一般如果不曉得,設定 16 是合理的!
-X  :設定 UtraDMA 的模式,一般來說, UDMA 的模式值加 64 即為設定值。
      並且,硬碟與主機板晶片必須要同步,所以,取最小的那個。一般來說:
      33 MHz DMA mode 0~2 (X64~X66)
      66 MHz DMA mode 3~4 (X67~X68)
      100MHz DMA mode 5   (X69)
      如果您的硬碟上面顯示的是 UATA 100 以上的,那麼設定 X69 也不錯!
-T  :測試暫存區 cache 的存取效能
-t  :測試硬碟的實際存取效能 (較正確!)

範例一:取得我硬碟的最大同步存取 sector 值與目前的 UDMA 模式
[root@www ~]# hdparm -i /dev/hdc
 Model=IC35L040AVER07-0, FwRev=ER4OA41A, SerialNo=SX0SXL98406 <==硬碟的廠牌型號
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=40
 BuffType=DualPortCache, BuffSize=1916kB, MaxMultSect=16, MultSect=16
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=80418240
 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4
 DMA modes:  mdma0 mdma1 mdma2
 UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5 <==有 * 為目前的值
 AdvancedPM=yes: disabled (255) WriteCache=enabled
 Drive conforms to: ATA/ATAPI-5 T13 1321D revision 1:
    ATA/ATAPI-2 ATA/ATAPI-3 ATA/ATAPI-4 ATA/ATAPI-5
# 這顆硬碟緩衝記憶體只有 2MB(BuffSize),但使用的是 udma5 !還可以。

範例二:由上個範例知道最大 16 位元/UDMA 為 mode 5,所以可以設定為:
[root@www ~]# hdparm -d1 -c1 -X69 /dev/hdc

範例三:測試這顆硬碟的讀取效能
[root@www ~]# hdparm -Tt /dev/hdc
/dev/hdc:
 Timing cached reads:   428 MB in  2.00 seconds = 213.50 MB/sec
 Timing buffered disk reads:  114 MB in  3.00 seconds =  38.00 MB/sec
# 這部測試機沒有很好啦~這樣的速度.....差強人意~

如果你是使用 SATA 硬碟的話,這個指令唯一可以做的,就是最後面那個測試的功能而已囉! 雖然這樣的測試不是很準確,至少是一個可以比較的基準。在我的 cluster 機器上面測試的 SATA (/dev/sda) 與 RAID (/dev/sdb) 結果如下,可以提供給你參考看看。

[root@www ~]# hdparm -Tt /dev/sda /dev/sdb
/dev/sda:
 Timing cached reads:   4152 MB in  2.00 seconds = 2075.28 MB/sec
 Timing buffered disk reads:  304 MB in  3.01 seconds = 100.91 MB/sec

/dev/sdb:
 Timing cached reads:   4072 MB in  2.00 seconds = 2036.31 MB/sec
 Timing buffered disk reads:  278 MB in  3.00 seconds =  92.59 MB/sec

[checkbox] – Array 型態 進行全選、全不選

大部份的人在進行 checkbox 全選、全不選的方式,

checkbox name 命令的方式都是用 name+i(流水號),

再用 for 迴圈達到效果,

但如 checkbox name 是使用 Array 又要如何達到同樣的效果呢 ?

<form>

<input type="checkbox" name="check[]" value="1″>

<input type="checkbox" name="check[]" value="2″>

<input type="checkbox" name="check[]" value="3″>

<input type="button" value="全選" onclick="javascript :var e=this.form.elements;for(var i=0;i<e.length;i++)if(e[i].name==’check[]’)e[i].checked=true;“>

<input type="button" value="全不選" onclick="javascript :var e=this.form.elements;for(var i=0;i<e.length;i++)if(e[i].name==’check[]’)e[i].checked=false;“>

<input type="submit" value="提交">

</form>

[php5] – php4 vs php5 diff in object

以下是同事TB所發現 PHP5 在 object 引用上是有差異的…

PHP 5 handles object differently from PHP4

In PHP4
$new_object = $object;
will copy $object to $new_object

In PHP5
The $new_object will point to $ojbect, kind of like Java.

The correct syntax in PHP5 should be:
$new_object = clone($object);

[Synergy] – 一組鍵盤滑鼠,同時控制多台電腦

如何用一組鍵盤滑鼠,
就同時控制多台電腦呢?

推薦 Synergy官方網站 這個好用的小工具