banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Hỏi sự khác nhau giữa các hàm lấy nội dung file  XML
  [Programming]   Hỏi sự khác nhau giữa các hàm lấy nội dung file 10/10/2008 03:17:53 (+0700) | #1 | 154637
[Avatar]
learn2hack
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 16:32:37
Messages: 825
Offline
[Profile] [PM] [WWW]
Chào mọi người, mình dùng PHP để lấy nội dung của 1 file remote, theo như mình biết thì có 3 cách làm:
- dùng hàm file_get_contents
- dùng fsockopen
- dùng curl

Đối với file_get_contents, mình thấy người ta hay sử dụng nhất. Tuy nhiên, mình test thử với 1 số host thì lúc được lúc không (phần lớn là được), VD với host https chẳng hạn là ko được. Mình tìm được http://www.howtogeek.com/howto/programming/php-get-the-contents-of-a-web-page-rss-feed-or-xml-file-into-a-string-variable/ 1 chú ý nhỏ, họ ghi là 1 số host vì lí do bảo mật đã chặn các hàm truy xuất đến file. Ở PHPManual cũng ko nói gì về hạn chế của hàm này. Vì thế mình muốn hỏi là ngoài việc bị host ngăn cấm như trên, hàm file_get_contents này còn bị hạn chế gì nữa ko, và trong những trường hợp nào khác thì nó ko dùng được?

Đối với fsockopen mình thử 1 VD lấy content của 1 file ở localhost mà cũng ko nổi, đây là VD mình làm gần như y nguyên trong PHPManual:

Code:
<?php
		$fp = fsockopen('localhost', 80, $errno, $errstr, 30);
		if (!$fp) {
			echo "$errstr ($errno)";
		} else {
			$out = 'GET /one.html HTTP/1.1\r\n';
			$out .= 'Host: localhost\r\n';
			$out .= 'Connection: Close\r\n\r\n';

			fwrite($fp, $out);
			$buffer = '';
			while (!feof($fp)) {
				$buffer .= fgets($fp, 4096);  <== Đây là dòng bị báo lỗi timeout
			}
			fclose($fp);
			echo $buffer;
		}
?>


Lỗi nhận được là:
Code:
Fatal error: Maximum execution time of 60 seconds exceeded in D:\xampp\htdocs\wrapper.php on line 19

Mình có search trên Google nhưng ko thấy có trả lời về lỗi này. Mình đoán là do config của server, nhưng ko biết chính xác. Hiện giờ mình dùng XAMPP, PHP 5. Mình muốn hỏi làm thế nào cho hàm này hoạt động và nó có hạn chế nào trong việc lấy nội dung file remote ko?
Blog: http://hontap.blogspot.com
Tải phần mềm miễn phí: http://www.taiphanmem.org
[Up] [Print Copy]
  [Question]   Hỏi sự khác nhau giữa các hàm lấy nội dung file 10/10/2008 04:31:45 (+0700) | #2 | 154646
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
Chào learn2hack,

learn2hack wrote:

...
Lỗi nhận được là:
Code:
Fatal error: Maximum execution time of 60 seconds exceeded in D:\xampp\htdocs\wrapper.php on line 19

Mình có search trên Google nhưng ko thấy có trả lời về lỗi này. Mình đoán là do config của server, nhưng ko biết chính xác. Hiện giờ mình dùng XAMPP, PHP 5. Mình muốn hỏi làm thế nào cho hàm này hoạt động và nó có hạn chế nào trong việc lấy nội dung file remote ko? 

Nhiều chỗ trả lời mà. Bạn thử tăng giá trị max_execution_time trong php.ini lên xem.
Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   Hỏi sự khác nhau giữa các hàm lấy nội dung file 10/10/2008 06:14:32 (+0700) | #3 | 154671
nbthanh
HVA Friend

Joined: 21/12/2001 14:51:51
Messages: 429
Offline
[Profile] [PM]

quanta wrote:
Chào learn2hack,

learn2hack wrote:

...
Lỗi nhận được là:
Code:
Fatal error: Maximum execution time of 60 seconds exceeded in D:\xampp\htdocs\wrapper.php on line 19

Mình có search trên Google nhưng ko thấy có trả lời về lỗi này. Mình đoán là do config của server, nhưng ko biết chính xác. Hiện giờ mình dùng XAMPP, PHP 5. Mình muốn hỏi làm thế nào cho hàm này hoạt động và nó có hạn chế nào trong việc lấy nội dung file remote ko? 

Nhiều chỗ trả lời mà. Bạn thử tăng giá trị max_execution_time trong php.ini lên xem. 

