php干货

        以前博文叫“php面试中常见到的算法”,后发现每次要面试时,老是要在网上找资料,还不如自己整理下自认为重要的干货放在里面。本想叫面试宝典的,但是市面上相同的太多了,还是叫做干货得了。


        1、进程和线程

进程是资源分配的最小单位,线程是程序执行的最小单位。
进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

        2、apache默认使用进程管理还是线程管理?如何判断并设置最大连接数? 

一个进程可以开多个线程 默认是进程管理 默认有一个主进程 
Linux: ps -aux | grep httpd | more 一个子进程代表一个用户的连接 
Conf/extra/httpd-mpm.conf 多路功能模块 http -l 查询当前apache处于什么模式下

        3、单例模式

单例模式需求:只能实例化产生一个对象
如何实现:
私有化构造函数
禁止克隆对象
提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一对象
需要一个保存类的静态属性
class demo {
    private static $MyObject; //保存对象的静态属性
    private function __construct(){ //私有化构造函数
    }
    private function __clone(){ //禁止克隆
    }
    public static function getInstance(){
        if(! (self::$MyObject instanceof self)){
        self::$MyObject = new self;
    }
    return self::$MyObject;
    }
}

        4、安装完Apache后,在http.conf中配置加载PHP文件以Apache模块的方式安装PHP,在文件http.conf中首先要用语句LoadModule php5_module "e:/php/php5apache2.dll"动态装载PHP模块,然后再用语句AddType application/x-httpd-php .php 使得Apache把所有扩展名为PHP的文件都作为PHP脚本处理


        5、debug_backtrace()函数能返回脚本里的任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的

function one($str1, $str2)
 {
 two("Glenn", "Quagmire");
 }
function two($str1, $str2)
 {
 three("Cleveland", "Brown");
 }
function three($str1, $str2)
 {
 print_r(debug_backtrace());
 }

one("Peter", "Griffin");

Array
(
    [0] => Array
        (
            [file] => D:\www\test\result.php
            [line] => 9
            [function] => three
            [args] => Array
                (
                    [0] => Cleveland
                    [1] => Brown
                )

        )

    [1] => Array
        (
            [file] => D:\www\test\result.php
            [line] => 5
            [function] => two
            [args] => Array
                (
                    [0] => Glenn
                    [1] => Quagmire
                )

        )

    [2] => Array
        (
            [file] => D:\www\test\result.php
            [line] => 16
            [function] => one
            [args] => Array
                (
                    [0] => Peter
                    [1] => Griffin
                )

        )

)

        6、输出用户的IP地址,并且判断用户的IP地址是否在192.168.1.100 — 192.168.1.150之间

echo $ip=getenv('REMOTE_ADDR');


$ip=str_replace('.','',$ip);


if($ip<1921681150 && $ip>1921681100)


{


echo 'ip在192.168.1.100—–192.168.1.150之间';


}


else


{


echo 'ip不在192.168.1.100—–192.168.1.150之间';


}

        7、请将2维数组按照name的长度进行重新排序,按照顺序将id赋值

$tarray = array(

    array('id' => 0, 'name' => '123'),

    array('id' => 0, 'name' => '1234'),

    array('id' => 0, 'name' => '1235'),

    array('id' => 0, 'name' => '12356'),

    array('id' => 0, 'name' => '123abc')

);

 

foreach($tarray as $key=>$val)

{

$c[]=$val['name'];

}

 

function aa($a,$b)

{

if(strlen($a)==strlen($b)) return 0;

return strlen($a)>strlen($b)?-1:1;

}

usort($c,'aa');
$len=count($c);

for($i=0;$i<$len;$i++)

{

$t[$i]['id']=$i+1;

$t[$i]['name']=$c[$i];

}


print_r($t);

        8、表单数据提交方式POST和GET的区别,URL地址传递的数据最大长度是多少?

POST方式提交数据用户不可见,是数据更安全,最大长度不受限制,而GET方式传值在URL地址可以看到,相对不安全,对大长度是2048字节。

        9、SESSION和COOKIE的作用和区别,SESSION信息的存储方式,如何进行遍历

SESSION和COOKIE都能够使值在页面之间进行传递,SESSION存储在服务器端,数据更安全,COOKIE保存在客户端,用户使用手段可以进行修改,SESSION依赖于COOKIE进行传递的。Session遍历使用$_SESSION[]取值,cookie遍历使用$_COOKIE[]取值。

        10、什么是数据库索引,主键索引,唯一索引的区别,索引的缺点是什么

索引用来快速地寻找那些具有特定值的记录。

主键索引和唯一索引的区别:主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”,每个表只能有一个主键。唯一索引索引列的所有值都只能出现一次,即必须唯一。

索引的缺点:

1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

2、索引需要占用物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,需要的空间就会更大。

3、当对表中的数据进行增加、删除、修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

        11、数据库设计时,常遇到的性能瓶颈有哪些,常有的解决方案

瓶颈主要有:

1、磁盘搜索 优化方法是:将数据分布在多个磁盘上

2、磁盘读/写 优化方法是:从多个磁盘并行读写。

3、CPU周期 优化方法:扩充内存

4、内存带宽 

        12、include和require区别

include引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码。

require引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码。

        13、文件上传时设计到点

和文件上传有关的php.ini配置选项(File Uploads):
file_uploads=On/Off:文件是否允许上传
upload_max_filesize上传文件时,单个文件的最大大小
post_max_size:提交表单时,整个post表单的最大大小
max_file_uploads =20上传文件的个数
内存占用,脚本最大执行时间也间接影响到文件的上传

        14、header常见状态

//200 正常状态
header('HTTP/1.1 200 OK');

// 301 永久重定向,记得在后面要加重定向地址 Location:$url
header('HTTP/1.1 301 Moved Permanently');

// 重定向,其实就是302 暂时重定向
header('Location: http://www.maiyoule.com/');

// 设置页面304 没有修改
header('HTTP/1.1 304 Not Modified');

// 显示登录框,
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="登录信息"');
echo '显示的信息!';

// 403 禁止访问
header('HTTP/1.1 403 Forbidden');
 
// 404 错误
header('HTTP/1.1 404 Not Found');

// 500 服务器错误
header('HTTP/1.1 500 Internal Server Error');

/*
服务器500错误。500错误的出现原因是很多的,但是你要知道,500错误是服务器内部错误,而且一般程序上是ASP错误为多的,可能是你的用户权限的问题导致,或者是数据库连接出现了错误,那么要好好检查下服务器语句错误问题。

服务器501错误。服务器501错误是服务器还是不具有请求功能的,而且501错误原因是没有实施的,可以用来HttpWebRequest指定一个UserAgent来试试的,有时候你可以换电脑来测试一下的。

服务器502错误。这是服务器上的一个错误网关 ,因此说它是无效的,我们在出现了服务器502错误问题的时候,最好是先清除下缓存或者是在服务器上进行刷新试试的,因为502错误牵扯的问题也是很多的,最好是让程序们来去在服务器上下文章。

服务器503错误。服务不可用是的一种状态,那么在服务器503错误出现了之后,大家不必担心的, 服务器或许就是正在维护或者暂停了,你可以联系一下服务器空间商。还有的时候cpu占用的频率大导致的。

服务器504错误。这是代表着网关超时是现象出现了。504错误问题是一个不好办的问题,当然你必须尝试着和网站官方获得联系,认真的去检查不同的电脑简的ip传输的状况。而且这个504错误要专业的负责人才能去解决。

服务器505错误。http的版本是不受支持的,一般的请款下浏览器的默认都是1.x 的版本的, 如果出现了HTTP 1.1版本的,那么你需要在Internet 选项的高级下进行设置的。
*/
 
// 3秒后重定向指定地址(也就是刷新到新页面与 <meta http-equiv="refresh" content="10;http://www.maiyoule.com/ /> 相同)
header('Refresh: 3; url=http://www.maiyoule.com/');
echo '10后跳转到http://www.maiyoule.com';
 
// 重写 X-Powered-By 值
header('X-Powered-By: PHP/5.3.0');
header('X-Powered-By: Brain/0.6b');
 
//设置上下文语言
header('Content-language: en');
 
// 设置页面最后修改时间(多用于防缓存)
$time = time() - 60; //建议使用filetime函数来设置页面缓存时间
header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT');

// 设置内容长度
header('Content-Length: 39344');
 
// 设置头文件类型,可以用于流文件或者文件下载
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="example.zip"'); 
header('Content-Transfer-Encoding: binary');
readfile('example.zip');//读取文件到客户端
 
//禁用页面缓存
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
header('Pragma: no-cache');
 
//设置页面头信息
header('Content-Type: text/html; charset=iso-8859-1');
header('Content-Type: text/html; charset=utf-8');
header('Content-Type: text/plain'); 
header('Content-Type: image/jpeg'); 
header('Content-Type: application/zip'); 
header('Content-Type: application/pdf'); 
header('Content-Type: audio/mpeg');
header('Content-Type: application/x-shockwave-flash'); 
//.... 至于Content-Type 的值 可以去查查 w3c 的文档库,那里很丰富

        15、ORM和ActiveRecord

ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射。为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但是传统的数据库却是关系型的。为了可以靠贴近面向对象开发,我们想要像操作对象一样操作数据库。还可以隔离底层数据库层,我们不需要关心我们使用的是mysql还是其他的关系型数据库

ActiveRecord也属于ORM层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而且简洁易懂。

ActiveRecord的主要思想是:

1. 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的Field;

2. ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CURD;;

3. ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻辑;

ActiveRecord比较适用于:

1. 业务逻辑比较简单,当你的类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的,即你的业务逻辑大多数是对单表操作;

2. 当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script),把跨表事务提升到事务脚本中;

3. ActiveRecord最大优点是简单, 直观。 一个类就包括了数据访问和业务逻辑. 如果配合代码生成器使用就更方便了;

这些优点使ActiveRecord特别适合WEB快速开发。

        16、斐波那契方法,也就是1 1 2 3 5 8 ……,这里给出两种方法,大家可以对比下,看看哪种快,以及为什么

function fibonacci($n){
    if($n == 0){
        return 0;
    }
    if($n == 1){
        return 1;
    }
    return fibonacci($n-1)+fibonacci($n-2);
}

function fibonacci($n){
    for($i=0; $i<$n; $i++){
        $r[] = $i<2 ? 1 : $r[$i-1]+$r[$i-2];
    }
    return $r[--$i];
}


        17、约瑟夫环,也就是常见的数猴子,n只猴子围成一圈,每只猴子下面标了编号,从1开始数起,数到m那么第m只猴子便退出,依次类推,每数到m,那么那个位置的猴子退出,那么最后剩下的猴子下的编号是啥。

function yuesefu($n,$m) {
    $r=0;
    for($i=2; $i<=$n; $i++) {
        $r=($r+$m)%$i;
    }
    return $r+1;
}

        18、冒泡排序,大致是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束;概括起来就是:对于一个长度为N的数组,我们需要排序 N-1 轮,每 i 轮 要比较 N-i 次。对此我们可以用双重循环语句,外层循环控制循环轮次,内层循环控制每轮的比较次数


function bubbleSort($arr)
{
    for ($i=0, $len=count($arr); $i<$len-1; $i++) {
        for ($j=0; $j<$len-1-$i; $j++) {
            if ($arr[$j] > $arr[$j+1]) {
                $temp =$arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;
            }
        }
    }
    return $arr;
}


        19、快速排序,也就是找出一个元素(理论上可以随便找一个)作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

function quickSort($arr){
    $len = count($arr);
    if($len <=1){
        return $arr;
    }
    $key = $arr[0];
    $leftArr = $rightArr= array();
    for($i=1; $i<$len; $i++){
        if($arr[$i] <= $key){
            $leftArr[] = $arr[$i];
        } else{
            $rightArr[] = $arr[$i];
        }
    }
    $leftArr = quickSort($leftArr);
    $rightArr = quickSort($rightArr);
    return array_merge($leftArr, array($key), $rightArr);
}

        20、(递归的)列出目录下所有文件及目录,这里也有两种方法

function listDir($path){
    $res = dir($path);
    while($file = $res->read()){
        if($file == '.' || $file == '..'){
            continue;
        }
        if(is_dir($path . '/' .$file)){
            echo $path . '/' .$file . "\r\n";
            listDir($path . '/' .$file);
        } else{
            echo $path . '/' .$file . "\r\n";
        }
    }
    $res->close();
}

