1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM ubuntu:21.04

LABEL maintainer="Thh"


RUN sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list && sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
RUN apt-get update \
&& apt-get install -y curl zip unzip git supervisor sqlite3 zsh vim net-tools

RUN git clone https://gitee.com/mirrors/oh-my-zsh.git ~/.oh-my-zsh \
&& cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc \
&& sed -i "s@robbyrussell@af-magic@g" ~/.zshrc \
&& git config --global --add oh-my-zsh.hide-dirty 1

CMD ["/bin/sh","-c","while true; do date +'%Y-%m-%d %T %z'; sleep 2; done"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3.5'

networks:
local_net:
driver: bridge
services: #表示这是一组服务
ubuntu:
build:
context: ubuntu
working_dir: /var/www
volumes:
- ${WORKSPACE}:/var/www:cached
restart: always #docker服务重启后nginx的docker容器也重启
networks:
- local_net
阅读全文 »

1
2
3
4
5
6
7
create table `id_maker`
(
`business` varchar(255) NOT NULL COMMENT '业务',
`next_id` decimal(64, 0) unsigned NOT NULL default 1 COMMENT '下一次id',
PRIMARY KEY (`business`) USING BTREE
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='idMaker';
1
2
3
4
5
6
insert into id_maker values ('default',1);
insert into id_maker values ('eat_food_00',1);
insert into id_maker values ('eat_food_01',101);
insert into id_maker values ('eat_food_02',201);
insert into id_maker values ('eat_food_03',301);
insert into id_maker values ('eat_food_04',401);
1
2
3
4
begin;
select next_id from id_maker where business = 'default';
update id_maker set next_id = next_id+100 where business = 'default';
commit;
1
2
3
4
begin;
select next_id from id_maker where business = 'default';
update id_maker set next_id = next_id+500 where eat_food_01 = 'default';
commit;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class IdMaker
{
public $idMaker = 'default';
public $maxId = '0';
public $nextId = '0';
public function __construct()
{
$this->idMaker = 'eat_food_'.rand_mt(0,4);
$this->updateIdMaker();
}

public function getNextId()
{
if($nextId>$maxId){
$this->updateIdMaker();
}
return $this->nextId++;
}

protected function updateIdMaker()
{
// 通过 idMaker 获取最新的
$this->nextId = $maxId;
$this->maxId = $nextId + 100;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118


alias workspace='cd /Users/thh/workspace'
alias sha='shasum -a 256 '
alias untar='tar -zxvf '
alias vi='vim'
alias wget='wget -c '
alias ipi='ifconfig getifaddr en0'
alias ipe='curl ipinfo.io/ip'
alias c='clear'
alias cls='clear'
alias ipe='curl ipinfo.io/ip'
alias ipi='ifconfig getifaddr en0'
alias ping='ping -c 5'
alias sha='shasum -a 256 '
#alias phpstan='~/tools/vendor/bin/phpstan'
alias rphpstan='phpstan analyse --error-format table -c ~/tools/phpstan.neon'
alias needpwd=' openssl rand -base64 16'
alias showip='cat /etc/resolv.conf'
hello(){
echo "\n"
echo "needpwd\n"
echo "ii\n"
echo "showip\n"
echo "gitcbr\n"
}
gitcbr()
{
$1
git checkout -b $1 origin/$1
}
gitpp()
{
$1
git push origin $1:$1
}

alias upsource="source ~/.zshrc"
alias hosts='code /etc/hosts'
alias phpunit='./vendor/bin/phpunit'

cddr()
{
echo $1
case $1 in
php71 )
docker exec -it php-71 /bin/zsh
;;
p71 )
docker exec -it php-71 /bin/zsh
;;
php72 )
docker exec -it php-72 /bin/zsh
;;
p72 )
docker exec -it php-72 /bin/zsh
;;
php )
docker exec -it php-super /bin/zsh
;;
p )
docker exec -it php-super /bin/zsh
;;
nginx)
docker exec -it nginx /bin/sh
;;
ng)
docker exec -it nginx /bin/sh
;;
php8)
docker exec -it php-80 /bin/zsh
;;
p8)
docker exec -it php-80 /bin/zsh
;;
n)
docker exec -it nginx bash
;;
esac
}

upngconfig(){
docker exec nginx nginx -s reload
}


pdate()
{
php -r 'echo date("Y-m-d H:i:s",time()).PHP_EOL;'
}

ptime()
{
php -r 'echo time();'
}

source ~/.bash_profile

gitsetp()
{
git config --global http.proxy 'http://127.0.0.1:11000'
git config --global https.proxy 'http://127.0.0.1:11000'
}

gitunsetp()
{
git config --global --unset http.proxy
git config --global --unset https.proxy
}

