深入理解PHP ob_flush和flush的区别

当PHP脚本有输出时,输出控制函数可以用这些来控制输出。这在多种不同情况中非常有用,尤其是用来在脚本开始输出 数据后,发送http头信息到浏览器。输出控制函数不影响由 header() 或 setcookie()发送的文件头信息,仅影响象 echo这样的函数和PHP代码块间的数据。

buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区域。通过buffer,可以使进程这间的相互等待变少。

这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入 一个字符,操作系统并不会立即把这个字符直接写入到磁盘,而是先写入到buffer,当写满了一个buffer的时候,才会把buffer中的数据写入磁 盘,当然当调用内核函数flush()的时候,强制要求把buffer中的脏数据写回磁盘。

– 阅读剩余部分 –

Vagrantfile配置文件

Vagrantfile配置文件

生成对应的Vagrantfile。通过文本编辑器打开Vagrantfile可以进行一些进一步的常用配置:

网络配置:

Vagrant的网络有三种模式

1、较为常用是端口映射,就是将虚拟机中的端口映射到宿主机对应的端口直接使用 ,在Vagrantfile中配置:

config.vm.network :forwarded_port, guest: 80, host: 8080
#guest: 80 表示虚拟机中的80端口, host: 8080 表示映射到宿主机的8080端口。

– 阅读剩余部分 –

vagrant安装使用

vagrant

Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它 使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境
vagrant 官网https://www.vagrantup.com

在使用vagrant前首先要安装VirtualBoxvagrant
这两个安装没有好说的,vagrant默认安装就可以了

下面记录一下VagrantBox的使用
至于VagrantBox是什么,你可以认为它就是一个已经安装好的操作系统就可以了

添加VagrantBox有两种方法,一种是离线添加,还有一种是在线添加

– 阅读剩余部分 –

php assert断言

assert — 检查一个断言是否为 FALSE

bool assert ( mixed $assertion [, string $description ] )
assert()是检查$assertion是否返回false。$assertion一般是一个表达式或函数。

assert()如果检测了false,默认情况下会抛出一个Warning。

<span class="pi"><?php
assert(is_int(1.3));
echo "after assert";
</span>

– 阅读剩余部分 –

虚拟机linux找不到网卡解决

有时候重装系统后,重新安装虚拟机,之前安装过的linux启动后会出现找不到网卡的情况。或者克隆一个linux,也可能会出现这种情况。

网上有一种解决办法是这样的

启动虚拟机,执行下面的操作
#cd /etc/udev/rules.d
#mkdir backup
#mv * backup
#reboot
就可以了

我试了一下,似乎不能解决。

– 阅读剩余部分 –

UML类图几种关系的总结

在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)

1. 泛化(Generalization

【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。

【箭头指向】:带三角箭头的实线,箭头指向父类

– 阅读剩余部分 –

redis实现访问频率限制

使用redis实现访问频率限制,如每IP每分钟请求不能超过20次。

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', '6379');

$conf['count'] = 10;
$conf['time_range'] = 60;
$ip = "acl:127.0.0.1";

function aclByIp($key, $conf) {
    global $redis;
    extract($conf);
    $now = time();
    $listLength = $redis->lLen($key);

    if ($listLength < $count){
        $redis->lPush($key, $now);
        $flag = true;
    } else {
        $first_time = $redis->lIndex($key, -1);
        $last_time = $redis->lIndex($key, 0);
        if($now - $first_time < 60){
            echo "ERROR:访问频率超过限制\n";
            echo "你的动作确实快了点,请耐心等待".($time_range-($now-$last_time))."秒后再试。\n";
            $flag = false;
        }else{
            $redis->lPush($key,$now);
            $redis->lTrim($key,0,$count-1);
            $flag = true;
        }
    }
    return $flag;
}

if (aclByIp($ip, $conf)) {
    echo "OK. \n";
} else {

}
echo "<pre>";
print_r($redis->lRange($ip, 0, -1));

深入浅出讲解:php的socket通信

TCP/IPUDPSocket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问:

1.   什么是TCP/IP、UDP?
2.  Socket在哪里呢?
3.  Socket是什么呢?
4.  你会使用它们吗?

什么是TCP/IP、UDP?

         TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。

         UDPUser Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。
        这里有一张图,表明了这些协议的关系。

– 阅读剩余部分 –

php常用Stream函数集

stream_bucket_append函数:为队列添加数据
stream_bucket_make_writeable函数:从操作的队列中返回一个数据对象
stream_bucket_new函数:为当前队列创建一个新的数据
stream_bucket_prepend函数:预备数据到队列
stream_context_create函数:创建数据流上下文
stream_context_get_default函数:获取默认的数据流上下文
stream_context_get_options函数:获取数据流的设置
stream_context_set_option函数:对数据流、数据包或者上下文进行设置
stream_context_set_params函数:为数据流、数据包或者上下文设置参数
stream_copy_to_stream函数:在数据流之间进行复制操作
stream_filter_append函数:为数据流添加过滤器
stream_filter_prepend函数:为数据流预备添加过滤器
stream_filter_register函数:注册一个数据流的过滤器并作为PHP类执行
stream_filter_remove函数:从一个数据流中移除过滤器
stream_get_contents函数:读取数据流中的剩余数据到字符串
stream_get_filters函数:返回已经注册的数据流过滤器列表
stream_get_line函数:按照给定的定界符从数据流资源中获取行
stream_get_meta_data函数:从封装协议文件指针中获取报头/元数据
stream_get_transports函数:返回注册的Socket传输列表
stream_get_wrappers函数:返回注册的数据流列表
stream_register_wrapper函数:注册一个用PHP类实现的URL封装协议
stream_select函数:接收数据流数组并等待它们状态的改变
stream_set_blocking函数:将一个数据流设置为堵塞或者非堵塞状态
stream_set_timeout函数:对数据流进行超时设置
stream_set_write_buffer函数:为数据流设置缓冲区
stream_socket_accept函数:接受由函数stream_ socket_server()创建的Socket连接
stream_socket_client函数:打开网络或者UNIX主机的Socket连接
stream_socket_enable_crypto函数:为一个已经连接的Socket打开或者关闭数据加密
stream_socket_get_name函数:获取本地或者网络Socket的名称
stream_socket_pair函数:创建两个无区别的Socket数据流连接
stream_socket_recvfrom函数:从Socket获取数据,不管其连接与否
stream_socket_sendto函数:向Socket发送数据,不管其连接与否
stream_socket_server函数:创建一个网络或者UNIX Socket服务端
stream_wrapper_restore函数:恢复一个事先注销的数据包
stream_wrapper_unregister函数:注销一个URL地址包

php常见的五大运行模式

做 php 开发的应该都知道 php 运行模式概念吧,php目前比较常见的五大运行模式:

  • cgi (通用网关接口Common Gateway Interface)
  • fast-cgi (fast-cgi 是cgi的升级版本)
  • cli (Command Line Interface)
  • isapi (Internet Server Application Program Interface,是微软提供的一套面向Internet服务的API接口)
  • apache2handler (将php作为apache的模块, nginx类似)
  • 其他(continuity, embed, litespeed, milter等)

– 阅读剩余部分 –