Không phải đâu quanta, vì data đang được lấy về qua đường socket, nên giả sử server set KeepAlive On thì sao? Lúc đó thì điều kiện EOF là không có xảy ra cho tới khi thời gian chờ đạt tới MaxKeepAlive.

Lấy data qua socket là cách low level nhất và dĩ nhiên là cũng...khó nhất smilie
Bạn learn2hack nên sử dụng CURL, dễ dùng hơn socket và hiệu quả thì hơn hẳn so với fopen hay file_get_content (hay các hàm tương tự về mở file trực tiếp).
[Up] [Print Copy]
  [Question]   Hỏi sự khác nhau giữa các hàm lấy nội dung file 10/10/2008 06:43:27 (+0700) | #4 | 154676
[Avatar]
canh_nguyen
Elite Member

[Minus]    0    [Plus]
Joined: 23/08/2004 18:55:09
Messages: 775
Location: Broken dream
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]

nbthanh wrote:

Không phải đâu quanta, vì data đang được lấy về qua đường socket, nên giả sử server set KeepAlive On thì sao? Lúc đó thì điều kiện EOF là không có xảy ra cho tới khi thời gian chờ đạt tới MaxKeepAlive.

Lấy data qua socket là cách low level nhất và dĩ nhiên là cũng...khó nhất smilie
Bạn learn2hack nên sử dụng CURL, dễ dùng hơn socket và hiệu quả thì hơn hẳn so với fopen hay file_get_content (hay các hàm tương tự về mở file trực tiếp). 


Đúng thế, l2h dùng thử CURL đi sẽ thấy nó "mạnh" hơn nhiều so với các function kia. Những thứ thường làm như post form, get data, header nó đều làm việc hiệu quả

Nhưng nhiều host nó disable nốt cả curl thì lại phải dùng mấy function kia smilie .

Nói chung là dùng nhiều cái để dễ bề ứng biến trong các host khác nhau smilie

http://rapidshare.com/files/129786961/curl_php_book_v2.1.rar
[Up] [Print Copy]
  [Question]   Re: Hỏi sự khác nhau giữa các hàm lấy nội dung file 10/10/2008 10:50:39 (+0700) | #5 | 154696
[Avatar]
learn2hack
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 16:32:37
Messages: 825
Offline
[Profile] [PM] [WWW]
Cảm ơn mọi người đã giúp đỡ smilie

Về phần fsockopen thì lỗi ko phải là cấu hình timeout như quanta chỉ, mình có chỉnh nó lên bao nhiêu thì nó vẫn cứ timeout. Nhưng mà cũng ko phải tại KeepAlive như anh nbthanh nói, em có tắt nó thành Off vẫn cứ gặp hiện tượng trên, thậm chí bỏ hẳn cả vòng lặp while, chỉ để 1 lệnh đọc file mà vẫn bị lỗi đó. Em cũng chưa tìm được nguyên nhân tại sao.

Em sẽ thử với cURL. Cám ơn anh canh_nguyen về cuốn sách. Thực ra ban đầu em tính để cURL cuối cùng, ko hỏi nhưng các anh gợi đến nó nên xử nó luôn vậy, nhưng mà hiện giờ chưa có câu hỏi về nó smilie.

Về hàm file_get_contents ở bên VNP có đưa ra 1 cách để host "bị hỏi thăm" ngăn chặn việc đọc file từ xa bằng cách thêm dòng code sau:

Code:
if(!$_SERVER["HTTP_ACCEPT_ENCODING"] && !$_SERVER["HTTP_ACCEPT_LANGUAGE"])
{
echo "Data Error!";
exit();
}


Em có chỗ thắc mắc này 1 chút: giả sử bên A request đến bên B, thì bên B có những cách nào chống lại lấy thông tin như vậy theo từng cách trong 3 cách trên (VD như trên là 1 cách chống file_get_contents)?
Blog: http://hontap.blogspot.com
Tải phần mềm miễn phí: http://www.taiphanmem.org
[Up] [Print Copy]
  [Question]   Re: Hỏi sự khác nhau giữa các hàm lấy nội dung file 10/10/2008 13:20:29 (+0700) | #6 | 154708
nbthanh
HVA Friend

Joined: 21/12/2001 14:51:51
Messages: 429
Offline
[Profile] [PM]
@learn2hack: Manual của PHP cũng có nói về vấn đề này đó bạn http://vn.php.net/feof
Toàn bộ vấn đề là do phía server, và trong đó phần lớn là do KeepAlive và/hoặc cấu hình của webserver.
[Up] [Print Copy]
  [Question]   Re: Hỏi sự khác nhau giữa các hàm lấy nội dung file 11/10/2008 04:21:54 (+0700) | #7 | 154762
