⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util.inc

📁 用来优化php载入速度
💻 INC
字号:
<?php	/**	* @author Michael Spector <michael@zend.com>	* @copyright Zend Technologies Ltd 2005	* @version $Revision: 1.19.4.9 $	* @since $Date: 2005/09/14 14:26:37 $	*/	include_once ('Log.inc');	/**	* class Util	* 	* This class used for providing helper functions	*/	class Util	{		/**		* This function makes specified path nicer		* It removes '/./', '/../' and extra '/' from it		*/		function nicePath($path)		{			$path = preg_replace('@///*@', '/', $path); /* multiple '/' */			$path = preg_replace('@^\./@', '', $path); /* first './' from the path */			$path = preg_replace('@/\./@', '/', $path); /* '/./' from the path */			$path = preg_replace('@^[^/]+/\.\./?@', '', $path); /* dir/.. from the beginning */			$path = preg_replace('@\/[^/]+/\.\./?@', '/', $path); /* /dir/.. from the path */			$path = preg_replace('@([^/])/+$@', '\\1', $path); /* last / from the end of path */			return $path;		}		/**		* This function returns first argument as is if its a full path,		* otherwise it prepends second argument to it.		* @param string input path		* @param string root path (to prepend, in case if input path is not full)		* @return string full path		*/		function fullPath($path, $root)		{			return $path[0] == '/' ? $path : $root.'/'.$path;		}		/**		* This function performs matching file to pattern		* @param string file		* @param string pattern		* @return bool True whether file matches patterm, otherwise false		*/		function fileMatch($file, $pattern)		{			if(function_exists('fnmatch')) {				return fnmatch ($pattern, $file);			}			for($i=0; $i<strlen($pattern); $i++) {				if($pattern[$i] == "*") { /* star wildcard (matches all or nothing :) */					for($c=$i; $c<max(strlen($pattern), strlen($file)); $c++) {						if(Util::fileMatch(substr($file, $c), substr($pattern, $i+1))) {							return true;						}					}					return false;				}				if($pattern[$i] == "[") { /* [] set of letters (matches something :) */					unset($sqr_braket);					$letter_set = array();					for($c=$i+1; $c<strlen($pattern); $c++) {						if($pattern[$c] != "]") {							array_push($letter_set, $pattern[$c]);						}						else {							$sqr_braket = true;							break;						}					}					if(!isset($sqr_braket)) {						print("No closing ']' found\n");						return false;					}					foreach ($letter_set as $letter) {						if(Util::fileMatch(substr($file, $i), $letter.substr($pattern, $c+1))) {							return true;						}					}					return false;				}				if($pattern[$i] == "?") { /* question sign wildcard (matches only one thing :) */					continue;				}				if($pattern[$i] != $file[$i]) {					return false;				}			}			return true;		}		/**		* This function returns all directory contents, that		* match specified pattern		* @param string directory path		* @param string pattern		* @return array filenames that match the pattern		*/		function listDir($path, $pattern)		{			if(function_exists ('glob')) {				return glob($path.'/'.$pattern);			}			$files_list = array();			$dir = opendir($path);			while($file = readdir($dir)){				if($file == "." || $file == ".."){					continue;				}				if(Util::fileMatch($file, $pattern)){					array_push($files_list, realpath($path.'/'.$file));				}			}			closedir($dir);			return $files_list;		}		/**		* This function applies XSLT transformation on XML document and returns the result		* @param string path to XML file		* @param string path to XSLT file		* @return string result of transformation		*/		function xsltTransformXML($xml_file, $xslt_file)		{			if(function_exists('xslt_create')) {				return Util::xsltTransformXMLwithSablotron ($xml_file, $xslt_file);			}			else if (function_exists('domxml_xslt_stylesheet_file')) {				return Util::xsltTransformXMLwithDom ($xml_file, $xslt_file);			}			else {				print ("None of XSLT processors is avalable\n");				return;			}		}		/**		* This function applies XSLT transformation using Sablotron		* @param string path to XML file		* @param string path to XSLT file		* @return string result of transformation		*/		function xsltTransformXMLwithSablotron ($xml_file, $xslt_file)		{			$xsltproc = xslt_create();			$newt_code = xslt_process ($xsltproc, $xml_file, $xslt_file);			if(empty ($newt_code)) {				print ('XSLT processing error: '. xslt_error($xsltproc));				return;	  	}	 		xslt_free($xsltproc);			return preg_replace('@<\?xml.*\?>@U', '', $newt_code);		}		/**		* This function applies XSLT transformation using DOM XSLT		* @param string path to XML file		* @param string path to XSLT file		* @return string result of transformation		*/		function xsltTransformXMLwithDom ($xml_file, $xslt_file)		{			if(!$dom_xml_obj = domxml_open_file($xml_file)) {				print("Error parsing XML file: $xml_file\n");				return;			}			$dom_xslt_obj = domxml_xslt_stylesheet_file ($xslt_file);			$dom_trans_obj = $dom_xslt_obj->process ($dom_xml_obj);			return $dom_xslt_obj->result_dump_mem ($dom_trans_obj);		}		/**		* This function can be used for sending emails with attachments		* @param string To: recipient		* @param string Subject: subject of the letter		* @param string From: sender		* @param string path to the file to attach		* @param string mime type of the file		* @return bool exit status of PHP function mail() - it doesn't mean the status of mail delivery		*/		function sendMailWithAttachment($to, $subject, $message, $from, $file_name, $mime_type="application/octet-stream")		{			// Generate a boundary string			$semi_rand = md5(time());			$mime_boundary = "Zend-$semi_rand";			$smtp_headers = "X-Mailer: PHP mailer\n";			$text_body = "--$mime_boundary\n".				"Content-Type: text/plain; charset=\"us-ascii\"\n\n".				"$message\n";			// Open file to attach			$data = Util::fileToStr ($file_name);			// Prepare an encoded message			$text_encoded = "--$mime_boundary\n".				"Content-type: $mime_type; name=\"".basename($file_name)."\";\n".				"Content-Transfer-Encoding: base64\n".				"Content-disposition: attachment; filename=\"".basename($file_name)."\"\n\n".				chunk_split(base64_encode($data))."\n".				"--$mime_boundary--\n";			$mime_headers = "MIME-version: 1.0\n".				"Content-type: multipart/mixed; ".				"boundary=\"$mime_boundary\"\n".				"Content-transfer-encoding: 7BIT\n".				"X-attachments: $file_name;\n\n";			// Send the message			$headers = (empty($from) ? "" : "From: $from \r\n") . $smtp_headers . $mime_headers;			$message = $text_body . $text_encoded;			return mail($to, $subject, $message, $headers);		}		/**		* This function writes contents of string to file		* @param string string to write		* @param string filename		* @return bool exit status		*/		function strToFile ($str, $file)		{			if (function_exists('file_put_contents')) {				if(@file_put_contents ($file, $str)) return true;			}			$fp = @fopen ($file, "wb");			if (!is_resource($fp)) {				Log::append ("Error opening file: $file for writing");				return false;			}			fwrite ($fp, $str);			fclose ($fp);			return true;		}		/**		* This function returns contents of the file		* @param string filename		* @param int offset from where to start reading (default: 0)		* @return string contents of the file		*/		function fileToStr ($file, $offset=0)		{			if (function_exists('file_get_contents') && $offset==0) {				return @file_get_contents ($file);			}			$fp = @fopen ($file, "rb");			if(is_resource($fp)) {				if ($offset > 0) fseek ($fp, $offset, SEEK_SET);				else if($offset < 0) fseek ($fp, $offset, SEEK_END);				$bytes = filesize($file);				$str = "";				if ($bytes > 0) $str = fread ($fp, $offset < 0 ? -$offset : $bytes-$offset);				fclose ($fp);				return $str;			}			Log::append ("Error opening file: $file for reading");			return null;		}		/**		* This function executes command and returns output as string		* @param string command		* @param int exit status		* @return string output from the command		*/		function cmdToStr ($command, &$status)		{			exec($command.' 2>&1', $res_arr, $status);			Log::append ("Executing: $command (exit status: $status)");			return implode("\n", $res_arr);		}		/**		* This function executes command and returns exit status		* @param string command		* @return int exit status		*/		function execCmd ($command)		{			$command = preg_replace ('@\d\s*>\s*/dev/null\s*@', '', $command);			$command = $command.' 2> /dev/null 1> /dev/null';			passthru ($command, &$status);			Log::append ("Executing: $command (exit status: $status)");			return $status;		}		/**		* This function returns Glibc version		* @return string Glibc version		*/		function glibcVersion()		{			if (preg_match ("#(\d[\.\d]*\d)#", shell_exec("ls /lib/{libc,ld}-?.?.* 2>/dev/null"), $match)) {				return $match[1];			}			return null;		}		/**		* This functions works like 'which' command in Unix		* @return string full path of the first command that was found, otherwise - null		*/		function whichCmd($command, $extra_path=array())		{			static $which_cache;			if(isset($which_cache[$command])) {				return $which_cache[$command];			}			$extra_path[] = '/sbin';			$extra_path[] = '/usr/sbin';			$path_arr = array_merge(explode(':', getenv('PATH')), $extra_path);			foreach ($path_arr as $path) {				$full_path = realpath ($path.'/'.$command);				if (file_exists ($full_path) && is_executable($full_path)) {					$which_cache[$command] = $full_path;					return $full_path;				}			}			return null;		}		/**		* This function kills process with specified signal		* @param int PID		* @param mixed signal number		* @return bool exit status of the operation		*/		function kill($pid, $sig='TERM')		{			$pid = trim($pid);			if (is_numeric($pid)) {				$kill = Util::whichCmd("kill");				if ($kill) {					if(Util::execCmd ("$kill -$sig $pid") == 0) {						return true;					}				}			}			return false;		}		/**		* This function finds all PIDs of specified process		* @param string name (or part of the name) of the process		* @param &array PIDs of all matched processes		* @return bool exit status of the operation		*/		function pidof ($process, &$pids)		{			$ps = Util::whichCmd("ps");			$pids = array();			if($ps) {				exec ($ps.' ax 2> /dev/null', $ps_table, $status);				if (count($ps_table) == 0) {					exec ($ps.' -ef 2> /dev/null', $ps_table, $status);				}				foreach ($ps_table as $line) {					if(preg_match('@^[^\d]*(\d+)\s.*'.addcslashes($process, '@').'@', $line, $match)) {						array_push ($pids, $match[1]);					}				}				return (count($pids) > 0);			}			return false;		}		/**		* This function kills process with specified name		* @param string name (or part of the name) of the process		* @param mixed signal number		* @return bool exit status of the operation		*/		function killProcess ($process, $sig='TERM')		{			if (Util::pidof ($process, $pids)) {				foreach ($pids as $pid) {					if(Util::kill ($pid, $sig)) {						Log::append ("Killed: $process with signal: $sig");					}				}				// Check whether there are no still opened processes in memory				return !Util::pidof ($process, $pids);			}			return false;		}		/**		* This function parses URL		* If no protocol was specified, this function assumes 'http' protocol		* @param string URL		* @return array output from PHP's parse_url		*/		function parseURL ($url)		{			// If protocol exists - return native call			if(preg_match('@^[^:]+://.*$@', $url)) {				return @parse_url($url);			}			// Otherwise assume 'http' protocol and call to native function			$url = 'http://'.$url;			$url_arr = @parse_url($url);			unset ($url_arr['scheme']);			return $url_arr;		}		/**		* This function strips HTML tags		* @param string HTML page		* @return string text		*/		function stripHTML ($page)		{			foreach (array ('head', 'title', 'form', 'script') as $tag) {				$page = preg_replace ("/<$tag.*>.+<\/\s*$tag>/U", "", $page);			}			$page = preg_replace ("/<.+>/U", "", $page);			$page = html_entity_decode ($page);			return $page;		}		/**		* This function strips HTTP error response		* @param string HTTP response		* @return string text		*/		function stripHTTPError ($text)		{			$text = Util::stripHTML ($text);			$text = trim ($text);			$text = preg_replace ("/^[\r\n]+/", "", $text);			$text = preg_replace ("/404\s+Not\s+Found\s+Not Found/si", "", $text);			$text = preg_replace ("/^Apache\/.*Server at.*$/m", "", $text);			$text = preg_replace ("/[\r\n]+/", "\n", $text);			return $text;		}		/**		* Checks whether the given IP is valid		* @param string IP		* @return boolean true - valid, false - invalid		*/		function IsIPValid ($ip)		{			if (preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $ip, $match)) {				if($match[1] < 256 && $match[2] < 256 && $match[3] < 256 && $match[4] < 256) {					return true;				}			}			return false;		}	}?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -