php自己常用的函数
//日志
function glogs($logName, $log) {
global $onlineip;
$file = logs_file_path . $logName . '.log';
$hd = fopen ( $file, 'a+' );
$log = date ( 'Ymd H:i:s', time () ) . ' ' . $onlineip . ' ' . $log . "\n";
fwrite ( $hd, $log );
fclose ( $hd );
}
//调试
phptestCount=0;
function phptest($p,$file="",$line=0)
{
var_dump($p);
echo "测试文件路径:".$file."行号:".$line." 时间:".microtime();
exit();
}
function phptest($p, $varName="", $exit=false)
{
static $phptestCount=0;
$phptestCount++;
$arr=debug_backtrace();//获取调试信息,技巧:获取第1个数组成员
//var_dump($arr);
$file=$arr[0]['file'];
$line=$arr[0]['line'];
echo "序号: <span style='color:red'>".$phptestCount." </span> 时间:".microtime()." 测试文件路径:<span style='color:red'>".$file." </span> 行号:<span style='color:red'>".$line."</span><br/>";
if(!empty($varName))
{
echo " 变量名:$varName <br/>";
}
var_dump($p);
echo "<br/> ";
if(is_bool($exit) && $exit)
{
die();
}
}
function printTData2($db,$pre,$tablename,$fields='',$key='',$orderby='',$limit=''){
$fl='';
if(!empty($fields)){
foreach ($fields as $key=>$val){
$fl .= ($key==0 ? '':',').$val;
}
}
$fl = $fl==''? " * ":' '.$fl.' ';
$where = "";
if(!empty($key)){
if(is_array($key)){
foreach($key as $k=>$v){
$where .= $where==""? " WHERE " : " AND ";
$where .= "$k='$v'";
}
}
}
$limit = $limit=='' ? ' ':" LIMIT $limit";
$orderby = empty($orderby)?"":" ORDER BY $orderby DESC ";
$sql = "SELECT $fl FROM {$pre}{$tablename} ".$where." ".$orderby." ".$limit ;
//exit($sql);
$query = $db->query($sql);
$rs_list = array();
while ($rs = $db->fetch_array($query)){
$rs_list[] = $rs;
}
printphptest('', $rs_list);
}
//页面路径
function selfURL(){
//$_SERVER["REQUEST_URI"] 只有 apache 才支持,
//因此需要下面的判断来解决通用问题
if (isset($_SERVER['REQUEST_URI']))
{
$serverrequri = $_SERVER['REQUEST_URI'];
}
else
{
if (isset($_SERVER['argv']))
{
$serverrequri = $_SERVER['PHP_SELF'] .'?'. $_SERVER['argv'][0];
}
else if(isset($_SERVER['QUERY_STRING']))
{
$serverrequri = $_SERVER['PHP_SELF'] .'?'. $_SERVER['QUERY_STRING'];
}
}
$s = empty($_SERVER["HTTPS"]) ? '' : (($_SERVER["HTTPS"] == "on") ? "s" : "");
$protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,strpos($_SERVER["SERVER_PROTOCOL"],"/"))).$s;
$port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]);
return $protocol."://".$_SERVER['SERVER_NAME'].$port.$serverrequri;
}
/**
* 字符串解密加密
*
* @param string $string 原文或者加密后的密文
* @param string $operation 默认DECODE 为解密,其他加密
* @param string $key 密钥
* @param int $expiry 加密有效期 0为永不过期 单位秒
* @return string 加密的密文 或者解密的原文
*/
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
$ckey_length = 4; // 随机密钥长度 取值 0-32;
// 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。
// 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方
// 当此值为 0 时,则不产生随机密钥
$key = md5($key ? $key : $GLOBALS['gamecard_auth_key']);//UC_KEY 为加密密钥 此为UcHome 中的代码,没有修改
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
for($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
for($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if($operation == 'DECODE') {
if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
return substr($result, 26);
} else {
return '';
}
} else {
return $keyc.str_replace('=', '', base64_encode($result));
}
}
function myencode($str)
{
$str=passport_encrypt( $str, $GLOBALS['gamecard_auth_key']);
$str=authcode($str,"ENCODE");
return $str;
}
function mydecode($str)
{
$str=authcode( $str,"DECODE");
$str=passport_decrypt( $str, $GLOBALS['gamecard_auth_key']);
return $str;
}
function passport_encrypt($txt, $key) {
srand((double)microtime() * 1000000);
$encrypt_key = md5(rand(0, 32000));
$ctr = 0;
$tmp = '';
for($i = 0;$i < strlen($txt); $i++) {
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
}
return base64_encode(passport_key($tmp, $key));
}
function passport_decrypt($txt, $key) {
$txt = passport_key(base64_decode($txt), $key);
$tmp = '';
for($i = 0;$i < strlen($txt); $i++) {
$md5 = $txt[$i];
$tmp .= $txt[++$i] ^ $md5;
}
return $tmp;
}
function passport_key($txt, $encrypt_key) {
$encrypt_key = md5($encrypt_key);
$ctr = 0;
$tmp = '';
for($i = 0; $i < strlen($txt); $i++) {
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
}
return $tmp;
}
/**
* get user real ip
*
* @return string
*/
function real_ip()
{
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;
}
function printphptest($varname,$var,$bool=true){
if($bool){
echo "</pre>
<pre>"."$varname:";
print_r($var);
exit();
}
}
php中的xml与数组间的相互转换
function array_to_xml(& $Data)
{
$Str = "";
foreach ($Data as $Key => $Value)
{
$Mark = ucfirst($Key); // 将标签的首字母转换成大写
if(is_array($Value))
{
$Str .= is_numeric($Mark)? array_to_xml($Value) : "<".$Mark.">".array_to_xml($Value)."</".$Mark.">";
}
else
{
$Str .= "<".$Mark.">".$Value."</".$Mark.">";
}
}
return $Str;
}
function xml_to_array($xml)
{
if(strpos($xml, "<") !== false)
{
$xml = substr($xml, stripos($xml, "<"));
$xml = substr($xml, 0, strrpos($xml, ">") + 1);
}
$array = (array)(simplexml_load_file($xml));
foreach($array as $key=>$item)
{
$array[$key] = struct_to_array($item);
}
return $array;
}
function struct_to_array($item)
{
if(!is_string($item))
{
$item = (array)$item;
foreach($item as $key=>$val)
{
$item[$key] = struct_to_array($val);
}
}
$item = @ is_array($item) && empty($item) ? "" : $item;
return $item;
}
/**
* 对象转数组
* @author 佚名
* @param object $obj
* @return array
*/
function object_to_array($obj){
$_arr = is_object($obj) ? get_object_vars($obj) : $obj;
foreach ($_arr as $key => $val){
$val = (is_array($val) || is_object($val)) ? $this->object_to_array($val) : $val;
$arr[$key] = $val;
}
return $arr;
}
/**
* 循环实现编码互转
*
* @param string $param(字符串,对象,或者数组),$currCharset当前编码,$toCharset期望编码
* @return 参数类型
*/
function zhandi_iconv($param,$currCharset,$toCharset){
if ($currCharset != $toCharset){
if (is_string($param)){
return iconv($currCharset, $toCharset, $param);
}
elseif (is_array($param)){
foreach ($param as $key => $value){
$param[$key] = zhandi_iconv($value);
}
return $param;
}
elseif (is_object($param)){
foreach ($param as $key => $value){
$param->$key = zhandi_iconv($value);
}
return $param;
}
else{
return $param;
}
}
return $param;
}
/**
* 获得用户操作系统的换行符
*
* @access public
* @return string
*/
function get_crlf(){
if (stristr($_SERVER['HTTP_USER_AGENT'], 'Win')){
$the_crlf = '\r\n';
}
elseif (stristr($_SERVER['HTTP_USER_AGENT'], 'Mac')){
$the_crlf = '\r'; // for old MAC OS
}
else{
$the_crlf = '\n';
}
return $the_crlf;
}
function human_time_diff( $from, $to = '' ) {
if ( empty($to) )
$to = time();
$diff = (int) abs($to - $from);
if ($diff <= 3600) {
$mins = round($diff / 60);
if ($mins <= 1)
$since = '1 min';
else
$since = sprintf( '%s mins', $mins);
} else if (($diff <= 86400) && ($diff > 3600)) {
$hours = round($diff / 3600);
if ($hours <= 1)
$since = '1 hour';
else
$since = sprintf( '%s hours', $hours );
} elseif ($diff >= 86400) {
$days = round($diff / 86400);
if ($days <= 1)
$since = '1 day';
else
$since = sprintf( '%s days', $days );
}
return $since;
}
1024 - 腾讯财付通 1.支付成功的时候,为了保证成功率,后台还会先通知一次。 2.就是说,在浏览器回调之前,服务器已经调用了一次 3.如果你处理成功返回的页面应该包含
不然在前台也会再调用一次 4.我们都会第一次尝试在服务器上通知,如果通知没有成功或者超时或者没有标识成功,我们会通过浏览器调用。所有浏览器有可能是第一次也有可能是第二次
浙公网安备 33010602011771号