hn4u @ Last updated 21/11/04 22:42
Go to my homepage at http://4u.jcisio.com
Full version available at http://4u.jcisio.com/r/article616.htm

Hải Nam

Tạo ảnh thay đổi ngẫu nhiên

Trong bài này, tôi sẽ gới thiệu một cách tạo một ảnh mà nội dung của nó thay đổi ngẫu nhiên ở mỗi lần bạn xem nó. Khiến thức cần thiết là PHP và chỉ thị Apache (Apache directives).

Tạo file ảnh bằng PHP

Trước hết, bạn tạo một file script PHP có tên là star.php có nội dung như sau:

Mã lệnh (PHP)
<?
header('Cache-Control: no-cache, must-revalidate');
$img = array('lam_truong.jpg', 'hong_nhung.jpg', 'thu_hien.jpg');
$dir = 'data/';

$file = $img[rand(0, count($img)-1)];
$ext = strrchr($file, '.');
switch (
$ext)
{
    case
'.png':
       
header('Content-type: image/png');break;
    case
'.gif':
       
header('Content-type: image/gif');break;
    default:
       
header('Content-type: image/jpeg');break;
}
@
readfile($dir.$file);
?>

Trong đoạn mã trên, $img (dòng 3) là tên các file ảnh còn $dir (dòng 4) là tên thư mục chứa các file đó (nhưng không chứa star.php. Lệnh header tạo HTTP header với nội dung là không cache tấm ảnh đó (nếu browser cache thì sẽ không có ảnh mới).

Bây giờ, nếu bạn gọi star.php thì một ảnh bất kì trong 3 ảnh trên sẽ hiện ra. Thí dụ:

HTML
<img src="star.php">

Bạn cũng có thể làm cách khác, nhẹ nhàng hơn

Mã lệnh (PHP)
<?
header('Cache-Control: no-cache, must-revalidate');
$img = array('lam_truong.jpg', 'hong_nhung.jpg', 'thu_hien.jpg');
$dir = 'data/';

$file = $img[rand(0, count($img)-1)];
header('Location: http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/'.$dir.$file);
?>

Cách này chuyển định hướng đến thẳng tập tin ảnh. Ưu điểm của nó là đơn giản, thích hợp cho mọi loại file. Tuy nhiên, nó cũng có khuyết điểm là bạn không xử lí gì ở ảnh được (như đổi độ sáng, tạo watermark, đổi kích thước...), với lại vị trí để ảnh sẽ bị phát hiện.

Cấu hình Apache

Đổi kiểu file thành .jpg

Mặc dù làm xong bước trên là bạn đã có một tấm ảnh nội dung ngẫu nhiên, nhưng như thế là chưa hoàn thiện. Có nhiều trang web không cho bạn chèn đường dẫn trong thẻ IMG mà đuôi là .php (không phải file ảnh) - đây là lí do an toàn, nhất là khi dùng BBCode. Như vậy, bạn cần đối star.php thành star.jpg, tuy nhiên như vậy thì server sẽ không gọi module PHP để xử lí file này mà nó gửi thẳng đến browser. Vậy ta phải báo cho server biết là .jpg là file PHP.

Giả định là ta dùng Apache. Ta sẽ tạo file .htaccess trong thư mục chứa star.jpg với nội dung như sau:

Mã lệnh
AddType application/x-httpd-php .jpg

Tất nhiên, trong thư mục này không nên chứa file nào khác ngoài .htaccessstar.jpg, vì nếu có file .jpg nào đó là ảnh thật, PHP vẫn xử lí nó như là script PHP và tất nhiên là một thông báo lỗi.

Nếu dùng cách trên mà bị lỗi (có thể do phpsuexec), bạn có thể chuyển qua dùng modRewrite:

Mã lệnh
RewriteEngine on
RewriteRule star.jpg star.php

Chú ý là Apache của bạn phải có modRewrite mới dùng được. Thông tin cụ thể về modRewrite bạn có thể tìm thấy trong một bài khác.

Không cho truy cập vào dữ liệu

Bây giờ, bạn không muốn mọi người truy cập đến thư mục data của bạn (chứa các ảnh gốc). Bạn chỉ cần tạo file .htaccess trong thư mục data với nội dung:

Mã lệnh
Deny from all

File này ngăn cấm mọi truy cập từ browser (nhưng script của bạn vẫn truy cập được, vì nó đọc trực tiếp chứ không thông qua http).

Ngoài ra, bạn còn có thể bảo vệ ảnh của mình bằng cách ghi một dòng tương tự như © by hn4u.com vào góc ảnh. Điều này được hướng dẫn trong bài tạo watermark.


hainam4u @ Last updated 21/11/04 22:42
Go to my homepage at http://4u.jcisio.com