Twitter Delicious Facebook Digg Stumbleupon Favorites More

Chủ Nhật

Memory-RAM - Một số thuật ngữ và kỹ thuật!

System memory: khi ta nói đến "memory" thì có lẽ hơi mơ hồ và khó hiểu cho rất nhiều bạn, nhất là những bạn chưa có quen biết vi cấu trúc máy tính nhiều. Thực ra từ memory trong quá khứ được diễn tả như đại diện cho tất cả "vùng nhớ" trong computer ngoại trừ CPU. Ðó là trong quá khứ khi mà vi tính chưa phát triễn mạnh mẽ, chứ nếu dùng từ memory mà đề cập trong những thế hệ máy tính hiện nay thì danh từ nầy hoàn toàn mù mờ và không chích xác diễn tả các bộ phận trong máy vi tính nửa. Chúng ta có RAM, ROM, DRAM, SRRAM, DDR SDRAM... Ðể tránh sự lẫn lộn, tôi xin phép diễn tả ngắn gọn về memory và các thuật ngữ liên quan để bạn hiểu rõ.

Memory: Memory đơn giản là một thiết bị nhớ nó có thể ghi và chứa thông tin. ROM, RAM, Cache, Hard disk, Floppy disk, CD.... đều có thể gọi là memory cả (vì nó vẫn lưu thông tin). Dù là loại memory nào bạn cũng nên để ý đến các tính chất sau đây:

Sức chứa: thiết bị có thể chứa được bao nhiêu? Ví dụ: CD chứa được 650MB-700MB, Floppy disk chứa được 1.4MB, Cache chứa được 256KB...
tốc độ truy nhập: bạn nên lưu ý đến tốc độ vận truyền thông tin của thiết bị. Bạn có memory loại "chạy lẹ" khi mà thời gian truy cập thông tin ngắn hơn. Đây là phần quan trọng quyết định tốc độ truy cập của thiết bị. Ví dụ đơn giản là nếu bạn có con CPU chạy tốc độ 1.5Ghz trong khi đó hard disk của bạn thuộc loại "rùa bò" thì dù CPU có lẹ đến đâu nó cũng đàng phải....chờ thôi!
Tính về tốc độ thì CPU bao giờ cũng lẹ nhất, sau đó là Cache, sau nữa là các loại RAM.
Interface: bạn nên xem cấu trúc bên ngoài của memory nó có phù hợp với (ăn khớp) các thiết bị khác của bạn không. Ví dụ, nhiều loại RAM tren thị trường có số chân cắm và đặc tính khác nhau. Để phù hợp cho motherboard của bạn, bạn nên xem xét motherboard trước khi mua memory.
Các loại memory

ROM (Read Only Memory)
Ðây là loại memory dùng trong các hãng sãn xuất là chủ yếu. Nó có đặc tính là thông tin lưu trữ trong ROM không thể xoá được và không sửa được, thông tin sẽ được lưu trữ mãi mãi. Nhưng ngược lại ROM có bất lợi là một khi đã cài đặt thông tin vào rồi thì ROM sẽ không còn tính đa dụng (xem như bị gắn "chết" vào một nơi nào đó). Ví dụ điển hình là các con "chip" trên motherboard hay là BIOS ROM để vận hành khi máy vi tính vừa khởi động.

PROM (Programmable ROM)
Mặc dù ROM nguyên thủy là không xoá/ghi được, nhưng do sự tiến bộ trong khoa học, các thế hệ sau của ROM đã đa dụng hơn như PROM. Các hãng sản xuất có thể cài đặt lại ROM bằng cách dùng các loại dụng cụ đặc biệt và đắt tiền (khả năng người dùng bình thường không thể với tới được). Thông tin có thể được "cài" vào chip và nó sẽ lưu lại mãi trong chip. Một đặc điểm lớn nhất của loại PROM là thông tin chỉ cài đặt một lần mà thôi. CD có thể được gọi là PROM vì chúng ta có thể copy thông tin vào nó (một lần duy nhất) và không thể nào xoá được.

EPROM (Erasable Programmable ROM)
Một dạng cao hơn PROM là EPROM, tức là ROM nhưng chúng ta có thể xoá và viết lại được. Dạng "CD-Erasable" là một điển hình. EPROM khác PROM ở chổ là thông tin có thể được viết và xoá nhiều lần theo ý người xử dụng, và phương pháp xoá là hardware (dùng tia hồng ngoại xoá) cho nên khá là tốn kém và không phải ai cũng trang bị được.

EEPROM (Electronic Erasable Programmable ROM)
Ðây là một dạng cao hơn EPROM, đặt điểm khác biệt duy nhất so với EPROM là có thể ghi và xoá thông tin lại nhiều lần bằng software thay vì hardware. Ví dụ điển hình cho loại EPROM nầy là "CD-Rewritable" nếu bạn ra cửa hàng mua một cái CD-WR thì có thể thu và xoá thông tin mình thích một cách tùy ý. Ứng dụng của EEPROM cụ thể nhất là "flash BIOS". BIOS vốn là ROM và flash BIOS tức là tái cài đặt thông tin (upgrade) cho BIOS. Cái tiện nhất ở phương pháp nầy là bạn không cần mở thùng máy ra mà chỉ dùng software điều khiển gián tiếp.

RAM (Random Access Memory)
Rất nhiều người nghĩ là RAM khác với ROM trên nhiều khía cạnh nhưng thực tế RAM chẳng qua là thế hệ sau của ROM mà thôi. Cả RAM và ROM đều là "random access memory" cả, tức là thông tin có thể được truy cập không cần theo thứ tự. Tuy nhiên ROM chạy chậm hơn RAM rất nhiều. Thông thường ROM cần trên 50ns để vận hành thông tin trong khi đó RAM cần dưới 10ns (do cách chế tạo). Tôi sẽ trở lại với phần "shadow BIOS ROM" sau nầy.

SRAM (Static RAM) và DRAM (Dynamic RAM)
SRAM là loại RAM lưu giữ data mà không cần cập nhật thường xuyên (static) trong khi DRAM là loại RAM cần cập nhật data thường xuyên (high refresh rate). Thông thường data trong DRAM sẽ được refresh (làm tươi) nhiều lần trong một second để lưu giử lại những thông tin đang lưu trữ, nếu không refresh lại DRAM thì dù nguồn điện không ngắt, thông tin trong DRAM cũng sẽ bị mất.
SRAM chạy lẹ hơn DRAM. Nhiều người có thể lầm lẫn là DRAM là "dynamic" cho nên ưu việt hơn. Điều đó không đúng. Trên thực tế, chế tạo SRAM tốn kém hơn hơn DRAM và SRAM thường có kích cỡ lớn hơn DRAM, nhưng tốc độ nhanh hơn DRAM vì không phải tốn thời gian refresh nhiều lần. Sự ra đời của DRAM chỉ là một lối đi vòng để hạ giá sản xuất của SRAM (tôi sẽ nói rõ hơn về bên trong CPU, DRAM, và SRAM).

FPM-DRAM (Fast Page Mode DRAM)
Ðây là một dạng cải tiến của DRAM, về nguyên lý thì FPM DRAM sẽ chạy lẹ hơn DRAM một tí do cải tiến cách dò địa chỉ trước khi truy cập thông tin. Những loại RAM như FPM hầu như không còn sản xuất trên thị trường hiện nay nữa.

