찾다
백엔드 개발PHP 튜토리얼PHP效能集合类源码

PHP效能集合类源码

Jun 13, 2016 am 11:45 AM
filefunctionparamreturnstring

PHP功能集合类源码

代码如下:

<?php/**  * 常用工具类  * author Lee.  艾妮 http://ini.iteye.com* Last modify $Date: 2012-8-23*/class Tool {	/**	 * js 弹窗并且跳转	 * @param string $_info	 * @param string $_url	 * @return js	 */	static public function alertLocation($_info, $_url) {		echo "<script type='text/javascript'>alert('$_info');location.href='$_url';</script>";		exit();	}		/**	 * js 弹窗返回	 * @param string $_info	 * @return js	 */	static public function alertBack($_info) {		echo "<script type='text/javascript'>alert('$_info');history.back();</script>";		exit();	}		/**	 * 页面跳转	 * @param string $url	 * @return js	 */	static public function headerUrl($url) {		echo "<script type='text/javascript'>location.href='{$url}';</script>";		exit();	}		/**	 * 弹窗关闭	 * @param string $_info	 * @return js	 */	static public function alertClose($_info) {		echo "<script type='text/javascript'>alert('$_info');close();</script>";		exit();	}		/**	 * 弹窗	 * @param string $_info	 * @return js	 */	static public function alert($_info) {		echo "<script type='text/javascript'>alert('$_info');</script>";		exit();	}		/**	 * 系统基本参数上传图片专用	 * @param string $_path	 * @return null	 */	static public function sysUploadImg($_path) {		echo '<script type="text/javascript">document.getElementById("logo").value="'.$_path.'";</script>';		echo '<script type="text/javascript">document.getElementById("pic").src="'.$_path.'";</script>';		echo '<script type="text/javascript">$("#loginpop1").hide();</script>';		echo '<script type="text/javascript">$("#bgloginpop2").hide();</script>';	}		/**	 * html过滤	 * @param array|object $_date	 * @return string	 */	static public function htmlString($_date) {		if (is_array($_date)) {			foreach ($_date as $_key=>$_value) {				$_string[$_key] = Tool::htmlString($_value);  //递归			}		} elseif (is_object($_date)) {			foreach ($_date as $_key=>$_value) {				$_string->$_key = Tool::htmlString($_value);  //递归			}		} else {			$_string = htmlspecialchars($_date);		}		return $_string;	}		/**	 * 数据库输入过滤	 * @param string $_data	 * @return string	 */	static public function mysqlString($_data) {		$_data = trim($_data);		return !GPC ? addcslashes($_data) : $_data;	}		/**	 * 清理session	 */	static public function unSession() {		if (session_start()) {			session_destroy();		}	}		/**	 * 验证是否为空	 * @param string $str	 * @param string $name	 * @return bool (true or false)	 */	static function validateEmpty($str, $name) {		if (empty($str)) {			self::alertBack('警告:' .$name . '不能为空!');		}	}		/**	 * 验证是否相同	 * @param string $str1	 * @param string $str2	 * @param string $alert	 * @return JS 	 */	static function validateAll($str1, $str2, $alert) {		if ($str1 != $str2) self::alertBack('警告:' .$alert);	}		/**	 * 验证ID	 * @param Number $id	 * @return JS	 */	static function validateId($id) {		if (empty($id) || !is_numeric($id)) self::alertBack('警告:参数错误!');	}		/**	 * 格式化字符串	 * @param string $str	 * @return string	 */	static public function formatStr($str) {		$arr = array(' ', '	', '&', '@', '#', '%',  '\'', '"', '\\', '/', '.', ',', '$', '^', '*', '(', ')', '[', ']', '{', '}', '|', '~', '`', '?', '!', ';', ':', '-', '_', '+', '=');		foreach ($arr as $v) {			$str = str_replace($v, '', $str);		}		return $str;	}		/**	 * 格式化时间	 * @param int $time 时间戳	 * @return string	 */	static public function formatDate($time='default') {		$date = $time == 'default' ? date('Y-m-d H:i:s', time()) : date('Y-m-d H:i:s', $time);		return $date;	}		/**  	* 获得真实IP地址  	* @return string  	*/	static public function realIp() {   	    static $realip = NULL;   	    if ($realip !== NULL) return $realip;  	    if (isset($_SERVER)) {  	        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {   	            $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);  	            foreach ($arr AS $ip) {  	                $ip = trim($ip);  	                if ($ip != 'unknown') {   	                    $realip = $ip;   	                    break;   	                }   	            }   	        } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {   	            $realip = $_SERVER['HTTP_CLIENT_IP'];  	        } else {   	            if (isset($_SERVER['REMOTE_ADDR'])) {   	                $realip = $_SERVER['REMOTE_ADDR'];   	            } else {   	                $realip = '0.0.0.0';   	            }  	        }  	    } else {  	        if (getenv('HTTP_X_FORWARDED_FOR')) {  	            $realip = getenv('HTTP_X_FORWARDED_FOR');  	        } elseif (getenv('HTTP_CLIENT_IP')) {  	            $realip = getenv('HTTP_CLIENT_IP');  	        } else {  	            $realip = getenv('REMOTE_ADDR');  	        }  	    }	    preg_match('/[\d\.]{7,15}/', $realip, $onlineip);  	    $realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';  	    return $realip;  	}		/**	 * 加载 Smarty 模板	 * @param string $html	 * @return null;	 */	static public function display() {		global $tpl;$html = null;		$htmlArr = explode('/', $_SERVER[SCRIPT_NAME]);		$html = str_ireplace('.php', '.html', $htmlArr[count($htmlArr)-1]);		$dir = dirname($_SERVER[SCRIPT_NAME]);		$firstStr = substr($dir, 0, 1);		$endStr = substr($dir, strlen($dir)-1, 1);		if ($firstStr == '/' || $firstStr == '\\') $dir = substr($dir, 1);		if ($endStr != '/' || $endStr != '\\') $dir = $dir . '/';		$tpl->display($dir.$html);	}		/**	 * 创建目录	 * @param string $dir	 */	static public function createDir($dir) {		if (!is_dir($dir)) {			mkdir($dir, 0777);		}	}		/**	 * 创建文件(默认为空)	 * @param unknown_type $filename	 */	static public function createFile($filename) {		if (!is_file($filename)) touch($filename);	}		/**	 * 正确获取变量	 * @param string $param	 * @param string $type	 * @return string	 */	static public function getData($param, $type='post') {		$type = strtolower($type);		if ($type=='post') {			return Tool::mysqlString(trim($_POST[$param]));		} elseif ($type=='get') {			return Tool::mysqlString(trim($_GET[$param]));		}	}		/**	 * 删除文件	 * @param string $filename	 */	static public function delFile($filename) {		if (file_exists($filename)) unlink($filename);	}		/**	 * 删除目录	 * @param string $path	 */	static public function delDir($path) {		if (is_dir($path)) rmdir($path);	}		/**	 * 删除目录及地下的全部文件	 * @param string $dir	 * @return bool	 */	static public function delDirOfAll($dir) {		//先删除目录下的文件:		if (is_dir($dir)) {			$dh=opendir($dir);			while (!!$file=readdir($dh)) {				if($file!="." && $file!="..") {					$fullpath=$dir."/".$file;					if(!is_dir($fullpath)) {						unlink($fullpath);					} else {						self::delDirOfAll($fullpath);					}				}			}			closedir($dh);			//删除当前文件夹:			if(rmdir($dir)) {		    	return true;			} else {				return false;			}		}	}	/**	 * 验证登陆	 */	static public function validateLogin() {		if (empty($_SESSION['admin']['user'])) header('Location:/admin/');	}		/**	 * 给已经存在的图片添加水印	 * @param string $file_path	 * @return bool	 */	static public function addMark($file_path) {		if (file_exists($file_path) && file_exists(MARK)) {			//求出上传图片的名称后缀			$ext_name = strtolower(substr($file_path, strrpos($file_path, '.'), strlen($file_path)));			//$new_name='jzy_' . time() . rand(1000,9999) . $ext_name ;			$store_path = ROOT_PATH . UPDIR;			//求上传图片高宽			$imginfo = getimagesize($file_path);			$width = $imginfo[0];			$height = $imginfo[1];			 //添加图片水印             			switch($ext_name) {				case '.gif':					$dst_im = imagecreatefromgif($file_path);					break;				case '.jpg':					$dst_im = imagecreatefromjpeg($file_path);					break;				case '.png':					$dst_im = imagecreatefrompng($file_path);					break;			}			$src_im = imagecreatefrompng(MARK);			//求水印图片高宽			$src_imginfo = getimagesize(MARK);			$src_width = $src_imginfo[0];			$src_height = $src_imginfo[1];			//求出水印图片的实际生成位置			$src_x = $width - $src_width - 10;			$src_y = $height - $src_height - 10;			//新建一个真彩色图像			$nimage = imagecreatetruecolor($width, $height);               			//拷贝上传图片到真彩图像			imagecopy($nimage, $dst_im, 0, 0, 0, 0, $width, $height);          			//按坐标位置拷贝水印图片到真彩图像上			imagecopy($nimage, $src_im, $src_x, $src_y, 0, 0, $src_width, $src_height);			//分情况输出生成后的水印图片			switch($ext_name) {				case '.gif':					imagegif($nimage, $file_path);					break;				case '.jpg':					imagejpeg($nimage, $file_path);					break;				case '.png':					imagepng($nimage, $file_path);					break;     			}			//释放资源 			imagedestroy($dst_im);			imagedestroy($src_im);			unset($imginfo);			unset($src_imginfo);			//移动生成后的图片			@move_uploaded_file($file_path, ROOT_PATH.UPDIR . $file_path);		}	}		/**	*  中文截取2,单字节截取模式	* @access public	* @param string $str  需要截取的字符串	* @param int $slen  截取的长度	* @param int $startdd  开始标记处	* @return string	*/	static public function cn_substr($str, $slen, $startdd=0){		$cfg_soft_lang = PAGECHARSET;		if($cfg_soft_lang=='utf-8') {			return self::cn_substr_utf8($str, $slen, $startdd);		}		$restr = '';		$c = '';		$str_len = strlen($str);		if($str_len < $startdd+1) {			return '';		}		if($str_len < $startdd + $slen || $slen==0) {			$slen = $str_len - $startdd;		}		$enddd = $startdd + $slen - 1;		for($i=0;$i<$str_len;$i++) {			if($startdd==0) {				$restr .= $c;			} elseif($i > $startdd) {				$restr .= $c;			}			if(ord($str[$i])>0x80) {				if($str_len>$i+1) {					$c = $str[$i].$str[$i+1];				}				$i++;			} else {				$c = $str[$i];			}			if($i >= $enddd) {				if(strlen($restr)+strlen($c)>$slen) {					break;				} else {					$restr .= $c;					break;				}			}		}		return $restr;	}	/**	*  utf-8中文截取,单字节截取模式	*	* @access public	* @param string $str 需要截取的字符串	* @param int $slen 截取的长度	* @param int $startdd 开始标记处	* @return string	*/	static public function cn_substr_utf8($str, $length, $start=0) {		if(strlen($str) < $start+1) {			return '';		}		preg_match_all("/./su", $str, $ar);		$str = '';		$tstr = '';		//为了兼容mysql4.1以下版本,与数据库varchar一致,这里使用按字节截取		for($i=0; isset($ar[0][$i]); $i++) {			if(strlen($tstr) < $start) {				$tstr .= $ar[0][$i];			} else {				if(strlen($str) < $length + strlen($ar[0][$i]) ) {					$str .= $ar[0][$i];				} else {					break;				}			}		}		return $str;	}		/**	 * 删除图片,根据图片ID	 * @param int $image_id	 */	static function delPicByImageId($image_id) {		$db_name = PREFIX . 'images i';		$m = new Model();		$data = $m->getOne($db_name, "i.id={$image_id}", "i.path as p, i.big_img as b, i.small_img as s");		foreach ($data as $v) {			@self::delFile(ROOT_PATH . $v['p']);			@self::delFile(ROOT_PATH . $v['b']);			@self::delFile(ROOT_PATH . $v['s']);		}		$m->del(PREFIX . 'images', "id={$image_id}");		unset($m);	}		/**	 * 图片等比例缩放	 * @param resource $im    新建图片资源(imagecreatefromjpeg/imagecreatefrompng/imagecreatefromgif)	 * @param int $maxwidth   生成图像宽	 * @param int $maxheight  生成图像高	 * @param string $name    生成图像名称	 * @param string $filetype文件类型(.jpg/.gif/.png)	 */	static public function resizeImage($im, $maxwidth, $maxheight, $name, $filetype) {		$pic_width = imagesx($im);		$pic_height = imagesy($im);		if(($maxwidth && $pic_width > $maxwidth) || ($maxheight && $pic_height > $maxheight)) {			if($maxwidth && $pic_width>$maxwidth) {				$widthratio = $maxwidth/$pic_width;				$resizewidth_tag = true;			}			if($maxheight && $pic_height>$maxheight) {				$heightratio = $maxheight/$pic_height;				$resizeheight_tag = true;			}			if($resizewidth_tag && $resizeheight_tag) {				if($widthratio<$heightratio)					$ratio = $widthratio;				else					$ratio = $heightratio;			}			if($resizewidth_tag && !$resizeheight_tag)				$ratio = $widthratio;			if($resizeheight_tag && !$resizewidth_tag)				$ratio = $heightratio;			$newwidth = $pic_width * $ratio;			$newheight = $pic_height * $ratio;			if(function_exists("imagecopyresampled")) {				$newim = imagecreatetruecolor($newwidth,$newheight);				imagecopyresampled($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);			} else {				$newim = imagecreate($newwidth,$newheight);				imagecopyresized($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);			}			$name = $name.$filetype;			imagejpeg($newim,$name);			imagedestroy($newim);		} else {			$name = $name.$filetype;			imagejpeg($im,$name);		}	}	/**	 * 下载文件	 * @param string $file_path 绝对路径	 */	static public function downFile($file_path) {		//判断文件是否存在		$file_path = iconv('utf-8', 'gb2312', $file_path); //对可能出现的中文名称进行转码		if (!file_exists($file_path)) {			exit('文件不存在!');		}		$file_name = basename($file_path); //获取文件名称		$file_size = filesize($file_path); //获取文件大小		$fp = fopen($file_path, 'r'); //以只读的方式打开文件		header("Content-type: application/octet-stream");		header("Accept-Ranges: bytes");		header("Accept-Length: {$file_size}");		header("Content-Disposition: attachment;filename={$file_name}");		$buffer = 1024;		$file_count = 0;		//判断文件是否结束		while (!feof($fp) && ($file_size-$file_count>0)) {			$file_data = fread($fp, $buffer);			$file_count += $buffer;			echo $file_data;		}		fclose($fp); //关闭文件	}}?>

?

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
스칼라 유형, 반환 유형, 노조 유형 및 무효 유형을 포함한 PHP 유형의 힌트 작업은 어떻게 작동합니까?스칼라 유형, 반환 유형, 노조 유형 및 무효 유형을 포함한 PHP 유형의 힌트 작업은 어떻게 작동합니까?Apr 17, 2025 am 12:25 AM

PHP 유형은 코드 품질과 가독성을 향상시키기위한 프롬프트입니다. 1) 스칼라 유형 팁 : PHP7.0이므로 int, float 등과 같은 기능 매개 변수에 기본 데이터 유형을 지정할 수 있습니다. 2) 반환 유형 프롬프트 : 기능 반환 값 유형의 일관성을 확인하십시오. 3) Union 유형 프롬프트 : PHP8.0이므로 기능 매개 변수 또는 반환 값에 여러 유형을 지정할 수 있습니다. 4) Nullable 유형 프롬프트 : NULL 값을 포함하고 널 값을 반환 할 수있는 기능을 포함 할 수 있습니다.

