开发VPS一键安装PHP环境的难题/折腾记(3)

王志勇 发表于 2019年09月18日 09:56

在《进度(2)》一文,由于fpm的服务名的多变,LNMP下用service --status-all | grep 'php'这个命令,会只显示一个fpm的服务,用于兼容所有Ubuntu/Debian系统下的fpm重启,此命令在Ubuntu 16下完美运行,此命令有点慢。但是在Ubuntu 12下会显示几十个服务,所以此命令只能放弃,换别的解决方案。

想办法尝试了一下,尝试用find命令,即:find /etc -name 'fpm'
在Ubuntu 12、16下测试,只显示一行,如:
Ubuntu 16显示:/etc/php/7.4/fpm
Ubuntu 12显示:/etc/php5/fpm

如果所有的Ubuntu/Debian系统都只显示这一行,就好办了。让Shell程序将显示结果最前面的“/etc/”字符删除掉,后面的 php/7.4/fpm 第一个/删除,第2个/替换为-,得到php7.4-fpm。/etc/php5/fpm,则只替换/为-,得到php5-fpm。

php7.4-fpm和php5-fpm就是需要得到的服务名。

PHP官方公司的开发者,应该把Ubuntu/Debian系统的fpm服务名,都统一为php-fpm,就省很多麻烦

Nginx的PHP服务进程名:
Ubuntu 14下是php5-fpm
CentOS 6下是php-fpm
Ubuntu 16,自带的PHP软件源的进程是php7.0-fpm

PPA+PHP的fpm进程名:
PHP 7.4: php7.4-fpm
PHP 7.4: php7.3-fpm
PHP 5.6: php5.6-fpm

等等。是不是真的够折腾的?就是因为fpm的名称不同,我在开发一键Shell命令中,还需要将所有的系统,所有的PHP版本都重新测试一遍。

2019-09-18 10:37更新:
刚测试了一下让Ubuntu 16同时安装PHP 7.4和PHP 5.6,然后用 find /etc -name 'fpm' 的命令,结果如:
/etc/php/7.4/fpm
/etc/php/5.6/fpm

所以这个命令只能让其运行一个PHP,只取第一个。Shell程序分享:

a1=`find /etc -name 'fpm'`; a2=(${a1// /}); echo ${a2[0]};

其中,a1变量的反引号会把回行符自动转成空格,a2=(${a1// /});表示把空格变成数组,${a2[0]}获取数组第一个值,就是/etc/php/7.4/fpm。

2019-09-18 10:53更新:更完美的解决、折腾方案
为了防止由于find命令会搜索所有的子目录,应该尽量缩小搜索范围,所以原搜索命令改为:
find /etc/php* -name 'fpm'

然后用a3=`ps -ef | grep 'fpm'`;来筛选出已有的fpm进程的名称。
将上述搜索结果进行遍历数组,如果数组中某个值包含在a3=`ps -ef | grep 'fpm'`当中,则这个值一定就是此时运行的PHP的fpm版本。

假如此时ps -ef当中没有fpm进程怎么办?只好按照上述的办法,只取数组中的第一个。

所以,避免PHP版本冲突的办法,用户的系统里最好只装一个PHP,其余版本全部不要装、或卸载。

2019-09-18 11:14更新:
上述提到的遍历 find /etc/php* -name 'fpm' 的结果的数组的Shell程序分享:

a1=`find /etc/php* -name 'fpm'`;
b1=(${a1// /}); for a2 in ${b1[@]}; do echo $a2; done;

上述程序的$a2就是所有的fpm的目录。

2019-09-18 11:27更新:
上述的解决办法,已经刚编写完成程序,Shell程序分享:

a4='';
a3=`ps -ef | grep 'fpm'`;
a1=`find /etc/php* -name 'fpm'`;
b1=(${a1// /});
a5=${b1[0]};
for a2 in ${b1[@]}; do if [[ $a3 =~ $a2 ]]; then a4=$a2; fi; done;

if [ "$a4"x = ''x ]; then a4=$a5; fi;
…… (还少了一步把/etc/php/7.3/fpm转成php7.3-fpm,未写完)
if [ "$a4"x != ''x ]; then service $a4 restart; fi;

说明:a4这个值,就是代表的fpm进程名,
b1=(${a1// /}); 这一行表示把空格变成数组,
if [ "$a4"x = ''x ]; then a4=$a5; fi; 这一行表示,如果ps -ef进程里没有fpm,则取find结果里的第一个fpm目录的名称,然后自动重启fpm。

2019-09-18 11:45更新:
把/etc/php/7.4/fpm转成php7.4-fpm,/etc/php5/fpm转成php5-fpm是这样想办法的,Shell程序分享:

a4='/etc/php/7.4/fpm';
a4=${a4//\/etc\//};
a4=${a4//\/fpm/};
a4=${a4//\//}'-fpm';
echo $a4;

说明:
第2行 a4=${a4//\/etc\//}; 首先把 /etc/ 字符删除,变成:
php/7.4/fpm
php5/fpm

第3行 a4=${a4//\/fpm/}; 把最后的字符 /fpm 删除,变成:
php/7.4
php5

第4行 ${a4//\//} 表示把 / 删除,变成:
php7.4
php5

第4行最后再添加'-fpm'的字符,即a4=${a4//\//}'-fpm';,变成:
php7.4-fpm
php5-fpm

最后就把/etc/php/7.4/fpm转成php7.4-fpm,/etc/php5/fpm转成php5-fpm。初看起来好像有点麻烦,经过这样解题,是不是变得思路清晰、简单了很多呢?

所以,把上述程序添加到最后一步重启fpm里,成品Shell程序为:

if [ "$a4"x != ''x ]; then a4=${a4//\/etc\//}; a4=${a4//\/fpm/}; a4=${a4//\//}'-fpm';
service $a4 restart;
fi;

完整的LNMP环境自动识别fpm进程名,并重启fpm最终的成品Shell程序是:

a4='';
a3=`ps -ef | grep 'fpm'`;
a1=`find /etc/php* -name 'fpm'`;
b1=(${a1// /});
a5=${b1[0]};
for a2 in ${b1[@]}; do if [[ $a3 =~ $a2 ]]; then a4=$a2; fi; done;

if [ "$a4"x = ''x ]; then a4=$a5; fi;
if [ "$a4"x != ''x ]; then a4=${a4//\/etc\//}; a4=${a4//\/fpm/}; a4=${a4//\//}'-fpm';
service $a4 restart;
fi;

0条评论:

发表评论:
名字: (*必填)
博客: (可省)

正文:

  记住信息?

王志勇:1980-09-26 (44周岁)
程序设计,前端设计。

版权声明:本博客所有文章,均符合原创的定义,禁止转载,违者将必究;正确的方法是贴原文的标题和网址即可。

与此相关的链接
自由勇专栏

Blog存档 Archives

2022年07月
2022年06月(15)
2022年05月(20)
2022年04月(16)
2022年03月(9)
2022年02月(9)
2022年01月(10)
2021年 +

2020年 +
2019年 +
2018年 +
2016年-2017年(9)
2014年06月-09月(10)
2013年 +
2012年 +
2011年 +
2010年 +
2009年 +
2008年 +
2007年 +
2006年 +
2005年09月(4)

Copyright © 2006-2024 auiou.com All rights reserved.
此Blog程序由王志勇编写