EDO-DRAM (Extended Data Out DRAM)
Là một dạng cải tiến của FPM DRAM, nó chạy lẹ hơn FPM DRAM một nhờ vào một số cải tiến cách dò địa chỉ trước khi truy cập data. Một đặc điểm nữa của EDO DRAM là nó cần support của system chipset. Loại memory nầy chạy với máy 486 trở lên (tốc độ dưới 75MHz). EDO DRAM cũng đã quá cũ so với kỹ thuật hiện nay. EDO-DRAM chạy lẹ hơn FPM-DRAM từ 10 - 15%.

BDEO-DRAM (Burst Extended Data Out DRAM)
Là thế hệ sau của EDO DRAM, dùng kỹ thuật "pineline technology" để rút ngắn thời gian dò địa chỉ của data. Nếu các bạn để ý những mẫu RAM tôi giới thiệu trên theo trình tự kỹ thuật thì thấy là hầu hết các nhà chế tạo tìm cách nâng cao tốc độ truy cập thông tin của RAM bằng cách cải tiến cách dò địa chỉ hoặt cách chế tạo hardware. Vì việc giải thích về hardware rất khó khăn và cần nhiều kiến thức điện tử cho nên tôi chỉ lướt qua hoặc trình bày đại ý. Nhiều mẩu RAM tôi trình bày có thể không còn trên thị trường nữa, tôi chỉ trình bày để bạn có một kiến thức chung mà thôi.

SDRAM (Synchronous DRAM)
Ðây là một loại RAM có nguyên lý chế tạo khác hẳn với các loại RAM trước. Như tên gọi của nó là "synchronous" DRAM, synchronous có nghĩa là đồng bộ, nếu bạn học về điện tử số thì sẽ rõ hơn ý nghĩ của tính đồng bộ.
Synchronous là một khái niệm rất quan trọng trong lĩnh vực digital, trong giới hạn về chuyên môn tôi cũng rất lấy làm khó giải thích. Bạn chỉ cần biết là RAM hoạt động được là do một memory controller (hay clock controller), thông tin sẽ được truy cập hay cập nhật mổi khi clock (dòng điện) chuyển từ 0 sang 1, "synchronous" có nghĩa là ngay lúc clock nhảy từ 0 sang 1 chứ không hẳn là clock qua 1 hoàn toàn (khi clock chuyển từ 0 sang 1 hay ngược lại, nó cần 1 khoảng thời gian interval, tuy vô cùng ngắn nhưng cũng mất 1 khoảng thời gian, SDRAM không cần chờ khoảng interval này kết thúc hoàn toàn rồi mới cập nhật thông tin, mà thông tin sẽ được bắt đầu cập nhật ngay trong khoảng interval). Do kỹ thuật chế tạo mang tính bước ngoặc nầy, SDRAM và các thế hệ sau có tốc độ cao hơn hẳn các loại DRAM trước.
Đây là loại RAM thông dụng nhất trên thị trường hiện nay, tốc độ 66-100-133Mhz.

DDR SDRAM (Double Data Rate SDRAM)
Ðây là loại memory cải tiến từ SDRAM. Nó nhân đôi tốc độ truy cập của SDRAM bằng cách dùng cả hai quá trình đồng bộ khi clock chuyển từ 0 sang 1 và từ 1 sang 0. Ngay khi clock của memory chuyển từ 0 sang 1 hoặc từ 1 sang 0 thì thông tin trong memory được truy cập.
Loại RAM này được CPU Intel và AMD hỗ trợ, tốc độ hiện tại vào khoảng 266Mhz. (DDR-SDRAM đã ra đời trong năm 2000)

DRDRAM (Direct Rambus DRAM)
Ðây lại là một bước ngoặc mới trong lĩnh vực chế tạo memory, hệ thống Rambus (cũng là tên của một hãng chế tạo nó) có nguyên lý và cấu trúc chế tạo hoàn toàn khác loại SDRAM truyền thống. Memory sẽ được vận hành bởi một hệ thống phụ gọi là Direct Rambus Channel có độ rộng 16 bit và một clock 400MHz điều khiển. (có thể lên 800MHz)
Theo lý thuyết thì cấu trúc mới nầy sẽ có thể trao đổi thông tin với tốc độ 800MHz x 16bit = 800MHz x 2 bytes = 1.6GB/giây. Hệ thống Rambus DRAM như thế nầy cần một serial presence detect (SPD) chip để trao đổi với motherboard. Ta thấy kỹ thuật mới nầy dùng 16bits interface, trông trái hẳn với cách chế tạo truyền thống là dùng 64bit cho memory, bởi thế kỹ thuật Rambus (sở hữu chủ của Rambus và Intel) sẽ cho ra đời loại chân Rambus Inline Memory Module (RIMM) tương đối khác so với memory truyền thống.
Loại RAM này hiện nay chỉ được hỗ trợ bởi CPU Intel Pentum IV, khá đắt, tốc độ vào khoảng 400-800Mhz

SLDRAM (Synchronous-Link DRAM)
Là thế sau của DRDRAM, thay vì dùng Direct Rambus Channel với chiều rộng 16bit và tốc độ 400MHz, SLDRAM dùng bus 64bit chạy với tốc độ 200MHz. Theo lý thuyết thì hệ thống mới có thể đạt được tốc độ 400Mhz x 64 bits = 400Mhz x 8 bytes = 3.2Gb/giây, tức là gấp đôi DRDRAM. Ðiều thuận tiện là là SLDRAM được phát triển bởi một nhóm 20 công ty hàng đầu về vi tính cho nên nó rất da dụng và phù hợp nhiều hệ thống khác nhau.

VRAM (Video RAM)
Khác với memory trong hệ thống và do nhu cầu về đồ hoạ ngày càng cao, các hãng chế tạo graphic card đã chế tạo VRAM riêng cho video card của họ mà không cần dùng memory của hệ thống chính. VRAM chạy lẹ hơn vì ừng dụng Dual Port technology nhưng đồng thời cũng đắt hơn rất nhiều.

SGRAM (Synchronous Graphic RAM)
Là sản phẩm cải tiến của VRAM mà ra, đơn giản nó sẽ đọc và viết từng block thay vì từng mảng nhỏ.

Flash Memory
Là sản phẩm kết hợp giửa RAM và hard disk. Có nghĩa là Flash memory có thể chạy lẹ như SDRAM mà và vẫn lưu trữ được data khi power off.

PC66, PC100, PC133, PC1600, PC2100, PC2400....
Chắc khi mua sắm RAM bạn sẽ thấy họ đề cập đến những từ như trên. PC66, 100, 133MHz thì bạn có thể hiểu đó là tốc độ của hệ thống chipset của motherboard. Nhưng PC1600, PC2100, PC2400 thì có vẻ hơi...cao và quái lạ! Thực ra những từ nầy ra đời khi kỹ thuật Rambus phát triển. Ðặt điểm của loại motherboard nầy là dùng loại DDR SDRAM (Double Data Rate Synchronous Dynamic RAM). Như đã đề cập ở phần trên, DDR SDRAM sẽ chạy gấp đôi (trên lý thuyết) loại RAM bình thường vì nó dùng cả rising and falling edge của system clock. Cho nên PC100 bình thường sẽ thành PC200 và nhân lên 8 bytes chiều rộng của DDR SDRAM: PC200 * 8 = PC1600. Tương tự PC133 sẽ là PC133 * 2 * 8bytes = PC2100 và PC150 sẽ là PC150 * 2 * 8 = PC2400.

BUS: gồm nhiều dây dẫn điện nhỏ gộp lại, là hệ thống hành lang để dẫn data từ các bộ phận trong computer (CPU, memory, IO devices). BUS có chứa năng như hệ thống ống dẫn nước, nơi nào ống to thì nước sẽ chạy qua nhiều hơn, còn sức nước mạnh hay yếu là do các bộ phận khác tạo ra.
FSB (Front Side Bus) hành lang chạy từ CPU tới main memory
BSB (Back Side Bus) hành lang chạy từ memory controller tới L2 (Cache level 2)

