开发机一直使用brew来安装PHP及其他的环境,今天把PHP升到7.1,由于7.1版本下还没有runkit的源,官方也没有更新支持到php7,庆幸Github上有人Fork后做了支持,所以无法使用brew安装,只能编译安装了。

首先下载runkit,解压,进入目录。

只好从 Nginx 上想其他的方案,毕竟之前曾利用 lua 脚本对 MySQL 连接请求进行改造过,果不其然,有类似的模块可以拷贝一个请求。

1
2
3
4
5
6
git clone https://github.com/runkit7/runkit7
cd runkit7
$(brew --prefix homebrew/php/php71)/bin/phpize
./configure --with-php-config=$(brew --prefix homebrew/php/php71)/bin/php-config
make && make install
make test

1
$(brew –prefix homebrew/php/php71)
即 brew info php71结果中的path值。

由于brew安装PHP会在php.ini同级目录创建conf.d目录,并把扩展的配置文件写在这里,一目了然知道都安装了哪些扩展,所以也以同样方式在此目录创建ext-runkit.ini。

1
make install
后会显示,具体路径可能会不一样。

1
Installing shared extensions:  /usr/local/Cellar/php71/7.1.0_11/lib/php/extensions/no-debug-non-zts-20160303/

这个目录即扩展.so的存放目录。下边会用到。

1
2
[runkit]
extension="/usr/local/Cellar/php71/7.1.0_11/lib/php/extensions/no-debug-non-zts-20160303/runkit.so"

至此,重启php-fpm就可以了。

最近通过 Java 重写了一个简单但流量较大的 PHP 项目,但需要做一个稳定的线上测试,将 PHP 项目的流量拷贝一份至 Java 项目上,在保证项目稳定的同时,从而评估出 Java 服务在性能和成本上的变更。

于是我最快联想到的解决方案是 tcp copy,在生产环境上部署和实施后,发现流量无法拷贝到测试服务器上,排查一天也没有结果,可能与我使用云服务提供商 AWS 有关。

只好从 Nginx 上想其他的方案,毕竟之前曾利用 lua 脚本对 MySQL 连接请求进行改造过,果不其然,有类似的模块可以拷贝一个请求。

1
2
3
4
5
6
                    |-> Nginx -> PHP                    |--> Nginx -> Java
                    |     |------Copy------|            |
Http Request -> ELB |-> Nginx -> PHP       +----> ELB --|--> Nginx -> Java
                    |     |------Copy------|            |
                    |-> Nginx -> PHP       |            |--> Nginx -> Java
                    |     |------Copy------|

最近团队正在做一些Java的转型,在一段时间的编程过程中,发现Java配合Maven的XML配置蛮多的,自己在调试的过程中也是踩了不少的坑,期间遇到各种问题,搜索的网上大量的文章,虽然大部分都是互相转载,加之自己摸爬滚打,周围有经验丰富的java工程师,综合下来也解决了大部分问题,正好十一放假,根据最近使用 Intellij 的经验做一些总结和记录,以免将来少走弯路。

创建项目以及工程

在 Intellij 创建项目,选择 Maven 工程 webapp,如下图:

创建项目

创建模块,可以简单先填写,这里方便演示,举个例子使用 demo.api,表示demo项目的api模块(创建结束后也可以修改和增加模块)

创建模块

Innodb数据库对于已经删除的数据只是标记为删除,并不真正释放所占用的磁盘空间,这就导致InnoDB数据库文件不断增长。

如果在创建数据库的时候设置 innodb_file_per_table=1,这样 InnoDB 会对每个表创建一个数据文件,然后只需要运行OPTIMIZE TABLE 命令就可以释放所有已经删除的磁盘空间。
运行 OPTIMIZE TABLE 表名后,虽然最后会报 Table does not support optimize, doing recreate + analyze instead,但其实已经成功了。

那么如果没有设置这个参数,又想释放空间,彻底释放这些已经删除的数据,需要把数据库导出,删除InnoDB数据库文件,然后再倒入。

下面是基本的步骤:

  1. 使用mysqldump命令将InnoDB数据库导出
  2. 停止MySQL
  3. 删除所有InnoDB数据库文件和日志
  4. 启动MySQL并自动重建InnoDB数据库文件和日志文件
  5. 导入前面备份的数据库文件

具体DEMO:

1
2
3
4
5
6
7
8
9
10
11
# 备份数据库:
mysqldump -uroot -proot --quick --force --all-databases > mysqldump.sql
# 停止数据库
service mysqld stop
# 删除这些大文件
rm /usr/local/mysql/var/ibdata1
rm /usr/local/mysql/var/ib_logfile*
# 手动删除除Mysql之外所有数据库文件夹,然后启动数据库
service mysqld start
# 还原数据
mysql -uroot -proot < mysqldump.sql

由于项目以及服务器管理比较多,OSX上操作直接使用终端,无法如Windows Xshell一般记住密码,每次ssh的时候都要输入密码实在太浪费时间,今天有空一口气全部改为公钥/私钥认证,登录再也不用任何密码了。

实现步骤:

在你的自己的机器下面使用

1
ssh-keygen
命令来实现创建公钥,使用
1
ssh-keygen -t rsa
来创建密钥,程序会问你存放的目录,如果不需要修改,直接回车两次即可。

将你

1
~/.ssh
目录中的
1
id_rsa.pub
这个文件拷贝到你要登录的服务器的
1
~/.ssh
目录中,然后再运行以下命令来将公钥导入到
1
~/.ssh/authorized_keys
这个文件中

1
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

另外要注意请务必要将服务器上

1
~/.ssh
权限设置为
1
700

1
~/.ssh/authorized_keys
的权限设置为
1
600

这是linux的安全要求,如果权限不对,自动登录将不会生效 完毕之后,退出服务器的登录,再使用ssh登录,你就会发现服务器不会再向你询问密码了.

当然也可以使用

1
ssh-copy-id
命令:
1
ssh-copy-id user@server

1
2
ssh-copy-id -i 公钥文件路径 user@server
ssh-copy-id -p 服务器SSH服务端口 user@server