引用符号'&'在foreach循环中的惊喜
工作中总会遇到一些奇奇怪怪的由前人所写下的不可置疑的代码,如果你仅仅跟着眼前所见的代码去理解他人的思路,Well You have fell into a terrible situation.
贴一段示例代码:
1 |
|
你也许会回答这样一个输出结果:
Anthony 发表于 标签: PHP
工作中总会遇到一些奇奇怪怪的由前人所写下的不可置疑的代码,如果你仅仅跟着眼前所见的代码去理解他人的思路,Well You have fell into a terrible situation.
贴一段示例代码:
1 | <?php |
你也许会回答这样一个输出结果:
Anthony 发表于 标签: PHP / OpenSSL / mcrypt / xtea
PHP版本从7.2开始不再支持mcrypt扩展,所以我们需要使用OpenSSl对其进行替换。本文仅列出部分算法的替换示例,所以不在本文出现的算法或模式需要自行尝试,顺水推舟。
本文替换案例:
在使用 MCRYPT_RIJNDAEL_128 的地方,如果秘钥长度分别为16、24、32,则加密算法用 AES-128-ECB、AES-192-ECB、AES-256-ECB,BlockSize为16、24、32。
首先列出需要用到的数据填充方法:
1 | function ZeroPadding($str, $block = 16) { |
Anthony 发表于 标签: Golang / PHP / RPC
写这篇笔记的目的
为了应对后续开发生涯中可能遇到的种种情况以及分布式计算的趋势(讲白了就是后续对工作会很有帮助)。如若总是依赖http-api/restful编写并提供外部调用接口,当接口数量不断上升,文档内容不断增加,这给设计者和使用者都带来非常不好的体验,而RPC在这体就现出了非常大的优势。我将自己的理解和体会以及学习的过程记录在这里,以便今后遇到问题能够从这儿获得些许的线索以及提供一个参考给同道中人。
前提
不妨思考这样一个情形:作为接口设计者,我早已经定义好的接口的请求方式(RESTFul)和返回结构(json),但是每个接口我还需要另外维护一个文档来说明各个接口的用法(请求参数)和解释返回的结果(字段描述)。而对于接口的调用者而言,不但要去文档中查找自己需要的接口并阅读说明,在实际调用中,还要以防接口提供者返回非既定结构的结果而导致的报错。
介绍
Remote Procedure Call(远程过程调用),简称RPC。它可以使得调用远程服务接口如同调用本地方法一样简单。虽然实质还是通过网络通信,但是相比http请求api的网络开销还是极小的,其原因简单来说,HTTP协议每次请求都需要建立TCP连接,就会涉及3次握手的网络开销问题以及冗余报文,而rpc直接使用TCP多路复用(gRPC基于HTTP/2)无需重复建立连接。就文档方面而言,编写一份开发文档足矣,因为接口的定义由接口定义语言(IDL)来完成,而阅读IDL便可理解所有接口,并且通过编译器可以将IDL编译成不同的语言实现源码(gRPC通过protoc编译器将protobuf编译)。其他优点例如:注册、监控、发布等的这里不做论述。
Go-Server
GRPC的官方资源:go get google.golang.org/grpc
GRPC的镜像资源:https://github.com/grpc/grpc
官方的相关示列可以在grpc/examples/中找到。
使用protocol buffers去定义gRPC service和方法 request以及 response 的类型。
新增并编辑文件:something.proto
1 | syntax = "proto3"; |
Go-代码
1 | protoc --go_out=plugins=grpc:. something.proto |
运行这个命令后,会在当前目录生成一个something.pb.go文件,内容包含:
PHP-代码
1 | protoc --proto_path=./ --php_out=./ --grpc_out=./ --plugin=protoc-gen-grpc=/Users/anthony/git/grpc/bins/opt/grpc_php_plugin ./something.proto |
其中/Users/anthony/git/grpc/bins/opt/grpc_php_plugin对应从git中获取的<grpc-git-path>/bins/opt/grpc_php_plugin
运行这个命令后,会在当前目录生成如下:
首先我们需要实现服务定义的服务接口:
something/something.go:
1 | package something |
然后运行一个gRPC服务器,注册我们的服务并监听来自客户端的请求:
server.go:
1 | package main |
简单执行命令:go run server.go,然后等待客户端请求。
Go-Client
创建文件client.go:
1 | package main |
PHP-Client
PHP首先要安装grpc的php扩展,下载地址:http://pecl.php.net/package/gRPC
直接使用phpize安装:
1 | tar -zxf grpc-1.17.0.tgz |
执行php -m | grep grpc 应该会输出”grpc”,就代表成功了。
创建客户端文件,这里需要用到composer获取两个包,其中composer.json内容为:
1 | { |
something.php:
1 | <?php |
Go-Client
我们先编译一下:go build client.go,输出可执行文件client,然后直接运行:
./client Anthony./client ny分别输出如下:
1 | 2018/12/02 13:40:15 Find user: id:1 name:"Anthony" age:24 sex:Female |
1 | 2018/12/02 13:40:25 Find user: |
PHP-Client
直接执行PHP文件:php something.php Anthony和php something.php ny,结果如下:
1 | int(1) |
1 | int(0) |
本次笔记接近结尾了,内容很简单,主要记录使用grpc的大体流程。为后续的测试做一点点的准备。
参考资料
当你的服务同时开放于公网和内网,子服务却仅允许内网访问,那么则会涉及到IP白名单的功能。但是如果名单太多或者服务进行了迁移,那么维护起来会相当的麻烦,最简单的就是判断访问的来源IP是否内网IP地址,从而直接屏蔽掉公网IP。
首先,我们认识了3类私有地址:
A类:10.0.0.0-10.255.255.255
B类:172.16.0.0-172.31.255.255
C类:192.168.0.0-192.168.255.255
还有一个本机地址:127.0.0.1
他们就是我们平时所谓的内网IP地址。
filter_var($IP, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)
如果$IP是内网IP则会返回false,否则返回ip字符串。
1 | $IP = get_client_ip(); //该方法自己实现,返回客户端的IP地址 |
关于IP地址的知识,这里就不讲太多了,下面的方法就是根据IP地址的定义和网段的划分等专业知识进行判定的。懂的就自然懂啦!
1 | <?php |
更加不用解释了。
1 | <?php |
参考:
Anthony 发表于 标签: PHP
在PHP中内置的对数组操作的方法(函数)有一个叫做’array_column’的非常实用,它可以用作返回一个二维数组的指定列。
先介绍一下它!
好比这样一个用法:
1 | $students = array( |
输出结果:
1 | array (size=4) |
这样就得到了一个所有名字的数组,想必对于一个PHPER来说并不陌生。但是今天要讲的重点是array_column的另外一个用法,如果给它第三个参数,那么它将以第三个参数对应的数组中的值作为返回数组的键,用例如下:
Anthony 发表于 标签: Linux / MySQL / Nginx / PHP
环境:
软件:
依赖软件:
Anthony 发表于 标签: PHP
为何我的date(“Y/m/d H:i:s”)相差了7个小时?
环境:MacOS X EI Capitan / PHP5.6.25
今天在校验Crontab的计划执行时,利用PHP输出执行时间却发现输出的时间和当地事件相差了7个小时,对!是7不是8,并不是默认的UTC,呵呵了~
好吧,一贯思路,我去把php.ini中的date.timezone修改成PRC。嗯,肯定正常了吧。
要能正常我也不会写本文了^_~!
不论是修改成PRC还是Asia/Shanghai又或者UTC,全都未然。

php -i | grep zone也还是同样没变


php -a交互模式,调用ini_get('date.timezone'),检查配置的INI是否生效
全都没有任何问题啊!!!为什么结果却出乎意料呢??百度,谷歌我都问遍了,大家没人出现我这样的情况啊。正当我发愁的时候,小伙伴过来给我支招了。

由于项目和学习的需要,本机曾经升级到了5.5.38已经不够折腾了,所以时候升级一波5.6了(没必要到7的时候,我是不会去升级的)。
首先直接去搜索引擎找便捷的方法呗,直接就选中了一款来自“简书”的文章,因为它就简单的一条命令:
1 | curl -s http://php-osx.liip.ch/install.sh | bash -s 5.6 |
看到这个地址,我心里就放心了!因为上一个版本也是liip的。
我首先看了一下这个install.sh的内容,确定没有什么危险,里面其实就是检测一下设备的系统版本和cpu类型是否可以升级。
环境检测没问题就去下载了一个叫做“packager.tgz”的压缩包,然后解压,运行里面的pythony脚本。
1 | #TYPE = 5.6-10.10 |
Anthony 发表于 标签: PHP
昨天在做某兔的校招笔试题的时候遇到的题目,就这一个编程题,然而当时却没有拿下,把它和字符串匹配中的子串包含给弄混了,哎!
废话少说,上代码!
1 | <?php |
没什么含金量,只是写出来练练手,思路照搬过来的。
以前说起写算法,基本上都是拿C语言来写,因为用C可以更清楚的理解各种排序算法和数据结构。今天遍换成使用PHP语言来写几个常用的算法。
这次要写的算法包括:
<?php
$arr = array(4,3,5,6,8,0,10,15,11);
echo implode(' ',$arr);
//冒泡排序 最坏 平均O(N^2) 最好O(N)
function BubbleSort($arr){
$length = count($arr);
if($length <= 1){
return $arr;
}
for($i=0;$i<$length;$i++){
for($j=0;$j<$length-$i-1;$j++){
if($arr[$j] > $arr[$j+1]){
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
}
}
}
return $arr;
}
echo "\nBubbleSort:\n";
echo implode(' ',BubbleSort($arr))."\n";
?>