您的位置:首页 > 职场人生

PHP 之 面试题(笔试题总结)

2016-10-31 10:30 260 查看

多个进程同时处理同一文件,加下锁防冲突

function writeData($path, $mode, $data){
$fp = fopen($path, $mode);
$retries = 0;
$max_retries = 100;
do{
if ($retries > 0){
usleep(rand(1, 10000));
}
$retries += 1;
}while(!flock($fp, LOCK_EX) and $retries <= $max_retries);

if ($retries == $max_retries) {
return false;
}
fwrite($fp, "$data\n");
flock($fp, LOCK_UN);
fclose($fp);
return true;
}


超大文件读取

error_reporting(E_ALL^E_NOTICE);
function readBigFile($filename, $count = 20, $tag = "\r\n") {

$content = "";//最终内容
$_current = "";//当前读取内容寄存
$step= 1;//每次走多少字符
$tagLen = strlen($tag);
$start = 0;//起始位置
$i = 0;//计数器
$handle = fopen($filename,'r+');//读写模式打开文件,指针指向文件头
while($i < $count && !feof($handle)) {    //文件没有到结尾和小鱼需要读取得行数时

fseek($handle, $start, SEEK_SET);//指针设置在文件开头
$_current = fread($handle,$step);//读取文件
//echo $_current;exit;
$content .= $_current;//组合字符串
$start += $step;//依据步长向前移动
//依据分隔符的长度截取字符串最后免得几个字符
$substrTag = substr($content, -$tagLen);
if ($substrTag == $tag) {    //判断是否为判断是否是换行或其他分隔符
$i++;
}
}
//关闭文件
fclose($handle);
//返回结果
return $content;
}

$filename = 'F:/wamp/www/test/import_order_log.txt';//需要读取的文件
$tag = "\r\n";//行分隔符 注意这里必须用双引号
$count = 20;//读取行数
$data = readBigFile($filename,$count,$tag);
echo $data;
exit;


多维数组转一维

function arrToOne($multi) {
$arr = array();
foreach ($multi as $key => $val) {
if( is_array($val) ) {
$arr = array_merge($arr, arrToOne($val));
} else {
$arr[] = $val;
}
}
return $arr;
}

function get_real_ip(){

$ip=false;
if(!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ips=explode (', ', $_SERVER['HTTP_X_FORWARDED_FOR']);
if($ip){ array_unshift($ips, $ip); $ip=FALSE; }
for ($i=0; $i < count($ips); $i++){
if(!eregi ('^(10│172.16│192.168).', $ips[$i])){
$ip=$ips[$i];
break;
}
}
}
return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
}

echo get_real_ip();
echo $_SERVER['REMOTE_ADDR'];


拆分成小文件

function chai($file){
//$file  = './qq.txt';
$sub_file_count = 100;                                   //要拆分的文件个数
$sub_file_len   = ceil(filesize($file)/$sub_file_count); //每个子文件的大小
$handle         = fopen($file, "rb");                    //打开文件资源
rewind($handle);                                         //文件位置指针设为文件流的开头
$last_n_len = 0;
for ($i=0;$i<$sub_file_count;$i++){
$content        = fread($handle , $sub_file_len + $last_n_len);
$last_n         = strrchr($content , "\n");   //从最后一个\n开始一直到末尾的字符串
$last_n_len     = strlen($last_n);            //从最后一个\n开始一直到末尾的字符串的长度
$trim_n_content = substr($content , 0 , strlen($content) - $last_n_len);
//写文件
fwrite(fopen($i.".log", "wb") , $trim_n_content);
fseek($handle , ftell($handle) - $last_n_len + 1);//设置文件指针
}

}


功能:删除数组出现次数最多或最少

function dodellargemsl($array){

$count = array_count_values($array);
$max= max($count);
foreach($count as $kt=>$vw){
if($vw==$max){
$vc[]=$kt;
}
}
foreach($array as $k=>$v){
if( in_array($v,$vc)){
unset($array[$k]);
}
}
return $array;
}


数据库分表(提前分)