# export PATH=$PATH:/Users/thh/go/bin
# export PATH=$PATH:/Users/thh/.local/platform-tools
# export PATH=$PATH:/Users/thh/.local/bin
# export MAVEN_HOME=/Users/thh/.local/apache-maven-3.8.1
# export PATH=$PATH:$MAVEN_HOME/bin
# export PATH="/opt/homebrew/opt/php@7.4/bin:$PATH"
# export PATH="/opt/homebrew/opt/php@7.4/sbin:$PATH"
# export PATH="/opt/homebrew/opt/node@12/bin:$PATH"

开发服务端接口的时候会使用postman进行调试,但是postman毕竟是一个功能比较固定的窗口软件,虽然postman也支持before after的一些操作,但是在参数复杂,或者批量调用的时候会存在操作繁琐,性能不高的情况,所以早先的时候有一些接口的调试我使用laravel-console+GuzzleHttp进行接口调试 ,postman用来辅助编写。 相比于postman这类的窗口软件,用语言直接编写接口调试的功能更加强大,并且在批量调用的时候响应上比postman快很多(postman 如果按照组进行调用,如果量大了会卡住)。后来就我就换成了go+resty。其中得益于换成了go,今天在测试环境寻找合适的测试数据,效率也比较快的完成。

阅读全文 »

浏览器收藏栏收藏了了许多看过的。一直没清理,导致越来越多,不不方便管理,所以把一些已经看完/或者以后可能会查询但是目前不看的收藏的放在这

阅读全文 »

php 层次式性能分析器

php官网xhprof介绍
pecl_xhprof

目前xhprof有着比较新的更新,pecl显示是原来版本fork后的版本。不过一致到8都提供了支持。所以可以在开发测试环境使用来分析代码的运行状况

install

如果不能直接下载或许需要 sudo pecl install xhprof ,或者先进行 pecl 的更新

1
pecl install xhprof

之后将extension=xhprof.so 加入对应的 php.ini(注意区分fpm和cli的ini配置是否相同)

接着可以配合已经浅封装的php代码进行分析
https://github.com/phacility/xhprof

其中如果是web项目可以进行双入口控制,在另一个入口中引入原来的入口。这样对原有代码污染。

如新的 index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

require __DIR__ . '/../ifang_php_forgelogin/phpapps/forgelogin/src/public/index.php';


$xhprof_data = xhprof_disable();

$XHPROF_ROOT = __DIR__;
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_testing");

$str = "http://localhost/xhprof/xhprof_html/index.php?run={$run_id}&source=xhprof_testing\n";

file_put_contents(__DIR__.'/tmp.log',$str);

图形化显示依赖graphviz

安装graphviz

1
2
apt update 
apt install graphviz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php

$code = <<<'CODE'
<?php

function test($foo)
{
var_dump($foo);
}

class Cat
{
public int $a = 1;
protected float $b = 2;
public function __construct($a) {
$this->a = $a;
}
}
$cat = new Cat(1);
$f = function () use ($cat){
echo $cat;
};
CODE;

/**
* 创建一个php7的语法解析器(Parser),在没有传入词法解析器(Lexer)的时候会创建一个默认的词法分析器
* 同时如果没有指定只使用php7的语法解析器,那么将会同时创建一个php7和一个php5的parser
*/
$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);

try {
/* @var $parser Multiple */
$ast = $parser->parse($code);
/**
* 解析时先使用[0]解析器,当解析存在报错时,会调用后续的解析器,直至等到一个完全没有解析错误的结果
*
* 上面的都不重要
*
*/
} catch (Error $error) {
echo "Parse error: {$error->getMessage()}\n";
return 1;
}

$dumper = new NodeDumper;
echo $dumper->dump($ast) . "\n";
1
$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);

创建一个php7的语法解析器(Parser),在没有传入词法解析器(Lexer)的时候会创建一个默认的词法分析器
同时如果没有指定只使用php7的语法解析器,那么将会同时创建一个php7和一个php5的parser

默认lexer

1
2
3
4
public function create(int $kind, Lexer $lexer = null, array $parserOptions = []) : Parser {
if (null === $lexer) {
$lexer = new Lexer\Emulative();
}
默认parser
1
2
3
4
case self::PREFER_PHP7:
return new Parser\Multiple([
new Parser\Php7($lexer, $parserOptions), new Parser\Php5($lexer, $parserOptions)
]);

解析时先使用[0]解析器,当解析存在报错时,会调用后续的解析器,直至等到一个完全没有解析错误的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public function parse(string $code, ErrorHandler $errorHandler = null) {
if (null === $errorHandler) {
$errorHandler = new ErrorHandler\Throwing;
}

list($firstStmts, $firstError) = $this->tryParse($this->parsers[0], $errorHandler, $code);
if ($firstError === null) {
return $firstStmts;
}

for ($i = 1, $c = count($this->parsers); $i < $c; ++$i) {
list($stmts, $error) = $this->tryParse($this->parsers[$i], $errorHandler, $code);
if ($error === null) {
return $stmts;
}
}

throw $firstError;
}

上述都不重要

自己传入异常,当有错的时候抛出这个写法有点意思呀

这个项目用的是get_token_all研究卒

阅读全文 »
0%