Hướng dẫn dùng php glob trong PHP

Hướng dẫn dùng php glob trong PHP

Các hàm rất hữu ích trong PHP bạn cần biết !

1/ Hàm có bao nhiêu tham số cũng được Bạn có thể đã biết trong PHP chúng ta có thể tạo hàm với các tham số có giá trị mặc định ban đầu . Nhưng có 1 phương pháp cho phép 1 hàm chấp nhận mọi tham số ! Ví dụ đầu tiên với hàm có tham số có giá trị mặc định :

// Hàm có 2 tham số mặc định function foo($arg1 = '', $arg2 = '') { echo "arg1: $arg1\n"; echo "arg2: $arg2\n"; } foo('hello','world'); /* Xuất arg1: hello arg2: world */ foo(); /* Xuất arg1: arg2: */


Bây giờ, hãy cùng xây dựng 1 hàm có thể truyền vào mọi tham số . func_get_args() sẽ giúp chúng ta làm điều đó :

// Tham số để rỗng nhé function foo() { // returns an array of all passed arguments $args = func_get_args(); foreach ($args as $k => $v) { echo "arg".($k+1).": $v\n"; } } foo(); /* Không xuất gì cả */ foo('hello'); /* Xuất arg1: hello */ foo('hello', 'world', 'again'); /* Xuất arg1: hello arg2: world arg3: again */


2/ Sử dụng GLOB() để tìm files

Nhiều hàm trong PHP có tên dài và có tính mô tả chức năng của nó . Tuy nhiên, thật khó để nói hàm glob() có nhiệm vụ gì nếu chúng ta chưa từng sử dụng qua .

Thật ra, glob() có chức năng như hàm scandir() nhưng là 1 phiên bản cao cấp hơn ~~


// Lấy hết tất cả các file đuôi .php $files = glob('*.php'); print_r($files); /* Xuất Array ( [0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php ) */

Bên cạnh đó, chúng ta có thể lấy ra nhiều file :

// Lấy tất cả file có đuôi .php và .txt //GLOB_BRACE : ở trong {} sẽ dc hiểu là hoặc << hoặc php hoặc txt thì lấy ra $files = glob('*.{php,txt}', GLOB_BRACE); print_r($files); /* Xuất Array ( [0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php [4] => log.txt [5] => test.txt ) */

File cũng có thể được lấy ra với đường dẫn :

$files = glob('../images/a*.jpg'); print_r($files); /* Xuất Array ( [0] => ../images/apple.jpg [1] => ../images/art.jpg ) */


Còn nếu bạn muốn lấy đường dẫn đầy đủ, chỉ cần dùng realpath() :

$files = glob('../images/a*.jpg'); // sử dụng hàm đến mỗi phần tử mảng $files = array_map('realpath',$files); print_r($files); /* output looks like: Array ( [0] => C:\wamp\www\images\apple.jpg [1] => C:\wamp\www\images\art.jpg ) */

Tất nhiên các ví dụ ở trên bạn test sẽ cho ra kết quả khác, vì folder trong máy của tác giả hok giống với folder của bạn . Tùy cơ ứng biến nhé ^^

3/ Thông tin bộ nhớ được sử dụng

Nếu biết được thời gian chạy script, bạn sẽ tối ưu code tốt hơn !

PHP có 1 bộ xử lý bộ nhớ rất phức tạp . Sự sử dụng bộ nhớ của đoạn script có thể tăng, giảm trong khi nó nó chạy . Để lấy bộ nhớ hiện tại đang được sử dụng, chúng ta dùng memory_get_usage() , để lấy bộ nhớ maximum được sử dụng trong cả quá trình, dùng memory_get_peak_usage() :


echo "Ban đầu: ".memory_get_usage()." bytes \n"; /* prints Ban đầu: 361400 bytes */ // Sử dụng bộ nhớ nào for ($i = 0; $i < 100000; $i++) { $array []= md5($i); } // Loại bỏ mảng for ($i = 0; $i < 100000; $i++) { unset($array[$i]); } echo "Cuối cùng : ".memory_get_usage()." bytes \n"; /* Xuất Cuối cùng: 885912 bytes */ echo "Cao nhất: ".memory_get_peak_usage()." bytes \n"; /* Xuất Cao nhất: 13687072 bytes */