PHP는 객체 클로닝 (클론 키워드) 및 __clone 마법 방법을 어떻게 처리합니까?PHP는 객체 클로닝 (클론 키워드) 및 __clone 마법 방법을 어떻게 처리합니까?Apr 17, 2025 am 12:24 AM

PHP에서는 클론 키워드를 사용하여 객체 사본을 만들고 \ _ \ _ Clone Magic 메소드를 통해 클로닝 동작을 사용자 정의하십시오. 1. 복제 키워드를 사용하여 얕은 사본을 만들어 객체의 속성을 복제하지만 객체의 속성은 아닙니다. 2. \ _ \ _ 클론 방법은 얕은 복사 문제를 피하기 위해 중첩 된 물체를 깊이 복사 할 수 있습니다. 3. 복제의 순환 참조 및 성능 문제를 피하고 클로닝 작업을 최적화하여 효율성을 향상시키기 위해주의를 기울이십시오.

PHP vs. Python : 사용 사례 및 응용 프로그램PHP vs. Python : 사용 사례 및 응용 프로그램Apr 17, 2025 am 12:23 AM

PHP는 웹 개발 및 컨텐츠 관리 시스템에 적합하며 Python은 데이터 과학, 기계 학습 및 자동화 스크립트에 적합합니다. 1.PHP는 빠르고 확장 가능한 웹 사이트 및 응용 프로그램을 구축하는 데 잘 작동하며 WordPress와 같은 CMS에서 일반적으로 사용됩니다. 2. Python은 Numpy 및 Tensorflow와 같은 풍부한 라이브러리를 통해 데이터 과학 및 기계 학습 분야에서 뛰어난 공연을했습니다.