Cache memory
Là loại memory có dung lượng rất nhỏ (thường nhỏ hơn 1MB) và chạy rất lẹ (gần như tốc độ của CPU). Thông thường thì Cache memory nằm gần CPU và có nhiệm vụ cung cấp những data thường (đang) dùng cho CPU. Sự hình thành của Cache là một cách nâng cao hiệu quả truy cập thông tin của máy tính mà thôi. Những thông tin bạn thường dùng (hoặc đang dùng) thường được chứa trong Cache, mổi khi xử lý hay thay đổi thông tin, CPU sẽ dò trong Cache memory trước xem có tồn tại hay không, nếu có nó sẽ lấy ra dùng lại còn không thì sẽ tìm tiếp vào RAM hoặc các bộ phận khác. Lấy một ví dụ đơn giản là nếu bạn mở Microsoft Word lên lần đầu tiên sẽ thấy hơi lâu nhưng mở lên lần thứ nhì thì lẹ hơn rất nhiều vì trong lần mở thứ nhất các lệnh (instructions) để mở Microsoft Word đã được lưu giữ trong Cache, CPU chỉ việc tìm nó và xài lại thôi.
Lý do Cache memory nhỏ là vì nó rất đắt tiền và chế tạo rất khó khăn bởi nó gần như là CPU (về cấu thành và tốc độ). Thông thường Cache memory nằm gần CPU, trong nhiều trường hợp Cache memory nằm trong con CPU luôn. Người ta gọi Cache Level 1 (L1), Cache level 2 (L2)...là do vị trí của nó gần hay xa CPU. Cache L1 gần CPU nhất, sau đó là Cache L2...

Interleave
Là một kỹ thuật làm tăng tốc độ truy cập thông tin bằng giảm bớt thời gian nhàn rổi của CPU. Ví dụ, CPU cần đọc thông tin thông từ hai nơi A và B khác nhau, vì CPU chạy quá lẹ cho nên A chưa kịp lấy đồ ra CPU phải chờ rồi! A thấy CPU chờ thì phiền quá mới bảo CPU sang B đòi luôn sau đó trỡ lại A lấy cũng chưa muộn! Bởi thế CPU có thể rút bớt thời gian mà lấy được đồ ở cả A và B. Toàn bộ nghĩa interleave là vậy.

Bursting
Cũng là một kỹ thuật khác để giảm thời gian truyền tải thông tin trong máy tính. Thay vì CPU lấy thông tin từng byte một, bursting sẽ giúp CPU lấy thông tin mỗi lần là một block. 

ECC (Error Correction Code)
Khi mua RAM bạn có thể thấy cụm từ nầy mô tả phụ thêm vào loại RAM. Ðây là một kỹ thuật để kiểm tra và sửa lổi trong trường hợp 1 bit nào đó của memory bị sai giá trị trong khi lưu chuyển data. Những loại RAM có ECC thường dùng cho các loại computer quan trọng như server. Tuy nhiên không có ECC cũng không phải là mối lo lớn vì theo thống kê 1 bit trong memory có thể bị sai giá trị khi chạy trong gần 750 giờ, người tiêu dùng bình thường như chúng ta đâu có ai mở máy liên tục tới...1 tháng đâu chớ!

Register và Buffer (cùng như nhau)
Ðôi khi mua memory bạn có thể thấy người bán đề cập đến tính chất của memory là có buffer, register...Buffer và Register chủ yếu dùng để quản lý các modules trên RAM. Trông hình vẽ dưới chắc bạn cũng sẽ nhận ra được loại RAM có buffer. Loại RAM có buffer hay register thì sẽ chạy chậm hơn loại RAM không có buffer hay register một ít.

CAS (Column Address Strobe) latency
Latency nghĩa là khoảng thời gian chờ đợi để làm cái gì đó, CAS latency là thuật ngữ diễn tả sự delay trong việc truy cập thông tin của memory và được tính bằng clock cycle. Ví dụ, CAS3 là delay 3 "clock cycle". Trong quá khứ các nhà sản xuất cố gắng hạ thấp chỉ số delay xuống nhưng nó sẽ tỷ lệ nghịch với giá thành sản phẩm.

Cách tính dung lượng của memory (RAM)
Thông thường RAM có hai chỉ số, ví dụ, 32Mx4. Thông số đầu biểu thị số hàng (chiều sâu) của RAM trong đơn vị Mega Bit, thông số thứ nhì biểu thị số cột (chiều ngang) của RAM. 32x4 = 32MegaBit x 4 cột = 128 Mega Bit = 128/8 Mega Bytes = 16MB. Có nhiều bạn có thể lầm tưởng thông số đầu là Mega Bytes nhưng kỳ thực các hãng sãn xuất mặc định nó là Mega Bit, bạn nên lưu nhớ cho điều nầy khi mua RAM. Ví dụ, 32Mx64 RAM tức là một miếng RAM 256MB.

Số Pin của RAM

Khi chọn RAM, ngoài việc chú ý tốc độ, sức chứa, ta phải coi số Pin của nó. Thông thường sốPin của RAM là (tuỳ vào loại RAM): 30, 72, 144, 160, 168, 184 pins.

SIMM (Single In-Line Memory Module)
Ðây là loại ra đời sớm và có hai loại hoặc là 30 pins hoặc là 72 pins. Người ta hay gọi rõ là 30-pin SIMM hoặc 72-pin SIMM. Loại RAM (có cấu hình SIMM) nầy thường tải thông tin mỗi lần 8bits, sau đó phát triễn lên 32bits. Bạn cũng không cần quan tâm lắm đến cách vận hành của nó, nếu ra ngoài thị trường bạn chỉ cần nhận dạng SIMM khi nó có 30 hoặc 72 pins. Loại 72-pin SIMM có chiều rộng 41/2" trong khi loại 30-pin SIMM có chiều rộng 31/2" 

DIMM (Dual In-line Memory Modules)
Cũng gần giống như loại SIMM mà thôi nhưng có số pins là 72 hoặc 168. Một đặc điểm khác để phân biệt DIMM với SIMM là cái chân (pins) của SIMM dính lại với nhau tạo thành một mảng để tiếp xúc với memory slot trong khi DIMM có các chân hoàn toàn cách rời độc lập với nhau. Một đặc điểm phụ nửa là DIMM được cài đặt thẳng đứng (ấn miếng RAM thẳng đứng vào memory slot) trong khi SIMM thì ấn vào nghiêng khoảng 45 độ. Thông thường loại 30 pins tải data 16bits, loại 72 pins tải data 32bits, loại 144 (cho notebook) hay 168 pins tải data 64bits. 

SO DIMM (Small Outline DIMM)
Ðây là loại memory dùng cho notebook, có hai loại pin là 72 hoặc 144. Nếu bạn để ý một tý thì thấy chúng có khổ hình nhỏ phù hợp cho notebook. Loại 72pins vận hành với 32bits, loại 144pins vận hành với 64bits.

RIMM (Rambus In-line Memory Modules) và SO RIMM (RIMM dùng cho notebook)
Là technology của hãng Rambus, có 184 pins (RIMM) và 160 pins (SO RIMM) và truyền data mỗi lần 16bit (thế hệ củ chỉ có 8bits mà thôi) cho nên chạy nhanh hơn các loại củ. Tuy nhiên do chạy với tốc độ cao, RIMM memory tụ nhiệt rất cao thành ra lối chế tạo nó cũng phải khác so với các loại RAM truyền thống. Như hình vẽ bên dưới bạn sẽ thấy miến RAM có hai thanh giải nhiệt kẹp hai bên gọi là heat speader. Nếu bạn dùng Pentium 4 sẽ gặp loại RAM nầy.
ST

