邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

php 用 ... 定义变长参数函数
       // 1.
	$email = [];
	$email[] = 'hello world !';
	$email[] = 'what are you doing?';
	//mail('my@126.com',...$email);


	//2
	function addAll(...$num){
		return array_sum($num);
	}

	echo addAll(1,2,3,4,5,6,7,8,9);
php 的 yield 简单使用
    // 文件的读取(一)
    function getLines($filename){
        $f = fopen($filename,'rb');
        try{
            while ($line = fgets($f)) {
                yield $line;
            }
        }finally{
            fclose($f);
        }
    }
    $lines = getLines('my.log');
    foreach($lines as $line){
        echo $line.PHP_EOL;
    }

    // 文件的读取(二)
    function getLiness($filename){
        $f = fopen($filename,'rb');
        try{
            while ($line = fgets($f)) {
                $lineParts = explode(' ',$line,2);
                yield $lineParts[0] => $lineParts[1];
            }
        }finally{
            fclose($f);
        }
    }

    foreach(getLiness('my.log') as $ip => $line){
        echo $ip.'=》'.$line.PHP_EOL;
    }


    // 大数组的构建
    function xrange($start,$end,$step=1){
        for ($i=$start; $i <= $end; $i+=$step) {
            yield $i;
        }
    }
    foreach (xrange(1,999) as $num) {
        echo $num,"\n";
    }
php安装vld扩展查看编译opcode

php安装vld扩展查看编译opcode

wget http://pecl.php.net/get/vld-0.14.0.tgz

tar -zxvf vld-0.14.0.tgz 

/usr/local/php/bin/phpize 

./configure --with-php-config=/usr/local/php/bin/php-config --enable-vld

make && make install 

vim /usr/local/php/etc/php.ini ,在文件最后面加入 extension=vld.so

service php-fpm restart //重启php-fpm


例子 

vim array.php
<?php
        $tmp = array('a'=>'a','b'=>'b','c'=>'c');
        $a = $tmp['a'];
        $b = $tmp[b];
        $c = $tmp["c"];


然后执行 
php -dvld.active=1 ./array.php    //如果加入 -dvld.execute=0(默认是1),则文件只输出opcode而不执行

返回结果如下
Finding entry points
Branch analysis from position: 0
Jump found. (Code = 62) Position 1 = -2
filename:       /data/www/study/array.php
function name:  (null)
number of ops:  9
compiled vars:  !0 = $tmp, !1 = $a, !2 = $b, !3 = $c
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   ASSIGN                                                   !0, <array>
   3     1        FETCH_DIM_R                                      $5      !0, 'a'
         2        ASSIGN                                                   !1, $5
   4     3        FETCH_CONSTANT                                   ~7      'b'
         4        FETCH_DIM_R                                      $8      !0, ~7
         5        ASSIGN                                                   !2, $8
   5     6        FETCH_DIM_R                                      $10     !0, 'c'
         7        ASSIGN                                                   !3, $10
   6     8      > RETURN                                                   1

branch: #  0; line:     2-    6; sop:     0; eop:     8; out1:  -2
path #1: 0, 
PHP Notice:  Use of undefined constant b - assumed 'b' in /data/www/study/array.php on line 4	

可以看到$tmp[b] 在编译成opcode的时候就比其他两个多一步



php正则相关知识点笔记

正则 环视(零宽断言)

环视不匹配任何字符,只匹配文本中的特定位置。类似于\b,^,$那样。环视不会占用字符。

环视分为顺序和逆序两种。

顺序
(?=exp)位置的后面能匹配exp。例如(?=\d)当前位置右边是数字
(?!exp)位置的后面不能匹配exp。例如(?!\d)当前位置右边不是数字

逆序
(?<=exp)位置的前面能匹配exp。例如(?<=\d)当前位置左边是数字
(?<!exp)位置的前面不能匹配exp。例如(?<!\d)当前位置左边不是数字


(?=jeffrey)jeff 等价于  jeff(?rey)

