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