用 Matomo 建设一个类似 Google Analytics 的网站

LAMP 技术栈真的是一个神奇的存在。昨天研究 Proxmox,去一个 TurnKeyLinux 的网站,看到了居然还有做一个类似 Google Analytics 的,所以就顺便上手做了一个 https://a.yj777.cn/

和其他所有 LAMP 系统一样,下载解压后,设置 Nginx 配置,certbot 挂免费 Let’s Encrypt 证书,浏览器进入,默认就是安装界面,去 MySQL 命令行创建数据库, grant 用户,然后填写数据库信息到安装界面,设置好管理用户的用户名和密码。系统就可以使用了。

然后添加第一个网站,输入网站的信息,就可以把生成的 JS 代码直接放入网站的 Header 等地方,收集信息了!

功能看上去很多,慢慢研究, 但是感觉比起 GA 来还是差一截。

Cool!

Ubuntu 1904 上的 Apache + PHP-FPM

在玩 Nginx 之余, 小伙伴们也要玩下 Apache ,索性就在最新版本的 Ubutu 1904 上玩耍一下。

# apt install apache2 php7.2 php7.2-fpm php7.2-mysql libapache2-mod-php7.2

安装中有几句话是这么说的:
NOTICE: Not enabling PHP 7.2 FPM by default.
NOTICE: To enable PHP 7.2 FPM in Apache2 do:
NOTICE: a2enmod proxy_fcgi setenvif
NOTICE: a2enconf php7.2-fpm

看这两个 a2 开头的脚本, ls -al 查看,原来就是软连接指向一个真正的 Perl 脚本 a2enmod 。

a2query 顾名思义是查询的,例如查询 php 模块是否启用:
# a2query -m php7.2

可以看到 Ubuntu 里面的 Apache 配置和 Web 虚拟机是通过 conf-available 和 sites-available 里的文件软连接到 conf-enabled 以及 sites-enabled 来启动的。

PHPDoc 的兼容性问题

  1. composer global remove phpdocumentor/phpdocumentor
  2. composer global require jms/serializer:1.7.*
  3. composer global require phpdocumentor/reflection-docblock:~2.0
  4. composer global require phpdocumentor/phpdocumentor:^2.9

运行:
$ phpdoc run –title “项目标题” –force -d 项目目录 -t 写入的目标目录 –ignore “extra/, ignore_dir2/”

LNMP 下 PHP-FPM 多版本以及不同 PHP 配置的部署

在考虑容器部署 LNMP 实现松耦合或者微服务方案时,感觉从性能上和配置上而言,用容器来部署没有太多的优点,反而在安全上造成太多的问题。

正好在实际部署 PHP 应用的过程中,发现一个 PHP 原来是 Windows 上开发的很古老的应用,迁移到 Linux 以后,必须打开 open_short_tag 。但是在这次迁移到生产环境的服务器时,考虑安全因素,决定不全局打开这个开关,但是又不想更改代码,所以针对这种情况,解决的办法是 php-fpm 配置里,新添加一个 Web Pool,然后把 open_short_tag 配置到这个新的 php-fpm 配置里。 具体而言就是复制原先的 www.conf 到一个新的例如 newweb.conf 然后修改 listen 的端口号或者 socket 的路径, 然后添加以下这行:
php_flag[short_open_tag] = On
重新启动 php-fpm 服务后,就可以看到进程表里两个不同的pool , netstat -nat 可以看到新的端口号已经启动。

那么如果要让一台机器运行不同的 PHP 版本,怎么办?实际上,在 Fedora/CentOS 上用现成的 REMI 源 ,就可以直接安装不同版本的 php-fpm ,然后启动不同的服务名称就可以。
例如同时运行 php72 和 php73,可以
1. yum install -y php72-php-fpm php73-php-fpm
2. systemctl enable/start/status php72-php-fpm php73-php-fpm
当然因为默认配置都是启动 127.0.0.1:9000 端口,所以需要至少修改其中一个服务的配置,把端口修改为9001 之类的。
具体配置文件在哪里,软件都安装了那些文件,我们用 repoquery 就可以查看

phpcs, phpdoc, phpunit

首先安装 composer,检查 composer 全局的路径:
$ composer global config bin-dir –absolute
把以上命令输出的路径目录加到 PATH 环境变量里

1. 安装 phpcs:
$ composer global require “squizlabs/php_codesniffer=*”
2. 安装 phpdoc:
$ composer global require “phpdocumentor/phpdocumentor=2.*”
3. 安装 phpunit:
$ composer global require phpunit/phpunit

