Hướng dẫn dùng binary diff trong PHP

Khi compile module PHP trên Linux, bạn thường xuyên phải sử dụng 2 chương trình phổ biến của phiên bản PHP là: phpizephp và config. Vậy 2 chương trình này là gì và sử dụng chúng như thế nào? Hãy cùng Bizfly Cloud tham khảo bài viết sau đây.

1. phpize 

Đôi khi, sử dụng pecl installer sẽ không phải là lựa chọn của bạn bởi vì bạn đang đứng sau firewall hoặc có thể do tiện ích bạn muốn cài đặt không có sẵn dưới dạng gói tương thích PECL, chẳng hạn như extension chưa được phát hành từ SVN. Nếu bạn cần xây dựng một phần mở rộng như vậy, bạn có thể sử dụng các lower-level build tools để thực hiện việc xây dựng theo cách thủ công.

Lệnh phpize được sử dụng để chuẩn bị build environment cho một PHP extension. Trong ví dụ sau, các nguồn cho một phần mở rộng nằm trong một thư mục có tên là extname:

$ cd extname

$ phpize

$ ./configure

$ make

# make install

Một cài đặt thành công sẽ tạo ra extname.so và đặt nó vào extensions directory PHP. Bạn sẽ cần phải điều chỉnh php.ini và thêm một dòng extension=extname.so trước khi bạn có thể sử dụng extension.

Nếu hệ thống thiếu lệnh phpize, và các gói biên dịch sẵn (như RPM), hãy chắc chắn cài đặt phiên bản devel thích hợp của gói PHP vì chúng thường bao gồm lệnh phpize cùng với các header files thích hợp để xây dựng PHP và extensions.

Thực thi lệnh phpize --help để hiển thị thông tin sử dụng bổ sung.

2. php-config

php-config là một shell script đơn giản để lấy thông tin về cấu hình PHP đã cài đặt.

Khi  compiling các extensions, nếu bạn đã cài đặt nhiều phiên bản PHP, bạn có thể chỉ định cài đặt nào bạn muốn bằng cách sử dụng tùy chọn --with-php-config trong khi cấu hình, chỉ rõ đường dẫn của tập lệnh php-config tương ứng.

Danh sách các lệnh sau giúp php-config script có thể được truy vấn bất cứ lúc nào bằng cách chạy php-config với -h switch:

Usage: /usr/local/bin/php-config [OPTION] 

Tùy chọn: 

--prefix [...]

--includes [...]

--ldflags [...]

--libs [...]

--extension-dir [...]

--include-dir [...]

--php-binary [...]

--php-sapis [...]

--configure-options [...]

--version [...]

--vernum [...]



Hướng dẫn dùng binary diff trong PHP

Chi tiết các tùy chọn dòng lệnh:

--prefix: Tiền tố thư mục nơi PHP được cài đặt, ví dụ: /usr/local.

--includes: Danh sách tùy chọn -I với tất cả các tệp bao gồm.

--ldflags: LD flag được compile bằng PHP

--libs: Các thư viện bổ sung mà PHP đã được compile cùng.

--extension-dir: Thư mục nơi các tiện ích mở rộng được tìm kiếm theo mặc định.

--include-dir: Tiền tố thư mục nơi tệp tiêu đề được cài đặt theo mặc định.

--php-binary: Đường dẫn đầy đủ đến php CLI hoặc CGI binary.

--php-sapis: Hiển thị tất cả các module SAPI có sẵn.

--configure-options: Tùy chọn cấu hình để tạo lại cấu hình của cài đặt PHP hiện tại.

--version: PHP version.

--vernum: Phiên bản PHP dưới dạng số nguyên.

>> Có thể bạn quan tâm: Hướng dẫn cách cài đặt MongoDB trên CentOS 7

BizFly Cloud là nhà cung cấp dịch vụ điện toán đám mây với chi phí thấp, được vận hành bởi VCCorp.

BizFly Cloud là một trong 4 doanh nghiệp nòng cốt trong "Chiến dịch thúc đẩy chuyển đổi số bằng công nghệ điện toán đám mây Việt Nam" của Bộ TT&TT; đáp ứng đầy đủ toàn bộ tiêu chí, chỉ tiêu kỹ thuật của nền tảng điện toán đám mây phục vụ Chính phủ điện tử/chính quyền điện tử.

Hi vọng với bài viết này, bạn đã hiểu rõ ứng dụng của hàm fread() trong PHP. Nếu bạn thấy bài viết hay và có ý nghĩa hãy like và chia sẻ bài viết này để mọi người cùng nhau học tập nhé. Cảm ơn các bạn đã ghé thăm codetutam.com

Cách đơn giản và thô sơ nhất là dùng toán tử so sánh của PHP (comparison operators). Tuy nhiên không nên dùng toán tử Equal (

 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
0) mà nên dùng toán tử Identical (
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
1). Bởi vì
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
0 không so sánh kiểu dữ liệu và có thể dẫn đến sai lệch trong việc so sánh. Ta hãy xem thử ví dụ sau:


  $input = 0;
  if('defaultpassword' == $input){
   echo 'true';
  } else {
   echo 'false';
  }
?>

Viết ngắn sử dụng toán tử 3 ngôi (ternary operator):

 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>

Mặc dùng

 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
3 và
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
4 hoàn toàn khác nhau nhưng kết quả trả về là
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
5 thay vì
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
6. Bởi vì khi PHP sẽ ngầm định ép kiểu về
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
7 để so sánh, và ép kiểu chuỗi ‘defaultpassword’ về kiểu float thì nó sẽ ra kết quả như sau:
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
8 Xem thêm

Do đó khi so sánh 2 chuỗi

 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
9 và
 

echo ('1e3' == '1000') ? 'true' : 'false';
?>
0 bằng phép toán
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
0 ta được kết quả là true.

 

echo ('1e3' == '1000') ? 'true' : 'false';
?>

Nhưng nếu dùng toán tử === ta sẽ được kết quả là false:

 

echo ('1e3' === '1000') ? 'true' : 'false';
?>

Do

 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
9 tương đương
 

echo ('1e3' == '1000') ? 'true' : 'false';
?>
0 nếu như convert sang kiểu
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
7. Vì vậy tốt hơn hết là ta dùng toán tử Identical (
 

$input = 0;
echo ('defaultpassword' == $input) ? true : false;
?>
1) để so sánh hai chuỗi.

Sử dụng hàm strcmp()

 

echo ('1e3' == '1000') ? 'true' : 'false';
?>
6 Nhận hai tham số
 

echo ('1e3' == '1000') ? 'true' : 'false';
?>
7 và
 

echo ('1e3' == '1000') ? 'true' : 'false';
?>
8 và trả về kết quả:

  1.  
    
    echo ('1e3' == '1000') ? 'true' : 'false';
    ?>
    9 nếu như
     
    
    echo ('1e3' === '1000') ? 'true' : 'false';
    ?>
    0
  2.  
    
    echo ('1e3' === '1000') ? 'true' : 'false';
    ?>
    1 nếu như
     
    
    echo ('1e3' === '1000') ? 'true' : 'false';
    ?>
    2
  3.  
    
    $input = 0;
    echo ('defaultpassword' == $input) ? true : false;
    ?>
    3 nếu như
     
    
    echo ('1e3' === '1000') ? 'true' : 'false';
    ?>
    4

Đây là một hàm binary-safe, tức là nhận dữ liệu đầu vào như dữ liệu thô mà không ngầm định kiểu dữ liệu. Và hàm strcmp chỉ so sánh nội dung của hai chuỗi mà không phải so sánh địa chỉ bộ nhớ và bỏ qua các ký tự đặc biệt. Lưu ý thêm là hàm này có phân biệt hoa thường, nhưng hàm

 

echo ('1e3' === '1000') ? 'true' : 'false';
?>
5 thì không.

Ví dụ: Hai chuỗi “string1” và “string1\0\n”, hiển nhiên là không giống nhau. Nếu dùng toán tử so sánh ở trên để kiếm tra thì tất nhiên kết quả trả về sẽ là ‘false’. Tuy nhiên nếu dùng hàm strcmp ta sẽ nhận được kết quả là true vì nội dung hai chuỗi này hoàn toàn giống nhau nếu bỏ đi ký tự đặc biệt trong PHP là \0 và\n. echo (strcmp(‘string1’, ‘string1\0\n’)) ? ‘true’ : ‘false’;

Nhưng lưu ý là PHP có một bug như sau: Nếu dùng strcmp để so sánh một array() và một chuỗi thì kết quả trả về vẫn là 0 (tức là hai “chuỗi” bằng nhau).

 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12

Mặc dù nó vẫn bung ra Warning như nó vẫn vượt qua vào được bên trong và in ra câu thông báo:”You successfully logged in”

Sử dụng hàm similar_text

 

echo ('1e3' === '1000') ? 'true' : 'false';
?>
6

Hàm similar_text nhận 3 tham số, 2 chuỗi đầu vào và một biến chứa kết quả trả về. Kết quả là số phần trăm giống nhau giữa hai chuỗi. Ví dụ:

 