다른 HTTP 캐싱 헤더 (예 : 캐시 제어, ETAG, 최종 수정)를 설명하십시오.다른 HTTP 캐싱 헤더 (예 : 캐시 제어, ETAG, 최종 수정)를 설명하십시오.Apr 17, 2025 am 12:22 AM

HTTP 캐시 헤더의 주요 플레이어에는 캐시 제어, ETAG 및 최종 수정이 포함됩니다. 1. 캐시 제어는 캐싱 정책을 제어하는 ​​데 사용됩니다. 예 : 캐시 제어 : Max-AGE = 3600, 공개. 2. ETAG는 고유 식별자를 통해 리소스 변경을 확인합니다. 예 : ETAG : "686897696A7C876B7E". 3. Last-modified는 리소스의 마지막 수정 시간을 나타냅니다. 예 : 마지막으로 변형 : Wed, 21oct201507 : 28 : 00GMT.

PHP에서 보안 비밀번호 해싱을 설명하십시오 (예 : Password_hash, Password_Verify). 왜 MD5 또는 SHA1을 사용하지 않습니까?PHP에서 보안 비밀번호 해싱을 설명하십시오 (예 : Password_hash, Password_Verify). 왜 MD5 또는 SHA1을 사용하지 않습니까?Apr 17, 2025 am 12:06 AM

