PHP实用封装函数集一
<div style="background:#eeeeee; border:1px solid #cccccc; padding:5px 10px"><code style="background-color:#e6e6fa;border-left:5px solid #ff0000;display:block;padding:5px 5px 5px 5px;">获取本周前的12周开始时间与结束时间</code><p>在统计中,会经常遇到“统计本月前的12个月的数据”,这个非常好计算,一年12个月,好计算。如果说,要“统计本周前的12周的数据”,这还真是第一次碰到这种需求。</p>
<p>好吧,看招:</p>
//本周前的前12周以及对应开始日期、结束日期<br />
function get_12_week()<br />
{<br />
$now = time();<br />
$curr_week_1 = date('Y-m-d', strtotime('-' . (date("w",$now)-1).' days', $now));//得到本周星期一<br />
$i = 0;<br />
while(true)<br />
{<br />
$i += 1;<br />
$before_week_1 = date('Y-m-d', strtotime('-7 days', strtotime($curr_week_1)));<br />
$before_week_7 = date('Y-m-d', strtotime('+6 days', strtotime($before_week_1)));<br />
$week[$i] = [<br />
'format_time_start' => $before_week_1,<br />
'format_time_end' => $before_week_7,<br />
'time_start' => strtotime($before_week_1),<br />
'time_end' => strtotime($before_week_7.' 23:59:59')];<br />
<br />
$curr_week_1 = $before_week_1;<br />
if($i >= 12)<br />
{<br />
break;<br />
}<br />
}<br />
$week = array_reverse($week);<br />
return $week;<br />
}</div>
<div> </div>
<p> </p>
<p> </p>
<div style="background:#eeeeee; border:1px solid #cccccc; padding:5px 10px"><code style="background-color:#e6e6fa;border-left:5px solid #ff0000;display:block;padding:5px 5px 5px 5px;">获取本周一,周未的时间: $today = date('Y-m-d');</code><br />
$curr = strtotime($today);<br />
$i = date('N');<br />
$diff = $i - 1;<br />
$monday = strtotime('-'.$diff.' days');<br />
$begin = date('Y-m-d', $monday);<br />
$end = date('Y-m-d 23:59:59', strtotime('+6 days', $monday));<br />
echo $begin, "\n", $end; //输出:<br />
2021-01-11<br />
2021-01-17 23:59:59</div>
php一次打印多个变量,方便调试:dd
<p>//一次打印多个变量,方便调试。实用函数dd,仿var_dump,但比var_dump美观</p><div style="background:#eeeeee; border:1px solid #cccccc; padding:5px 10px">if(!function_exists('dd')){<br />
function dd(){<br />
header('Content-type:text/html;charset=utf-8');<br />
$ua = $_SERVER['HTTP_USER_AGENT'];<br />
$b = 0;<br />
if(stripos($ua, 'Gecko') !== false) $b = 1;<br />
<br />
//得到传入的参数:<br />
$trace = debug_backtrace();<br />
$param = $trace['args'];<br />
$fileline = '文件:'. $trace['file'] . '___' . '行:'. $trace['line'];<br />
echo '<p>',$fileline, '</p>';<br />
for ($i = 0; $i < count($param); $i++) {<br />
$tips = (is_array($param[$i]) || is_object($param[$i])) ? '数组'.($i+1) : '变量'. ($i+1);<br />
echo $b ? ('<fieldset><legend>变量:'.($tips).',值为:</legend>') : ('变量:$'.($tips).',值为:');<br />
echo $b ? '<pre>' : '';<br />
empty($param[$i]) ? var_dump($param[$i]) : print_r($param[$i]) ;<br />
echo $b ? '</pre>' : '';<br />
echo $b ? '</fieldset>' : PHP_EOL;<br />
}<br />
exit;<br />
}<br />
}</div>
<p>调用示例:dd($var1, $var2, $var3, $var4, $var5); </p>
curl函数封装函数
<p>curl函数封装: </p><div style="background:#eeeeee; border:1px solid #cccccc; padding:5px 10px">
<pre>
function curl_($url, $post_data = array(), $timeout = 30, $ext = array())
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); //执行超时
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); //连接超时
if (!empty($ext['referer'])) {
curl_setopt($ch, CURLOPT_REFERER, $ext['referer']);
}
$ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36';
if (!empty($ext['user_agent'])) {
$ua = $ext['user_agent'];
}
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
if (!empty($ext['header'])) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $ext['header']); //构造
}
if (!empty($post_data)) {
curl_setopt($ch, CURLOPT_POST, 1);
if (is_array($post_data)) {
$mydata = http_build_query($post_data);
} else {
$mydata = $post_data;
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $mydata);
}
if (preg_match('~^https~i', $url)) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$content = curl_exec($ch);
curl_close($ch);
return $content;
}</pre>
</div>
<p>调用示例: </p>
<pre>
$img_content = curl_($url, array(), 30, ['referer'=>$url]);</pre>
通用日志记录函数:filelog
<div style="background:#eeeeee; border:1px solid #cccccc; padding:5px 10px"><pre>
/**
* 通用日志记录函数
*
* 此函数日志文件路径为:.\data\log\20180106_[$fileName|$level].log
* @param string $msg 日志内容
* @param string $level 日志级别 NORMAL:一般级别,默认。NOTICE:提醒,WARING:警告,ERR:错误
* @param type $fileName 仅文件名称。默认为空时将按照默认方式(日期)提供文件名
*/
function filelog($msg, $fileName = '', $level = 'NORMAL') {
$levels = array('NORMAL', 'NOTICE', 'WARING', 'ERR');
!in_array($level, $levels) && $level = 'NORMAL';
$discuz_root = dirname(__DIR__);
$dir = $discuz_root . './data/log/'; //DIRECTORY_SEPARATOR
if(!is_dir($dir)) mkdir($dir, 0755, true);
$destination = $dir . date('Ymd') . '_' .(empty($fileName) ? (strtoupper($level) . ".log") : $fileName);
$now = date('Y-m-d H:i:s', time());
//检测日志文件大小,超过配置大小则备份日志文件重新生成
$log_size = 2 * 1024* 1024;
if(is_file($destination) && floor($log_size) <= filesize($destination) )
{
rename($destination,dirname($destination).'/'.time().'-'.basename($destination));
}
if (!is_file($destination)) {
touch($destination);
chmod($destination, 0775);
}
if(!is_string($msg)){
//$msg = print_r($msg, true);
$msg = var_export($msg, true);
}
error_log("[{$now}]_{$level}: {$msg}\r\n\n", 3, $destination);
}</pre>
</div>
发送HTTP状态函数:send_http_status
<pre>/**
* 发送HTTP状态
* @param integer $code 状态码
* @return void
*/
function send_http_status($code, $exit=false)
{
if($code == 404 || $code == 500)
{
$msg = GROUP_NAME . '/' . MODULE_NAME . '/' . ACTION_NAME . ':不存在!';
if(GROUP_NAME == 'GROUP_NAME'){
$msg = $_SERVER['REQUEST_URI'] . '?' . ($_SERVER['QUERY_STRING'] ?? '');
}
$ip = GetRealIp();//获取IP地址
$str = date_() . ' _ ['.$ip.']['.($_SERVER['REQUEST_METHOD'] ?? '').']' . $msg;
$filefullpath = C('LOG_PATH') . '/'. date('Y-m-d').'.error.log';
filelog($filefullpath, $str);
}
static $_status = array(
// Informational 1xx
100 => 'Continue',
101 => 'Switching Protocols',
// Success 2xx
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative Information',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
// Redirection 3xx
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Moved Temporarily ', // 1.1
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
// 306 is deprecated but reserved
307 => 'Temporary Redirect',
// Client Error 4xx
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Timeout',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Requested Range Not Satisfiable',
417 => 'Expectation Failed',
// Server Error 5xx
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported',
509 => 'Bandwidth Limit Exceeded'
);
if (isset($_status[$code])) {
header('HTTP/1.1 ' . $code . ' ' . $_status[$code]);
// 确保FastCGI模式下正常
header('Status:' . $code . ' ' . $_status[$code]);
}
if($exit){
exit;
}
}
</pre>
获取用户真实IP函数:GetRealIp()
<pre>/**
* 获取用户的真实ip,仅适用于cgi运行方式,cli运行方式请不要使用
* @return string,IP十五位字符,
*/
function GetRealIp(){
static $_map = array();
if(isset($_map['ip']))
$ip = $_map['ip'];
else{
if(isset($_SERVER["HTTP_X_CONNECTING_IP"])) {
$ip = trim($_SERVER["HTTP_X_CONNECTING_IP"]);
}else if(isset($_SERVER["HTTP_FW_ADDR"])) {
$ip = trim($_SERVER["HTTP_FW_ADDR"]);
}else if(isset($_SERVER["HTTP_CDN_SRC_IP"])){
$ip = trim($_SERVER["HTTP_CDN_SRC_IP"]);
}else if(getenv ( "REMOTE_ADDR" ) && strcasecmp ( getenv ( "REMOTE_ADDR" ), "unknown" ) ) {
$ip = trim(getenv("REMOTE_ADDR"));
}else if (isset ( $_SERVER ['REMOTE_ADDR'] ) && $_SERVER ['REMOTE_ADDR'] && strcasecmp ( $_SERVER ['REMOTE_ADDR'], "unknown" )){
$ip = trim($_SERVER ['REMOTE_ADDR']);
}else if(getenv ( "HTTP_X_FORWARDED_FOR" ) && strcasecmp ( getenv ( "HTTP_X_FORWARDED_FOR" ), "unknown" )) {
$ip = getenv ( "HTTP_X_FORWARDED_FOR" );
$ip = explode ( ',', $ip );
$len = count($ip);
$tmp = trim($_SERVER['REMOTE_ADDR']);
for($i=0;$i<$len;$i++){
$t = trim($ip[$i]);
if($t!="127.0.0.1"){
$tmp = $t;
}
}
$ip = $tmp;
}else
$ip = "127.0.0.1";
$_map['ip'] = $ip;
}
return $ip;
}</pre>
thinkphp获取cookie方法:cookie
<pre>/**
* Cookie 设置、获取、删除
* @param string $name cookie名称
* @param mixed $value cookie值
* @param mixed $options cookie参数
* @return mixed
*/
function cookie($name, $value = '', $option = null)
{
// 默认设置
$config = array(
'prefix' => C('COOKIE_PREFIX'), // cookie 名称前缀
'expire' => C('COOKIE_EXPIRE'), // cookie 保存时间
'path' => C('COOKIE_PATH'), // cookie 保存路径
'domain' => C('COOKIE_DOMAIN'), // cookie 有效域名
);
// 参数设置(会覆盖黙认设置)
if (!is_null($option)) {
if (is_numeric($option))
$option = array('expire' => $option);
elseif (is_string($option))
parse_str($option, $option);
$config = array_merge($config, array_change_key_case($option));
}
// 清除指定前缀的所有cookie
if (is_null($name)) {
if (empty($_COOKIE))
return;
// 要删除的cookie前缀,不指定则删除config设置的指定前缀
$prefix = empty($value) ? $config['prefix'] : $value;
if (!empty($prefix)) {// 如果前缀为空字符串将不作处理直接返回
foreach ($_COOKIE as $key => $val) {
if (0 === stripos($key, $prefix)) {
setcookie($key, '', time() - 3600, $config['path'], $config['domain']);
unset($_COOKIE[$key]);
}
}
}
return;
}
$name = $config['prefix'] . $name;
if ('' === $value) {
if (isset($_COOKIE[$name])) {
$value = $_COOKIE[$name];
if (0 === strpos($value, 'think:')) {
$value = substr($value, 6);
return array_map('urldecode', json_decode(MAGIC_QUOTES_GPC ? stripslashes($value) : $value, true));
} else {
return $value;
}
} else {
return null;
}
} else {
if (is_null($value)) {
setcookie($name, '', time() - 3600, $config['path'], $config['domain']);
unset($_COOKIE[$name]); // 删除指定cookie
} else {
// 设置cookie
if (is_array($value)) {
$value = 'think:' . json_encode(array_map('urlencode', $value));
}
$expire = !empty($config['expire']) ? time() + intval($config['expire']) : 0;
setcookie($name, $value, $expire, $config['path'], $config['domain']);
$_COOKIE[$name] = $value;
}
}
}</pre>
thinkphp获取session函数:session
<pre>//注:稍微将此函数里获取配置的地方改动一下,即可拿到其它框架使用
/**
* session管理函数
* @param string|array $name session名称 如果为数组则表示进行session设置
* @param mixed $value session值
* @param boolean $isPrefix
* @return mixed
*/
function session($name, $value = '')
{
$prefix = <span style="color:#e74c3c">C('SESSION_PREFIX')</span>;
if (is_array($name)) { // session初始化 在session_start 之前调用
if (isset($name['prefix'])) <span style="color:#e74c3c">C('SESSION_PREFIX'</span>, $name['prefix']);
if (C('VAR_SESSION_ID') && isset($_REQUEST[<span style="color:#e74c3c">C('VAR_SESSION_ID')</span>])) {
session_id($_REQUEST);
} elseif (isset($name['id'])) {
session_id($name['id']);
}
ini_set('session.auto_start', 0);
if (isset($name['name'])) session_name($name['name']);
if (isset($name['path'])) session_save_path($name['path']);
if (isset($name['domain'])) ini_set('session.cookie_domain', $name['domain']);
if (isset($name['expire'])) ini_set('session.gc_maxlifetime', $name['expire']);
if (isset($name['use_trans_sid'])) ini_set('session.use_trans_sid', $name['use_trans_sid'] ? 1 : 0);
if (isset($name['use_cookies'])) ini_set('session.use_cookies', $name['use_cookies'] ? 1 : 0);
if (isset($name['cache_limiter'])) session_cache_limiter($name['cache_limiter']);
if (isset($name['cache_expire'])) session_cache_expire($name['cache_expire']);
if (isset($name['type'])) <span style="color:#e74c3c">C('SESSION_TYPE'</span>, $name['type']);
if (<span style="color:#e74c3c">C('SESSION_TYPE')</span>) { // 读取session驱动
$class = 'Session' . ucwords(strtolower(C('SESSION_TYPE')));
// 检查驱动类
if (require_cache(EXTEND_PATH . 'Driver/Session/' . $class . '.class.php')) {
$hander = new $class();
$hander->execute();
} else {
// 类没有定义
throw_exception(L('_CLASS_NOT_EXIST_') . ': ' . $class);
}
}
// 启动session
if (<span style="color:#e74c3c">C('SESSION_AUTO_START')</span>) session_start();
} else {
// 启动session
if (!isset($_SESSION)) session_start();
if ('' === $value) {
if (0 === strpos($name, '[')) { // session 操作
if ('' == $name) { // 暂停session
session_write_close();
} elseif ('' == $name) { // 启动session
session_start();
} elseif ('' == $name) { // 销毁session
$_SESSION = array();
session_unset();
session_destroy();
} elseif ('' == $name) { // 重新生成id
session_regenerate_id();
}
} elseif (0 === strpos($name, '?')) { // 检查session
$name = substr($name, 1);
if (strpos($name, '.')) { // 支持数组
list($name1, $name2) = explode('.', $name);
return $prefix ? isset($_SESSION[$prefix][$name1][$name2]) : isset($_SESSION[$name1][$name2]);
} else {
return $prefix ? isset($_SESSION[$prefix][$name]) : isset($_SESSION[$name]);
}
} elseif (is_null($name)) { // 清空session
if ($prefix) {
unset($_SESSION[$prefix]);
} else {
$_SESSION = array();
}
} elseif ($prefix) { // 获取session
if (strpos($name, '.')) {
list($name1, $name2) = explode('.', $name);
return isset($_SESSION[$prefix][$name1][$name2]) ? $_SESSION[$prefix][$name1][$name2] : null;
} else {
return isset($_SESSION[$prefix][$name]) ? $_SESSION[$prefix][$name] : null;
}
} else {
if (strpos($name, '.')) {
list($name1, $name2) = explode('.', $name);
return isset($_SESSION[$name1][$name2]) ? $_SESSION[$name1][$name2] : null;
} else {
return isset($_SESSION[$name]) ? $_SESSION[$name] : null;
}
}
} elseif (is_null($value)) { // 删除session
if ($prefix) {
unset($_SESSION[$prefix][$name]);
} else {
unset($_SESSION[$name]);
}
} else { // 设置session
if ($prefix) {
if (!is_array($_SESSION[$prefix])) {
$_SESSION[$prefix] = array();
}
$_SESSION[$prefix][$name] = $value;
} else {
// 如果没有支持两级以上的数组会出现值覆盖的情况
if (strpos($name, '.')) {
list($name1, $name2) = explode('.', $name);
$_SESSION[$name1][$name2] = $value;
} else {
$_SESSION[$name] = $value;
}
}
}
}
}
</pre>
php将变量输出到console:consolelog()
<pre>//一次打印多个变量,方便调试,将信息输出到console.log里
if(!function_exists('consolelog')){
function consolelog(){
header('Content-type:text/html;charset=utf-8');
$ua = $_SERVER['HTTP_USER_AGENT'];
if(stripos($ua, 'Gecko') !== false) return ;
//得到传入的参数:
$trace = debug_backtrace();
$param = $trace['args'];
echo '<script>';
$fileline = '文件:'. $trace['file'] . '___' . '行:'. $trace['line'];
echo 'console.log("',$fileline, '");';
for ($i = 0; $i < count($param); $i++) {
$tips = (is_array($param[$i]) || is_object($param[$i])) ? '数组'.($i+1) : '变量'. ($i+1);
echo 'console.log("'.$tips.'="'.(empty($param[$i]) ? var_dump($param[$i]) : print_r($param[$i])).');';
}
echo '</script>';
}
}</pre>
<Br><br>
页:
[1]