similar_text("Hello World","Hello Hello",$percent);
echo $percent;
?>

Kết quả trả về là

 

echo ('1e3' === '1000') ? 'true' : 'false';
?>
7 Theo document của PHP, hàm này tính toán sự giống nhau giữa hai chuỗi được được mô tả trong sách Programming Classics: Implementing the World’s Best Algorithms by Oliver (ISBN 0-131-00413-1).

Tuy nhiên thứ tự của các tham số cũng khiến thay đổi kết quả trả về, và ví dụ dưới đây được báo cáo là một bug nhưng chưa được xác nhận

 

echo similar_text('test','wert'); // 1
echo similar_text('wert','test'); // 2 hay
$var_1 = 'PHP IS GREAT'; 
$var_2 = 'WITH MYSQL'; 

echo similar_text($var_1, $var_2); // 3
echo similar_text($var_2, $var_1); // 2
?>

Sử dụng hàm levenshtein

Hàm này ngược lại với hàm

 

echo ('1e3' === '1000') ? 'true' : 'false';
?>
8, nó sẽ trả về 0 nếu như hai chuỗi so sánh giống hệt nhau:

 
 
int levenshtein ( string $str1 , string $str2 )
int levenshtein ( string $str1 , string $str2 , int $cost_ins , int $cost_rep , int $cost_del ) 
?>

Hàm này tính khoảng cách levenshtein (hay còn gọi là Edit distance) giữa 2 dãy (sequence) và được đặt tên theo một nhà khoa học người Nga Vladimir Levenshtein người đã nghĩ ra ý tưởng này vào năm 1965. Khoảng cách levenshtein được tính bằng cách tính số lần xóa (deletions), thêm (insertions) và thay thế (substitutions) để chuyển chuỗi gốc (source) thành chuỗi đích (target).

Ví dụ: Khoảng cách Levenshtein giữa 2 chuỗi “kitten” và “sitting” là 3, vì phải dùng ít nhất 3 lần biến đổi.

  • kitten -> sitten (thay “k” bằng “s”)
  • sitten -> sittin (thay “e” bằng “i”)
  • sittin -> sitting (thêm kí tự “g”)
 
 
  echo levenshtein("kitten","sitting");//3
?>

Sử dụng hàm soundex

 

echo ('1e3' === '1000') ? 'true' : 'false';
?>
9

Hàm này sử dụng thuật toán ngữ âm (phonetic algorithm) để tính toán chỉ mục của các tự dựa trên cách phát âm của nó (theo tiếng Anh). Hàm này trả về một chuỗi 4 ký tự bắt đầu với một chữ cái. Thuật toán này được mô tả trong cuốn nổi tiếng The Art Of Computer Programming, vol. 3: Sorting And Searching”, Addison-Wesley (1973), pp. 391-392 của Donald Knuth.

Ví dụ: Trong MySQL có một hàm tương tự soundex. Ta có thể dùng hàm này để đưa ra tìm không gần đúng một keyword. Ta lưu trong database 1 trường soundex, để so sánh với keyword người dùng đưa vào:

 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
0

Sử dụng hàm metaphone

 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
1

Theo PHP document thì hàm này tương tự như soundex nhưng chính xác hơn vì dựa vào nguyên tắc phát âm cơ bản trong tiếng Anh. Và hàm này trả về một khóa có chiều dài thay đổi theo chiều dài của chuỗi đầu vào. Thuật toán này được phát triển bởi Lawrence Philips và được mô tả trong cuốn “Practical Algorithms for Programmers”, Binstock & Rex, Addison Wesley, 1995.

 
 
var_dump(metaphone('Catherine'));
var_dump(metaphone('Katherine'));
//string(5) "K0RN"
//string(5) "K0RN"
?>

Trong khi dùng hàm soundex sẽ trả về 2 kết quả khác nhau

 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
2 (Catherine) và
 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
3 (Katherine). Ở đây ta có thể thấy tại sao hàm
 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
4 được mô tả là chính xác hơn hàm
 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
5, theo nghĩa nó có ích hơn vì trên thực tế hai Katherine và Catherine đọc hoàn toàn giống nhau. Cũng tương tự như
 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
5, ta có thể sử dụng hàm
 

$pwd = isset($_GET[pwd]) ? $_GET[pwd] : '';
//tương đương $pwd = array();
 if ( strcasecmp( $pwd, 'password' ) == 0 ){
      echo 'You successfully logged in.';
}
?>
Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12
4 để tăng khả năng tìm kiếm trong database.