Các kênh truyền dữ liệu trong máy tính

ISA - Industrial Standard Architecture:
Là một loại kênh truyền của khe gắn card mở rộng trên Mainboard. Các card mở rộng chuẩn ISA có thể là Card âm thanh, card màn hình và các thiết bị ngoại vi khác. Nhiều mainboard trước đây hỗ trợ ISA nhưng ngày nay ISA hầu như rất ít khi được sử dụng và rất ít Mainboard đời mới hỗ trợ chuẩn ISA. Trước đây, ISA là chuẩn kênh truyền mở rộng chính trên máy tính IBM AT nên thường được gọi là "kênh AT". Băng thông của ISA là 8-16 bits, tần số 8-10Mhz.
Micro Channel - viết tắt là MCA (Micro Channel Architecture):Là một loại kênh truyền 32-bit được thiết kế bởi công ty IBM cho các dòng máy PS/2, RS/6000 và một số đời của ES/9370. Nó hỗ trợ 15 mức Bus Mastering cho phép truyền dữ liệu từ tốc độ 20Mbytes/s đến 80 Mbytes/s. Vào cuối năm 1996, IBM ngưng hỗ trợ công nghệ MCA và chuyển qua sử dụng PCI.
EISA Extended ISA:
Kênh truyền trong máy tính là phiên bản mở rộng của kênh truyền ISA (Kênh truyền AT - AT bus) 16-bit thành kênh truyền 32-bit. Chuẩn EISA được công bố năm 1988 như là một sự lựa chọn 32-bit thay thế cho Kênh truyền Micro Channel. Các loại card mở rộng loại ISA có thể gắn vào khe gắn EISA dễ dàng do cả hai cùng sử dụng tốc độ 8-10Mhz. Chuẩn EISA sau này được thay thế bởi chuẩn PCI.
VL-Bus - Vesa Local Bus:
Là một chuẩn kênh truyền ngoại vi được phát triển bởi VESA và được sử dụng phổ biến ở các đời máy 486. VL-Bus là loại kênh truyền 32-bit, hỗ trợ bus mastering và họat động ở tốc độ 40Mhz.
PCI Peripheral Component Interconnect:
Là một loại kênh ngoại vi trên Mainboard được thiết kế bởi Intel vào năm 1993. Nó được dùng để gắn các card mở rộng cung cấp các đường truyền tốc độ cao giữa CPU và các thiết bị ngoại vi (màn hình, mạng, đĩa cứng ngoài...). Công nghệ PCI cung cấp khả năng "cắm và chạy" (plug and play) là khả năng tự nhận dạng và cài đặt các card PCI rất tốt. PCI cho phép chia sẻ "tài nguyên" IRQ (Interrupt Request-Ngắt hệ thống) giữa các card PCI với nhau. Đây là một đặc điểm rất quan trọng trong tình hình các card ngoại vi phục vụ nhiều thiết bị ngoại vi và ứng dụng ngày càng nhiều trong khi số lượng các IRQ được hỗ trợ thì lại giới hạn. Thiết bị PCI hoạt động ở tần số 33Mhz với các đường truyền dữ liệu có băng thông 32 hoặc 64 bits (PCI version 2.1 họat động ở xung nhịp 66Mhz).
AGP - Accelerated Graphics Port:Là chuẩn của khe gắn card mở rộng chuyên dùng cho card màn hình tốc độ cao. Nó cung cấp kết nối trực tiếp giữa card màn hình và bộ nhớ. Nó là một thay thế cao cấp cho các card màn hình loại PCI trước đây. Nó có màu nâu, ngắn hơn và được thiết kế hơi thụt vào một chút so với khe gắn PCI. AGP có băng thông 32-bits. Chuẩn AGP nguyên thủy (AGP 1X) cung cấp tốc độ truyền dữ liệu 264Mbytes/s, AGP 2X là 528 Mbytes/s, AGP 4X là 1Gbytes/s, AGP 8X là 2Gbytes/s. Xem hình: Các loại giao diện và card mở rộng.
CNR - Communications and Networking Riser:
Là chuẩn khe gắn cho phép gắn bổ xung mạch hỗ trợ các chức năng như âm thanh (audio), modem (communications) và mạng (networking).

AMR Audio/Modem Raiser:
Là một chuẩn khe gắn cho phép gắn các card mở rộng chứa mạch xử lý âm thanh (audio) và bộ điều biến (modem) lên Mainboard. Được thiết kế bởi hãng Intel, AMR cung cấp khe cắm 46-pin giao diện kỹ thuật số (digital interface) lên Mainboard. Card mở rộng chuẩn AMR hỗ trợ tất cả các chức năng xử lý tương tự (analog functions - codecs) theo yêu cầu xử lý âm thanh và truyền thông dạng tương tự. Cùng với chuẩn cắm CNR, AMR là các lựa chọn cho các nhà sản xuất Mainboard. Hiện nay, AMR và CNR chưa hỗ trợ khả năng tương thích rộng rãi như các chuẩn khe cắm công nghiệp khác trước đây.
USB Universal Serial Bus:
Là giao diện kết nối phần cứng dùng cho các thiết bị ngoại vi có tốc độ thấp như: keyboard, mouse, cần chỉnh hướng (dùng cho game), máy in và các thiết bị điện thoại. Nó còn hỗ trợ video kỹ thuật số như MPEG-1 và MPEG-2. USB 1.1 có băng thông (bandwidth) lớn nhất là 12 Mbits/sec (tương đương với 1.5 Mbytes/sec) và có thể gắn được tới 127 thiết bị. Các thiết bị USB được mắc nối tiếp tạo thành chuỗi thiết bị USB. Các thiết bị cần tốc độ cao thì sử dụng tòan bộ băng thông còn những thiết bị tốc độ thấp thì có thể truyền dữ liệu ở các kênh truyền con là 1.5 Mbits/sec. Khả năng hoán đổi nóng của USB cho phép mọi thiết bị được gắn vào hoặc tháo ra mà không cần phải tắt máy. Các cổng USB đã có trong các máy tính cá nhân từ năm 1997, và Windows 98 hỗ trợ đầy đủ cho giao diện này. USB 2.0 tăng dung lượng đột ngột lên đến 480 Mbits/sec. Nó được xem là mạch ghép nối tuần tự cho tương lai và là "đối thủ" của chuẩn giao tiếp FireWire (IEEE1394).
Các thiết bị USB có thể được gắn trực tiếp vào ổ cắm 4-chân (4-pin socket) trên PC, gắn vào hub có nhiều cổng được nối vào PC hoặc gắn vào thiết bị có chức năng như là hub cho các thiết bị khác. Ví dụ: một số màn hình cung cấp chức năng của một USB hub.