PHP에서 Password_hash 및 Password_Verify 기능을 사용하여 보안 비밀번호 해싱을 구현해야하며 MD5 또는 SHA1을 사용해서는 안됩니다. 1) Password_hash는 보안을 향상시키기 위해 소금 값이 포함 된 해시를 생성합니다. 2) Password_verify 암호를 확인하고 해시 값을 비교하여 보안을 보장합니다. 3) MD5 및 SHA1은 취약하고 소금 값이 부족하며 현대 암호 보안에는 적합하지 않습니다.

PHP : 서버 측 스크립팅 언어 소개PHP : 서버 측 스크립팅 언어 소개Apr 16, 2025 am 12:18 AM

PHP는 동적 웹 개발 및 서버 측 응용 프로그램에 사용되는 서버 측 스크립팅 언어입니다. 1.PHP는 편집이 필요하지 않으며 빠른 발전에 적합한 해석 된 언어입니다. 2. PHP 코드는 HTML에 포함되어 웹 페이지를 쉽게 개발할 수 있습니다. 3. PHP는 서버 측 로직을 처리하고 HTML 출력을 생성하며 사용자 상호 작용 및 데이터 처리를 지원합니다. 4. PHP는 데이터베이스와 상호 작용하고 프로세스 양식 제출 및 서버 측 작업을 실행할 수 있습니다.