只要 PATH 设置正确, 就可以直接在命令行执行 phpcs/phpdoc/phpunit 了。

Yii, CodeIgniter, CakePHP, ThinkPHP, Laravel, Symfony Zend 七大 PHP 框架的 Composer 安装方法

PHP 的框架各种都有,各种都流行,今天暂时不比较,只是安装一下。 假定以下所有都安装在 Web 服务器对应的 DocumentRoot 目录下。

Yii 安装文档官网连接:
https://www.yiiframework.com/download#offline-documentation
$ composer create-project --prefer-dist yiisoft/yii2-app-basic yii2-basic
将会创建一个 yii2-basic 的目录,
访问: http://localhost/yii2-basic/web

CodeIgniter(CI) 的安装文档: https://www.codeigniter.com/userguide3/installation/index.html
官方安装为 zip 下载后解压,不推荐。
$ composer create-project kenjis/codeigniter-composer-installer codeigniter (注意:非官方)
http://localhost/codeigniter/public/
官方 CI3, github 地址: https://github.com/bcit-ci/CodeIgniter

CakePHP 安装文档:
https://github.com/cakephp/cakephp
骨架安装:(需要事先安装 PHP 的 Intl 扩展)
$ composer create-project --prefer-dist cakephp/app cakephp
访问: http://localhost/cakephp/webroot/
或者用 bin/cake server -p 8765,然后访问: http://localhost:8765/

ThinkPHP 安装文档:
5.1 GitHub: https://github.com/top-think/think/tree/5.1
$composer create-project topthink/think tp5
访问: http://localhost/tp5/public/

Laravel 安装文档:
https://laravel.com/docs/5.8/installation
$ composer create-project --prefer-dist laravel/laravel laravel
访问: http://localhost/laravel/public/

Symfony 安装文档:
https://github.com/symfony/demo
$ composer create-project symfony/symfony-demo symfony_demo
访问: http://localhost/symfony_demo/public/
或者: 运行 symfony serve 后访问 http://localhost:8000/

Zend 安装文档:
https://framework.zend.com/downloads/expressive
$ composer create-project zendframework/zend-expressive-skeleton zend
访问: http://localhost/zend/public/
或者运行 composer serve 后访问: http://localhost:8080/

composer 介绍

作为 PHPer , 不知道 composer 是干么的,简直就是 shame.
第一, 先把 composer 库指向阿里云全量镜像:
$ composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

第二:一些基本命令:
查看配置: $ composer config –list
看了配置, 你当然就知道怎么去设置所需要的配置选项了
查看已经安装的包: $ composer show 或者composer info
后面加参数 –all 会列出所有的包(慎用)
$ composer show -t –ansi
能以树状以及 ansi 方式显示依赖

composer show -t –ansi

Composer 的 Global 和 Local 存储
composer 推荐以普通用户运行,因此, composer 的 global 是放在 $HOME/.composer 目录下的,而对应的 local (默认)是存放在当前项目目录下的 vendor

… …

代码 push 前对 PHP 做语法检查

按理说 IDE 就能做语法检查, 但是总有漏网之鱼,粗心之王,写了一个语法检查的脚本, 但是也仅仅限于语法检查。函数的合法性就没有去检查了。 这都是用来检查低级错误用的。 Sigh …

#!/bin/bash
检查 PHP 的语法错误 git push 之前检查
for f in $(git diff-tree –no-commit-id –name-only $(git log|head -1|awk ‘{print $2}’));do
if [ “$f” == “$(basename $f .php)””.php” ];then
php -l $f >/dev/null
[ $? != 0 ] && echo “出错了! $f 有语法错误,请检查后再提交代码。” && exit 1
# else
# echo “$f is not php file”
fi
done
# git push

ThinkPHP 框架从开头部署整合 git 代码库

从头开始部署 ThinkPHP 框架,保证框架代码保持最新版本。

1. $ composer create-project topthink/think project_name –prefer-dist
2. $ cd project_name; git clone git_url temp_dir
3. $ cd temp_dir; tar czf – * .git .gitignore|tar xzf – -C ..
4. $ cd ..; rm -rf temp_dir
5. $ git log // 验证
6. $ composer require 安装相关的包

TP 项目常见使用的软件包:(用 composer require 安装,安装某些包时需要 github Token, 按照指示登录 github 去copy Token过来粘贴即可(粘贴时不会显示 token!))
# 阿里云短信:alibabacloud/client
# 腾讯云短信: “qcloudsms/qcloudsms_php”
# 生成二维码: “endroid/qrcode”
# 生成 Captcha: “topthink/think-captcha”
#