Archive for the ‘PHP’ Category

is_dir vs file_exists

Tuesday, March 17th, 2009

Hôm nay ở cty anh Linh đã hỏi có ai biết hàm kiểm tra thư mục đã tồn tại hay chưa không? (anh ấy đang làm cái liên quan đến theme thì phải :-? ). Theo phản xạ tôi bật ngay ra hàm is_dir, ngay lúc đấy chỉ biết hàm is_dir là kiểm tra xem tên truyền vào có phải là thư mục hay không, đúng như tên gọi của hàm: is_dir. Mà dù sao thì phải là thư mục thì mới tồn tại được chứ nhỉ? :D

Còn thằng ku Trường nó bảo dùng hàm file_exists. Lúc đó tôi cũng chẳng biết là file_exists có thể check exists cả file lẫn folder :”> Tuy nhiên cái cần nhấn mạnh ở đây là: tôi đã có lần từng dùng hàm file_exists để kiểm tra sự tồn tại của 1 fileluôn nhận được kết quả FALSE mặc dù file nó nằm chình ình ra đấy nên tôi khá e dè trong việc sử dụng hàm này. Khi phải check sự tồn tại của file hay thư mục thì tôi hay dùng is_fileis_dir.

Lúc đó cũng chí chóe 1 lúc nhưng lý do chính để bảo nên dùng is_dir thì tôi chẳng thế nhớ được. Đang bận làm nên không có thời gian search (nhớ không nhầm thì trong PHPVietnam cũng có nhắc đến => nó đây: http://groups.google.com/group/phpvietnam/browse_thread/thread/88631b0e7cec117/199d1957c9df6e73?lnk=gst&q=file_exists#199d1957c9df6e73)

Bây giờ test thử xem nào:

1
2
3
4
5
6
7
8
9
10
exec('chown mrkhanh test_dir');
 
if( file_exists('test_dir') )
{
    echo 'test_dir is existed.';
}
else 
{
    echo 'test_dir does not exist.';
}

Mới chạy thử trên host (bluehost) thì thấy nó chỉ hiện trang trắng, error 500 :”>
Để hôm nào test trên thằng Ubuntu vậy :-s

Nhưng mà PHP manual nói rồi, chẳng lẽ sai :-”

This function returns FALSE for files inaccessible due to safe mode restrictions. However these files still can be included if they are located in safe_mode_include_dir.

Còn đây là giải thích của anh pcdinh (Phạm Công Định):

file template được up lên với sở hữu của root trong khi apache lại chạy dưới 1 user khác.

Lấy bảng dự báo thời tiết

Friday, October 10th, 2008

Dễ lắm :D Ngày xửa ngày xưa thì dùng đoạn Javascript của bên Vnexpress.net. Nhưng giờ ít ai dùng cái đó nữa vì nó quá đơn giản. Thế nên sẽ lấy ở các nguồn khác thôi. Chung quy lại, là nên lấy của thằng Trung tâm khí tượng thủy văn Việt Nam (http://www.nchmf.gov.vn) là chuẩn nhất (chuyện, của Việt Nam mà :p)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* Get weather table
* @author Do Nam Khanh 
* @return string
*/
function _weather() {
	$content = file_get_contents('http://www.nchmf.gov.vn/website/vi-VN/43/Default.aspx');
 
	$strBegin 	= '<!-- Begin Display content -->';
	$strEnd 	= '<TD class="thoitiet_rightbox_ver"></TD>';
 
	$pos1 = strpos($content, $strBegin);
 
	if(false === $pos1) {
		return '';
	}
	else {
		$pos2 = strpos($content, $strEnd);
		$content = substr($content, $pos1, ($pos2-$pos1));
		return strip_tags($content, '<table><tr><td><img>');
	}
}

Demo: http://halongtours.vn/demo

Một PHP class tạo file ZIP

Monday, September 15th, 2008

Tôi đang phải làm  chức năng nén/giải nén trong dự án hiện tại. Giải nén thì đã làm xong rồi, còn nén nữa là xong. Zip library của PHP hỗ trợ chức năng zip hơi bị kém, cái cơ bản nhất là cũng ngại phải viết => search & thấy class này khá nhẹ để nén 1 folder.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
	require ("zipfile.inc.php");
 
	$zipfile = new zipfile();
 
	rec_listFiles('myFolder');
 
	header("Content-type: application/octet-stream");
	header("Content-disposition: attachment; filename=zipfile.zip");
	echo $zipfile->file();
 
	function rec_listFiles( $from = '.')
	{
		global $zipfile, $filedata;
 
		if(! is_dir($from))
			return false;
 
		if( $dh = opendir($from))
		{
			while( false !== ($file = readdir($dh)))
			{
				// Skip '.' and '..'
				if( $file == '.' || $file == '..')
					continue;
				$path = $from . '/' . $file;
				if( is_dir($path) ) {
					$zipfile->add_dir($path);
					rec_listFiles($path);
				}
				else {
					$filedata = implode("", file($path));
					$zipfile->add_file($filedata, $path);
				}
			}
			closedir($dh);
		}
	}
?>

Tạm đáp ứng yêu cầu :)

Source: http://www.devco.net/archives/2005/05/24/creating_zip_files_with_php.php

PHP post_max_size issue

Thursday, September 11th, 2008

Hôm nay tôi gặp phải 1 “tình huống” khá là củ chuối. Phần upload file (thật ra là upload file để update lại các store – khá nhiều, hiện tại là 1500 store) có validate file size, file type. Tôi test “khá kỹ ” ở local & mọi thứ đều ổn. Thông số local của tôi như sau:

  • Windows XP/Vertrigo
  • post_max_size = 100M
  • upload_max_size = 20M

Khi up 1 file có dung lượng quá 20MB (<100MB) thì hệ thống hiện thông báo rất đẹp với nội dung là bạn đã upload quá dung lượng quy định bla bla…:-@

Thế nhưng sau khi request done trên PMS (project management system), bên test report lại là khi upload 1 file lớn hơn 16MB thì chẳng hiện gì cả, không lỗi & giống như tự F5 lại trang.

Xem phpinfo của môi trường trên testing thì như sau:

  • post_max_size = 8M
  • upload_max_size = 16M

Vậy là dung lượng vượt quá post_max_size rồi, và PHP đã làm thế này đối với đoạn code của tôi:

If the size of post data is greater than post_max_size, the $_POST and $_FILES superglobals are empty

Thế cho nên đoạn code:

1
2
3
4
$postMaxSize = int_get('post_max_size');
if($postMaxSize < $userFile['size']) {
//process error
}

chẳng hoạt động gì cả :( (
Trên php.net có 1 trick để xử lý trường hợp này:

This can be tracked in various ways, e.g. by passing the $_GET variable to the script processing the data, i.e.

, and then checking if $_GET['processed'] is set.

Và đây là đoạn code của tôi:

1
2
3
if(isset($_GET['processed']) && !count($_POST)) {
  die('Error message here...');
}

Chạy ngon ;)

Rất cảm ơn anh NBThanh (Nguyễn Bá Thành) đã giúp đỡ em khắc phục vấn đề này :)

Upgrade whois domain to v3.1

Thursday, August 28th, 2008

Lý do phải nâng cấp:
- Matbao.net đã thay đổi lại cấu trúc site của họ (thay đổi giao diện) nên phần parse data của mình sẽ không chính xác nữa.
- Dùng nsloop-up chỉ có thể check domain đó có hoạt động hay không, chứ không check được đã được mua hay chưa. Có thể chủ sở hữu đã mua nhưng chưa active domain :)

Những thay đổi:
Không có nhiều thay đổi trong phiên bản nâng cấp này ngoài:
- Get xml content thay cho html content.
- Chuẩn hóa các function theo camelCase.
- Bỏ php short tag, chuyển về <?php echo …;?> nếu có.

Todo:
Mặc dù kết quả nhận được từ matbao.net là dạng XML nhưng vẫn gặp khó khăn trong khâu parse XML. Dùng các libs có sẵn trong PHP như simpleXML, XMLparse… đều bị lỗi do syntax của file XML này không chuẩn cho lắm. Tạm thời tôi dùng preg_match để parse XML. Khi nào có điều kiện sẽ nghiên cứu cách parse XML mà không biết trước cấu trúc :D Có bác nào tốt bụng thì phát triển thêm hộ tôi với :p

Hướng dẫn nâng cấp:
- Download bản upgrade tại http://donamkhanh.com/download/whoisv3.1.php.txt http://donamkhanh.com/download/whoisv3.2.php.txt
- Sau khi download, rename file whoisv3.1.php.txt whoisv3.2.php.txt thành index.php, rồi ghi đè file index.php trong thư mục whoisv3 (nếu chưa có phiên bản 3.0 thì có thể download tại http://donamkhanh.com/download/whoisv3.tar.bz2)

Yêu cầu:
- Chmod quyền hợp lý (cho đọc ghi đối với file checked_domain.txt)
- Thông số allow_url_fopen trên host phải thiết lập bằng On.