Bus USB:
Phân phối 0.5 amps (500 milliamps) cho mỗi cổng. Do đó các thiết bị sử dụng nguồn điện thấp thông thường sử dụng adapter nguồn AC rời nay có thể được cung cấp nguồn thông qua dây cáp. Hub (USB) có thể lấy nguồn điện từ đường truyền USB (gọi là Bus powered - được cung cấp nguồn qua kênh truyền dữ liệu), hoặc có thể lấy nguồn điện thông qua adapter nguồn AC riêng của nó. Các hub sử dụng adapter riêng cấp nguồn ít nhất là 0.5 amps cho mỗi cổng cung cấp khả năng linh hoạt tối đa cho các thiết bị được kết nối phía sau trong chuỗi (downstream devices). Các hub hỗ trợ chuyển đổi cổng (Port switching hubs) cô lập tất cả các cổng với nhau vì thế khi xảy ra hiện tượng đoản mạch (shorted) ở một thiết bị trong chuỗi sẽ không ảnh hưởng đến các thiết bị khác. Các cổng USB trên máy tính và trên hub sử dụng ổ cắm hình chữ nhật loại A (USB Type A socket). Tất cả các dây cáp gắn cố định vào thiết bị đều có đầu cắm (phích cắm) loại A. Các thiết bị sử dụng dây cáp riêng đều có ổ cắm loại B hình vuông. Dây cáp để kết nối có đầu cắm loại A và loại B (USB Type A & Type B plug). Xem hình dưới: Các loại đầu cắm chuẩn USB (A&B).


FireWire (IEEE1394):

Là kênh truyền tuần tự tốc độ cao (high-speed serial bus) được phát triển bởi hãng Apple và hãng Texas Instruments. Chuẩn kênh truyền này cho phép kết nối lên tới 63 thiết bị. Firewire còn được biết đến như là chuẩn IEEE 1394, đầu nối i.Link (i.Link Connector) và High Performance Serial Bus (HPSB - Kênh truyền tuần tự tốc độ cao). Các đặc tả (specification) ban đầu của chuẩn IEEE 1394 hỗ trợ các tốc độ truyền 100 / 200 và 400 Mbits/s. Chuẩn IEEE 1394b cung cấp các tốc độ 800 / 1600 và 3200 Mbits/s. Giao diện Firewire hỗ trợ khả năng hoán đổi nóng (hot swapping), hỗ trợ nhiều tốc độ trên cùng một kênh truyền và hỗ trợ thời gian truyền bằng nhau (isochronous data transfer - truyền dữ liệu "đẳng thời"). Do vậy FireWire bảo đảm băng thông cho các tác vụ truyền thông đa phương tiện (multimedia) và nó được sử dụng rộng rãi cho việc kết nối máy quay phim / chụp ảnh kỹ thuật số và các thiết bị video khác vào máy tính. Đầu nối FireWire có hai loại: loại 6-chân (6-pin) thường thấy trong máy tính để bàn (desktop) và loại 4-chân thường được thiết kế trong máy tính xách tay (laptop). Xem hình: Đầu nối chuẩn FireWire IEEE 1394.

greentek.vn

Thứ Tư

Lấy kết quả tìm kiếm từ Google qua các A

Từ giữa năm 2002 Google đã cung cấp các API cho phép người dùng truy xuất trực tiếp đến các nội dung: search result, suggestion, cached page mà không cần vào trang web. Bạn có thể vào để xem thông tin chi tiết rồi đăng kí 1 tài khoản (sẽ được cung cấp 1 số serial, có nó mới sử dụng các API được). Với tài khoản này bạn có thể thực hiện miễn phí 1000 yêu cầu tìm kiếm trong 1 ngày. Đây là dịch vụ rất ích lợi với các webmaster, thí dụ bạn có thể dùng nó để nghiên cứu về một từ khóa hoặc một trang web chẳng hạn.
Dịch vụ web của Google dựa trên SOAP. Với PHP (Google đã có sẵn thí dụ cho .NET và Java) bạn có thể dùng gói PEAR::SOAP thông qua thí dụ ở hoặc dùng một cài đặt khác là nusoap () như thí dụ ở
Cài đặt 1 (dùng PEAR::SOAP, bạn cần có package này trên server)

PHP Code:
<?php
/* Accessing the Google Web API via PHP
- by Simon Willison (simon@incutio.com)
This code is in the public domain - do whatever you want with it

To use this code you will need both PEAR and the PEAR SOAP package
installed somewhere on your php include path. You can get the SOAP
package from CVS:

cvs -d :pserver:cvsread@cvs.php.net:/repository login
(enter phpfi as the password)
cvs -d :pserver:cvsread@cvs.php.net:/repository co pear/SOAP

You will need a Google license key - see this site:
http://www.google.com/apis/

*/

include("SOAP/Client.php");

// Google search query
$query = 'soap';

// Your google license key
$key = 'xxxxxxxxxxxxxxxxxxxxxxxxx';

$s = new SOAP_Client('http://api.google.com/search/beta2');
$result = $s->call('doGoogleSearch', array(
'key' => $key,
'q' => $q,
'start' => 0,
'maxResults' => 10,
'filter' => false,
'restrict' => '',
'safeSearch' => false,
'lr' => '',
'ie' => '',
'oe' => '',
), 'urn:GoogleSearch');

// Is result a PEAR_Error?
if (get_class($result) == 'pear_error')
{
$message = $result->message;
$output = "An error occured: $message<p>";
}
else
{
// We have proper search results
$num = $result['estimatedTotalResultsCount'];
$elements = $result['resultElements'];
$list = '';
if ($num > 0) {
foreach ($elements as $item) {
$size = $item['cachedSize'];
$title = $item['title'];
$url = $item['URL'];
$snippet = $item['snippet'];
$desc = "<p><b>$title</b> - <a href=\"$url\">$url</a> ";
$desc .= "<small>[Size: $size]</small></p>";
$desc .= "\n<blockquote>$snippet</blockquote>\n\n";
$list .= $desc;
}
}
$output = "$num results returned:\n\n$list";
}
echo $output;
?>
Cài đặt 2 (dùng nusoap ), có chức năng đề nghị lỗi chính tả

PHP Code:
<?php

////////////////////////////////////////////////////////////
// This is example code of how to query the Google API using
// Web Services, SOAP, and PHP.
//
// Author: Geoff Peters, January 6th 2004.
// Updated by Dan Karran, 10th March 2005 to utilise nuSOAP instead of PEAR.


// put your developer's key here:
$key = 'INSERT GOOGLE API DEVELOPERS KEY';



include ('nusoap.php');

$soapclient = new soapclient('http://api.google.com/search/beta2');
$soapoptions = 'urn:GoogleSearch';

// Ensure there is a start value
if (!$start) {
$start = 0;
} else {
$start = intval($start-1);
}


////////////////////////////////////////////////////////////
// Calls the Google API and retrieves the search results in $ret
//
function do_search( $q, $type, $key, $start, &$ret )
{
global $soapclient;
global $soapoptions;


// Note that we pass in an array of parameters into the Google search.
// The parameters array has to be passed by reference.
// The parameters are well documented in the developer's kit on the
// Google site http://www.google.com/apis


// limit searches to this server
$sitequery = "$q site:{$_SERVER['SERVER_NAME']} $restrict";

$params = array(
'key' => $key,
'q' => $sitequery,
'start' => $start,
'maxResults' => 10,
'filter' => false,
'restrict' => '',
'safeSearch' => false,
'lr' => '',
'ie' => '',
'oe' => ''
);

// Here's where we actually call Google using SOAP.
// doGoogleSearch is the name of the remote procedure call.

$ret = $soapclient->call('doGoogleSearch', $params, $soapoptions);

$err = $soapclient->getError();

if ($err)
{
print("<br>An error occurred!<br>");
print(" Error: $err<br>\n");
return false;
}

return true;
}


////////////////////////////////////////////////
// Does Google search with retry.
// Retry is useful because sometimes the connection will
// fail for some reason but will succeed when retried.
function search( $q, $type, $key, $start, &$ret )
{
$result = false;
$max_retries = 5;
$retry_count = 0;

while( !$result && $retry_count < $max_retries )
{
$result = do_search( $q, $type, $key, $start, $ret );
if( !$result )
{
print( "Attempt $retry_count failed.<br>\n");
}
$retry_count++;
}
if( !$result )
{
print("<br>Sorry, connection to Google failed after retrying several times.<br>\n");
}
return $result;
}