例子
<?php
$string = '5345678986';
$pattern = '/(?!=\d)(?=(\d{3})+$)/';
$replacement  = ',';
echo  preg_replace($pattern, $replacement, $string);//5,345,678,986


贪婪与懒惰
贪婪 通常的行为是匹配尽可能多的字符
a.*b -- aabab -- 会匹配 aabab
懒惰 只要在后面加上一个问号?。这样.*? 就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
a.*?b --- aabab  --  会匹配 aab和 ab


正则的引擎
是否支持忽略优先量词和分组捕获
支持的话是 NFA
不支持的话是 DFA

DFA文本主导   //  awk,egrep,flex,lex,msyql,procmail
NFA表达式主导 //  gnu,emacs,java,ergp,less,more,.net,perl,php,python,ruby,sed,vi



php pcre的主要函数

preg_grep    --------------  返回匹配模式的数组条目
preg_match --------------   执行一个正则表达式匹配
preg_match_all -------------- 执行一个全局正则表达式匹配
preg_filter --------------  执行一个正则表达式搜索和替换
preg_replace --------------   执行一个正则表达式的搜索和替换
preg_replace_callback --------------执行搜索并且使用一个回调进行替换
preg_split-------------- 通过一个正则表达式分隔字符串
preg_quote -------------- 转义正则表达式字符
preg_last_error-------------- 返回最后一个pcre正则执行产生的错误代码


linux下安装node+npm+vue
cd /opt
wget https://npm.taobao.org/mirrors/node/latest-v10.x/node-v10.2.1-linux-x64.tar.gz
tar -zxvf node-v10.2.1-linux-x64.tar.gz

vim /etc/profile
加入
export PATH=$PATH:/opt/node-v10.2.1-linux-x64/bin
然后
source /etc/profile


换用淘宝npm源
npm install -g cnpm --registry=https://registry.npm.taobao.org



安装vue
cnpm install -g vue-cli
vue init webpack first-vue
cd first-vue
cnpm install
npm run dev

然后就可以通过 localhost:8080在浏览器里访问了
php7下安装event扩展
1.先安装libevent

wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz

tar -zxvf libevent-2.1.8-stable.tar.gz

cd  libevent-2.1.8-stable

./configure --prefix=/usr/local/libevent-2.1.8

make 

make install


2.再安装event扩展

wget http://pecl.php.net/get/event-2.3.0.tgz

tar -zxvf  event-2.3.0.tgz

cd event-2.3.0

/usr/local/php7/bin/phpize

./configure --with-php-config=/usr/local/php7/bin/php-config --with-event-libevent-dir=/usr/local/libevent-2.1.8/

make 

make install

然后在php.ini中加入 extension=event.so

重启php-fpm即可

php7内核读书笔记-第五章 php的编译与执行
php7内核读书笔记-第五章 php的编译与执行
opline指令-操作数类型
IS_CONST 常量,也称作字面量,比如$a=123,$a="hello",其中123,hello就是字面量
IS_CV 变量,比如$a=123,$b=3+$c,$a,$b,$c就是CV变量
IS_VAR PHP变量,比如$a=time(),time()的返回值就是IS_VAR类型
IS_TMP_VAR 临时变量,或者中间变量 $a="hello_".time(),  "hello".time()就是临时变量
IS_UNUSED 表示操作数没有使用
EXT_TYPE_UNUSED 表示返回值但是没有使用
php7内核读书笔记-第四章 内存管理
php7内核读书笔记-第四章 内存管理
引用计数
会使用引用计数机制的类型
type refcounted
simple types
string Y
interned string N(内部字符串,request完成后统一销毁释放 $a="hi")
array Y
imutable array N(不可变数组)
object Y
resource Y
reference Y

垃圾回收
ps:如果一个变量value的refcount减少到了0,那么此value可以被释放掉,不属于垃圾;如果一个变量value的refcount减少之后大于0,那么此value还不能被释放,此value可能成为一个垃圾(例子 $a=array(1);$a[]=$a;unset($a);)。
回收算法

优惠券
最新微语