function listDir($path){
    if(is_dir($path)){
        if(FALSE !== ($res = opendir($path))){
            while(FALSE !== ($file = readdir($res))){
                if($file == '.' || $file == '..'){
                    continue;
                }
                $subPath = $path . '/' . $file;
                if(is_dir($subPath)){
                    echo $subPath . "\r\n";
                    listDir($subPath);
                } else{
                    echo $subPath . "\r\n";
                }
            }
        }
    }
}

        21、找出相对的目录,比如/a/b/c/d/e.php相对于/a/b/13/34/c.php是/c/d/

function ralativePath($a, $b){
    $a = explode('/', dirname($a));
    $b = explode('/', dirname($b));
    $c = '/';
    foreach ($a as $k=> $v){
        if($v != $b[$k]){
            $c .= $v . '/';
        }
    }
    echo $c;
}

        22、快速找出url中php后缀

function get_ext($url){
    $data = parse_url($url);
    return pathinfo($data['path'], PATHINFO_EXTENSION);
}

        23、正则题,使用正则抓取网页,以网页meta为utf8为准,若是抓取的网页编码为big5之类的,需要转化为utf8再收录

function preg_meta($meta){
    $replacement = "\\1utf8\\6\\7";
    $pattern = '#(<meta\s+http-equiv=(\'|"|)Content-Type(\'|"|)\s+content=(\'|"|)text/html; charset=)(\w+)(\'|"|)(>)#i';
    return preg_replace($pattern, $replacement, $meta);
}

echo preg_meta("<meta http-equiv=Content-Type content='text/html; charset=big5'><META http-equiv=\"Content-Type\" content='text/html; charset=big5'>");

        24、不用php的反转函数倒序输出字符串,如abc,反序输出cba

function revstring($str){
    for($i=strlen($str)-1; $i>=0; $i--){
        echo $str{$i};
    }
}
revstring('abc');

        25、常见端口

TCP 21端口:FTP 文件传输服务
SSH 22端口:SSH连接linux服务器,通过SSH连接可以远程管理Linux等设备
TCP 23端口:TELNET 终端仿真服务
TCP 25端口:SMTP 简单邮件传输服务
UDP 53端口:DNS 域名解析服务
TCP 80端口:HTTP 超文本传输服务
TCP 110端口:POP3 “邮局协议版本3”使用的端口
TCP 443端口:HTTPS 加密的超文本传输服务
TCP 1521端口:Oracle数据库服务
TCP 1863端口:MSN Messenger的文件传输功能所使用的端口
TCP 3389端口:Microsoft RDP 微软远程桌面使用的端口
TCP 5631端口:Symantec pcAnywhere 远程控制数据传输时使用的端口
UDP 5632端口:Symantec pcAnywhere 主控端扫描被控端时使用的端口
TCP 5000端口:MS SQL Server使用的端口
UDP 8000端口:腾讯QQ

        26、linux常用的命令

top linux进程实时监控
ps 在Linux中是查看进程的命令。ps查看正处于Running的进程
mv 为文件或目录改名或将文件由一个目录移入另一个目录中。
find 查找文件
df 可显示所有文件系统对i节点和磁盘块的使用情况。
cat 打印文件类容
chmod 变更文件或目录的权限
chgrp 文件或目录的权限的掌控以拥有者及所诉群组来管理。可以使用chgrp指令取变更文件与目录所属群组
grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。
wc 为统计指定文件中的字节数、字数、行数,并将统计结果显示输出

        27、对于大流量的网站,您采用什么样的方法来解决访问量问题

首先,确认服务器硬件是否足够支持当前的流量

其次,优化数据库访问。

第三,禁止外部的盗链。

第四,控制大文件的下载。

第五,使用不同主机分流主要流量

第六,使用流量分析统计软件

        28、$_SERVER常用的字段

$_SERVER['PHP_SELF'] #当前正在执行脚本的文件名
$_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称
$_SERVER['REQUEST_METHOD'] #访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT”
$_SERVER['QUERY_STRING'] #查询(query)的字符串
$_SERVER['HTTP_HOST'] #当前请求的 Host: 头部的内容
$_SERVER['HTTP_REFERER'] #链接到当前页面的前一页面的 URL 地址
$_SERVER['REMOTE_ADDR'] #正在浏览当前页面用户的 IP 地址
$_SERVER['REMOTE_HOST'] #正在浏览当前页面用户的主机名
$_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名
$_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用
$_SERVER['REQUEST_URI'] #访问此页面所需的 URI。例如,“/index.html”

        29、安装php扩展