incous
Member

[Minus]    0    [Plus]
Joined: 08/07/2004 16:22:37
Messages: 2
Offline
[Profile] [PM]
thay lại ' bằng " đi bro
thêm nữa là nên dùng HTTP/1.0 thay cho HTTP/1.1

[Up] [Print Copy]
  [Question]   Re: Hỏi sự khác nhau giữa các hàm lấy nội dung file 11/10/2008 16:32:36 (+0700) | #8 | 154818
[Avatar]
learn2hack
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 16:32:37
Messages: 825
Offline
[Profile] [PM] [WWW]
@nbthanh: cám ơn anh, em sẽ tìm hiểu kĩ hơn xem server dính vào vấn đề gì. Hiện giờ em mới test với localhost mà ko biết cấu hình ra sao cho nó chạy được smilie.

@incous: cám ơn bạn đã nhắc, chỗ code đó mình copy lại cho nhanh nên ko sửa smilie. Còn tại sao lại dùng HTTP/1.0 cũ thay cho bản 1.1 mới hơn vậy bạn?
Blog: http://hontap.blogspot.com
Tải phần mềm miễn phí: http://www.taiphanmem.org
[Up] [Print Copy]
  [Question]   Re: Hỏi sự khác nhau giữa các hàm lấy nội dung file 12/10/2008 05:14:12 (+0700) | #9 | 154900
mediocre-ninja
Member

[Minus]    0    [Plus]
Joined: 06/10/2008 17:56:32
Messages: 26
Offline
[Profile] [PM] [MSN]

Chào mọi người, mình dùng PHP để lấy nội dung của 1 file remote, theo như mình biết thì có 3 cách làm:
- dùng hàm file_get_contents
- dùng fsockopen
- dùng curl
 

Bạn vẫn có thể dùng fopen để handle 1 file từ URL , và lọc lấy dữ liệu cũng không khó khăn gì.

[Up] [Print Copy]
  [Question]   Re: Hỏi sự khác nhau giữa các hàm lấy nội dung file 12/10/2008 08:12:04 (+0700) | #10 | 154919
[Avatar]
learn2hack
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 16:32:37
Messages: 825
Offline
[Profile] [PM] [WWW]
Hàm fopen cũng cùng 1 họ với hàm file_get_contents, nguyên tắc của chúng đều là sử dụng các hàm thao tác với file để lấy dữ liệu. Nếu như hàm fopen mà hoạt động thì file_get_contents cũng hoạt động và ngược lại. Mà thao tác với fopen thì qua nhiều bước hơn, nên người ta ít khi dùng nó mà thường dùng file_get_contents cho nhanh.
Blog: http://hontap.blogspot.com
Tải phần mềm miễn phí: http://www.taiphanmem.org
[Up] [Print Copy]
  [Question]   Re: Hỏi sự khác nhau giữa các hàm lấy nội dung file 12/10/2008 11:01:48 (+0700) | #11 | 154934
mediocre-ninja
Member

[Minus]    0    [Plus]
Joined: 06/10/2008 17:56:32
Messages: 26
Offline
[Profile] [PM] [MSN]

Hàm fopen cũng cùng 1 họ với hàm file_get_contents, nguyên tắc của chúng đều là sử dụng các hàm thao tác với file để lấy dữ liệu. Nếu như hàm fopen mà hoạt động thì file_get_contents cũng hoạt động và ngược lại. Mà thao tác với fopen thì qua nhiều bước hơn, nên người ta ít khi dùng nó mà thường dùng file_get_contents cho nhanh.
 

Hì, bồ nói không chính xác rồi. Hàm file_get_contents có thể lấy nội dung 1 file (text) vào 1 biến string, thực chất nó sử dụng fopen ở bên trong, phần implementation. Sử dụng fopen sẽ làm được hơn file_get_contents nhiều, chẳng hạn đọc file nhị phân (jpeg, gif,... ) và xử lý .

Lưu ý là chủ đề này đang thảo luận "SỰ KHÁC NHAU GIỮA CÁC HÀM LẤY NỘI DUNG FILE", nên việc nêu ra thiếu hàm có người đính chính là thường smilie , thảo luận kỹ thuật nên chú trọng về tính "chính xác" .

[Up] [Print Copy]
  [Question]   Re: Hỏi sự khác nhau giữa các hàm lấy nội dung file 12/10/2008 13:51:47 (+0700) | #12 | 154951
nbthanh
HVA Friend

Joined: 21/12/2001 14:51:51
Messages: 429
Offline
[Profile] [PM]

