夕口技術錄
專業上的小常識,備而用之~
Monthly Archives: 一月 2009
[PHP][rewind] – 重置檔案指標
2009/01/22
Posted by 於 在使用 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__] – 如何取得 現在檔案的目錄 與 上層目錄
2009/01/21
Posted by 於 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’)));
[MySQL][import] – ERROR 1062 (23000) at line 43238: Duplicate entry '?' for key 2
2009/01/21
Posted by 於 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] – 網頁定時自動重新整理
2009/01/21
Posted by 於 <script type="text/javascript"> //每5分自動重新整理網頁 setTimeout("location.reload();",50000); </script>
[Linux][ps aux] – COMMAND 過長被截斷、掉問題
2009/01/19
Posted by 於 習慣使用 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
2009/01/14
Posted by 於 機器: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 型態 進行全選、全不選
2009/01/07
Posted by 於 大部份的人在進行 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
2009/01/07
Posted by 於 以下是同事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);
近期迴響