////////////////////////////////////////////////////////////
// Calls the Google API and retrieves the suggested spelling correction
//
function do_spell( $q, $key, &$spell )
{
global $soapclient;
global $soapoptions;

$params = array(
'key' => $key,
'phrase' => $q,
);

$spell = $soapclient->call('doSpellingSuggestion', $params, $soapoptions);

$err = $soapclient->getError();

if ($err)
{
print("<br>An error occurred!<br>");
print(" Error: $err<br>\n");
return false;
}

return true;
}


//////////////////////////////////////////////////////////
// The main part of this script


if( $q != "" )
{
// remove the slashes that are automatically added by PHP before each quotation mark
$q = stripslashes($q);

if( do_search( $q, $type, $key, $start, $ret ) )
{

$count = $ret['estimatedTotalResultsCount']; // total number of results
$secs = round($ret['searchTime'],2); // time taken to search (in seconds)
$min = $ret['startIndex']; // first record returned
$max = $ret['endIndex']; // last record returned

if ($max) {

// Truncate query for display
if (strlen($q) > 36) {
$short_q = substr($q,0,33)."...";
} else {
$short_q = $q;
}

// print header with search box and details of search results
print "<form method=\"GET\"><table class=\"search_top\" width=100%><tr><td nowrap style=\"text-align:left;\">";
print "<input type=\"text\" name=\"q\" size=\"30\" value=\"$q\">\n";
print "<input type=\"submit\" value=\"search\">\n";
print "</td><td nowrap> results <b>$min</b> - <b>$max</b> of about <b>$count</b> for <b>$short_q</b> ";
print " (<b>$secs</b> seconds)&nbsp;</td></tr></table></form>";

// list results
foreach($ret['resultElements'] as $result) {

// Make URLs more friendly for user by removing http:// and highlighting where necessary
$friendly_URL = $result['URL'];
$friendly_URL = str_replace("http://","",$friendly_URL);
$friendly_URL = str_replace("$q","<b>$q</b>",$friendly_URL);

print "<p class=\"search_result\">";
if (!$title = $result['title']) {
$title = $result['URL'];
print "<a href=\"".$result['URL']."\">".$friendly_URL."</a>\n";
} else {
print "<a href=\"".$result['URL']."\">".$title."</a><br/>\n";
if ($result['snippet']) {
print $result['snippet']."<br/>\n";
}
print "<span class=\"search_url\">$friendly_URL</a>";
}
print "</p>\n\n";
}
} else {

print "<p>Sorry, no results were found on this site for <b>$q</b>. ";
do_spell($q, $key, $spell);
if ($spell[0]) {
print "Did you mean <b><a href=\"../search/?q=".$spell."\">".$spell."</a></b>? ";
}
print "Occasionally no results will be returned when there are problems with the link between this site and Google. If you believe the information is on the site but it tells you that it's not, please try again.</p>";
}
}
}

// Show forward/backward navigation if there are results
if ($count) {
print "<div class=\"search_bottom\">";
if ($min>1) {
if ($min >10) {
$prevpage = $min-10;
} else {
$prevpage = 1;
}
print " <b><a href=\"../search/?q=".$q."&start=".$prevpage."\">previous page</a></b> | ";
} else {
print " previous page | ";
}
if ($count>$max) {
$nextpage = $max+1;
print " <b><a href=\"../search/?q=".$q."&start=".$nextpage."\">next page</a></b> ";
} else {
print " next page ";
}
print "</div>";
}

print "<form method=\"GET\" class=\"search_main\">";
print "<input type=\"text\" name=\"q\" size=\"32\" value=\"$q\"> <input type=\"submit\" value=\"search\">";
print "</form>";

?>
Theo hainam

Anti PHP & SQL Injection

I - Anti PHP & SQL Injection

1.SQL Injection

- Hầu hết các lỗi SQL Injection đều là do câu lệnh SQL sai hoặc do User làm cho câu lệnh SQL sai , không thực hiện đúng chức năng của nó . Ví dụ như chúng ta có một Script kiểm tra đăng nhập như sau :

Mã lệnh (php)
<?
//Các lệnh Connect vào SQL Database .v.v.
$username = $_POST['username']; //Lấy User và Pass từ Form
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM users WHERE user = \"$username\" AND password = \"$password\"");
if (mysql_num_rows($result) > 0) {
//Đăng nhập thành công
}
else {
//Đăng nhập không đúng Username hay Password
}
//.......
?>

- Đoạn Script trên là một đoạn Script rất đơn giản thực hiện Login thông qua câu SQL kiểm tra username và password . Câu lệnh SQL nguyên thủy là :

SELECT * FROM users WHERE user = "$username" AND password = "$password"

- Tuy nhiên, đây lại là một SQL Injection vô cùng lớn, nếu như User nhập biến User là " OR 1 OR user="

- Khi đó lệnh SQL sẽ trở thành :

SELECT * FROM users WHERE user = "" OR 1 OR user="" AND password = "$password"

- Kết quả trả về sẽ là toàn bộ user trong Database và dĩ nhiên đây là một trường hợp Login không hợp lệ (biến password cũng có thể sữ dụng để tạo SQL Injection) . Thực ra, lỗi trên là do biến $username, có thể fix bằng cách kiểm tra biến user, rồi sau đó mới kiểm tra biến pass, hoặc một cách nhanh hơn, fix được hầu hết tất cả các lỗi SQL Injection mà chỉ cần sữ dụng một hàm có sẵn của PHP, đó là hàm addslashes .

- Xin nói một chút về hàm addslashes: hàm này sẽ trả về một chuỗi với dấu \ trước các ký tự cần trích dẫn trong Database, các ký tự đó là " \ và NUL (\0) .

- Cấu trúc hàm addslashes : string addslashes ( string str)

- Nhờ có hàm addslashes mà câu lệnh SQL của ta sẽ trở thành :

SELECT * FROM users WHERE user = "\" OR 1 OR user=\"" AND password = "$password"

- Như vậy thì câu lệnh SQL sẽ hoạt động đúng như chức năng của nó . Một số lỗi SQL Injection khác cũng có thể khắc phục bằng phương pháp này. Tôi cũng xin nhắc lại là phương pháp này chỉ fix được hầu hết tất cả các lỗi SQL Injection, tức là các lỗi do biến PHP gây ra, còn các lỗi do bản thân câu lệnh SQL thì cách này không có hiệu quả gì. Tuy nhiên nếu dùng phương pháp này và câu lệnh SQL chắc chắn thì tôi tin rằng bạn sẽ không còn lo lắng về SQL Injection.

2.PHP Injection

- Lỗi PHP Injection thường xảy ra với các script đọc File, tương tác hệ thống v.v. . Đây là một điển hình của PHP Injection:

Mã lệnh (php)
<?
//...
readfile($file);
//...
?>

- Thoạt nhìn thì không có lỗi gì, nhưng nếu như vì một lý do gì đó mà biến $file không được khai báo thì đây là một lỗi PHP Injection rất nặng. Nếu như Link đưa đến trang có lỗi như thế này : http://somehost.com/somescript.php?file=somescript.php

- Lúc này thì biến $file lại được khai báo bởi chính PHP, chức năng Regiser-Global và kết quả là sẽ đưa ra nội dung của file somescript.php hay bất cứ File nào trên hệ thống (kể cả File chức Password nếu hacker chịu khó mò và xem như host của chúng ta tiêu luôn).