mediocre-ninja wrote:

Hàm fopen cũng cùng 1 họ với hàm file_get_contents, nguyên tắc của chúng đều là sử dụng các hàm thao tác với file để lấy dữ liệu. Nếu như hàm fopen mà hoạt động thì file_get_contents cũng hoạt động và ngược lại. Mà thao tác với fopen thì qua nhiều bước hơn, nên người ta ít khi dùng nó mà thường dùng file_get_contents cho nhanh.
 

Hì, bồ nói không chính xác rồi. Hàm file_get_contents có thể lấy nội dung 1 file (text) vào 1 biến string, thực chất nó sử dụng fopen ở bên trong, phần implementation. Sử dụng fopen sẽ làm được hơn file_get_contents nhiều, chẳng hạn đọc file nhị phân (jpeg, gif,... ) và xử lý . 

Manual của PHP có ghi rõ: hàm file_get_content là binary safe http://vn2.php.net/file_get_contents) nên nó hoạt động tốt với file nhị phân không có vấn đề gì cả.

mediocre-ninja wrote:
thảo luận kỹ thuật nên chú trọng về tính "chính xác" . 

Hoàn toàn đống ý, nên chú trọng về tính "chính xác" smilie (không biết có nguồn tài liệu nào chính xác hơn PHP manual không nhỉ? ^_^)
[Up] [Print Copy]
  [Question]   Re: Hỏi sự khác nhau giữa các hàm lấy nội dung file 13/10/2008 05:13:38 (+0700) | #13 | 155002
[Avatar]
learn2hack
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 16:32:37
Messages: 825
Offline
[Profile] [PM] [WWW]

mediocre-ninja wrote:

Hàm fopen cũng cùng 1 họ với hàm file_get_contents, nguyên tắc của chúng đều là sử dụng các hàm thao tác với file để lấy dữ liệu. Nếu như hàm fopen mà hoạt động thì file_get_contents cũng hoạt động và ngược lại. Mà thao tác với fopen thì qua nhiều bước hơn, nên người ta ít khi dùng nó mà thường dùng file_get_contents cho nhanh.
 

Hì, bồ nói không chính xác rồi. Hàm file_get_contents có thể lấy nội dung 1 file (text) vào 1 biến string, thực chất nó sử dụng fopen ở bên trong, phần implementation. Sử dụng fopen sẽ làm được hơn file_get_contents nhiều, chẳng hạn đọc file nhị phân (jpeg, gif,... ) và xử lý .

Lưu ý là chủ đề này đang thảo luận "SỰ KHÁC NHAU GIỮA CÁC HÀM LẤY NỘI DUNG FILE", nên việc nêu ra thiếu hàm có người đính chính là thường smilie , thảo luận kỹ thuật nên chú trọng về tính "chính xác" .

 

Cám ơn bạn đã góp ý. Thực ra nếu chúng ta thảo luận các hàm lấy nội dung file thông thường thì ngoài fopen, file_get_contents thì còn có 1 vài hàm khác thuộc cùng 1 họ này, chúng tất nhiên là có 1 số điểm khác nhau trong cách vận dụng. Tuy nhiên thảo luận về chúng sẽ khiến cho topic ko đi vào hướng mà mình nói tới ở bài post 1. Vì vậy chúng ta nên bàn về các phương thức, phương pháp lấy nội dung file remote thì có lẽ hợp lí hơn và thu được nhiều kết quả hơn. Tớ ko muốn vì cái tiêu đề mà chúng ta hơi cứng nhắc trong từng câu chữ.
Blog: http://hontap.blogspot.com
Tải phần mềm miễn phí: http://www.taiphanmem.org
[Up] [Print Copy]
  [Question]   Re: Hỏi sự khác nhau giữa các hàm lấy nội dung file 14/10/2008 00:00:16 (+0700) | #14 | 155083
[Avatar]
minhhangvt
Member

[Minus]    0    [Plus]
Joined: 04/07/2008 15:44:07
Messages: 23
Offline
[Profile] [PM]
Hiện nay tớ cũng đang tìm hiểu vấn đề này. Bạn nào có thể giúp mình nên bắt đầu tìm hiểu từ đâu ?
[Up] [Print Copy]
  [Question]   Re: Hỏi sự khác nhau giữa các hàm lấy nội dung file 21/10/2008 12:18:24 (+0700) | #15 | 155992
[Avatar]
learn2hack
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 16:32:37
Messages: 825
Offline
[Profile] [PM] [WWW]
Chào mọi người!