//生成id
function get_AI_ID($canshu) {
$sql = "insert into create_id (id) values('')";
$sid = $canshu->query($sql);
return $canshu->lastInsertId();
}
function new_Article($canshu) {
$id = get_AI_ID($canshu);
$table_name = get_Table_Name($id);

$sql = "insert into {$table_name} (id,subject,content) values('{$id}','测试标题','测试内容')";
print_r($id);
echo $table_name;
$canshu->exec($sql);
}
function get_Table_Name($id) {
return 'article_'.intval($id)%10;
}
$opts_values = array(PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES utf8');
$dns = "mysql:host=localhost;dbname=ttlsa_com";
$canshu=$dbObj = new PDO($dns,'root','',$opts_values);
//连接数据库查询更新数据
$dbObj -> query('set names utf-8');
new_Article($canshu);


excel文档导入

function mslz(){
echo "<pre>";
//$data = file_get_contents('./test.csv');
//$dataa = @explode("",$data);
$datab = fopen('./test.csv','r');

while (!feof($datab)) {
$datae[] = fgets($datab);
}
fclose($datab);
$datae = array_filter($datae);
unset($datae[0]);
foreach($datae as $v){

echo $v;
//var_dump($v);
$r = rtrim($v,",
");//特别之处
//$r = rtrim($v,",");

// echo $r=;
echo $r.PHP_EOL;
}
//print_r(trim("9.78076E+12,95,",","));
//print_r($datae);
}


判断参数中是否含有中文

function has_chinese($address) {
if (!$address) {
return false;
}
if (preg_match("/[\x7f-\xff]/", trim($address))) {
$has_chinese = true; // 含有中文
} else {
$has_chinese = false;
}
return $has_chinese;
}


文件查找函数

//文件查找函数
//返回文件绝对路径
//PHP_EOL换行符
function guchi($name="*",$type="*"){
$files = glob("{$name}.{$type}");
//realpath
foreach ($files as $filename){
$baf[] = realpath($filename);         // .filesize($filename);
}
return $baf;
}


图片放大或压缩函数

/**图片放大或压缩函数
*
*$imgname
*$sizex,$sizey 相对原图宽高比例
*$xsize="",$ysize="" 新图宽高值(设置后宽高比例失效)
*return 新图名字
*/

function doimage($imgname,$sizex,$sizey,$xsize="",$ysize=""){

$ext = pathinfo($imgname,PATHINFO_EXTENSION);
$type=array("jpg","jpeg","png","gif");
if(!in_array($ext,$type)){
exit("格式错误");
}
$ext = strtolower($ext);
switch($ext){
case "jpeg":
$img=imagecreatefromjpeg($imgname); //获得源文件
break;

case "png":
$img=imagecreatefrompng($imgname);//创建一块画布,并从 PNG 文件或 URL 地址载入一副图像
break;

case "gif":
$img=imagecreatefromgif($imgname);//创建一块画布,并从 GIF 文件或 URL 地址载入一副图像
break;

case "jpg":
$img=imagecreatefromjpeg($imgname); //获得源文件
break;
}

//echo $ext;exit("hui");
$x=imagesx($img); //获得图片的长
$y=imagesy($img); //获得图片的宽
$newx=$xsize?$xsize:$x*$sizex; //新图片的长,
$newy=$ysize?$ysize:$y*$sizey; //新图片的宽,
$newimg = imagecreatetruecolor($newx, $newy); // 创建新图片
imagecopyresized ($newimg,$img,0,0,0,0,$newx,$newy,$x,$y);
//(0,0,0,0)前两个是新文件的起始坐标,后面两个是源文件的起始坐标
if($ext=="jpg"||$ext=="jpeg"){
$newname = date("Y-m-d-H-i-s",time());
header ("Content-type: image/jpeg");
imagejpeg ($newimg,"{$newname}.jpg");
return $newname."jpg";
}
if($ext=="png"){
$newname = date("Y-m-d-H-i-s",time());
header ("Content-type: image/png");
imagejpeg ($newimg,"{$newname}.png");
return $newname."png";
}
if($ext=="gif"){
$newname = date("Y-m-d-H-i-s",time());
header ("Content-type: image/gif");
imagejpeg ($newimg,"{$newname}.gif");
return $newname."gif";
}

}


将php对象转化为数组

//将php对象转化为数组
function objectToArray($obj) {
if(is_object($obj)){
$obj = get_object_vars($obj);
}
if(is_array($obj)){
return array_map(__FUNCTION__, $obj);
}else{
return $obj;
}
}


将数组转化为对象

//将数组转化为对象
function arrayToObject($d) {
if (is_array($d)) {
return (object) array_map(__FUNCTION__, $d);
}else{return $d;}
}


字符串截取函数

//字符串截取函数
function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)
{
if(function_exists("mb_substr")){
if($suffix)
return mb_substr($str, $start, $length, $charset);
else
return mb_substr($str, $start, $length, $charset);
}
elseif(function_exists('iconv_substr')) {
if($suffix)
return iconv_substr($str,$start,$length,$charset);
else
return iconv_substr($str,$start,$length,$charset);
}
$re['utf-8']   = "/[x01-x7f]|[xc2-xdf][x80-xbf]|[xe0-xef][x80-xbf]{2}|[xf0-xff][x80-xbf]{3}/";
$re['gb2312'] = "/[x01-x7f]|[xb0-xf7][xa0-xfe]/";
$re['gbk']    = "/[x01-x7f]|[x81-xfe][x40-xfe]/";
$re['big5']   = "/[x01-x7f]|[x81-xfe]([x40-x7e]|xa1-xfe])/";
preg_match_all($re[$charset], $str, $match);
$slice = join("",array_slice($match[0], $start, $length));
if($suffix) return $slice;
return $slice;
}


表单提交框处理函数

//表单提交框处理函数
function checkstr($str){
$str= trim($str);
$str = htmlspecialchars($str);
$str = strtolower($str);
$str=str_replace("join","",$str);
$str=str_replace("union","",$str);
$str=str_replace("select","",$str);
$str=str_replace("where","",$str);
$str=str_replace("insert","",$str);
$str=str_replace("delete","",$str);
$str=str_replace("update","",$str);
$str=str_replace("like","",$str);
$str=str_replace("drop","",$str);
$str=str_replace("create","",$str);
$str=str_replace("modify","",$str);
$str=str_replace("rename","",$str);
$str=str_replace("alter","",$str);
$str=str_replace("admin","",$str);
$str=str_replace("performance_schema","",$str);
$str=str_replace("mysql","",$str);
$str = preg_replace( "@<script(.*?)</script>@is", "", $str );
$str = preg_replace( "@<iframe(.*?)</iframe>@is", "", $str );
$str = preg_replace( "@<style(.*?)</style>@is", "", $str );
$str = preg_replace( "@<(.*?)>@is", "", $str );

return $str;
}


加密解密函数

// 加密解密函数
// $string: 明文 或 密文
// $operation:DECODE表示解密,其它表示加密
// $key: 密匙
// $expiry:密文有效期
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
// 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
$ckey_length = 4;
// 密匙
$key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
// 密匙a会参与加解密
$keya = md5(substr($key, 0, 16));
// 密匙b会用来做数据完整性验证
$keyb = md5(substr($key, 16, 16));
// 密匙c用于变化生成的密文
$keyc = $ckey_length ? ($operation == 'DECODE'
? substr($string, 0, $ckey_length): substr(md5
(microtime()), -$ckey_length)) : '';
//PHP加密解密函数authcode参与运算的密匙
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
// 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性
// 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
$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();
//PHP加密解密函数authcode产生密匙簿
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;
}
//PHP加密解密函数authcode核心加解密部分
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;
// PHP加密解密函数authcode从密匙簿得出密匙进行异或,再转成字符
$result .= chr(ord($string[$i]) ^ (
$box[($box[$a] + $box[$j]) % 256]));
}
if($operation == 'DECODE') {
// substr($result, 0, 10) == 0 验证数据有效性
// substr($result, 0, 10) - time() > 0 验证数据有效性
// substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) //验证数据完整性
// 验证数据有效性,请看未加密明文的格式
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 {
//PHP加密解密函数authcode把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
// 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
return $keyc.str_replace('=', '',
base64_encode($result));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: