邢栋博客
邢栋博客,Action博客,记录工作和生活中的点点滴滴
php 用 ... 定义变长参数函数
标签:
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 表示返回值但是没有使用
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);)。
回收算法
引用计数
会使用引用计数机制的类型
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);)。
回收算法