- Nếu phân tích thì ta sẽ thấy rằng biến $file đã được khai báo do chức năng Register-Global (chức năng tự động đăng ký các biến trong GET, POST , COOKIE v.v...), và được fix một cách đơn giản là tắt chức năng này đi. Việc tắt chức năng này đi cũng không ảnh hưởng gì nhiều đến PHP.

II.Using Header

- Header là một hàm khác hay của PHP, hàm này sẽ send raw HTTP Header. Bạn có thể tìm tài liệu về HTTP Header trên rất nhiều diễn đàn lập trình khác. Trong bài viết này tôi sẽ đề cập đến một số header thông dụng.

1.Location Header

- Location Header có tác dụng chuyển trang yêu cầu đền một trang khác.

Mã lệnh (php)
header("location : http://php.net");
//Chuyển đến trang php.net

2.HTTP Command

- Lệnh Header cũng có thể sử dụng để gửi các lệnh của HTTP như 404 , 500 .v.v.

Mã lệnh (php)
header("HTTP/1.0 404 Not Found"); //Thông báo không tìm thấy của HTTP.

3.Attachment Header

- Header này có tác dụng thay tạo bảng Download, tải File do PHP tạo ra về máy ( UDU - Unlimited Database Upload , một script giúp ghi dữ liệu binary trong Database là một ví dụ về header này)

Mã lệnh (php)
<?
//Dạng File
header("Content-type: application/pdf");
//Tên File
header("Content-Disposition: attachment; filename=downloaded.pdf");
//Kích thước của File
header("Content-Length: " . filesize("original.pdf") );
//Nội dung cuả File
readfile('original.pdf');
?>

4.Authentication Header

- Đây là một header rất hay của PHP, nó sẽ tạo ra một bảng Login và yêu cầu nhập Username và Password, rất thích hợp cho trang dành cho các vùng hạng chế.

Mã lệnh (php)
<?
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
}
else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
?>

- Chú ý khi sữ dụng Header : header phải được gọi trước khi đưa nội dung vào trang, vì header phải được gửi trước khi gửi nội dung của trang hoặc bạn sẽ nhận được lỗi thông báo về Header, tuy nhiên bạn có thể tranh lỗi này bằng sữ dụng Output buffering mà tôi sẽ đề cập sau đây. Đây là một vd về sử dụng header sai:

Mã lệnh (html)
<html>
<?php
//Lỗi vì <html> đã được gửi rồi
header('Location: http://www.example.com/');
?>

III.Output Buffering

- Cũng như ASP, PHP cũng có chức năng tạo bộ đệm trang và chức năng này mạnh hơn rất nhiều so với ASP nhưng lại đòi hỏi cấu hình PHP. Tuy nhiên chức năng này hoạt động hầu hết trên Server mà không cần phải cấu hình lại PHP. Bạn có thể sử dụng các hàm Buffer của PHP hoặc tự tạo bộ đệm cho mình. Sử dụng Buffer sẽ giúp cho bạn tránh được lỗi header và có thể thay đổi nội dung của trang nhưng nó cũng yêu cầu một Server tốt, vì mỗi lần Buffer thì nó sẽ ghi vào bộ nhớ hay File.

1.Output Buffering Function

- Sau đây là một số hàm sử dụng Output Buffer:

- bool ob_start: bắt đầu sử dụng Buffer

- bool ob_end_flush: kết thúc sử dụng Buffer và gửi bộ đệm đến Client, chú ý là bộ đệm sẽ không thay đổi được nữa.

- bool ob_end_clean: kết thúc sử dụng Buffer và xóa toàn bộ bộ đệm .

- void ob_flush: gửi bộ đệm đến Client, bộ đệm không thay đổi được nữa.

- void ob_clean: xóa bộ đệm .

- string ob_get_contents: trả về nội dung bộ đệm .

- int ob_get_length: trả về kích thước bộ đệm .

- string ob_get_clean: trả về nội dung bộ đệm và xóa bộ đệm.

2.User Output Function

- Một cách khác để sử dụng Buffer là tạo một biến để chứa nội dung của trang trước khi đưa nội dung của trang ra. Cách này hơi tốn công so với sử dụng hàm của PHP nhưng nó đơn giản và không bị hạn chế.

IV.Search Array

- PHP là một ngôn ngữ Web mạnh, nhưng nó lại có một thiếu sót rất lớn là tìm kiếm trong Array, hầu hết các hàm của PHP chỉ sử dụng khi ta biết rỏ là key hay value đó hoặc có hoặc không trong Array đó, không thể nào tìm kiếm các key hay value liên quan hay hơi giống hay không phân biệt chữ hoa và chữ thường (sensitive) so với chuổi cần tìm .

1.PHP Array Function

- Sau đây là một số hàm tìm kiếm trong array của PHP:

mixed array_search ( mixed needle, array haystack [, bool strict])

- Hàm array_search tìm kiếm một giá trị trong array và trả về key của Value đó. Hàm này xem ra lại rất kém hiệu quả.

bool in_array ( mixed needle, array haystack [, bool strict])Hàm này cũng tương tự như array_search nhưng nó trả về giá trị TRUE nếu tìm thấy và FALSE nếu không tìm thấy trong Array.

- bool array_key_exists ( mixed key, array search) Hàm này là mô phỏng của in_array, điểm khác là nó kiểm tra key chứ không phải value.

- array array_keys ( array input [, mixed search_value])Cuối cùng là hàm array_key, hàm này sẽ trả về một array chứa Key của array cần tìm hay của một giá trị Array cần tìm. Hàm này không thể sử dụng để tìm kiếm nhưng có thể sử dụng trong việc tìm kiếm.

- Hầu hết các hàm liệt kê trên đều không hiệu quả, không thích hợp cho việc tìm kiếm Array, vì vậy mà tôi đã phải viết lại hàm SearchArray

2.SearchArray Function

- Hàm này do tôi viết lại để tìm kiếm trong Array

Mã lệnh (php)
function searcharray($search , $ARRAY , $checkkey = "" , $cmpflag = 0 , $breakonfind = "") {
$ret = array();$add = true;
foreach ($ARRAY as $key => $val) {
$add = false;
if ($checkkey != "") $cmp = $key;
else $cmp = $val;
if ($cmp <> "") {
switch ($cmpflag) {
case 1: //Compare From Left
if (strcasecmp(substr($cmp , 0 , strlen($search)) , $search) == 0) $add = true;
break;
case 2: //Compare From Right
if (strcasecmp(substr($cmp , strlen($cmp) - strlen($search)) , $search) == 0) $add = true;
break;
case 3: //Normal String Compare
if (strcasecmp($cmp , $search) == 0) $add = true;
break;
default: //In String Compare
if (stristr($cmp , $search)) $add = true;
break;
}
if ($add) {
if ($breakonfind != "") return $key;
$ret[] = $key;
}
}
}
return ($breakonfind != "") ? "" : $ret;
}

- Hàm này tìm kiếm rất hiệu quả, nó so sánh từng giá trị hay khóa trong Array và đưa ra kết quả tìm kiếm. Cách so sánh cũng tùy vào Flag mà ta đưa vào, và có thể chỉ tìm giá trị đầu tiên.

- Cách sữ dụng: hàm này có 5 tham số, trong đó có 2 tham số là bắt buộc.

- search: giá trị cần tìm .

- ARRAY: array cần kiểm tra .

- checkkey: nếu checkkey khác rỗng ("") , hàm sẽ kiểm tra khóa thay vì Value.

