Thứ Tư, 14 tháng 8, 2013

Một số mẹo cải thiện tốc độ php

Đây là một số cách giúp bạn cải thiện tốc độ của php, ngoài ra bạn có thể tham khảo thêm tài liệu php cơ bản
- Sử dụng biến toàn cục thì chậm hơn 2 lần so với dùng biết cục bộ.
- Sử dụng biến cục bộ ko được định nghĩa thì chậm hơn 9-10 lần biến được định nghĩa trước.
- Định nghĩa biến toàn cục mà không sử dụng trong hàm thì cũng chậm hơn.
- Hàm được triệu gọi thì độc lập với các hàm ở trong lớp định nghĩa nó. Ví dụ sau khi sử dụng gọi hàm đó
, ta định nghĩa thêm vào vào lớp chứa hàm đó, thì tốc độ performance không thay đổi.
- Hàm được định nghĩa từ lớp thì chạy nhanh hơn hàm định nghĩa từ lớp cơ sở.
- Hàm có 1 tham số hoặc hàm có body rỗng thì tương đương với thực thi 7-8 lần phép toán $localvar++.
 Một hàm bình thường thì tương đương 15 lần phép toán $localvar++.
- Nếu khai báo chuỗi mà không có biến ở trong thì sử dụng ‘’ sẽ nhanh hơn dùng “”.
- Khi dùng Echo thì dùng phân cách bằng dấu , sẽ nhanh hơn bằng dấu .
-  Nếu có thể khai báo hàm tĩnh thì có thể tăng tốc độ lên 4 lần.
- Echo thì nhanh hơn Print.
- Sử dụng nhiều câu lệnh Echo thay vì Echo 1 chuỗi nối vào nhau.
- Đặt giá trị lớn nhất cho vòng lặp for trước, và ko đặt trong vòng lặp for.
- Hủy các biến bằng hàm unset() để giải phóng bộ nhớ sau khi sử dụng, đặc biệt là những mảng lớn.
- Tránh dùng các định nghĩa kiểu: __get, __set, __autoload.
- Tránh dùng hàm require_once().
- Sử dụng đường dẫn đầy đủ trong includes và requires.
- Nếu cần tính thời gian lúc code được thực thi, thì nên dùng $_SERVER['REQUEST_TIME'] thay vì time().
- Sử dụng biến cục bộ trong hàm thì nhanh hơn.
- Đoạn mã PHP thực thi thì sẽ chậm hơn 2-10 lần so với trang HTML tĩnh khi chạy Apache.
- Mã PHP được biên dịch lại mỗi lần, trừ khi các đoạn mã được cache. Cài đặt các sản phẩm cache PHP
cơ bản để tăng hiệu suất từ 25-100% qua việc giảm số lần biên dịch lại.
- Cách với tất cả khả năng có thể. Memcache là hệ thống cache đối tượng với hiệu suất cao để tăng tốc
 các ứng dụng web động bằng việc giảm số lần truy suất DB. Opcode cache thì rất hữu ích, giúp các đoạn
 mã không phải biên dịch lại sau mỗi lần request.
