PDF:

Tạo một nguồn nạp Atom với PHP
Nguồn cấp tin chung dễ dàng với PHP và MySQL
Brian M. Carey
Kỹ sư hệ thống cao cấp
Triangle Information Solutions
28 01 2011
Atom là một đặc tả XML xác định thông tin chứa trong một trang Web. Bằng cách sử dụng Atom,
các nhà phát triển Web tạo ra các nguồn nạp cho phép các nhà phát triển Web khác (hoặc
những người tiêu dùng sử dụng các trình đọc nguồn nạp (feed readers)) nhanh chóng định
vị và xem các thông tin quan tâm trên một địa chỉ ở xa. Hãy coi nó là một bảng chỉ mục các
trang Web, sẵn có để dùng cho bất cứ ai cần đến nó. Bằng cách sử dụng PHP, một ngôn ngữ đại
chúng được ưa dùng đối với phần lớn các nhà cung cấp máy chủ, một nhà phát triển Web có
thể dễ dàng tạo ra một nguồn nạp Atom và sau đó làm cho nó trở nên sẵn sàng cho các trình
đọc nguồn nạp khác nhau và các nhà phát triển Web khác. Kết quả cuối cùng là một giải pháp
thông tin hiện đại cho phép nội dung Web đến được với một phạm vi khán giả rộng rãi hơn.
Atom là gì?
Các từ viết tắt thường dùng
•
•
•
•
•
•
HTML: Ngôn ngữ Đánh dấu Siêu văn bản
RSS: Dịch vụ Nguồn cấp tin chung Đơn giản
SQL: Ngôn ngữ Truy vấn Có cấu trúc
URL: Mã định vị Tài nguyên Đồng nhất
XHTML: Ngôn ngữ Đánh dấu Siêu văn bản Mở rộng
XML: Ngôn ngữ Đánh dấu Mở rộng
Atom, như được sử dụng ở đây, là nói về một ngôn ngữ XML cho phép các nhà xuất bản góp vào
nguồn cấp tin chung (syndicate) nội dung trang Web của họ cho những người tiêu dùng khác nhau.
Bằng cách sử dụng Atom, các nhà xuất bản có thể tạo ra một nguồn nạp theo một định dạng tiêu
chuẩn hóa. Nguồn nạp này cho phép người sử dụng đọc được nội dung của các trang Web bằng
phần mềm được biết với tên trình đọc nguồn nạp. Nó cũng cho phép các nhà phát triển Web xuất
bản các nội dung từ nguồn nạp lên các trang Web của chính họ.
Atom hoàn toàn không phải là chuẩn nguồn cấp tin chung duy nhất thông dụng ngày nay. RSS là
một định dạng nữa được chuẩn hóa (cũng bằng cách sử dụng XML) và ra đời trước Atom. Trên thực
tế Atom được tạo ra để đáp ứng lại các hạn chế nhất định trong RSS.
© Copyright IBM Corporation 2011
Tạo một nguồn nạp Atom với PHP
Nhẫn hiệu đăng ký
Trang 1 của 13
developerWorks®
ibm.com/developerWorks/vn/
Kết quả là, đặc tả kỹ thuật Atom có nhiều ưu điểm hơn RSS. Atom cung cấp một phương tiện để
định nghĩa khuôn dạng của dữ liệu được cung cấp — thí dụ như HTML, XHTML, v.v...— trong khi
RSS thì không. Không như RSS, Atom hỗ trợ việc quốc tế hoá với thuộc tính xml:lang attribute.
Atom cũng chấp nhận nhiều khuôn dạng ngày tháng hiện đại hơn (và tiêu chuẩn hóa), dựa trên bản
Yêu cầu Góp ý (RFC - Request for Comments) 3339 phân biệt với RFC 822 của RSS.
Tại sao lại là PHP với Atom?
PHP là viết tắt của PHP: Hypertext Processor. Có thể đó là từ viết tắt duy nhất bằng tiếng Anh
mà khi viết đầy đủ vẫn còn từ viết tắt ban đầu. Ý nghĩa lịch sử ở đây là PHP lúc đầu là viết tắt từ
Personal Home Page (Trang nhà của cá nhân).
PHP là một ngôn ngữ kịch bản lệnh tạo ra nội dung động, ở phía máy chủ. Nó làm việc một cách
hài hòa với HTML, và mã PHP thường xuyên được nhúng vào các trang Web HTML thông thường
để tạo các điều kiện cho nội dung động.
PHP cũng làm việc vô cùng tốt với MySQL, một hệ quản trị cơ sở dữ liệu. Qua nhiều năm phát triển
Web, hai công nghệ này đã cùng tiến hoá và cùng làm việc sát cánh với nhau trong vô số dịp. Gần
như chắc chắn đó là do một nguyên nhân căn bản không thể phủ nhận: Cả hai đều miễn phí.
Để trả lời cho câu hỏi trên đầu phần này, PHP cung cấp cho các nhà phát triển tính linh hoạt của
việc tạo ra nội dung động với một cách thức dễ đọc và dễ phát triển. Nội dung động được lấy ra từ
một cơ sở dữ liệu MySQL. Trang kết quả xuất ra nguồn nạp) được viết mã bằng cách sử dụng PHP
sao cho nó biểu hiện một đầu ra XML theo đúng đặc tả Atom.
Chú ý rằng các giải thích trong bài viết này được viết với giả định rằng bạn đã quen với các kiến
thức cơ sở của MySQL và PHP. Nếu bạn chưa quen thì hãy xem các liên kết đến các hướng dẫn
nhập môn trong phần Tài nguyên của bài viết này.
Xác định ca sử dụng nghiệp vụ: Những mẩu chuyện câu cá
Sếp của bạn đang ở trong văn phòng. Ông thực sự thích kiểu cách mà trang Web của công ty
(fishinhole.com) đang hoạt động. Trang Web hiện đang tiếp thị và bán các loại đồ nghề câu cá cho
những người thích thú câu cá thể thao. Trang Web cũng cung cấp một diễn đàn cho những mẩu
chuyện câu cá, trong đó những người câu cá giải trí trao đổi những câu chuyện về cá của họ.
Sếp của bạn ngồi xuống (không hỏi han gì!) một chiếc ghế trong phòng làm việc của bạn và phàn
nàn rằng trang Web không trưng ra nội dung đủ rộng khắp. Ông muốn sử dụng phần những mẩu
chuyện câu cá của trang Web để “nhử mồi” (có ý chơi chữ ở đây) nhiều thêm những người câu cá
thể thao giải trí vào địa chỉ Web này. Ông nói với bạn rằng ông muốn bạn làm cho phần này của
trang Web thành một “cửa hàng một điểm dừng” dành cho những mẩu chuyện câu cá giải trí trên
khắp thế giới. Đó là điều cốt yếu cho sự thành công mà bạn đang có với fishinhole.com (hoặc ông
nói như vậy). Sếp của bạn xì xụp ly cà phê, mỉm cười, và ra khỏi văn phòng của bạn mà không nói
thêm gì nữa.
Bạn ngả người lên ghế và bắt đầu ngẫm nghĩ: Cái gì có thể làm cho diễn đàn những mẩu chuyện
câu cá được biết đến rộng hơn? Một lát sau ý tưởng đã đến với bạn: Nguồn cấp tin chung! Thay cho
Tạo một nguồn nạp Atom với PHP
Trang 2 của 13
ibm.com/developerWorks/vn/
developerWorks®
việc chỉ làm cho khu vực dành cho những mẩu chuyện câu cá sẵn sàng cho người sử dụng và những
người mua sắm tại fishinhole.com, bạn có thể đưa diễn đàn vào nguồn cấp tin chung sao cho mọi
người có thể đọc tóm tắt của những mẩu chuyện câu cá bằng trình đọc nguồn nạp của họ. Các nhà
phát triển Web khác chắc cũng phải gộp thêm nguồn nạp cấp tin chung vào trang Web của chính
họ. Dù trường hợp nào thì mọi người cũng sẽ nhấn chuột lên các tiêu đề những mẩu chuyện được
quan tâm và sẽ được liên kết trở lại fishinhole.com, nơi mà bạn có thể trưng ra cho họ một hàng
rào tiếp thị trực tiếp các đồ câu cá. Đó đúng là một ý tưởng tuyệt vời.
Thiết kế cơ sở dữ liệu
Từ lâu trước khi sếp bước vào phòng làm việc của bạn, cơ sở dữ liệu của diễn đàn những mẩu
chuyện câu cá đã được thiết kế rồi. Hãy nhớ lại rằng phần dành cho những mẩu chuyện câu cá của
trang Web đã tồn tại rồi. Chỉ đơn giản là nó chưa được đưa lên nguồn cấp tin chung mà thôi.
Vậy có những thay đổi gì về cơ sở dữ liệu mà bạn cần thực hiện để đưa lên nguồn cấp tin chung
các nội dung của nó? Chẳng phải làm gì cả! Đó là một trong những điều tuyệt vời về nguồn cấp
tin chung. Trong phần lớn các trường hợp, bạn có thể đưa lên nguồn cấp tin chung các bài viết
mà không phải thay đổi sơ đồ nằm dưới hay mô hình dữ liệu của bạn. Đó là do trong phần lớn các
trường hợp, bạn sẽ đưa lên nguồn cấp tin chung các bài viết, và chúng hầu như luôn sẵn có thông
tin mà đặc tả Atom yêu cầu.
Liệt kê 1 cho thấy mô hình cơ sở dữ liệu hiện được sử dụng trong phần những mẩu chuyện câu cá
của fishinhole.com. Nó cũng chứa vài lệnh INSERT (chèn thêm bản ghi) để bạn có dữ liệu kiểm thử.
Liệt kê 1. Cấu trúc bảng REPORTS (Các mẩu chuyện) với các lệnh INSERT
CREATE TABLE IF NOT EXISTS `reports` (
`ID` bigint(20) NOT NULL auto_increment,
`AUTHOR` varchar(32) NOT NULL,
`TITLE` varchar(64) NOT NULL,
`SUBTITLE` varchar(128) NOT NULL,
`CONTENT` varchar(2000) NOT NULL,
`POSTED` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
INSERT INTO `reports` (`id`, `author`, `title`, `subtitle`, `content`, `posted`) VALUES
(1, 'BigRed', 'Spanish Bite Looking Good!', 'Near the Cape!',
'Trolled for 3 hours and limited out on Spanish Macks! Watch out for the shallows
near green can #4.', '2009-05-03 04:54:33'),
(2, 'JonBoy', 'Big Rock Report', 'Spring has sprung',
'Caught several blackfins and mahi just outside of the Big Rock on Saturday.
We were using flourescent squid teasers with ballyhoo for hookups.
One Mahi weighed over 50#!', '2009-05-03 04:56:06'),
(3, 'Erasmus', 'Drum in the backwaters', 'The bite was hot!',
'Loaded up against the marsh grass, boys. Go get em. I was using gulp
with 1/4 ounce jigheads.', '2009-05-03 04:57:19'),
(4, 'ReelHooked', 'Speckled Trout In Old River', 'Limited out by noon',
'They were schooling heavy in Old River. They would eat anything we would
throw at them. Most were undersized, but we managed to keep some
and had our fill by midday.', '2009-05-03 04:59:00');
Tạo một nguồn nạp Atom với PHP
Trang 3 của 13
developerWorks®
ibm.com/developerWorks/vn/
Nếu bạn chuẩn bị thử nghiệm thực sự mã trình bày trong bài viết này, bạn có thể làm điều đó bằng
cách tạo ra một cơ sở dữ liệu MySQL tên là fishinhole và thi hành mã lệnh từ Liệt kê 1 trong cơ sở
dữ liệu đó.
Cột đầu tiên (ID - mã nh#n d#ng) là khoá chính của bảng. Chú ý rằng nó sử dụng đặc tả
auto_increment, do đó mỗi khi một hàng mới được chèn vào bảng, cột ID được điền bằng cách
tăng thêm giá trị cột ID của hàng đứng trước đó. Điều này tương tự như kiểu dãy (sequence) trong
một bảng Oracle.
Cột AUTHOR (tác giả) đơn giản là xác định tên người sử dụng của người đã đăng mẩu chuyện câu cá
đó. Đây là bút danh (screen name) của người sử dụng, để phân biệt với tên họ thật của người sử
dụng (trừ phi tên thật của người sử dụng cũng là bút danh).
Cột TITLE (tiêu đề) đơn giản là tiêu đề của bài viết. Tương tự như vậy, SUBTITLE (Phụ đề) là phụ đề
của bài viết và được sử dụng trong nguồn nạp Atom dùng để tóm tắt bài viết.
Cột CONTENT (nội dung) là chính những mẩu chuyện câu cá thực sự. Vì nguồn nạp Atom đã tạo ra
ở đây chỉ bao gồm một tóm tắt tổng thể bài viết (như vậy khuyến khích những người sử dụng nhấn
vào liên kết và truy cập trang Web), nội dung tự nó không được hiển thị trong nguồn nạp Atom.
Cuối cùng, cột POSTED (đã đăng) là một cột kiểu DATETIME (ngày giờ) lưu lại thời gian ngày giờ mà
bài viết được đăng trên trang Web.
Để đơn giản, tôi chỉ cung cấp một vài bài (4). Trong tình huống thực tế, sẽ có hàng nghìn bài viết
như thế này từ hàng trăm tác giả khác nhau.
Công việc bắt đầu
Bây giờ bạn đã có thiết kế cơ sở dữ liệu sẵn sàng, đã đến lúc viết mã trang PHP để nó tạo ra một
nguồn nạp Atom. Bài này sẽ hướng dẫn bạn qua các cơ sở về cách tạo ra một nguồn nạp Atom đơn
giản, bạn có thể kiểm thử bằng cách sử dụng PHP.
Xin lưu ý rằng nếu bạn muốn kiểm tra các mã lệnh này bạn cần phải có quyền truy cập một trình xử
lý PHP. Hầu hết các giải pháp cung cấp máy chủ đều cung cấp quyền truy cập như vậy. Bạn cũng có
thể có quyền truy nhập vào một trình cục bộ. Hãy tham khảo các quản trị viên hệ thống hoặc nhân
viên hỗ trợ kỹ thuật cần thiết để tìm ra cách bạn có thể chạy thi hành các tài liệu PHP trong môi
trường Web của bạn.
Truy cập cơ sở dữ liệu bằng PHP
Tạo ra một tệp tin PHP mới tên là syndication.php. Đó là nơi mà bạn sẽ đặt mã lệnh của mình.
Như trước đây đã đề cập đến, PHP và MySQL có một lịch sử phong phú làm việc với nhau vô cùng
tốt. Một số người còn đi xa đến mức nói rằng chúng đã kết hôn với nhau. Nhưng các phán xét như
vậy không nằm trong phạm vi bài này.
Liệt kê 2 cung cấp một đoạn mã cơ bản cho phép bạn truy cập vào cơ sở dữ liệu MySQL được tạo
ra bằng các mã lệnh từ Liệt kê 1.
Tạo một nguồn nạp Atom với PHP
Trang 4 của 13
ibm.com/developerWorks/vn/
developerWorks®
Liệt kê 2. Truy cập cơ sở dữ liệu MySQL bằng PHP
$link = mysql_connect('localhost', 'admin', 'password')
or die('Could not connect: ' . mysql_error());
mysql_select_db('fishinhole') or die('Could not select database');
$query = 'SELECT id,title,subtitle,author,posted
FROM reports order by posted desc limit 25';
;
$result = mysql_query($query)
or die('Query failed: ' . mysql_error());
Đoạn mã đó thực tế bao hàm khá nhiều thứ, vì vậy điều quan trọng là phải xem xét tỉ mỉ từng bước
một.
Đầu tiên là hàm mysql_connect(). Bạn cần thay đổi các tham số theo các đặc tả của môi trường của
chính bạn. Tham số đầu tiên là máy chủ cơ sở dữ liệu. Trong một số trường hợp, nó sẽ trông giống
như Liệt kê 2 (nghĩa là, localhost). Trong các trường hợp khác đó sẽ là một máy chủ từ xa (thí dụ,
địa chỉ IP 10.92.2.1). Đó cũng có thể là một tên máy chủ thực tế, giả sử rằng bạn có Hệ thống phân
giải tên miền (DNS) (thí dụ, mysql.myhost.com).
Tham số thứ hai là tên của người sử dụng MySQL sẽ truy cập cơ sở dữ liệu. Bạn có thể sử dụng
admin, như đã chỉ ra, chỉ cần đó là một tài khoản hợp lệ trong môi trường MySQL của chính
bạn. Tham khảo tài liệu MySQL để tìm hiểu cách tạo ra các tài khoản dùng cho một cơ sở dữ
liệu MySQL. Hãy ghi nhớ rằng tài khoản dùng ở đây phải có quyền được phép đọc cơ sở dữ liệu
REPORTS.
Tham số thứ ba là mật khẩu của người sử dụng. Điều này cần để so khớp mật khẩu được dùng cho
người sử dụng đã xác định trong tham số thứ hai.
Mệnh đề or die được đưa vào để cung cấp cho nhà phát triển các thông tin chẩn đoán trong
trường hợp thất bại. Nếu một kết nối đến hệ quản trị cơ sở dữ liệu không thực hiện được, bạn sẽ
nhận được một thông báo cho biết kết nối đó thất bại và lý do thất bại khi kịch bản lệnh PHP được
thi hành.
Tiếp đến là hàm mysql_select_db(). Đây là nơi bạn thực sự chọn ra các cơ sở dữ liệu nào mà bạn
có kế hoạch sử dụng. Bản sao MySQL của chính bạn có thể (và rất có khả năng) chứa nhiều cơ sở
dữ liệu, do đó điều quan trọng là định rõ cơ sở dữ liệu nào bạn muốn sử dụng.
Hãy nhớ lại rằng tôi đã khuyên bạn tạo ra một cơ sở dữ liệu MySQL có tên là fishinhole nếu bạn
muốn kiểm tra các chức năng của phần mã đưa ra trong bài viết này. Dòng mysql_select_db() định
rõ rằng bạn sẽ sử dụng cơ sở dữ liệu đó.
Tiếp theo là truy vấn thực tế. Trong trường hợp này, bạn chỉ cần định nghĩa truy vấn trong một chuỗi
ký tự. Ở đây bạn nắm lấy các cột ID, TITLE, SUBTITLE, AUTHOR, và POSTED từ bảng REPORTS. Mệnh đề
order by posted desc buộc truy vấn phải trả về các hàng theo thứ tự giảm dần theo ngày tháng
trong cột POSTED (là ngày mà bài đó được đăng lên trang Web). Như vậy bạn lấy được trước tiên là
các bài viết mới nhất. Đây là một thói quen thực tế thông thường đối với các nguồn nạp.
Tạo một nguồn nạp Atom với PHP
Trang 5 của 13
developerWorks®
ibm.com/developerWorks/vn/
Mệnh đề limit 25 ở phía cuối là quan trọng. Đây là nơi bạn xác định rằng bạn muốn tối đa 25 bài
trả về đối với nguồn nạp này. Hãy nhớ lại rằng tôi đã đề cập trước đây là các diễn đàn chẳng hạn
như diễn đàn này có thể có hàng nghìn bài viết. Đơn giản là không thực tế khi trả về hàng nghìn
bài viết trong một nguồn nạp. Băng thông được sử dụng đáng kể, và hầu hết những người tiêu dùng
không còn đợi nữa sau một thời gian ngắn.
Truy vấn này là một chuỗi ký tự. Nó được gán cho một biến đặt tên rất trực giác là $query.
Trong hàm mysql_query(), bạn thực tế thi hành truy vấn được định nghĩa trong dòng trước đó. Kết
quả của truy vấn đó được lưu trong biến $result. Một lần nữa, mệnh đề or die có mặt nhằm mục
đích chẩn đoán.
Vòng lặp và đặc tả Atom
Bây giờ bạn đã có dữ liệu từ cơ sở dữ liệu, đã đến lúc bắt đầu hiển thị nó trong một định dạng theo
đúng đặc tả Atom. Do Atom là một ngôn ngữ XML, kết quả xuất ra của tệp tin PHP là ở định dạng
XML, chứ không phải định dạng HTML. Nếu bạn dự định sử dụng một trình duyệt Web để hiển
thị kết quả xuất đó thì chỉ cần ghi nhớ trong đầu rằng nó sẽ hiển thị theo một cách khác nhau, tùy
thuộc trình duyệt và phiên bản của bạn. Để xem kết quả xuất XML, thường tốt nhất là nhấn chuột
phải vào kết quả đó trong một trình duyệt và chọn View Source. Sau đó bạn sẽ nhìn thấy kết quả
xuất ra XML thô.
Trước khi hiển thị thông tin về mỗi bài viết, điều quan trọng là phải gộp thêm phần mở đầu
(preamble) vào nguồn nạp Atom. Đây là phần nhận dạng kết quả xuất ra như là một nguồn nạp
Atom và cung cấp các thông tin phù hợp về nguồn nạp, như trong Liệt kê 3.
Liệt kê 3. Phần mở đầu của Atom
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
<title>Fishing Reports</title>
<subtitle>The latest reports from fishinhole.com</subtitle>
<link href="http://www.fishinhole.com/reports/syndication.php" rel="self"/>
<updated><?php echo date3339(); ?></updated>
<author>
<name>NameOfYourBoss</name>
<email>[email protected]</email>
</author>
<id>
tag:fishinhole.com,2008:http://www.fishinhole.com/reports/syndication.php
</id>
Bạn có thể để ý thấy ngay rằng mã lệnh trong Liệt kê 3 trông không giống như PHP. Bởi vì nó phần
lớn không phải là PHP. Nó là kết quả xuất được chuẩn hóa, đòi hỏi ít về nội dung động.
Phần tử <feed> nhận dạng tài liệu XML này như là một nguồn nạp Atom. Vùng tên dùng để xác định
các phần tử được cung cấp như là một thuộc tính của phần tử <feed>. Bạn cũng sử dụng thuộc tính
xml:lang trên đây để quy định rằng đây là một tài liệu viết bằng tiếng Anh.
Phần tử <title> xác định một tiêu đề cho nguồn nạp tổng thể. Tương tự như vậy, phần tử
<subtitle> xác định một phụ đề cho nguồn nạp tổng thể này.
Tạo một nguồn nạp Atom với PHP
Trang 6 của 13
ibm.com/developerWorks/vn/
developerWorks®
Phần tử <link> xác định URL của tài liệu syndication.php này. Địa chỉ trong thí dụ làm việc trong
thế giới giả tưởng được mô tả trong bài này, nhưng trong đời thực nó không như vậy. Trên thực tế,
bạn có thể gộp vào một liên kết tạo ra kết quả xuất của nguồn nạp này.
Phần tử <updated> tạo ra một dấu thời gian (phù hợp với tiêu chuẩn 3339 RFC) nói cho người tiêu
dùng biết nguồn nạp này được cập nhật mới nhất vào thời gian nào. Trong trường hợp này, do
nguồn nạp sẽ luôn cập nhật vì nó lấy dữ liệu mới nhất từ cơ sở dữ liệu, bạn sử dụng dấu thời gian
hiện tại. Và bạn có thể nhận thấy rằng có một đoạn nhỏ các mã PHP trong phần tử này. Đó là một
hàm PHP được xây dựng theo nhu cầu, nó tạo ra một dấu thời gian ở định dạng RFC 3339.
Phần tử <author> định nghĩa tác giả của nguồn nạp tổng thể. Bạn sẽ sử dụng tên sếp của bạn như là
tác giả vì đó là ý tưởng của ông.
Cuối cùng, phần tử <id> xác định duy nhất nguồn nạp ở một định dạng mã nhận dạng tài nguyên
quốc tế hóa (IRI).
Liệt kê 4 là vòng lặp chính tạo ra các mục trong nguồn nạp Atom. Phần lớn công việc để tạo ra
nguồn nạp được thực hiện ở đây.
Liệt kê 4. Vòng lặp
<?php
$i = 0;
while($row = mysql_fetch_array($result))
{
if ($i > 0) {
echo "</entry>";
}
$articleDate = $row['posted'];
$articleDateRfc3339 = date3339(strtotime($articleDate));
echo "<entry>";
echo "<title>";
echo $row['title'];
echo "</title>";
echo "<link type='text/html'
href='http://www.fishinhole.com/reports/report.php?
id=".$row['id']."'/>";
echo "<id>";
echo "tag:fishinhole.com,2008:http:
//www.fishinhole.com/reports/report.php?id=".$row['id'];
echo "</id>";
echo "<updated>";
echo $articleDateRfc3339;
echo "</updated>";
echo "<author>";
echo "<name>";
echo $row['author'];
echo "</name>";
echo "</author>";
echo "<summary>";
echo $row['subtitle'];
echo "</summary>";
$i++;
}
?>
Tạo một nguồn nạp Atom với PHP
Trang 7 của 13
developerWorks®
ibm.com/developerWorks/vn/
Một lần nữa, Liệt kê 4 trình bày khá nhiều về nền tảng. Đầu tiên, đó là vòng lặp while. Về cơ bản,
phần mã này nói theo ngôn ngữ thường ngày, rằng “cho đến khi mà các hàng trong bảng còn chưa
được đưa hết vào trong kết quả xuất ra, hãy đi tiếp”. Hàng hiện tại trong mỗi lần lặp được lưu trong
một biến PHP, được đặt tên theo trực giác là $row (hàng).
Sau đó bộ đếm ($i) được kiểm tra. Nếu bộ đếm nhiều hơn 0 thì có nghĩa ít nhất đây là lần lặp thứ
hai. Trong trường hợp đó, cần phải đóng lại phần tử <entry> của lần lặp trước đó.
Hai dòng tiếp theo lấy ra ngày viết bài (từ cột POSTED) và chuyển đổi thành định dạng RFC 3339
bằng cách sử dụng hàm nói trên.
Tiếp theo, phần tử <entry> được bắt đầu. Theo sau là phần tử <title> mà được đưa vào từ cột
TITLE ở hàng hiện hành.
Phần tử <link> bất thường ở chỗ nó không chứa bất kỳ văn bản con nào. Thay vào đó, liên kết
thực tế được coi như là một thuộc tính. Đây là một phần của chuẩn Atom. Liên kết này đơn giản trỏ
người sử dụng đến URL mà người sử dụng có thể đọc được toàn bộ bài viết. Hãy nhớ lại rằng nguồn
nạp chỉ cung cấp một bản tóm tắt cho người sử dụng.
Phần tử <id> tương tự với phần tử mô tả trước đó. Nó xác định duy nhất phần tử này ở định dạng
IRI. Và, như trước đây, nó được xây dựng nên từ URL liên quan.
Phần tử <updated> chứa giá trị DATETIME (ở định dạng RFC 3339) từ cột POSTED. Hãy nhớ lại rằng
biến $articleDateRfc3339 cho tài liệu này được điền sớm hơn, trong lần lặp này.
Tiếp đến là phần tử <author>. Phần tử này, không như các phần tử khác (nhưng giống phần tử
<author> trong phần mở đầu) có các phần tử con. Đối với bài viết này, chỉ một trong những phần tử
con được dùng: tên tác giả. Tên tác giả được điền từ cột AUTHOR của hàng hiện tại.
Phần tử <summary> chứa các thông tin thu thập từ cột SUBTITLE của hàng hiện tại.
Cuối cùng, bộ đếm vòng lặp ($i) được tăng lên, và vòng lặp tiếp tục.
Tóm lại, đó là toàn bộ phần thân của mã lệnh kết hợp với việc tạo ra một tài liệu Atom từ bảng
REPORTS. Như bạn đã thấy, nó không phức tạp như tưởng tượng ban đầu.
Ngoài ra, phải ghi nhớ trong đầu là nhiều phần tử trong đặc tả Atom không được trình bày ở đây.
Bạn có thể dễ dàng bổ sung các phần tử đó bằng cách làm theo cùng một kiểu mẫu mà tôi đã mô
tả trong phần này của bộ mã. Để có nhiều thông tin hơn, xem phần Tài nguyên.
Hãy kiểm thử nó!
Bây giờ đến lúc thú vị: thử nghiệm!
Thay cho việc gõ lại (hay sao chép và dán) mọi thứ mà bạn trông thấy trong các liệt kê mã trên
đây, bạn có thể chỉ cần sử dụng tệp tin PHP có trong phần Tải về. Hãy sao chép tệp tin đó vào một
thư mục cục bộ và thực hiện các thay đổi cần thiết về cơ sở dữ liệu mà trước đây tôi đã mô tả (tên
Tạo một nguồn nạp Atom với PHP
Trang 8 của 13
ibm.com/developerWorks/vn/
developerWorks®
người sử dụng, mật khẩu, và máy chủ). Sau đó chép nó vào một cấu trúc tệp tin PHP mà có quyền
truy nhập đến cơ sở dữ liệu.
Khi bạn đã có tệp tin PHP ở đúng chỗ, khởi chạy trình duyệt của bạn và truy cập tệp tin của bạn như
sau: http://máy chủ của bạn/bối cảnh/syndication.php.
Như với bất kỳ giải pháp tùy chỉnh nào, bạn cần thay đổi các giá trị ở phần chữ in nghiêng cho hợp
với môi trường cụ thể của bạn.
Như tôi đã trình bày trước đây, các kết quả của bạn sẽ khác, tùy thuộc trình duyệt và phiên bản mà
bạn sử dụng. Một số trình duyệt hiện đại hơn phát hiện ra rằng đây là một nguồn nạp Atom và hiển
thị các kết quả tương ứng. Những trình duyệt khác hiển thị nó ở định dạng XML thô. Những trình
duyệt khác nữa có thể chẳng tạo ra cái gì vì tài liệu đó không phải là một tài liệu HTML chuẩn.
Nếu trình duyệt không hiển thị XML ở dạng thô, bạn có thể thực hiện được việc đó chỉ đơn giản
bằng cách nhấn chuột phải vào tài liệu và chọn View Source. Sau khi thực hiện bạn sẽ thấy một cái
gì đó tương tự như Liệt kê 5.
Liệt kê 5. Kết quả xuất ra (dạng tắt)
<?xml version='1.0' encoding='iso-8859-1' ?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
<title>Fishing Reports</title>
<subtitle>The latest reports from fishinhole.com</subtitle>
<link href="http://www.fishinhole.com/reports" rel="self"/>
<updated>2009-05-03T16:19:54-05:00</updated>
<author>
<name>NameOfYourBoss</name>
<email>[email protected]</email>
</author>
<id>tag:fishinhole.com,2008:http://www.fishinhole.com/reports</id>
<entry>
<title>Speckled Trout In Old River</title>
<link type='text/html' href='http://www.fishinhole.com/reports/report.php?id=4'/>
<id>tag:fishinhole.com,2008:http://www.fishinhole.com/reports/report.php?id=4</id>
<updated>2009-05-03T04:59:00-05:00</updated>
<author>
<name>ReelHooked</name>
</author>
<summary>Limited out by noon</summary>
</entry>
...
</feed>
Một cách khác để thử là kiểm tra lại nguồn nạp xem có hiệu lực không. Bạn có thể làm việc đó bằng
cách sử dụng một trong các trình xác nhận nguồn nạp Atom mà bạn có thể tìm thấy trong không
gian mạng. Một địa chỉ rất tốt để sử dụng là http://www.feedvalidator.org. Trang Web đó kiểm tra lại
các nguồn nạp ở định dạng Atom, RSS, và ngôn ngữ đánh dấu Keyhole (KML).
Các kết quả nghiệp vụ
Vì bạn thực hiện và triển khai nguồn nạp Atom của bạn, sẽ có hàng nghìn người câu cá thể thao giải
trí từ khắp nơi trên thế giới giờ đây đã được xem những mẩu chuyện câu cá trên trang Web của bạn.
Bạn sẽ nhận được hàng trăm liên kết đến từ các trang Web câu cá giải trí đang nhúng vào nguồn
Tạo một nguồn nạp Atom với PHP
Trang 9 của 13
developerWorks®
ibm.com/developerWorks/vn/
nạp Atom của bạn. Một số người câu cá thể thao giải trí thậm chí còn sử dụng các trình đọc nguồn
nạp để xem những mẩu chuyện đó hằng ngày.
Sếp bạn tạt vào phòng làm việc của bạn sau khi xem xét các báo cáo về lượng truy cập mới nhất.
Ông hài lòng với số lượt truy cập tăng thêm và với báo cáo số lượt khách đã tăng lên đến 10%.
Ông giơ ngón tay cái về phía bạn để tán thưởng, tợp ly cà phê của mình, và bước đi.
Kết luận
Đặc tả Atom là một phương tiện lý tưởng để đưa lên nguồn cấp tin chung các nội dung Web của
bạn. Bằng cách sử dụng PHP với MySQL, bạn có thể dễ dàng tạo ra một nguồn nạp Web theo đúng
chuẩn Atom và luôn được cập nhật do nó đọc trực tiếp từ cơ sở dữ liệu. Nguồn nạp này sau đó có
thể đọc được bằng một trình đọc nguồn nạp hoặc được nhúng trong các trang Web khác. Kết quả
cuối cùng là có một phạm vi trưng bày rộng hơn cho nội dung Web của bạn, và điều đó có nghĩa là
lượng khách truy cập nhiều hơn và, gần như chắc chắn là gia tăng thêm thu nhập của bạn.
Tạo một nguồn nạp Atom với PHP
Trang 10 của 13
ibm.com/developerWorks/vn/
developerWorks®
Các tải về
Mô tả
Tên
Kích thước
The PHP file used in this article
syndication.php
3KB
Tạo một nguồn nạp Atom với PHP
Trang 11 của 13
developerWorks®
ibm.com/developerWorks/vn/
Tài nguyên
Học tập
• Atom (chuẩn): Xem bài tổng quan Wikipedia về đặc tả Atom.
• RFC 4827: Tìm hiểu thêm về đặc tả Atom với các chi tiết về khuôn thức tài liệu dựa trên XML
mô tả các danh mục thông tin liên quan được biết như là các nguồn nạp.
• RFC 3339: Khám phá đặc tả quy cách ngày/giờ được Atom sử dụng.
• Hướng dẫn về PHP: Tìm hiểu các kiến thức cơ sở về PHP.
• Hướng dẫn về MySQL: Tìm hiểu cách tạo và sử dụng một cơ sở dữ liệu đơn giản bằng MySQL.
• Chứng nhận XML của IBM: Tìm ra cách làm thế nào để bạn có thể trở thành một Nhà phát
triển được IBM chứng nhận về XML và các công nghệ liên quan.
• Thư viện kỹ thuật XML: Xem vùng XML của developerWorks để có nhiều bài viết và mách
nước về kỹ thuật, các hướng dẫn, tiêu chuẩn, và các Sách đỏ của IBM.
• Các sự kiện và phát tin kỹ thuật của developerWorks: Theo sát công nghệ trong các phiên
này.
• Hiệu sách công nghệ: Duyệt tìm sách về XML, DocBook, và các chủ đề kỹ thuật khác
• Các bài phát thanh trên mạng của developerWorks: Nghe các bài phỏng vấn và thảo luận thú
vị dành cho các nhà phát triển phần mềm.
Lấy sản phẩm và công nghệ
• Các phiên bản đánh giá sản phẩm của IBM: Tải về hoặc khám phá dùng thử trực tuyến trong
Sandbox SOA của IBM và bắt tay thực hành các công cụ phát triển ứng dụng và các sản
phẩm phần giữa từ DB2®, Lotus®, Rational®, Tivoli®, và WebSphere®.
Thảo luận
• Các diễn đàn thảo luận vùng XML: Tham gia vào bất kỳ cuộc thảo luận nào liên quan đến
XML.
• Vùng XML của developerWorks: Chia sẻ suy nghĩ của bạn: Sau khi bạn đọc bài viết này, hãy
viết bình luận và suy nghĩ của bạn trong diễn đàn này. Các biên tập viên vùng XML điều hành
diễn đàn và chào đón dữ liệu nhập vào của bạn.
• Các blog của developerWorks: Xem các blog này và tham gia vào cộng đồng
developerWorks.
Tạo một nguồn nạp Atom với PHP
Trang 12 của 13
ibm.com/developerWorks/vn/
developerWorks®
Đôi nét về tác giả
Brian M. Carey
Brian Carey là một chuyên viên về các hệ thống thông tin, đặc biệt là xây dựng kiến
trúc, thiết kế và triển khai các ứng dụng Java doanh nghiệp
© Copyright IBM Corporation 2011
(www.ibm.com/legal/copytrade.shtml)
Nhẫn hiệu đăng ký
(www.ibm.com/developerworks/vn/ibm/trademarks/)
Tạo một nguồn nạp Atom với PHP
Trang 13 của 13