- cmpflag: cách kiểm tra: 1: so sánh chuổi từ bên trái, 2: so sánh chuổi từ bên phải, còn lại: hàm sẽ kiểm tra xem chuổi cần tìm có trong chuổi kiểm tra không. Tất cả các kiểu so sánh đều không phân biệt chữ hoa chữ thường.

- breakonfind: nếu khác rỗng ("") hàm sẽ trả về key của giá trị tìm thấy đầu tiên hay môt giá trị rỗng ("") nếu không tìm ra.

Hàm sẽ trả về một array chứa các giá trị tìm thấy nếu flag breakonfind không được set.

V.Make Configuration File

- Khi bạn tạo code một PHP script lớn như Forum hay Mysql Manager hay File Manager .v.v... hẳn các bạn sẽ dùng một File Config.php để lưu lại cấu hình PHP. Hàm savefile cũng do tôi viết có thể tạo một file config nhanh và rất hiệu quả.

Mã lệnh (php)
function savefile($F , $V) {
$result = "<?\n\n";
$f = fopen($F , "wb");
foreach($V as $key => $val) {
$result .= "\$" . addslashes($key) . " = " . parseval($val) . ";\n";
}
$result .= "\n?>";
fwrite($f , $result);
fclose($f);
}
function parseval($v) {
if (!is_array($v)) {
return "\"" . addslashes($v) . "\"";
}
else {
$result = "array(";
foreach ($v as $key => $value) {
$result .= '"' . addslashes($key) . '" => ' . parseval($value) . ",";
}
if (substr($result , strlen($result) - 1 , 1) == ",") $result = substr($result , 0 , strlen($result) - 1);
$result .= ")";
return $result;
}
}

- Hàm savefile sẽ mở File và sau đó sẽ chạy đệ quy parseval để tạo chuổi PHP về file Config.

- Ví dụ về sử dụng:

savefile("config.php" , array("MAINCONFIG" => $MAINCONFIG , "OTHERCONFIG" => $OTHERCONFIG);

- Hàm sẽ lưu vào file config.php 2 giá trị là MAINCONFIG theo biến $MAINCONFIG và OTHERCONFIG theo biến $OTHERCONFIG. File Config.php sẽ có nội dung như sau:

Mã lệnh (php)
<?
$MAINCONFIG = //Giá trị biến MAINCONFIG, tùy theo MAINCONFIG có dạng nào mà config được save theo dạng đó
$OTHERCONFIG = //Giá trị biến OTHERCONFIG, như trên
?>

VI.Use Pre-Made Script

- Xin kết thúc bài viết lập trình PHP nâng cao bằng một số Script thông dụng hiện nay.

1.Mysql Class

- Bạn có thể tìm thấy Mysql Class trong bộ Forum Invision Power Board, nó nằm ở thư mục IPB PATH\sources\Drivers/mySQL.php . Đây là một Class tương tác với mysql theo kiểu Object rất hay, nhưng điểm hay của nó là có thể tạo được câu lệnh SQL như INSERT, UPDATE từ các biến array rất chính xác (multi query). Tuy nhiên bạn cũng không nên sử dụng hoàn toàn class này mà nên dùng để tham khảo vì IPB không cho edit source.

2.phpMyAdmin

- Cái này thì chắc ai cũng biết , phpMyAdmin quản lý mySQL rất tuyệt vời, có thể download tại http://mysql.org

3.phpRemoteView

- Đây là một Script khá hay giúp bạn tương tác với hệ thống sử dụng PHP (cái này được xem là một công cụ hack thì đúng hơn , nhưng source của nó thì rất tuyệt). Script có thể download tại http://php.spb.ru/remview/

4.Net2ftp

- Một công cụ rất hay giúp bạn Connect tới các FTP Server sữ dụng PHP, có thể download tại http://www.net2ftp.com

5.pclTar , pclZip

- Hai công cụ tuyệt vời trong việc tạo các File Zip, Tar sử dụng PHP. Điểm đặc biệt là 2 script này không yêu cầu bất cứ gì từ PHP, bạn chỉ cần include vào và sử dụng. Có thể Download tại: http://www.phpconcept.net

6.Eskuel

- Một công cụ quản lý MySQL khác, công cụ này không bằng phpMyAdmin nhưng lại có một size rất khiêm tốn. Download tại: http://eskuel.sourceforge.net/site/upgrade...〈=english

7.Invision File Manager

- Ngoài Invision Power Board, hảng Invision còn viết một chương trình Manager rất hay, hổ trợ nhiều User và chức năng Zip File. Download tại trang web http://invisionpower.com

Ham Delay trong PHP(sleep or usleep)

1.Hàm sleep :
int sleep ( int $seconds );

Examples:

<?php

// current time
echo date('h:i:s') . "\n";

// sleep for 10 seconds
sleep(10);

// wake up !
echo date('h:i:s') . "\n";

?>
tham khảo thêm ở PHP Manual :http://php.net/manual/en/function.sleep.php
2.Hàm usleep :
 
void usleep ( int $micro_seconds );
 
Example:
<?php

// Current time
echo date('h:i:s') . "\n";

// wait for 2 seconds
usleep(2000000);

// back!
echo date('h:i:s') . "\n";

?>
tham khảo thêm ở PHP Manual :http://php.net/manual/en/function.usleep.php

Các cách lấy link web trong php - How To Find The Current URL In PHP

Trong một số trường hợp bạn bắt buộc phải lấy đường dẫn tên miền, tên miền hiện tại, các biến của bạn để phục vụ trong vấn đề gì đó.
Rất may PHP cung cấp cho chúng ta sẵn 1 số hàm phục vụ cho vân đề này. Các bạn xem các ví dụ say sẽ rõ

Code 1: Nếu bạn cần lấy tên miền hiện tại, bạn có thể sử dụng code dưới đây:

MÃ: CHỌN
<?php
# Using HTTP_HOST

$domain = $_SERVER['HTTP_HOST'];
echo $domain; //echo grouplaptrinh.com
?>
Code trên chỉ cho chúng ta tên website .com .net không bao gồm tiền tố http:// hoặc www. Vì vậy các bạn nên lưu ý khi sử dụng cú pháp này

Code 2: Lấy đường dẫn đang truy cập:
MÃ: CHỌN
<?php
# Using SCRIPT_NAME

$path = $_SERVER['SCRIPT_NAME'];

echo "Path To Script Example: <a href='$path'>An Article Title</a>";
//ex: http://grouplaptrinh.com/test.php
//result: http://grouplaptrinh.com/test.php

?>

Kết quả này trả về giá trị y chang đường dẫn bạn đang truy cập

Code 3: Trả về biến mà bạn đăng truy cập
ví dụ: http://grouplaptrinh.com/index.php?user=thanhansoft. Kết quả trả về user=thanhansoft

MÃ: CHỌN
<?php
# Using QUERY_STRING

$queryString = $_SERVER['QUERY_STRING'];

echo "Query: " . $queryString;

?>

Code 4: Dành cho các Mod rewrite
Nếu bạn đang sử dụng MOD rewrite để làm cho URL của bạn thân thiện với người dùng hơn, vẫn còn một cách để có được các URL ban đầu. Bằng cách sử dụng các biến server REQUEST_URI, chúng ta có thể nhận được các URL được truy cập trang. Vì vậy, được định nghĩa, chúng tôi bỏ qua bất cứ viết lại quy tắc.

MÃ: CHỌN
<?php
# Using REQUEST_URI

echo "http://" . $_SERVER['HTTP_HOST']  . $_SERVER['REQUEST_URI'];
//result: bai-viet/lap-trinh-web-php/cac-cach-lay-link-web-trong-php-how-to-find-the-current-url-in-php/236

?>

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Blogger Templates