1 数据库建立索引常用的规则如下:
1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
2 PHP多线程异步处理的几种方法
1.使用Ajax 与 img 标记
原理,服务器返回的html中插入Ajax 代码或 img 标记,img的src为需要执行的程序。
优点:实现简单,服务端无需执行任何调用
缺点:在执行期间,浏览器会一直处于loading状态,因此这种方法并不算真正的异步调用。
$.get("doRequest.php", { name: "fdipzone"} );
<img src="doRequest.php?name=fdipzone">
2.使用popen
使用popen执行命令:
优点:执行速度快
缺点:1.只能在本机执行
2.不能传递大量参数
3.访问量高时会创建很多进程。
// popen — 打开进程文件指针
resource popen ( string $command , string $mode )
pclose(popen('php /home/fdipzone/doRequest.php &', 'r'));
3
3.使用curl
设置curl的超时时间 CURLOPT_TIMEOUT 为1 (最小为1),因此客户端需要等待1秒
<?php
$ch = curl_init();
$curl_opt = array(
CURLOPT_URL, 'http://www.example.com/doRequest.php'
CURLOPT_RETURNTRANSFER,1,
CURLOPT_TIMEOUT,1
);
curl_setopt_array($ch, $curl_opt);
curl_exec($ch);
curl_close($ch);
?>
4
使用fsockopen
fsockopen是最好的,缺点是需要自己拼接header部分。
<?php
$url = 'http://www.example.com/doRequest.php';
$param = array(
'name'=>'fdipzone',
'gender'=>'male',
'age'=>30
);
doRequest($url, $param);
function doRequest($url, $param=array()){
$urlinfo = parse_url($url);
$host = $urlinfo['host'];
$path = $urlinfo['path'];
$query = isset($param)? http_build_query($param) : '';
$port = 80;
$errno = 0;
$errstr = '';
$timeout = 10;
$fp = fsockopen($host, $port, $errno, $errstr, $timeout);
$out = "POST ".$path." HTTP/1.1\r\n";
$out .= "host:".$host."\r\n";
$out .= "content-length:".strlen($query)."\r\n";
$out .= "content-type:application/x-www-form-urlencoded\r\n";
$out .= "connection:close\r\n\r\n";
$out .= $query;
fputs($fp, $out);
fclose($fp);
}
?>
3 websocket握手包括 3 次
第一次 发送请求
第二次 服务端返回连接请求
第三次 客户端返回连接就绪
php抽象类和接口的区别
ags:抽象类 接口 抽象类和接口 php
引言:这是一个面试经常被问到的问题,也是一个经典问题。我们尽量引用官方权威的说明或者经过实验来证明本文所说的内容准确性。
抽象类
官方描述请查看文档,下面是官方描述的梳理版本:
- 定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。(抽象类可以没有抽象方法,但是抽象类依然不能被实例化)被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。 如
<span style="color:#494949"><code><span style="color:#0000ff">abstract</span> <span style="color:#0000ff">class</span> <span style="color:#a31515">AbstractClass</span>
{
<span style="color:#008000">// 强制要求子类定义这些方法,且不能定义具体功能 注意没有大括号{}</span>
<span style="color:#0000ff">abstract</span> <span style="color:#0000ff">protected</span> <span style="color:#0000ff">function</span> <span style="color:#a31515">getValue</span> ();
<span style="color:#0000ff">abstract</span> <span style="color:#0000ff">protected</span> <span style="color:#0000ff">function</span> <span style="color:#a31515">prefixValue</span> ( $prefix );
<span style="color:#008000">// 普通方法(非抽象方法)</span>
<span style="color:#0000ff">public</span> <span style="color:#0000ff">function</span> <span style="color:#a31515">printOut</span> () {
<span style="color:#0000ff">print</span> <span style="color:#0000ff">$this</span> -> getValue () . <span style="color:#a31515">"\n"</span> ;
}
}</code></span>
- 继承一个抽象类的时候,非抽象子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
-
此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数(类似function eat($a,$b=1)中的$b就是可选参数),而父类抽象方法的声明里没有,则两者的声明并无冲突。这也适用于 PHP 5.4 起的构造函数。在 PHP 5.4 之前的构造函数声明可以不一样的。
补充:
- 抽象类可以有成员属性。
- 有人问:抽象方法是否可以定义为私有,答案是不可以,因为抽象接口的目的就是为了抽象出类模型用来继承,定义为私有,外部访问不到,偏移了设计目的。如下会报错
- 抽象类可以实现接口,且可以不实现其中的方法(后面接口的实现中有代码)
```php
abstract class Sutdent extends Human
{
abstract private function study();
}
```
Fatal error: Abstract function Sutdent::study() cannot be declared private in D:\11\index.php on line 10
- 抽象类可以继承抽象类,且不能重写抽象父类的抽象方法。这样的用法,可以理解为对抽象类的扩展。如
<span style="color:#494949"><code>
<span style="color:#0000ff">abstract</span> <span style="color:#0000ff">class</span> <span style="color:#a31515">Human</span>
{
<span style="color:#0000ff">abstract</span> <span style="color:#0000ff">function</span> <span style="color:#a31515">eat</span>();
}
<span style="color:#0000ff">abstract</span> <span style="color:#0000ff">class</span> <span style="color:#a31515">Sutdent</span> <span style="color:#0000ff">extends</span> <span style="color:#a31515">Human</span>
{
<span style="color:#0000ff">abstract</span> <span style="color:#0000ff">function</span> <span style="color:#a31515">study</span>();
<span style="color:#008000">//abstract function eat(); 若重写抽象父类的抽象方法eat()会报错</span>
}
</code></span>
若重写抽象父类的抽象方法则报以下错误
Fatal error: Can't inherit abstract function Human::eat() (previously declared abstract in Sutdent) in D:\11\index.php on line 11
接口
1. 接口的定义
- 使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
- 接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
- 接口中定义的所有方法都必须是公有,这是接口的特性,protected和private会报错(Fatal error: Access type for interface method)。
- 常量:接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。(不建议这样用,实在想不到有什么意义,也容易产生和抽象类的混淆)
<span style="color:#494949"><code>
<span style="color:#0000ff">interface</span> <span style="color:#a31515">Play</span>
{
<span style="color:#0000ff">const</span> LEVEL=10;
<span style="color:#0000ff">public</span> <span style="color:#0000ff">function</span> <span style="color:#a31515">PlayLOL</span>();
<span style="color:#0000ff">public</span> <span style="color:#0000ff">function</span> <span style="color:#a31515">PlayFootball</span>();
}
</code></span>
2. 接口的实现
要实现一个接口,使用 implements 操作符。非抽象类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
补充:
- 可以同时继承抽象类和实现接口,extends要写在前面.
- 抽象类实现接口,不需要重新其中的方法。
- 实现多个接口时,接口中的方法不能有重名。
- 接口也可以继承,通过使用 extends 操作符。
- 类要实现接口,必须使用和接口中所定义的方法完全一致的方式。否则会导致致命错误。
<span style="color:#494949"><code>
<span style="color:#0000ff">interface</span> <span style="color:#a31515">Play</span>
{
<span style="color:#0000ff">const</span> LEVEL=10;
<span style="color:#0000ff">public</span> <span style="color:#0000ff">function</span> <span style="color:#a31515">PlayLOL</span>();
<span style="color:#0000ff">public</span> <span style="color:#0000ff">function</span> <span style="color:#a31515">PlayFootball</span>();
}
<span style="color:#0000ff">interface</span> <span style="color:#a31515">Read</span>
{
<span style="color:#0000ff">public</span> <span style="color:#0000ff">function</span> <span style="color:#a31515">ReadNovel</span>();
}
<span style="color:#0000ff">abstract</span> <span style="color:#0000ff">class</span> <span style="color:#a31515">Human</span>
{
<span style="color:#0000ff">abstract</span> <span style="color:#0000ff">function</span> <span style="color:#a31515">eat</span>();
}
<span style="color:#008000">//抽象类可以实现接口后不实现其方法,可以继承一个抽象类的同时实现多个接口注意必须要把extends语句写在implements前面,否则会报错</span>
<span style="color:#0000ff">abstract</span> <span style="color:#0000ff">class</span> <span style="color:#a31515">Sutdent</span> <span style="color:#0000ff">extends</span> <span style="color:#a31515">Human</span> <span style="color:#0000ff">implements</span> <span style="color:#a31515">Play</span>,<span style="color:#a31515">Read</span>
{
<span style="color:#0000ff">abstract</span> <span style="color:#0000ff">function</span> <span style="color:#a31515">study</span>();
}
</code></span>
3. 接口的继承
接口可以继承另一个或多个接口,使用extends关键字,多个用 ',' 隔开,但是不能实现另一个接口,当然更不能继承抽象类(继承抽象类报错:Fatal error: PlayGame cannot implement Human - it is not an interface in D:\11\index.php on line 10)
<span style="color:#494949"><code>
<span style="color:#0000ff">interface</span> <span style="color:#a31515">Play</span>
{
<span style="color:#0000ff">public</span> <span style="color:#0000ff">function</span> <span style="color:#a31515">PlayFootball</span>();
}
<span style="color:#0000ff">interface</span> <span style="color:#a31515">PlayNew</span>
{
<span style="color:#0000ff">public</span> <span style="color:#0000ff">function</span> <span style="color:#a31515">PlayFootballNew</span>();
}
<span style="color:#0000ff">interface</span> <span style="color:#a31515">PlayGame</span> <span style="color:#0000ff">extends</span> <span style="color:#a31515">play</span>,<span style="color:#a31515">PlayNew</span>
{
<span style="color:#0000ff">public</span> <span style="color:#0000ff">function</span> <span style="color:#a31515">PlayLOL</span>();
}
</code></span>
总结
一般都在这里写相同点和不同点,我偏不写,嘿嘿,因为我觉得上面写的够详细了。
我们简单总结一句:抽象类一般用来定义一类实体是什么,他包含了属性,抽象方法和非抽象方法。接口用来定义一类实体能做什么,一般认为他只有抽象方法,常量极少用到。