Trong quá trình làm với CURL, mình gặp 1 vấn đề như thế này. Mình dùng CURL để lấy nội dung của trang web sau:
Code:
https://www.laterooms.com/en/p4000/wl/Reservation.aspx?hid=89581&rid=4291854&r=1&n=1&d=2008-10-20&a=1&c=0&bt=Phone

tuy nhiên ko thành công. Có nghĩa là kết quả mình nhận được bằng CURL là 1 thông báo lỗi của nó:
Code:
We are really sorry, but for some reason it appears that we’ve encountered a problem.
Our technical team have been made aware of this, however if you would like to report this problem, with more details, please send us an email.

We suggest you try clicking the back button in your browser and trying again.

Còn nếu như click vào link đó từ browser thì nhận được trang web có nội dung.

Mình đã thiết lập các tham số của CURL khá đầy đủ, bao gồm cookie, wwwect, ssl như script dưới đây:
Code:
if (!empty($_REQUEST['site'])) {
	$site = $_REQUEST['site'];
	$agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3';
	$reffer = $_SERVER['PHP_SELF'];
	$cookie = 'cookie.txt';
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $site);
	curl_setopt($ch, CURLOPT_USERAGENT, $agent);
	curl_setopt($ch, CURLOPT_REFERER, $reffer);
	curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
	curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
	$content = curl_exec($ch);
	curl_close($ch);
	if (!empty($content)) {
		echo $content;
	} else {
		echo 'error';
	}
}

Mình đã thử dùng curl dạng command trên Linux cũng gặp lỗi tương tự.

Ko biết đó là nguyên nhân gì, tại sao dùng CURL lại ko lấy được nội dung trang web đó? Có ai gặp vấn đề này rồi xin chỉ giúp. Cám ơn rất nhiều.

PS: chú ý 1 tẹo, site trên dùng HTTPS và nó rewrite lại URL, mỗi lần truy cập vào link trên, nó sẽ cho bạn 1 url khác nhau.
Blog: http://hontap.blogspot.com
Tải phần mềm miễn phí: http://www.taiphanmem.org
[Up] [Print Copy]
  [Question]   Re: Hỏi sự khác nhau giữa các hàm lấy nội dung file 23/10/2008 08:40:10 (+0700) | #16 | 156219
[Avatar]
learn2hack
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 16:32:37
Messages: 825
Offline
[Profile] [PM] [WWW]
Hic, cuối cùng cũng phát hiện ra lỗi. Là do mình dùng ajax để gửi url và lấy nội dung. Trong quá trình gửi url thì bị lỗi do không mã hoá các kí tự meta. Search trên mạng ra http://www.vninformatics.com/forum/post/1023609120/Re-Ham-nao-trong-javascript-ma-hoa-chuoi-nhu-ham-HttpUtility-HtmlEncode-trong-ASP-Net.html?zone=4 khá hay, nhờ đó mà gửi được trọn vẹn url.
Thanks!
Blog: http://hontap.blogspot.com
Tải phần mềm miễn phí: http://www.taiphanmem.org
[Up] [Print Copy]
  [Question]   Re: Hỏi sự khác nhau giữa các hàm lấy nội dung file 26/10/2008 04:57:02 (+0700) | #17 | 156606
9x9=81??
Elite Member

[Minus]    0    [Plus]
Joined: 26/06/2005 12:23:59
Messages: 92
Offline
[Profile] [PM]
fosockopen, file_get_contents mỗi cái có cái lợi điểm của nó, tuỳ trường hợp mà vận dụng.

Nếu chỉ file text, trang web, hay file nào nhỏ nhỏ thì cứ dùng file_get_content cho nó tiện tuy hơi ít khả năng tuỳ chỉnh.

Nếu muốn lấy nội dung cỡ file lớn tầm 50 MB mà nhét vào 1 biến thông qua file_get_contents thì ko ổn chút nào, lúc đó chỉ nước dùng fsockopen để đọc từ từ rồi xử lý.


Còn chuyện max time excution thì cứ fang set_time_limit(60*60) ở đầu trang smilie
[Up] [Print Copy]
  [Question]   Re: Hỏi sự khác nhau giữa các hàm lấy nội dung file 30/11/2008 04:01:02 (+0700) | #18 | 160713
thanhtu300988
Member

[Minus]    0    [Plus]
Joined: 05/04/2008 03:44:53
Messages: 1
Offline
[Profile] [PM]
nếu trong 1 folder mà không có file " boot" thi khi nhập địa chỉ vào thì kết quả trả về là các file trong folder đó , vậy có cách nào get mã html của cái trang kết quả trả về đó ko , cụ thể là get html của 1 url là 1 folder .
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|