- Dùng trick để tính độ dài của chuỗi bằng hàm isset thay vì sử dụng hàm strlen().
Ví dụ:
1 if (strlen($foo) < 5) { echo ”Foo is too short”; }
2 if (!isset($foo{5})) { echo ”Foo is too short”; }
Dùng hàm isset() sẽ nhanh hơn dùng strlen() vì isset() sẽ không tính toán trường hợp lowercase.
- Viết ++$i thay cho $i++ sẽ nhanh hơn (3 opcodes so với 4).
- Không phải mọi thứ đều dùng hướng đối tượng, sẽ tốn bộ nhớ.
- Không phải cài đặt mọi dữ liệu bằng lớp, có thể dùng mảng cũng hữu ích.
- Không nên chia ra quá nhiều hàm, tận dụng sử dụng lại code.
- Chú ý sử dụng các hàm trong PHP : strncasecmp, strpbrk and stripos thay vì regex.
- Str_replace thì nhanh hơn preg_replace nhưng mà strtr thì nhanh hơn str_replace 4 lần.
- Tốt hơn nên dùng câu lệnh Select hoặc Switch thay vì nhiều câu lệnh if, else.
- Các biến lỗi sử dụng @ thì rất chậm.
- Bật Apache mod_deflate.
- Đóng kết nối DB sau khi dùng xong.
- $row[‘id'] thì nhanh gấp 7 lần $row[id].
- Hạn chế gửi Error messeage.
- Không dùng các hàm khi khai báo vòng lặp. Ví dụ: for($x=0; $x
- Sử dụng các hàm được định nghĩa trước.
- Profile code sẽ giúp ta có cái nhìn tổng quan nếu có hiện tượng thắt cổ chai.
- mod_gzip có sẵn trong module Apache sẽ nén dữ liệu, và giảm dữ liệu truyền đi tới 80%.
- Sử dụng foreach để duyệt các mảng, các tập. Các phần tử PHP4 là theo giá trị, hay hơn nhiều so với theo
 tham chiếu ở PHP5.
- Sử dụng mẫu thiết kế Singleton với các lớp PHP trong việc đào tạo lập trình PHP phức tạp.
- Sử dụng POST thay cho GET với tất cả các giá trị vì lý do performance của TCP/IP.
- Sử dụng các hàm kiểm tra kiểu dữ liệu thay vì dùng Biểu thức chính quy (Regular Expression).
- Dùng include/require thay cho include once/require once để đảm bảo opcode cache.
- Dùng proxy để truy cập các Web Services (XML hay JSON) từ các tên miền nước ngoài dùng XMLHTTP
 để tránh lỗi cross-domain.
- Dùng thông báo lỗi (E_ALL) trong quá trình debug.
- Đặt allowoverride của Apache là “none ” để cải thiện performance khi truy cập file/ thư mục.
- Khi xử lý dữ liệu XML, sử dụng Regular Expression thì nhanh hơn dùng DOM hoặc SAX.
- Dùng tham chiếu làm tham số cho hàm thì nhanh hơn dùng tham số bình thường.
- Dùng INSERT DELAYED nếu như ko cần biết thời gian đưa dữ liệu vào.
- Dùng một fileserver nhanh để chạy nội dung tĩnh (thttpd). Ví dụ: static.domain.com.
- Hạn chế dùng các câu SQL: SELECT *.
- Dùng các phép logic database: queries, joins, views, procedures.
- Khởi tạo các biến trước khi sử dụng.
- Dùng đường dẫn đầy đủ thay vì đường dẫn tương đối.
- Tăng 1 thuộc tính của đối tượng thì chậm hơn việc dùng biến cục bộ 3 lần. ($this->prop++).
- Dùng multiple-row INSERT để INSERT nhiều dữ liệu bằng 1 câu Query.

Thứ Ba, 13 tháng 8, 2013

Bài 12: Khái niệm cơ bản về Cookie và session trong PHP


Tiếp tục với loạt bài trong serial tài liệu php cơ bản, hôm nay mình sẽ giới thiệu đến các bạn về Cookie và Session.

Cookie và session là hai phương pháp sử dụng để quản lý các phiên làm việc giữa người sử dụng và hệ thống. Việc quản lý phiên làm việc này sẽ giúp bạn tạo ra sự chứng thực hiệu quả bởi việc xác nhận thông tin trước khi truy cập vào một phân vùng cố định. Ngoài ra, việc quản lý tốt phiên làm việc cũng giúp người truy cập cảm thấy dễ dàng sử dụng dịch vụ của trang web cho những lần truy cập sau. Bởi cớ chế quản lý phiên làm việc ghi nhận lại quá trình truy cập của người sử dụng khi họ thăm viếc trang web của bạn lần đầu.



1- Tổng quan về session:


Một cách khác quản lý người sử dụng là session. Session được hiểu là khoảng thời gian người sử dụng giao tiếp với 1 ứng dụng. Một session được bắt đầu khi người sử dụng truy cập vào ứng dụng lần đầu tiên, và kết thúc khi người sử dụng thoát khỏi ứng dụng. Mỗi session sẽ có được cấp một định danh (ID) khác nhau và nội dung được lưu trong thư mục thiết lập trong file php.ini (tham số session.save_path).
a- Thiết lập session:
Để thiết lập 1 session ta sử dụng cú pháp: session_start()
Đoạn code này phải được nằm trên các kịch bản HTML. Hoặc những lệnh echo, printf.
Để thiết lập 1 giá trị session, ngoài việc cho phép bắt đầu thực thi session. Chúng ta còn phải đăng ký 1 giá trị session. Để tiện cho việc gán giá trị cho session đó.
Ta có cú pháp sau: session_register("Name")

Ví dụ:


<?php
Session_start();
Session_register("username");
?>


b- Sử dụng giá trị của session:


Giống với cookie. Để sử dụng giá trị của session ta sử dụng mã lệnh sau:
Cú pháp: $_SESSION["name"]
$_SESSION["name"]
Với Name là tên mà chúng ta sử dụng hàm session_register("name") để khai báo.

Ví dụ:


Tạo trang session.php với nội dung sau:


<?php
session_start();
session_register("name");
$_SESSION["name"] = "Kenny Huy";
?>
<html>
<head>
<title>Test page 1</title></head>
<body>
<b><a href=session2.php>Click here</a></b>
</body>
</html>


Tạo trang session2.php với nội dung sau:


<?
session_start();
?>
<html>
<head><title>Result Page</title></head>
<body>
<?php
echo "Ten cua ban la <b>".$_SESSION["name"]."</b>";
?>
</body>
</html>


c- Hủy bỏ session:


Để hủy bỏ giá trị của session ta có những cách sau:
session_destroy() // Cho phép hủy bỏ toàn bộ giá trị của session
session_unset()// Cho phép hủy bỏ session .
Ví dụ:


Tạo trang session3.php với nội dung sau:


<?php
session_start();
session_destroy();
?>
<html>
<head>
<title>Test page 1</title></head>
<body>
<b><a href=session2.php>Click here</a></b>
</body>
</html>

2- Tổng quan về cookie:


Cookie là 1 đoạn dữ liệu được ghi vào đĩa cứng hoặc bộ nhớ của máy người sử dụng. Nó được trình duyệt gởi ngược lên lại server mỗi khi browser tải 1 trang web từ server.
Những thông tin được lưu trữ trong cookie hoàn toàn phụ thuộc vào website trên server. Mỗi website có thể lưu trữ những thông tin khác nhau trong cookie, ví dụ thời điểm lần cuối ta ghé thăm website, đánh dấu ta đã login hay chưa, v.v...
Cookie được tạo ra bởi website và gởi tới browser, do vậy 2 website khác nhau (cho dù cùng host trên 1 server) sẽ có 2 cookie khác nhau gởi tới browser. Ngoài ra, mỗi browser quản lý và lưu trữ cookie theo cách riêng của mình, cho nên 2 browser cùng truy cập vào 1 website sẽ nhận được 2 cookie khác nhau.


a -Thiết lập cookie:


Để thiết lập cookie ta sử dụng cú pháp:
Setcookie("tên cookie","giá trị", thời gian sống)
Tên cookie là tên mà chúng ta đặt cho phiên làm việc.
Giá trị là thông số của tên cookie.
Ví dụ:


Setcookie("username","admin", time() +3600)
Như ví dụ trên ta thấy với tên là username và giá trị là admin, có thời gian sống là 1 giờ tính từ thời điểm thiết lập.
Chú ý: Kịch bản cookie phải đặt trên mọi giá trị trả về bao gồm thẻ HTML và lệnh echo.
Kịch bản cookie phải đặt trên mọi giá trị trả về bao gồm thẻ HTML và lệnh echo.
b - Sử dụng cookie:
Để sử dụng lại cookie vừa thiết lập, chúng ta sử dụng cú pháp:
Cú pháp: $_COOKIE["tên cookies"]
Tên cookie là tên mà chúng ta thiết lập phía trên.
Ví dụ:


Tạo trang cookie.php với nội dung sau:


<?php
setcookie("name","Kenny Huy",time() + 3600);
?>
<html>
<head>
<title>Test page 1</title></head>
<body>
<b><a href=cookie2.php>Click here</a></b>
</body>
</html>


Tiếp tục tạo trang cookie2.php với nội dung sau:


<html>
<head><title>Result Page</title></head>
<body>
<?php
echo "Ten cua ban la <b>".$_COOKIE['name']."</b>";
?>
</body>
</html>


c- Hủy Cookie:


Để hủy 1 cookie đã được tạo ta có thể dùng 1 trong 2 cách sau:
+ Cú pháp: setcookie("Tên cookie")
Gọi hàm setcookie với chỉ duy nhất tên cookie mà thôi
+ Dùng thời gian hết hạn cookie là thời điểm trong quá khứ.
Ví dụ: setcookie("name","Kenny Huy",time()-3600);
Ví dụ:


Tiếp tục tạo trang cookie3.php với nội dung sau:


<?php
setcookie("name","Kenny Huy",time()-360);
?>
<html>
<head>
<title>Test page 1</title></head>
<body>
<b><a href=cookie2.php>Click here</a></b>
</body>
</html>



3- Tổng Kết:


Sau bài học này chúng ta đã nắm được cách điều khiển phiên làm việc giữa cookie và session. Sử dụng chúng trong từng trường hợp cụ thể. Từ đó có thể áp dụng để viết những ứng dụng nhỏ như kiểm soát người đăng nhập, làm giỏ hàng online,…..


Bài tập áp dụng:


Xây dựng website sử dụng tính năng session thỏa mãn những yêu cầu sau:
1- Tạo trang đăng nhập với username/password là : admin/vietchuyen. Nếu user đăng nhập thành công thì sẽ xuất ra dòng welcome, admin.
2- Tạo trang đăng xuất thoát khỏi phần quản trị

Bạn có thể tham gia các khóa học đào tạo lập trình của công ty cổ phần An Tâm Đức tại địa chỉ http://daotaolaptrinh.edu.vn

Một số ví dụ PHP hay về cUrl

Cách cơ bản để sử dụng hàm cURL

cURL là một hàm hay của PHP. Hàm này giúp ta lấy, chiết tách hay đọc nội dung một trang web khác ngay trên Server của chúng ta. Một thuận lợi lớn nhất mà hàm curl này mang lại đó là tốc độ, nhanh hơn rất nhiều so với hàm open file  gần gấp 3 lần. cURL được ví như một công cụ giao tiếp đa giao thức, giúp ta xem hoặc tải một địa chỉ Trước khi lướt qua các bài ví dụ, chúng ta nên xem lại cách tạo, gọi và thực thi một hàm curl nhé.
Một thủ tục cUrl hoàn chỉnh phải trải qua các bước sau:
$ch = curl_init(); //khai báo curl
curl_setopt($ch, CURLOPT_URL,"http://daotaolaptrinh.edu.vn"); // xác định địa chỉ cần thực thi
curl_setopt($ch, CURLOPT_POST, 1); // GET hay POST
// và các tham số khác ... dùng curl_setopt để dịnh giá trị cho mỗi tham số.
curl_exec ($ch); // thực thi curl
curl_close ($ch); // đóng curl để giải phóng vùng nhớ



Bạn có thể thiết đặt thêm 1 hoặc nhiều option nữa cho curl bằng curl_setopt. Các curl_setopt này phải được đặt trước curl_exec thì mới có hiệu lực.

Một số ví dụ PHP hay về cUrl

Trong mỗi ví dụ mình đều có comment, chắc là không cần phải giải thích thêm.

Đọc dữ liệu từ một url dưới dạng binary và lưu vào biến

<?php
// Vẫn như thường lệ, phải khai báo cái đã
$ch = curl_init("http://minhnhut.info/image.jpg);
// khai báo curl có kèm url
// tức đã set luôn CURLOPT_URL cho curl
if (! $ch) {
 die( "Lỗi trong quá trình khởi tạo cURL" );
}
// Chúng ta sẽ nhận trị trả về và nhận dưới dạng binary
// Dó đó ta phải set 2 option như sau
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
// Nếu không set như trên, bạn sẽ không nhận được gì
// khi curl được thực thi, tức giá trị NULL
// Chạy curl và lưu trị trả về vào $data
$data = curl_exec($ch);
// đóng kết nối
curl_close($ch);
// Lúc bây giờ $data đã lưu file ảnh vừa lây được từ
// url khai báo ban đầu
header("Content-type: image/jpeg");
// Định dạng ảnh là .jpg, do đó content-type như trên
// cũng không có gì quá khó hiểu
// xuất dữ liệu ra và trả về cho người duyệt web
print( $data );
?>

Trong ví dụ trên, chúng ta dùng curl để load một file ảnh từ địa chỉ và lưu nó vào biến $data. Cuối cùng ta xuất biến $data này ra, tức xuất file ảnh ra…  Nói nôm na, ta tải file ảnh về và xuất nó ra cho người dùng coi.

Upload file gián tiếp lên trang web khác

Giả sử ta có form sau:
<form enctype="multipart/form-data" action="somewhere.php" method="post">
    <input type="file" name="upfile">
    <input type="text" name="filename">
    <input type="text" name="description">
    <input type="submit" value="upload">
</form>


Vâng đây là một form dùng để upload file. Chúng ta có thể dùng curl để upload gián tiếp một file trên host của ta (máy chủ đang thực thi lệnh curl) lên máy chủ đích. Trước khi thực hiện ví dụ, ta cần chú trọng một số vấn đề trước khi làm thử thủ thuật này.
  1. giá trị name của thẻ input: “name=”
  2. Loại tệp tin của file sẽ dùng để upload phải phù hợp với loại tệp tin mà máy chủ đích yêu cầu, nếu không muốn bị máy chủ đích từ chói.
  3. Địa chỉ tuyệt đối đến nơi sẽ nhận dữ liệu từ form có thể suy ra từ chỗ “action=”
  4. <?php
    // địa chỉ đến file cần upload
       $uploadfile="/tmp/myimage.jpg";
    // và khai báo curl
    // địa chỉ ở đây bạn phải suy ra từ  thuộc tính
    // action của form, daotaolaptrinh.edu.vn chỉ là ví dụ
       $ch = curl_init("http://daotaolaptrinh.edu.vn/somewhere.php");
    // Đặt thuộc tính
    // trước hết là các biến cho gói dữ liệu POST
       curl_setopt($ch, CURLOPT_POSTFIELDS,
                   array('sampfile'=>"@$uploadfile",
                         'shoesize'=>'9',
                         'filename'=>"fake name for file"));
    // cài chế độ lấy nội dung trả về
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    // thực thi curl, đồng thời lưu trị trả về vào biến
       $postResult = curl_exec($ch);
    //đóng kết nối và xuất ra nội dung trang web trả về.
       curl_close($ch);
       print "$postResult";
    ?>

    Sử dụng Cookie Jar, lưu trữ cookie


    curl có một tính năng độc đáo là lưu trữ lại cookie trong quá trình thực thi lại thành một tệp tinh lưu trên host hiện hành. File cookie có thể dùng để nạp vào curl cho lần truy vấn sau, rất thuận tiện nếu trang web đích yêu cầu đăng nhập, hoặc làm một số hành động kiểm tra cookie.
    Thủ thuật này gồm 2 ví dụ. Ví dụ 1, lưu cookie với cookie jar:
    <?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookieFileName");
    curl_setopt($ch, CURLOPT_URL,"http://daotaolaptrinh.edu.vn/login.php");
    // ví dụ thôi nhá =,=
    curl_setopt($ch, CURLOPT_POST, 1);
    // thiết lập POST, và nội dung gói dữ liệu POST
    curl_setopt($ch, CURLOPT_POSTFIELDS, "UserID=admin&password=123456");
    curl_exec ($ch);
    // và đừng quên đóng curl lại
    curl_close ($ch);
    ?>


    Đoạn code trên sẽ truy cập vào daotaolaptrinh.edu.vn với username là admin và 123456 là mật khẩu (giả sử). Sau đó nó sẽ lưu toàn bộ cookie minhnhut.info thiết lập vào file cookieFileName. Mọi chuyện diễn ra khá đơn giản.
    Tiếp theo là ví dụ 2, ta sẽ sử dụng lại file cookie từ ví dụ 1.
    <?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    // dùng lại file cookie đã lưu
    curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookieFileName");
    // giả sử dashboard.php là trang mật, chỉ khi đã đăng nhập mới có
    // quyền truy cập
    curl_setopt($ch, CURLOPT_URL,"http://daotaolaptrinh.edu.vn/dashboard.php");
    //thực thi
    $data = curl_exec($ch);
    // đóng
    curl_close ($ch);
    // xuất ra nội dung dashboard.php đã truy cập
    echo htmlentities($data);
    Ở ví dụ 2 trên ta giả sử dashboard.php được bảo vệ bằng mật khẩu, ở ví dụ 1 ta đã đăng nhập và lưu lại cookie, ở ví dụ 2 ta dùng lại cookie cũ tức đã được xác nhận là đã đăng nhập, dó đó curl sẽ có thể truy cập được nội dung dashboard.php trên daotaolaptrinh.edu.vnn
    Bạn có thể xem tài liệu php cơ bản hoặc tham gia khóa học php tại công ty An Tâm Đức http://daotaolaptrinh.edu.vn