进入扩展的目录
phpize命令得到configure文件
./configure --with-php-config=/usr/local/php/bin/php-config
make & make install
在php.ini中加入扩展名称.so
重启web服务器(nginx/apache)

        30、php-fpm与nginx

PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的,在安装的时候也需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中,因此在处理性能方面更加优秀;同时它在处理高并发方面也比spawn-fcgi引擎好很多,因此,推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。
FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求

#fastcgi 
FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也被许多脚本语言所支持,其中就有PHP。
FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。
FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。
Nginx+FastCGI运行原理
Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。

        31、ajax全称“Asynchronous Javascript And XML”(异步JavaScript和XML)

        32、myisam和innodb

ACID表示原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability),一个良好的事务处理系统,必须具备这些标准特征

MySQL5.5版本将InnoDB作为默认的存储引擎

在文件系统中MySQL将每个数据库(也可以称之为schema)保存为数据目录下的一个子目录。创建表时,MySQL会在数据库子目录创建一个和表同名的.frm文件保存表的定义。SHOW TABLE STATUS LIKE 'table' \G

MyISAM是默认的存储引擎,不支持事务和外键,表级锁,不支持崩溃后安全恢复。对于只读的数据,或表比较小,可以忍受崩溃后修复的操作,依然可以使用MyISAM.
MyISAM会将表存储在两个文件中:数据文件和索引文件,分别以.MYD和.MYI为扩展名。
innodb存储引擎的元数据文件ibdata[.ibd]
如果表在创建并导入数据以后,不会再进行修改操作,那么这样的表或许适合采用MyISAM压缩表【只读的,CD-ROM应用】。
MyISAM只将数据写入到内存中,然后等待操作系统顶起将数据刷出到磁盘上
MyISAM随着应用压力的上升,各种锁争用、崩溃后的数据丢失等问题随之而来

简单的表达。
MyISAM 是非事务的存储引擎。
innodb是支持事务的存储引擎。

innodb的引擎比较适合于插入和更新操作比较多的应用
而MyISAM 则适合用于频繁查询的应用

MyISAM --表锁。
innodb--设计合理的话是行锁。
MyISAM 不会出现死锁。

最大的区别就是MYISAM适合小数据,小并发;INNODB 适合大数据,大并发。最大的区别就是在锁的级别上。

MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。 MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。综述,就可以根据数据表不同的用处是用不同的存储类型。而且MyISAM是文件存储的,可以进行直接在不同操作系统间拷贝使用。
 
InnoDB:
InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)。这些特性均提高了多用户并发操作的性能表现。在InnoDB表中不需要扩大锁定(lock escalation),因为 InnoDB 的列锁定(row level locks)适宜非常小的空间。InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY constraints)的表引擎。InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库引擎所不能比的。在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 InnoDB 把数据和索引存放在表空间里,可能包含多个文件,这与其它的不一样,举例来说,在 MyISAM 中,表被存放在单独的文件中。InnoDB 表的大小只受限于操作系统的文件大小,一般为 2 GB。InnoDB所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件,或者是独立的表空间文件),相对来说比较不好备份,可以拷贝文件或用navicat for mysql。

        33、gbk和utf8的区别

GBK编码:是指中国的中文字符,其它它包含了简体中文与繁体中文字符,另外还有一种字符“gb2312”,这种字符仅能存储简体中文字符。
UTF-8编码:它是一种全国家通过的一种编码,如果你的网站涉及到多个国家的语言,那么建议你选择UTF-8编码。

GBK和UTF8有什么区别?
UTF8编码格式很强大,支持所有国家的语言,正是因为它的强大,才会导致它占用的空间大小要比GBK大,对于网站打开速度而言,也是有一定影响的。
GBK编码格式,它的功能少,仅限于中文字符,当然它所占用的空间大小会随着它的功能而减少,打开网页的速度比较快。

        34、utf-8与unicode字符集的关系:UTF-8是Unicode的实现方式之一,它规定了字符如何在计算机中存储、传输等;utf8是对unicode字符集进行编码的一种编码方式。

        35、浅谈php垃圾回收机制


PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为 NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。

变量$a引用了自己,形成了一个环。$a被unset了,可是由于存在环状引用,因此$a之前指向的内存的引用计数为1,因此该内存区域不会被垃圾回收机制回收。

PHP5.3针对这个重大的缺陷做了优化。虽然其基础仍然是引用计数,但是在做了一些改良,能够将环状引用导致的内存泄露控制在一定的规模以内。当然,这并不是说你可以随便滥用内存,编写代码时仍然要小心为上!

其他要点:
1.PHP脚本运行完毕,该脚本申请的所有内存空间都会释放,不管是否存在环状引用。因此环状引用内存泄露的问题一般只影响长时间运行的程序脚本。
2.垃圾回收机制需要满足一定的条件才会执行。因此unset后,系统并不一定会立即回收垃圾。
3.unset的作用。
“unset只是断开一个变量到一块内存区域的连接,同时将该内存区域的引用计数-1”。也就是说,如果有一个以上的变量指向同一个内存区域,或者存在环状引用,那么unset不会使内存区域释放。断开也说明unset并不会直接删除内存区域,而只是改变其引用计数而已。
4.$xx=null的作用。
“$a = null 是直接将$a 指向的数据结构置空,同时将其引用计数归0”。(null操作可以立即释放掉内存空间)因此很多PHP技巧中不厌其烦地对我们说,先将变量设为null,再unset。


        36、Hash表的优缺点,原理,如何解决hash冲突

哈希函数、处理冲突
散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。

希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。

对哈希表的使用者一一人来说,这是一瞬间的事。哈希表运算得非常快,在计算机程序中,如果需要在一秒种内查找上千条记录通常使用哈希表(例如拼写检查器)哈希表的速度明显比树快,树的操作通常需要O(N)的时间级。哈希表不仅速度快,编程实现也相对容易。

哈希表也有一些缺点它是基于数组的,数组创建后难于扩展某些哈希表被基本填满时,性能下降得非常严重,所以程序虽必须要清楚表中将要存储多少数据(或者准备好定期地把数据转移到更大的哈希表中,这是个费时的过程)。

解决冲突:
开放定址法
单独链表法:将散列到同一个存储位置的所有元素保存在一个链表中。实现时,一种策略是散列表同一位置的所有冲突结果都是用栈存放的,新元素被插入到表的前端还是后端完全取决于怎样方便。
再散列:即在上次散列计算发生冲突时,利用该次冲突的散列函数地址产生新的散列函数地址,直到冲突不再发生。这种方法不易产生“聚集”(Cluster),但增加了计算时间。

查找效率
散列表的查找过程基本上和造表过程相同。一些关键码可通过散列函数转换的地址直接找到,另一些关键码在散列函数得到的地址上产生了冲突,需要按处理冲突的方法进行查找。在介绍的三种处理冲突的方法中,产生冲突后的查找仍然是给定值与关键码进行比较的过程。所以,对散列表查找效率的量度,依然用平均查找长度来衡量。

查找过程中,关键码的比较次数,取决于产生冲突的多少,产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产生冲突多少的因素,也就是影响查找效率的因素。影响产生冲突多少有以下三个因素:

散列函数是否均匀;
处理冲突的方法;
散列表的载荷因子(英语:load factor)。

        37、有一个4GB的文件,服务器只有1GB内存,如何排序(归并)



        38、有大约一亿个手机号码,最少能用多少文件空间排序和存储

8位电话号码总共有0----99999999个号码,使用bitmap的办法, 每一个bit(二进制位)代表一个8个数字的电话号码。
需要 100000000bit = 100000000/8 = 12500000bytes的内存进行存储, 也就是12.5M的内存空间进行存储

        39、堆、栈、队列

栈的插入和删除操作都是在一端进行的,而队列的操作却是在两端进行的。
队列先进先出,栈先进后出。
栈只允许在表尾一端进行插入和删除,而队列只允许在表尾一端进行插入,在表头一端进行删除 

栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等。
堆区(heap)   —   一般由程序员分配释放,   若程序员不释放,程序结束时可能由OS回收。
堆(数据结构):堆可以被看成是一棵树,如:堆排序;
栈(数据结构):一种先进后出的数据结构。


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值