PHP 및 웹 : 장기적인 영향 탐색PHP 및 웹 : 장기적인 영향 탐색Apr 16, 2025 am 12:17 AM

PHP는 지난 수십 년 동안 네트워크를 형성했으며 웹 개발에서 계속 중요한 역할을 할 것입니다. 1) PHP는 1994 년에 시작되었으며 MySQL과의 원활한 통합으로 인해 개발자에게 최초의 선택이되었습니다. 2) 핵심 기능에는 동적 컨텐츠 생성 및 데이터베이스와의 통합이 포함되며 웹 사이트를 실시간으로 업데이트하고 맞춤형 방식으로 표시 할 수 있습니다. 3) PHP의 광범위한 응용 및 생태계는 장기적인 영향을 미쳤지 만 버전 업데이트 및 보안 문제에 직면 해 있습니다. 4) PHP7의 출시와 같은 최근 몇 년간의 성능 향상을 통해 현대 언어와 경쟁 할 수 있습니다. 5) 앞으로 PHP는 컨테이너화 및 마이크로 서비스와 같은 새로운 도전을 다루어야하지만 유연성과 활발한 커뮤니티로 인해 적응력이 있습니다.

PHP를 사용하는 이유는 무엇입니까? 설명 된 장점과 혜택PHP를 사용하는 이유는 무엇입니까? 설명 된 장점과 혜택Apr 16, 2025 am 12:16 AM

PHP의 핵심 이점에는 학습 용이성, 강력한 웹 개발 지원, 풍부한 라이브러리 및 프레임 워크, 고성능 및 확장 성, 크로스 플랫폼 호환성 및 비용 효율성이 포함됩니다. 1) 배우고 사용하기 쉽고 초보자에게 적합합니다. 2) 웹 서버와 우수한 통합 및 여러 데이터베이스를 지원합니다. 3) Laravel과 같은 강력한 프레임 워크가 있습니다. 4) 최적화를 통해 고성능을 달성 할 수 있습니다. 5) 여러 운영 체제 지원; 6) 개발 비용을 줄이기위한 오픈 소스.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구