4/Magic Constants

PHP cung cấp một số magic_constants hữu ích như :


lấy ra dòng hiện tại (__FILE__), lấy ra đường dẫn hiện tại (__FILE__), lấy ra thư mục (__DIR__), tên hàm (__FUNCTION__), tên lớp (__CLASS__), tên method ( __METHOD__) và namespace (__NAMESPACE__) Chúng ta sẽ hok đi từng constant, mà chỉ giới thiệu 1 vài ví dụ hữu ích :

// đây là đường dẫn tương đối // Có thể bạn sẽ gặp lỗi nếu chạy script từ thư mục khác đấy nhé require_once('config/database.php'); require_once(dirname(__FILE__) . '/config/database.php');


Bạn hãy chạy script trên, đừng tạo file database.php trong folder config nhé, để hiểu __FILE__ có nhiệm vụ gì, bạn cứ việc copy->paste-> chạy . Bạn sẽ thấy lỗi chưa ?
Nếu thấy rồi, bạn đảo thứ tự của 2 dòng require_once() trên, bạn chạy lại và sẽ hiểu ^^

Lưu ý : nên sử dụng __FILE__ khi include script khác bạn nhé .

Sử dụng __LINE__ sẽ giúp chúng ta debug dễ hơn . Bạn có thể tìm ra số thứ tự của dòng :

// some code // ... my_debug("some debug message", __LINE__); /* Xuất Line 4: some debug message */ // some more code // ... my_debug("another debug message", __LINE__); /* Xuất Line 11: another debug message */ function my_debug($msg, $line) { echo "Line $line: $msg\n"; }


5/ Tạo ID đặc biệt :

Có 1 vài trường hợp chúng ta cần phải tạo ra những chuỗi đặc biệt ( không trùng lặp ), người ta thường dùng md5() để làm điều này, nhưng md5() không thực sự sinh ra để làm điều đó !

// generate unique string echo md5(time() . mt_rand(1,1000000));


Có 1 hàm chuyên dùng để xử lý điều đó trong PHP tên là : uniqid()

// Tạo chuỗi đặc biệt echo uniqid(); /* Xuất 4bd67c947233e */ // Tạo 1 chuỗi đặc biệt khác echo uniqid(); /* Xuất 4bd67c9472340 */

Có thể bạn đang thắc mắc rằng dù hàm tạo chuỗi đặc biệt nhưng có 1 số kí tự đâu tiên giống hệt nhau mỗi khi chạy ! Bởi vì việc tạo chuỗi này phụ thuộc vào thời gian server . Để giảm cơ hội chúng có thể y chang nhau, chúng ta thêm prefix vào :

// với prefix echo uniqid('foo_'); /* Xuất foo_4bd67d6cd8b8f */ // với nhiều kí tự hơn echo uniqid('',true); /* Xuất 4bd67d6cd8b926.12135106 */ // prefix và nhiều kí tự hơn echo uniqid('bar_',true); /* Xuất bar_4bd67da367b650.43684647 */


Hàm này sẽ tạo chuỗi với số kí tự ít hơn md5(), sẽ giúp bạn tiết kiệm thời gian hơn .

6/ Serialization

Bạn đã bao giờ lưu 1 biến phức tạp vào database hay file ? Bạn không cần phải có những giải pháp của mình để chuyển đổi mảng về dạng chuỗi rồi nạp vào, bởi vì PHP đã có vào hàm dùng với mục đích này !

Chúng ta sẽ tìm hiểu 2 hàm : serialize()unserialize()

