PHP Socket và chú ý khi tạo HTTP Request
Đăng trong danh mục Web Programming bởi admin | Tags: curl, fsockopen, header, http, PHP, request, response, socket
Vừa làm một cái script nho nhỏ sử dụng socket trong PHP để request thăm dò tới một site. Trong quá trình viết đoạn script nho nhỏ này thì gặp một chút rắc rối trong quá trình send cái header lên web server, mình nghĩ nếu các bạn làm có thể sẽ bị dính cái này giống mình nên viết bài này chia sẽ tới cho các bạn nào có ý định sử dụng hàm fsockopen() để tạo một HTTP request.
Cách sử dụng fsockopen() thì khỏi bàn, mở PHP Manual là biết. đại khái là:
$fp = fsockopen('bloghoctap.com', 80, $errno, $errstr, 10);
$out = 'your request data here';
fwrite($fp, $out); //send request
$contents = '';
while (!feof($fp))
{
$contents .= fgets($fp, 4096); //get response
}
fclose($fp);
Như các bạn biết, để tạo một HTTP Request thì phải gởi cú pháp request của HTTP thì server sẽ response nội dụng. Tưởng như tạo request đơn giản nhưng các bạn cần cẩn thận với 2 chỗ này:
1> Mỗi header line kết thúc bằng ký tự xuống hàng “\r\n”. vd:
$out .= "GET / HTTP/1.1\r\n";
$out .= "Host: bloghoctap.com\r\n";
2> Để quá trình request-response diễn ra nhanh chóng, mình quan sát thấy nếu để giá trị ‘keep-alive’ ở dòng Connection trong header sẽ khiến script bị đứng và timeout, do đó, hãy sử dụng giá trị ‘Close’ để kết thúc connection trong quá trình send request.
$out .= "Connection: Close\r\n";
3> Lưu ý, đối với các request có phần body(thường là POST method), phần body thường nằm ngay sau dòng cuối cùng của Header, nếu chỉ sử dụng gắn thêm nội dung body vào phần header thì bạn sẽ bị lỗi Header, nếu trên IIS6 thì server sẽ response về Bad Request (Invalid Header Name), các bạn cần lưu ý là dòng Header cuối cùng phải kết thúc bằng “\r\n\r\n” chứ không phải chỉ có “\r\n”.
Ví dụ đầy đủ cho phần request:
$out = '';
$out .= "POST /somepagewithform HTTP/1.1\r\n";
$out .= "Host: bloghoctap.com\r\n";
$out .= "Connection: Close\r\n\r\n"; //very important, must be Close, not keep-alive and double \r\n
$out .= "postdata=testing&somename=123"
Hy vọng một chút chia sẽ này sẽ giúp được các bạn nếu lỡ đụng tới phải viết HTTP Request bằng fsockopen(). Và, nếu có điều kiện thì nên sử dụng cURL nhé, nó đơn giản hơn nhiều đó.
Bài viết liên quan:
2 Lời bình cho bài viết “PHP Socket và chú ý khi tạo HTTP Request”
Viết lời bình
Bình luận mới nhất
- Karaoke Vietnam - Ứng dụng Android đầu tay
"Em cũng đang định làm 1 app. Anh có thể cho em vài gợi ý về server và" - thang - [Slide] Hội thảo: Heavy Web Optimization – Front-end
"Trên blog cá nhân của mình cũng có những bài viết cho việc tối ưu hóa " - TMQuang - phpmailer gởi mail SMTP bằng Gmail/Google Apps
"mình muốn đính kèm theo tập tin thì sao nhỉ" - Hòa - Mạng xã hội và thị trường Châu Á
"@admin, "Còn về mô hình “" - Dior - Lưu dữ liệu đa ngôn ngữ trong Database
"@viet_it_pro, cau truy " - viet_it_pro - Lưu dữ liệu đa ngôn ngữ trong Database
"@Quang Huỳnh, Bài bình luậ" - viet_it_pro - [Slide] Hội thảo: Heavy Web Optimization – Front-end
"Anh ơi cho em hỏi, làm thế nào để nhận mail google bằng php, anh có th" - Đặng Trung Kiên - Làm IT nên đọc ebook của nhà xuất bản nào?
"@Lê Hoàng Dũng, Mình thấy" - quang - Thư viện Khoa học tổng hợp TPHCM
"cảm ơn bài viết, mặc dù đã sinh sống ở Saigon khá lâu , nay mình mới c" - NHUNG - phpmailer gởi mail SMTP bằng Gmail/Google Apps
"Chào anh Tuấn, tut của anh em đã đọc, cảm ơn anh đã chia sẻ. Tuy nhiên" - Trần Đình Trọng
Danh mục
- android (2)
- Business (24)
- Flash (1)
- Graphic Design (16)
- IT Guys (1)
- Javascript (9)
- Miscellaneous (58)
- Photography (9)
- PHP (38)
- Review sách (13)
- Search Engine Optimization (2)
- security (2)
- software (5)
- User Interface Design & Usability (8)
- Web Design (28)
- Web Programming (48)
Lưu trữ
- February 2012 (1)
- January 2012 (1)
- December 2011 (1)
- November 2011 (2)
- September 2011 (2)
- August 2011 (1)
- July 2011 (4)
- June 2011 (2)
- May 2011 (2)
- April 2011 (2)
- March 2011 (2)
- February 2011 (2)
- January 2011 (4)
- December 2010 (6)
- November 2010 (3)
- October 2010 (3)
- September 2010 (5)
- August 2010 (6)
- July 2010 (5)
- June 2010 (2)
- May 2010 (5)
- April 2010 (7)
- March 2010 (8)
- February 2010 (4)
- January 2010 (10)
- December 2009 (12)
- November 2009 (12)
- October 2009 (15)
- September 2009 (16)
- August 2009 (11)
- July 2009 (15)
- November 2008 (1)
- October 2008 (1)
- September 2008 (3)



April 15, 2010 at 4:56 pm
Không có set Content Length àh ?
[Reply]
April 16, 2010 at 7:44 am
Cảm ơn bồ, dài quá nên lược bỏ dòng Content-Length luôn
[Reply]