// 1 mảng phức tạp $myvar = array( 'hello', 42, array(1,'two'), 'apple' ); // convert to a string $string = serialize($myvar); echo $string; /* Xuất a:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";} */ // Bạn có thể lấy lại mảng ban đầu $newvar = unserialize($string); print_r($newvar); /* Xuất Array ( [0] => hello [1] => 42 [2] => Array ( [0] => 1 [1] => two ) [3] => apple ) */


Tuy nhiên, từ khi JSON trở nên phổ biến, họ đã quyết định thêm sự hỗ trợ vào PHP5.2 . Bây giờ bạn có thể sử dụng json_encode()json_decode() :

// Mảng phức tạp $myvar = array( 'hello', 42, array(1,'two'), 'apple' ); // Chuyển đổi mảng thành string $string = json_encode($myvar); echo $string; /* Xuất ["hello",42,[1,"two"],"apple"] */ // Lấy lại mảng ban đầu $newvar = json_decode($string); print_r($newvar); /* Xuất Array ( [0] => hello [1] => 42 [2] => Array ( [0] => 1 [1] => two ) [3] => apple ) */

Có vẻ 2 hàm này nhỏ gọn hơn nhỉ ^^ . Hơn thế nữa, chúng tương thích với javascript và 1 số ngôn ngữ khác . Tuy nhiên, cho những đối tượng phức tạp quá, có thể sẽ bị mất thông tin đấy !

7/ Nén chuỗi

Khi nói về sự nén, chúng ta cứ nghĩ là nến file zip !! Nhưng chúng ta hoàn toàn có thể nén 1 chuỗi phức tạp trong PHP .

Ở ví dụ sau đây, chúng ta sẽ dùng hàm gzcompress()gzuncompress()

$string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut elit id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui pretium orci, non ultricies elit lacus quis ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elit mollis congue. Praesent ipsum diam, consectetur vitae ornare a, aliquam a nunc. In id magna pellentesque tellus posuere adipiscing. Sed non mi metus, at lacinia augue. Sed magna nisi, ornare in mollis in, mollis sed nunc. Etiam at justo in leo congue mollis. Nullam in neque eget metus hendrerit scelerisque eu non enim. Ut malesuada lacus eu nulla bibendum id euismod urna sodales. "; $compressed = gzcompress($string); echo "Size ban đầu: ". strlen($string)."\n"; /* Xuất Size ban đầu: 800 */ echo "Size sau khi nén: ". strlen($compressed)."\n"; /* Xuất Size sau khi nén: 418 */ // Lấy lại chuỗi ban đầu $original = gzuncompress($compressed);


Chúng ta có thể tiết kiệm tới 50% tổng kích thước đấy ! Bên cạnh đó, 2 hàm gzencode() gzdecode() cũng làm điều tương tự nhưng dùng thuật toán khác thôi .

8/ Đăng kí 1 hàm shutdown

Với hàm register_shutdown_function(), chúng ta có thể làm 1 vài chuyện trước khi script ngừng chạy .

Ví dụ đếm thời gian chạy script nè :

// Lấy thời gian bắt đầu chạy $start_time = microtime(true); // Code ở đây // ... // Xuất code đã chạy được bao lâu rồi echo "Thời gian chạy script : ". (microtime(true) - $start_time). " seconds.";


Với cái nhìn đầu tiên, có thể bạn thấy thật tầm thường !! Đoạn code trên chỉ là thêm đoạn code tính thời gian ở cuối script . Tuy nhiên, nếu bạn gọi hàm exit() , đoạn code trên sẽ hok bao giờ chạy được . Thay vào đó, nó sẽ thông báo lỗi , hoặc là khi script bạn bị kết thúc bởi người dùng, bằng cách nhấn nút stop trên trình duyệt chẳng hạn !!!

Khi bạn sử dụng register_shutdown_function(), đoạn code của bạn sẽ chạy bất kể nó bị ngừng đột xuất vì lí do gì !

$start_time = microtime(true); register_shutdown_function('my_shutdown'); // Code ở đây // ... function my_shutdown() { global $start_time; echo "Thời gian chạy script : ". (microtime(true) - $start_time). " seconds."; }


Chúc các bạn thành công!