[转]多个php版本的composer使用
Php/Js/Shell/Go jackxiang 2017-9-1 15:26
背景:有的人一台服务搞好几个PHP版本,麻烦,建议用Docker隔离~
由于系统环境变量之前同事安装的laravel是5.1...php默认的环境变量是:
不想破话原有环境变量,因为现在新的项目是laravel5.4.。。所以在用默认composer require安装时提示php版本过低滴问题
问题是这样滴:
默认composer安装会调用原来的php5.5环境变量,所以这里安装会出现兼容问题
新项目使用的是php7.1
那么如何在多个php版本中互不干扰安装composer呢,折腾了半个多小时,
现在说下解决办法吧:
1:下载composer.phar,官网有直接下载的链接,https://getcomposer.org/download/
2:composer.phar 复制到项目根目录,比如我的是:/home/www/web
3:执行 /usr/local/php7/bin/php composer.phar update (这里我的安装路径是/usr/local/php7/bin/php,不一定适合你额,请对号入座即可吧)
4:安装依赖包:/usr/local/php7/bin/php composer.phar require laravel/scout
OK,大功告成!
由于系统环境变量之前同事安装的laravel是5.1...php默认的环境变量是:
不想破话原有环境变量,因为现在新的项目是laravel5.4.。。所以在用默认composer require安装时提示php版本过低滴问题
问题是这样滴:
默认composer安装会调用原来的php5.5环境变量,所以这里安装会出现兼容问题
新项目使用的是php7.1
那么如何在多个php版本中互不干扰安装composer呢,折腾了半个多小时,
现在说下解决办法吧:
1:下载composer.phar,官网有直接下载的链接,https://getcomposer.org/download/
2:composer.phar 复制到项目根目录,比如我的是:/home/www/web
3:执行 /usr/local/php7/bin/php composer.phar update (这里我的安装路径是/usr/local/php7/bin/php,不一定适合你额,请对号入座即可吧)
4:安装依赖包:/usr/local/php7/bin/php composer.phar require laravel/scout
OK,大功告成!
PHP7高可用全球开发者大会的点滴记录片段~
Php/Js/Shell/Go jackxiang 2017-7-3 20:40
goto 性能好,但编译时间长。
技术一定要伴随需求的,有一个场景的。
工程师的社会责任。
做技术还是要懂业务。
Opcache回收问题:负载高的问题。影响稳定性。
Kafka
PHP-FPM能否解决数据库连接池的问题:
1)定时重启的机制。
2)Php-FPM重启一下。
3)要规避一下。(业务时间点)
粗放、性能高,内存搞得很精细,也很耗时。
Mysql的连接池,Kafka~
返回值在后面:Grep。(指函数返回值和C不一样)
autoconf版本太底~
makefile也是为了提高效率。
掌握知识不同,用的方法不同,本质是一样的。
关注生成这个扩展能否写出来,再看Autoconf,再看编译系统。
学一个语言成了研究这个编辑器的问题,要Forcus在那个点上。
做一件事表非常难非常难的时候,你得怀疑这样做对不对?
脖子肌肉不够强。
高性能PHP7~
终端用户的真实体验,才是应用性能是否良好的最终标准。
技术一定要伴随需求的,有一个场景的。
工程师的社会责任。
做技术还是要懂业务。
Opcache回收问题:负载高的问题。影响稳定性。
Kafka
PHP-FPM能否解决数据库连接池的问题:
1)定时重启的机制。
2)Php-FPM重启一下。
3)要规避一下。(业务时间点)
粗放、性能高,内存搞得很精细,也很耗时。
Mysql的连接池,Kafka~
返回值在后面:Grep。(指函数返回值和C不一样)
autoconf版本太底~
makefile也是为了提高效率。
掌握知识不同,用的方法不同,本质是一样的。
关注生成这个扩展能否写出来,再看Autoconf,再看编译系统。
学一个语言成了研究这个编辑器的问题,要Forcus在那个点上。
做一件事表非常难非常难的时候,你得怀疑这样做对不对?
脖子肌肉不够强。
高性能PHP7~
终端用户的真实体验,才是应用性能是否良好的最终标准。
[实践OK]cat | wc -l 少一行的问题,linux的wc -l 命令统计文件少一行(一般是windows文件)。
Php/Js/Shell/Go jackxiang 2017-6-27 22:13
背景:用Windows下的Excel,再倒腾成Txt,在Linux下统计发现少一行,最后,用vi对最后一行的行尾按回车后再加一行,后删除这一行,再统计就对了,具体原因如下。
今天从一个服务器列表来批量执行expect脚本进行Tivoli Endpoint Client的安装,从excel表格中拷贝出服务器名导入到txt文件上传到服务器后,执行wc -l统计发现少了一行,反复对比确认不存在遗失的条目,那么为什么wc -l少一行呢?
查询帮助文件:
[root@managevm1 ~]# wc --help
-l, --lines print the newline counts
-l用来统计新行的个数,那么用什么来标记新行的开始呢?对了!用换行符\n。于是用 vi编辑器打开txt文件,在最后一行的行尾回车下,然后ESC推出到命令模式,dd删除自然生成的最后一个空行。保存退出再次运行wc -l统计,这样就和excel中的行数一样了。
=============================================================
先简单介绍
wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出
格式:wc file
命令参数:
-c 统计Bytes数(字节数),并显示文件名
-l 统计行数:使用换行符‘\n’作为行结束标志,实际是统计换行符个数
-m 统计字符数。这个标志不能与 -c标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L 打印最长行的长度。
-help 显示帮助信息
--version 显示版本信息
实例:
wc test.txt
6 24 132test.txt
默认输出:行,字数,字节数
test.txt内容
Cat test.txt
test1 name1 age1 sex1
test2 name2 age2 sex2
test3 name3 age3 sex3
test4 name4 age4 sex4
test5 name5 age5 sex5
test6 name6 age6 sex6
问题:wc 统计行数时少一行:
因为wc ?l是按\n作为行结束符统计行数,所以最后一行如果没有\n的话会统计丢失。
实例:比如,在windows下生成同上面test.txt相同的文件testtt.txt,上传到linux下:
cat testtt.txt
test1 name1 age1 sex1
test2 name2 age2 sex2
test3 name3 age3 sex3
test4 name4 age4 sex4
test5 name5 age5 sex5
test6 name6 age6 sex6[wizad@srv26 lmj]$
可以看出结尾有点奇怪。这是因为文件末尾无\n,而是直接用了文件结束符EOF。这样文件使用wc统计就会少一行:
wc -l testtt.txt
5 24 136 testtt.txt
使用管道也不行:
cat testtt.txt | wc -l
5
为什么linux下没有这样的问题?
因为vim编辑器会自动在文件结尾加上\n,在加上文件结束符EOF。(linux下文本文件主要按处理,所以vim会末行自动加\n)
而对windows文件用dos2unix转化也不行:
[wizad@srv26 lmj]$ dos2unix testtt.txt
dos2unix: converting file testtt.txt toUNIX format ...
[wizad@srv26 lmj]$ wc testtt.txt
5 24131 testtt.txt
可以看出windows文件在linux下还是有兼容问题的。文件字数没变24,byte数少5个是windows下行结束符是回车\r+换行\n。而linux下只是换行\n
Vim二进制可以看到不同,\n显示为.,文件结尾没有
来自:http://blog.csdn.net/sws9999/article/details/7942074
今天从一个服务器列表来批量执行expect脚本进行Tivoli Endpoint Client的安装,从excel表格中拷贝出服务器名导入到txt文件上传到服务器后,执行wc -l统计发现少了一行,反复对比确认不存在遗失的条目,那么为什么wc -l少一行呢?
查询帮助文件:
[root@managevm1 ~]# wc --help
-l, --lines print the newline counts
-l用来统计新行的个数,那么用什么来标记新行的开始呢?对了!用换行符\n。于是用 vi编辑器打开txt文件,在最后一行的行尾回车下,然后ESC推出到命令模式,dd删除自然生成的最后一个空行。保存退出再次运行wc -l统计,这样就和excel中的行数一样了。
=============================================================
先简单介绍
wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出
格式:wc file
命令参数:
-c 统计Bytes数(字节数),并显示文件名
-l 统计行数:使用换行符‘\n’作为行结束标志,实际是统计换行符个数
-m 统计字符数。这个标志不能与 -c标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L 打印最长行的长度。
-help 显示帮助信息
--version 显示版本信息
实例:
wc test.txt
6 24 132test.txt
默认输出:行,字数,字节数
test.txt内容
Cat test.txt
test1 name1 age1 sex1
test2 name2 age2 sex2
test3 name3 age3 sex3
test4 name4 age4 sex4
test5 name5 age5 sex5
test6 name6 age6 sex6
问题:wc 统计行数时少一行:
因为wc ?l是按\n作为行结束符统计行数,所以最后一行如果没有\n的话会统计丢失。
实例:比如,在windows下生成同上面test.txt相同的文件testtt.txt,上传到linux下:
cat testtt.txt
test1 name1 age1 sex1
test2 name2 age2 sex2
test3 name3 age3 sex3
test4 name4 age4 sex4
test5 name5 age5 sex5
test6 name6 age6 sex6[wizad@srv26 lmj]$
可以看出结尾有点奇怪。这是因为文件末尾无\n,而是直接用了文件结束符EOF。这样文件使用wc统计就会少一行:
wc -l testtt.txt
5 24 136 testtt.txt
使用管道也不行:
cat testtt.txt | wc -l
5
为什么linux下没有这样的问题?
因为vim编辑器会自动在文件结尾加上\n,在加上文件结束符EOF。(linux下文本文件主要按处理,所以vim会末行自动加\n)
而对windows文件用dos2unix转化也不行:
[wizad@srv26 lmj]$ dos2unix testtt.txt
dos2unix: converting file testtt.txt toUNIX format ...
[wizad@srv26 lmj]$ wc testtt.txt
5 24131 testtt.txt
可以看出windows文件在linux下还是有兼容问题的。文件字数没变24,byte数少5个是windows下行结束符是回车\r+换行\n。而linux下只是换行\n
Vim二进制可以看到不同,\n显示为.,文件结尾没有
来自:http://blog.csdn.net/sws9999/article/details/7942074
[替换实战]sed模拟替换,sed -i (先sed -n匹配模拟替换输出加p模拟替换显示后)实现*.conf批量替换文件中的控制字符(特别是模拟替换),以替换PHP-FPM的PHP-SOCK位置为例子。
Php/Js/Shell/Go jackxiang 2017-6-27 11:08
核心是模拟替换,用
记住,斜杠要转意,再就是是 sed -n 's#abc#def#p' replcee.txt ==> sed -i 's#abc#def#' replcee.txt 不要有g,如: sed -i #abc#def#g replcee.txt,出现没有被替换:
sed -n "s#,'pdo-mysql-php70-7.0.5'#123#p" ./*.yml #单引不行用双引,sed -n 's#,\'pdo-mysql-php70-7.0.5\'#123#p' ./*.yml
真实的替换将123给去了:
&符号也要转义:
正确替换为:
PHP.ini替换示例:
sed -n "s#stream_socket_server,#333#p" php.ini
; disable_functions = chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,333fsocket
批量替换包含某些内容的sed结合grep脚本:
sed -i "s#localhost#10.71.182.128#g" grep -rl "localhost" ./
上面也可以实现先模拟替换,再真实替换,更靠谱一些:
sed -n 's#\/data\/jenkins\/jobs\/jackxiang.com_deploy\/#\/data\/jenkins\/jobs\/jackxiang.com_deploy\/workspace\/#p' *.yml
真的替换:
sed -i 's#\/data\/jenkins\/jobs\/jackxiang.com_deploy\/#\/data\/jenkins\/jobs\/jackxiang.com_deploy\/workspace\/#' *.yml
nginx.lua2内容,给$upstream_response_time变量加上引号:
'"upstream_response_time":$upstream_response_time,'
sed -n 's@:$upstream_response_time@:"$upstream_response_time"@p' /usr/local/share/lua/5.1/kong/templates/nginx.lua2
'"upstream_response_time":"$upstream_response_time",'
替换一下PHP的SOCK文件位置,/usr/local/php/var/run/php-fpm.sock ===> /dev/shm/php-fcgi.sock:
cat /usr/local/php/etc/php-fpm.conf |grep php-fpm.sock
cat /usr/local/nginx/conf/vhost/*.conf|grep php-fpm.sock
新的:
cat /usr/local/php/etc/php-fpm.conf |grep php-fcgi.sock
cat /usr/local/nginx/conf/vhost/*.conf|grep php-fcgi.sock
启动Nginx和PHP成功后删除软链接的sock文件:
ls -lart /usr/local/php/var/run/php-fpm.sock
rm -rf /usr/local/php/var/run/php-fpm.sock
ansible 10.70.32.33,10.70.32.32 -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
ansible 10.70.32.33,10.70.32.32 -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/php/etc/php-fpm.conf"
cp -rf /usr/local/php/etc/php-fpm.conf /usr/local/php/etc/php-fpm.conf.bak.04.20
sed -i "s/\/usr\/local\/php\/var\/run\/php-fpm.sock/\/dev\/shm\/php-fcgi.sock/g" /usr/local/php/etc/php-fpm.conf
diff /usr/local/php/etc/php-fpm.conf.bak.04.20 /usr/local/php/etc/php-fpm.conf
service php-fpm restart
替换Nginx的配置文件:
批量测试:
ansible jack_vedio_upload -a"curl -i -H"Host:u.jackxiang.com" http://127.0.0.1/simpleupload.php"|grep 200 -B 2 > simpleupload.php.test.response.200.log
批量:
ansible 10.71.182.6 -a"sed -i 's/\/usr\/local\/php\/var\/run\/php-fpm.sock/\/dev\/shm\/php-fcgi.sock/g' /usr/local/php/etc/php-fpm.conf && service php-fpm restart"
换成#号:
ansible 192.168.112.161 -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#g' /usr/local/php/etc/php-fpm.conf"
sed -n 's#\/usr\/local\/php\/var\/run\/php-fpm\.sock#\/dev\/shm\/php-fcgi\.sock#p' /usr/local/nginx/conf/vhost/*.conf
用ansible尝试批量替换#p ,注意显示内容:
ansible 10.71.182.6 -a"sed -n 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#p' /usr/local/nginx/conf/vhost/*.conf"
正式开始批量替换:
ansible 10.71.182.6 -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
ansible xiyou -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
ansible xiyou_api -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
ansible xiyou_my -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
<H2 class=post-title>用<FONT style="BACKGROUND-COLOR: #ffff00">awk</FONT>和sed实现批量替换文件中的控制字符</H2><DIV class=post-body> 有时候会遇到这样一个问题,就是把文件ftp上传到AIX系统以后,发现文件中包含了一些特殊的控制字符,例如最常见的^M。如果文件只是一个两个,那直接用vi打开文件,把文件中的控制字符替换掉就可以了。但如果文件数量很多的话,这样一个个去改就会变得很麻烦。这时候我们可以通过<FONT style="BACKGROUND-COLOR: #ffff00">awk</FONT>和sed实现对多个文件的批量处理,具体步骤如下:
1)假设需要修改的文件放在/tmp/test1目录下,然后新建一个目录,如/tmp/test2目录,这个目录用来存放修改后的文件。
ls -1 * | <FONT style="BACKGROUND-COLOR: #ffff00">awk</FONT> '{print "sed 's/^M//g' "$1" >/tmp/test2/"$1}' > sed.sh
生成的脚本文件如下所示:<BR><div class=code>sed s/^M//g test.txt >/tmp/test2/test.txt
sed s/^M//g test2.txt >/tmp/test2/test2.txt
3)执行生成的脚本文件:
就会在/tmp/test2目录下生成去掉控制字符^M后的文件。
一些其他的方法可以参考以下的文章:
<U><FONT color=#0000ff>用sed批量替换文件中的字符</FONT></U></A>
<U><FONT color=#0000ff>批量修改文件</FONT></U></A>
<U><FONT color=#0000ff>sed的in-place edit选项,和RTFM</FONT></U></A>
方法1:
这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库.
手工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“替换为”http://localhost:8081/nexus/content/groups/public“.
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,
perl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'
方法2:
Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。
用sed命令可以批量替换多个文件中的字符串。
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`
例如:我要把mahuinan替换为huinanma,执行命令:
sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'
这是目前linux最简单的批量替换字符串命令了!
具体格式如下:
sed -i "s/oldString/newString/g" `grep oldString -rl /path`
实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`
方法3:
在日程的开发过程中,可能大家会遇到将某个变量名修改为另一个变量名的情况,如果这个变量是一个局部变量的话,vi足以胜任,但是如果是某个全局变量的话,并且在很多文件中进行了使用,这个时候使用vi就是一个不明智的选择。这里给出一个简单的shell命令,可以一次性将所有文件中的指定字符串进行修改:
grep "abc" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i 's/abc/abcde/g'
记住,斜杠要转意,再就是是 sed -n 's#abc#def#p' replcee.txt ==> sed -i 's#abc#def#' replcee.txt 不要有g,如: sed -i #abc#def#g replcee.txt,出现没有被替换:
sed -n "s#,'pdo-mysql-php70-7.0.5'#123#p" ./*.yml #单引不行用双引,sed -n 's#,\'pdo-mysql-php70-7.0.5\'#123#p' ./*.yml
真实的替换将123给去了:
&符号也要转义:
正确替换为:
PHP.ini替换示例:
sed -n "s#stream_socket_server,#333#p" php.ini
; disable_functions = chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,333fsocket
批量替换包含某些内容的sed结合grep脚本:
sed -i "s#localhost#10.71.182.128#g" grep -rl "localhost" ./
上面也可以实现先模拟替换,再真实替换,更靠谱一些:
sed -n 's#\/data\/jenkins\/jobs\/jackxiang.com_deploy\/#\/data\/jenkins\/jobs\/jackxiang.com_deploy\/workspace\/#p' *.yml
真的替换:
sed -i 's#\/data\/jenkins\/jobs\/jackxiang.com_deploy\/#\/data\/jenkins\/jobs\/jackxiang.com_deploy\/workspace\/#' *.yml
nginx.lua2内容,给$upstream_response_time变量加上引号:
'"upstream_response_time":$upstream_response_time,'
sed -n 's@:$upstream_response_time@:"$upstream_response_time"@p' /usr/local/share/lua/5.1/kong/templates/nginx.lua2
'"upstream_response_time":"$upstream_response_time",'
替换一下PHP的SOCK文件位置,/usr/local/php/var/run/php-fpm.sock ===> /dev/shm/php-fcgi.sock:
cat /usr/local/php/etc/php-fpm.conf |grep php-fpm.sock
cat /usr/local/nginx/conf/vhost/*.conf|grep php-fpm.sock
新的:
cat /usr/local/php/etc/php-fpm.conf |grep php-fcgi.sock
cat /usr/local/nginx/conf/vhost/*.conf|grep php-fcgi.sock
启动Nginx和PHP成功后删除软链接的sock文件:
ls -lart /usr/local/php/var/run/php-fpm.sock
rm -rf /usr/local/php/var/run/php-fpm.sock
ansible 10.70.32.33,10.70.32.32 -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
ansible 10.70.32.33,10.70.32.32 -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/php/etc/php-fpm.conf"
cp -rf /usr/local/php/etc/php-fpm.conf /usr/local/php/etc/php-fpm.conf.bak.04.20
sed -i "s/\/usr\/local\/php\/var\/run\/php-fpm.sock/\/dev\/shm\/php-fcgi.sock/g" /usr/local/php/etc/php-fpm.conf
diff /usr/local/php/etc/php-fpm.conf.bak.04.20 /usr/local/php/etc/php-fpm.conf
service php-fpm restart
替换Nginx的配置文件:
批量测试:
ansible jack_vedio_upload -a"curl -i -H"Host:u.jackxiang.com" http://127.0.0.1/simpleupload.php"|grep 200 -B 2 > simpleupload.php.test.response.200.log
批量:
ansible 10.71.182.6 -a"sed -i 's/\/usr\/local\/php\/var\/run\/php-fpm.sock/\/dev\/shm\/php-fcgi.sock/g' /usr/local/php/etc/php-fpm.conf && service php-fpm restart"
换成#号:
ansible 192.168.112.161 -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#g' /usr/local/php/etc/php-fpm.conf"
sed -n 's#\/usr\/local\/php\/var\/run\/php-fpm\.sock#\/dev\/shm\/php-fcgi\.sock#p' /usr/local/nginx/conf/vhost/*.conf
用ansible尝试批量替换#p ,注意显示内容:
ansible 10.71.182.6 -a"sed -n 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#p' /usr/local/nginx/conf/vhost/*.conf"
正式开始批量替换:
ansible 10.71.182.6 -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
ansible xiyou -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
ansible xiyou_api -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
ansible xiyou_my -a"sed -i 's#\/usr\/local\/php\/var\/run\/php-fpm.sock#\/dev\/shm\/php-fcgi.sock#' /usr/local/nginx/conf/vhost/*.conf"
<H2 class=post-title>用<FONT style="BACKGROUND-COLOR: #ffff00">awk</FONT>和sed实现批量替换文件中的控制字符</H2><DIV class=post-body> 有时候会遇到这样一个问题,就是把文件ftp上传到AIX系统以后,发现文件中包含了一些特殊的控制字符,例如最常见的^M。如果文件只是一个两个,那直接用vi打开文件,把文件中的控制字符替换掉就可以了。但如果文件数量很多的话,这样一个个去改就会变得很麻烦。这时候我们可以通过<FONT style="BACKGROUND-COLOR: #ffff00">awk</FONT>和sed实现对多个文件的批量处理,具体步骤如下:
1)假设需要修改的文件放在/tmp/test1目录下,然后新建一个目录,如/tmp/test2目录,这个目录用来存放修改后的文件。
ls -1 * | <FONT style="BACKGROUND-COLOR: #ffff00">awk</FONT> '{print "sed 's/^M//g' "$1" >/tmp/test2/"$1}' > sed.sh
生成的脚本文件如下所示:<BR><div class=code>sed s/^M//g test.txt >/tmp/test2/test.txt
sed s/^M//g test2.txt >/tmp/test2/test2.txt
3)执行生成的脚本文件:
就会在/tmp/test2目录下生成去掉控制字符^M后的文件。
一些其他的方法可以参考以下的文章:
<U><FONT color=#0000ff>用sed批量替换文件中的字符</FONT></U></A>
<U><FONT color=#0000ff>批量修改文件</FONT></U></A>
<U><FONT color=#0000ff>sed的in-place edit选项,和RTFM</FONT></U></A>
方法1:
这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库.
手工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“替换为”http://localhost:8081/nexus/content/groups/public“.
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g'这里用到了Perl语言,
perl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'
方法2:
Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。
用sed命令可以批量替换多个文件中的字符串。
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`
例如:我要把mahuinan替换为huinanma,执行命令:
sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'
这是目前linux最简单的批量替换字符串命令了!
具体格式如下:
sed -i "s/oldString/newString/g" `grep oldString -rl /path`
实例代码:sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`
方法3:
在日程的开发过程中,可能大家会遇到将某个变量名修改为另一个变量名的情况,如果这个变量是一个局部变量的话,vi足以胜任,但是如果是某个全局变量的话,并且在很多文件中进行了使用,这个时候使用vi就是一个不明智的选择。这里给出一个简单的shell命令,可以一次性将所有文件中的指定字符串进行修改:
grep "abc" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i 's/abc/abcde/g'
[实践OK]Linux下使用find命令使用-exec 进行两次大括号传入路径进行cat重定向到对应的特定文件,清空日志目录日志。
Php/Js/Shell/Go jackxiang 2017-6-24 13:06
[实践OK]Linux下使用find命令使用-exec 进行两次大括号传入路径进行cat重定向到对应的特定文件可结合xargs 相关命令:http://jackxiang.com/post/6520/
find超级查找,路径模糊、文件名模糊、时间、大小:
看文件名:https://linux.cn/article-6956-1.html ,使用 -l 选项可以只显示文件名。 ll |grep ^d 只显示目录。
查找所有Conf文件包含了upstream的时间变量的文件列出来:
./nginx.conf
#删除/home/git/gitlab下所有系统日志(每周日11点59分删除一次所有日志)
59 23 * * 0 find /home/git/gitlab/log -name "*.log" -exec bash -c "echo '' > {}" \;
=============================================
这个解决方法我可是找了好久。。。正确写法:
find -name "*" -exec sh -c 'cat {} > {}.out.iso' \;
find -name "*.php" -exec bash -c "mv -f {} {}.tmp" \;
find -name "*.php" -exec bash -c "copy {} {}.tmp" \;
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}.tmp; mv -f {}.tmp {}" \;
替换文件名内容:
find /tmp/exectest -name "*.txt" -exec bash -c "ls {}" \;
/tmp/exectest/b.txt
/tmp/exectest/aaa/ccc.txt
find /tmp/exectest -name "*.txt" -exec bash -c "ls {}|sed -e 's/txt/php/'" \;
/tmp/exectest/b.php
/tmp/exectest/aaa/ddd.php
批量给不同层次的目录包含的*.log里写入jackwriteLog或清空日志:
find -name "*.log" -exec bash -c "echo '' > {}" \;
#删除/home/git/gitlab下所有系统日志(每周日11点59分删除一次所有日志)
59 23 * * 0 find /home/git/gitlab/log -name "*.log" -exec bash -c "echo "" > {}" \;
修改为这样:
#删除/home/git/gitlab下所有系统日志(每周日11点59分删除一次所有日志)
find /home/git/gitlab/log -name "*.log" -exec bash -c "echo "" > {}" \;
# find -name "*.log" -exec bash -c "echo 'jackwriteLog' > {}" \;
# cat ./k.log
jackwriteLog
# cat ./n/n.log
jackwriteLog
# cat ./n/j/a.log
jackwriteLog
find -name "*.php" -exec bash -c "cp {} {}.tmp" \;
a.php a.php.tmp b.php b.php.tmp
@ 2010-08-20 BS一下不看manpage的自己
引用
$ man sed
...
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
...
也就是说,只需要用 sed -i 就可以直接替换文件中的内容
======以前的分割线======
要用sed批量修改文件的内容,但是用这个命令解决不了问题:
find -name "*.php" -exec sed -e 's/aaa/bbb/' {} > {} \;
因为bash把 > 解释为find命令输出的重定向。
修改一下:
find -name "*.php" -exec sed -e 's/aaa/bbb/' {} \> {} \;
还是不行,因为 sed 去寻找一个名为 > 的文件进行处理
再修改:
find -name "*.php" -exec "sed -e 's/aaa/bbb/' {} \> {} " \;
还是不行,因为find去找一个名为 "sed -e 's/aaa/bbb/' {} \> {} " 的程序来执行
那是囧之又囧阿。于是去baidu,去google,
但是无论baidu还是google "find -exec 重定向"
都搜不到相应的解决方案,这样的问题居然没有人遇到过?
于是用google搜了一下
引用
linux find using "-exec" sed redirect
搜到了这一页: http://www.loisch.de/linux.html
看来还是国人太ooxx了,sigh。
解决方案其实很简单:绕个弯,把 -exec 的命令给shell来执行
注意:下面的命令一定不要在有用的文件上直接尝试!!!!!!
引用
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}" \;
哦也!没有错误提示了!
然后 ls -al 一下,爽!所有文件大小都变成 0 了!
为什么捏?那篇文章里面解释了:
因为bash检测到需要重定向到那个文件,所以事先把那个文件清空了。
那篇文章里面提到一个修改bash配置的解决方案,但是不通用,建议还是用他说的第二种方案:
引用
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}.tmp; mv -f {}.tmp {}" \;
嘿,这下爽了!
From:https://www.felix021.com/blog/read.php?1465
像下面这些文章只是说这么用,但从不说为何,在QQ群里说只一句重定向,没一个解释更深入点的,附录:
如何在-exec参数中使用重定向
http://www.2cto.com/os/201306/222794.html
Clear log file content without impacting service that is running (in batch):
find . -name "*.log" -exec bash -c ">{}" \;
Subsitute file content in batch:
find -name "*.xml" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}" \;
http://blog.csdn.net/duanlove/article/details/8261677
find超级查找,路径模糊、文件名模糊、时间、大小:
看文件名:https://linux.cn/article-6956-1.html ,使用 -l 选项可以只显示文件名。 ll |grep ^d 只显示目录。
查找所有Conf文件包含了upstream的时间变量的文件列出来:
./nginx.conf
#删除/home/git/gitlab下所有系统日志(每周日11点59分删除一次所有日志)
59 23 * * 0 find /home/git/gitlab/log -name "*.log" -exec bash -c "echo '' > {}" \;
=============================================
这个解决方法我可是找了好久。。。正确写法:
find -name "*" -exec sh -c 'cat {} > {}.out.iso' \;
find -name "*.php" -exec bash -c "mv -f {} {}.tmp" \;
find -name "*.php" -exec bash -c "copy {} {}.tmp" \;
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}.tmp; mv -f {}.tmp {}" \;
替换文件名内容:
find /tmp/exectest -name "*.txt" -exec bash -c "ls {}" \;
/tmp/exectest/b.txt
/tmp/exectest/aaa/ccc.txt
find /tmp/exectest -name "*.txt" -exec bash -c "ls {}|sed -e 's/txt/php/'" \;
/tmp/exectest/b.php
/tmp/exectest/aaa/ddd.php
批量给不同层次的目录包含的*.log里写入jackwriteLog或清空日志:
find -name "*.log" -exec bash -c "echo '' > {}" \;
#删除/home/git/gitlab下所有系统日志(每周日11点59分删除一次所有日志)
59 23 * * 0 find /home/git/gitlab/log -name "*.log" -exec bash -c "echo "" > {}" \;
修改为这样:
#删除/home/git/gitlab下所有系统日志(每周日11点59分删除一次所有日志)
find /home/git/gitlab/log -name "*.log" -exec bash -c "echo "" > {}" \;
# find -name "*.log" -exec bash -c "echo 'jackwriteLog' > {}" \;
# cat ./k.log
jackwriteLog
# cat ./n/n.log
jackwriteLog
# cat ./n/j/a.log
jackwriteLog
find -name "*.php" -exec bash -c "cp {} {}.tmp" \;
a.php a.php.tmp b.php b.php.tmp
@ 2010-08-20 BS一下不看manpage的自己
引用
$ man sed
...
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
...
也就是说,只需要用 sed -i 就可以直接替换文件中的内容
======以前的分割线======
要用sed批量修改文件的内容,但是用这个命令解决不了问题:
find -name "*.php" -exec sed -e 's/aaa/bbb/' {} > {} \;
因为bash把 > 解释为find命令输出的重定向。
修改一下:
find -name "*.php" -exec sed -e 's/aaa/bbb/' {} \> {} \;
还是不行,因为 sed 去寻找一个名为 > 的文件进行处理
再修改:
find -name "*.php" -exec "sed -e 's/aaa/bbb/' {} \> {} " \;
还是不行,因为find去找一个名为 "sed -e 's/aaa/bbb/' {} \> {} " 的程序来执行
那是囧之又囧阿。于是去baidu,去google,
但是无论baidu还是google "find -exec 重定向"
都搜不到相应的解决方案,这样的问题居然没有人遇到过?
于是用google搜了一下
引用
linux find using "-exec" sed redirect
搜到了这一页: http://www.loisch.de/linux.html
看来还是国人太ooxx了,sigh。
解决方案其实很简单:绕个弯,把 -exec 的命令给shell来执行
注意:下面的命令一定不要在有用的文件上直接尝试!!!!!!
引用
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}" \;
哦也!没有错误提示了!
然后 ls -al 一下,爽!所有文件大小都变成 0 了!
为什么捏?那篇文章里面解释了:
因为bash检测到需要重定向到那个文件,所以事先把那个文件清空了。
那篇文章里面提到一个修改bash配置的解决方案,但是不通用,建议还是用他说的第二种方案:
引用
find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}.tmp; mv -f {}.tmp {}" \;
嘿,这下爽了!
From:https://www.felix021.com/blog/read.php?1465
像下面这些文章只是说这么用,但从不说为何,在QQ群里说只一句重定向,没一个解释更深入点的,附录:
如何在-exec参数中使用重定向
http://www.2cto.com/os/201306/222794.html
Clear log file content without impacting service that is running (in batch):
find . -name "*.log" -exec bash -c ">{}" \;
Subsitute file content in batch:
find -name "*.xml" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}" \;
http://blog.csdn.net/duanlove/article/details/8261677
超实用shell技巧 —— !$,以及!:$+1(free !:1)和上个命令各个参数的表示方法,Esc + . 和!$一样一样的。
Php/Js/Shell/Go jackxiang 2017-6-24 13:05
在shell中,!$是一个特殊的环境变量,它代表了上一个命令的最后一个参数。
自己常常使用:Esc + . 和!$一样一样的。
$! 刚好写法相反,则表示Shell最后运行的后台Process的PID,看下面的例子:
mkdir -p /tmp/a/b/c/d/e/f
# ls !$
ls /tmp/a/b/c/d/e/f
# ls !$
ls /tmp/a/b/c/d/e/f
a.txt b.txt c.txt
# rm -Rf !$
rm -Rf /tmp/a/b/c/d/e/f
# ls !$
ls /tmp/a/b/c/d/e/f
ls: 无法访问/tmp/a/b/c/d/e/f: 没有那个文件或目录
Shell参数变量之 !:0是命令行,!:1是参数1,!:2是参数2,如下所示:
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo hello world
hello world
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo !:3
-bash: :3: bad word specifier
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo hello world
hello world
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo !:2
echo world
world
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo !:1
echo world
world
例二:
# free -m
total used free shared buff/cache available
Mem: 991 856 32 34 103 29
Swap: 1407 321 1086
# free !:1
free -m total used free shared buff/cache available
Mem: 991 856 36 34 98 31
Swap: 1407 321 1086
===============================================
$ echo hello world
hello world
$ echo !$
echo worldworld
$ echo "hello world"
hello world
$ echo !$
echo "hello world"
hello world
这里为什么要用echo呢,请看下面,如果不用echo,!$输出的内容(world)会被shell当做一个命令来执行,所以就会报错
$ echo hello world
hello world
$ !$
world
No command 'world' found, did you mean:
Command 'tworld' from package 'tworld' (universe)
world: command not found
应用场景示例
1、建立多层目录并进入建立好的多层目录
$ mkdir -p a/b/c/d/e
$ cd a/b/c/d/e
改成
$ mkdir -p a/b/c/d/e
$ cd !$
上面mkdir -p命令用来一次性建立多层目录
2、编写文件后检测文件格式或者编译文件
$ vi a.php
$ php -l !$
或者
$ vi main.c
$ gcc !$
你可能不知道的超实用shell技巧 —— !$。
中,我们知道了 在shell中,!$代表了上一个命令的最后一个参数。那如果要获取上个命令的其它参数该怎么操作呢?
还是以echo hello world命令为例,下面就演示在该命令执行完成后,如何获取命令的各个参数甚至命令本身。
# echo helloworld
hello world
# echo !:1
echo hello
hello
# echo helloworld
hello world
# echo !:2
echo world
world
# echo hello world
hello world
# echo !:3
-bash: :3: bad word specifier
在调用!:3的时候出错了,因为上一次的命令只有两个参数。
下面你应该知道如何获取上次执行的是哪个命令了,那就是!:0,请看下面
# echo hello world
hello world
# echo !:0
echo echo
echo
其实呢,有更好的表示方法,看下面
# echo hello world
hello world
# echo !#
echo echo
echo
总结
!# 上一个命令名
!$ 上一个命令的最后一个参数
!:n 上一个命令的第n个参数
参考文章
http://crazyof.me/blog/archives/171.html
自己常常使用:Esc + . 和!$一样一样的。
$! 刚好写法相反,则表示Shell最后运行的后台Process的PID,看下面的例子:
mkdir -p /tmp/a/b/c/d/e/f
# ls !$
ls /tmp/a/b/c/d/e/f
# ls !$
ls /tmp/a/b/c/d/e/f
a.txt b.txt c.txt
# rm -Rf !$
rm -Rf /tmp/a/b/c/d/e/f
# ls !$
ls /tmp/a/b/c/d/e/f
ls: 无法访问/tmp/a/b/c/d/e/f: 没有那个文件或目录
Shell参数变量之 !:0是命令行,!:1是参数1,!:2是参数2,如下所示:
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo hello world
hello world
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo !:3
-bash: :3: bad word specifier
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo hello world
hello world
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo !:2
echo world
world
[root@justwinit-php-mysql_bj_sjs_10_44_202_177 ~]# echo !:1
echo world
world
例二:
# free -m
total used free shared buff/cache available
Mem: 991 856 32 34 103 29
Swap: 1407 321 1086
# free !:1
free -m total used free shared buff/cache available
Mem: 991 856 36 34 98 31
Swap: 1407 321 1086
===============================================
$ echo hello world
hello world
$ echo !$
echo worldworld
$ echo "hello world"
hello world
$ echo !$
echo "hello world"
hello world
这里为什么要用echo呢,请看下面,如果不用echo,!$输出的内容(world)会被shell当做一个命令来执行,所以就会报错
$ echo hello world
hello world
$ !$
world
No command 'world' found, did you mean:
Command 'tworld' from package 'tworld' (universe)
world: command not found
应用场景示例
1、建立多层目录并进入建立好的多层目录
$ mkdir -p a/b/c/d/e
$ cd a/b/c/d/e
改成
$ mkdir -p a/b/c/d/e
$ cd !$
上面mkdir -p命令用来一次性建立多层目录
2、编写文件后检测文件格式或者编译文件
$ vi a.php
$ php -l !$
或者
$ vi main.c
$ gcc !$
你可能不知道的超实用shell技巧 —— !$。
中,我们知道了 在shell中,!$代表了上一个命令的最后一个参数。那如果要获取上个命令的其它参数该怎么操作呢?
还是以echo hello world命令为例,下面就演示在该命令执行完成后,如何获取命令的各个参数甚至命令本身。
# echo helloworld
hello world
# echo !:1
echo hello
hello
# echo helloworld
hello world
# echo !:2
echo world
world
# echo hello world
hello world
# echo !:3
-bash: :3: bad word specifier
在调用!:3的时候出错了,因为上一次的命令只有两个参数。
下面你应该知道如何获取上次执行的是哪个命令了,那就是!:0,请看下面
# echo hello world
hello world
# echo !:0
echo echo
echo
其实呢,有更好的表示方法,看下面
# echo hello world
hello world
# echo !#
echo echo
echo
总结
!# 上一个命令名
!$ 上一个命令的最后一个参数
!:n 上一个命令的第n个参数
参考文章
http://crazyof.me/blog/archives/171.html
一个小习惯让你的代码更完美 PHP中抽出数组成员
Php/Js/Shell/Go jackxiang 2017-6-24 12:59
数组成员调用你会吗?
比如数组:$arr=['apple','b'=>'banana'];
你一定会,就是用下标$arr[0],或者键名嘛$arr['b']。
调用键名这种情况在PHP里非常普遍,像是从数据库直接取来的成员都是数组加字段名。
但是你从来没觉得自己的代码有些怪怪的?
奇怪而正常的代码
现在我要循环一个数组,还要用它里边的成员,但是数组本身就是一个单词(为了让代码易懂)。
这个长单词再加上比较长的键名,感觉似乎乱乱滴啊!
比如我随便写点儿代码,这是我们可能经常遇到的:
//我只是简单地用if判断两个值相加是否大于总分,可是数组名加键名看起来超蛋痛有没有
//……好凌乱,猛一看还以为我写了个操作系统
if( $students['score'] + $students['last_score'] > $students['total_score']){
return;
}
如何让代码快乐?唯有extract
以上情况,你只需要提前作一个这样的操作:extract($students)
于是代码就清爽了一个数量级:
extract($students)
if( $score + $last_score > $total_score ){
return;
}
所以,extract()的作用呢,就是将关联数组中的键名当作变量名,把数组成员抽出来啦。
而我要给出的结论就是,操作关联数组,一定要有使用extract的意识!
抽出来是全局变量?
注意!抽出的数组会覆盖同名变量,但覆盖的目标抽出的位置有关,比如在函数中使用,就只是覆盖临时的局部变量。
怎么说呢,应当主要在函数中使用。
WHAT? 我不想覆盖已有变量!
可以我的王,你只需要再加一个参数EXTR_SKIP,上边的例子里会是这么写:
extract($students, EXTR_SKIP);
另外再告诉你一个小密秘我们还能用它生成统一前缀的变量,只要这样写:
extract($students, EXTR_PREFIX_ALL,'我是前缀');
//得到:$我是前缀score, $我是前缀$last_score, $我是前缀total_score
比如数组:$arr=['apple','b'=>'banana'];
你一定会,就是用下标$arr[0],或者键名嘛$arr['b']。
调用键名这种情况在PHP里非常普遍,像是从数据库直接取来的成员都是数组加字段名。
但是你从来没觉得自己的代码有些怪怪的?
奇怪而正常的代码
现在我要循环一个数组,还要用它里边的成员,但是数组本身就是一个单词(为了让代码易懂)。
这个长单词再加上比较长的键名,感觉似乎乱乱滴啊!
比如我随便写点儿代码,这是我们可能经常遇到的:
//我只是简单地用if判断两个值相加是否大于总分,可是数组名加键名看起来超蛋痛有没有
//……好凌乱,猛一看还以为我写了个操作系统
if( $students['score'] + $students['last_score'] > $students['total_score']){
return;
}
如何让代码快乐?唯有extract
以上情况,你只需要提前作一个这样的操作:extract($students)
于是代码就清爽了一个数量级:
extract($students)
if( $score + $last_score > $total_score ){
return;
}
所以,extract()的作用呢,就是将关联数组中的键名当作变量名,把数组成员抽出来啦。
而我要给出的结论就是,操作关联数组,一定要有使用extract的意识!
抽出来是全局变量?
注意!抽出的数组会覆盖同名变量,但覆盖的目标抽出的位置有关,比如在函数中使用,就只是覆盖临时的局部变量。
怎么说呢,应当主要在函数中使用。
WHAT? 我不想覆盖已有变量!
可以我的王,你只需要再加一个参数EXTR_SKIP,上边的例子里会是这么写:
extract($students, EXTR_SKIP);
另外再告诉你一个小密秘我们还能用它生成统一前缀的变量,只要这样写:
extract($students, EXTR_PREFIX_ALL,'我是前缀');
//得到:$我是前缀score, $我是前缀$last_score, $我是前缀total_score
[实践Ok]记录一次PHP项目并发太多报502的问题
Php/Js/Shell/Go jackxiang 2017-6-24 12:57
背景:自从有了nginx和php-fpm,就有502,这个经验公式有,但是502依然有,三点:1,很多小厂商vps搞了nginx还搞mysql把负载提起来了处理能力下降,业务本来逻辑就复杂处理时间长不说,还搞一些后台PHP调用计算的接口放crontab里面,逻辑运算稍微重点就导致PHP阻塞进程默认就不够用或阻塞后不够用出现502,或还会fd句柄也不够用。二、一下子来了个洪峰,本文讲到的,作者很好。三,配置进程数不当。
pm.start_server #控制服务启动时创建的进程数,
pm.min_spare_servers #控制最小备用进程数
pm.max_spare_servers #最大备用进程数
spare_servers翻译成备用进程,不知道合适不适合,如果真这样,那我之前的配置就让人无奈了: pm.min_space_servers 20,pm.max_spare_servers 80,pm.max_children 80,会不会是因为备用的太多才导致502呢?
另外,下面的具体配置里面,注释中给出了计算pm.start_servers默认值的公式:
Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
———————————————————————————————————
问题描述
最近有台服务器偶尔会报502错误,虽然量不多,每天就几十个,但是也必须得找到原因,避免让小问题变成大问题。
排查过程
502错误的原因,一般是对用户访问请求的响应超时造成的,一开始以为是请求量太大,超过了服务器目前的负载,但是查看了zabbix监控,发现问题时段的负载、内存、IO都没有非常明显的变化,服务器并没有达到繁忙的状态;查看这个时段请求的并发数,也不高。
然后查看nginx错误日志,发现该时段有如下报错:
connect to unix:/dev/shm/phpfpm.socket failed (11: Resource temporarily unavailable) while connecting to upstream
说明还是php-fpm进程不足导致的。
然后再观察问题时段的php-fpm进程数变化情况:
点击在新窗口中浏览此图片
发验证猜想
为了验证上面的这个猜测,我在测试环境做了一些尝试,即将php-fpm的pm.start_servers和pm.max_spare_servers都设置得比较小,然后进行ab测试,观察php-fpm创建子进程的速度,发现果然和猜测的一样,是非常慢的。当请求数比较多时,会因为创建php-fpm子进程的速度太慢,出现502的情况。
解决方案
增大php-fpm的pm.start_servers和pm.max_spare_servers的数值(最关键的是pm.max_spare_servers这个配置),保证请求量增加时,能够有足够的进程来处理请求,不需要在短时间内创建过多进程。现问题时段php-fpm的进程数确实有比较明显的变化,但是最高只到了75左右,并没有达到我们设置的pm.max_children的数值。
综上,结合502的特性,猜测:
是否是php-fpm子进程设置为dynamic模式,而我们的空闲进程数上限设置得比较低(目前设置的是35),然后当请求量增大时,创建子进程的速度跟不上请求增加的速度,进而导致部分请求无法得到响应,从而出现502?
验证猜想
pm.start_server #控制服务启动时创建的进程数,
pm.min_spare_servers #控制最小备用进程数
pm.max_spare_servers #最大备用进程数
spare_servers翻译成备用进程,不知道合适不适合,如果真这样,那我之前的配置就让人无奈了: pm.min_space_servers 20,pm.max_spare_servers 80,pm.max_children 80,会不会是因为备用的太多才导致502呢?
另外,下面的具体配置里面,注释中给出了计算pm.start_servers默认值的公式:
Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
———————————————————————————————————
问题描述
最近有台服务器偶尔会报502错误,虽然量不多,每天就几十个,但是也必须得找到原因,避免让小问题变成大问题。
排查过程
502错误的原因,一般是对用户访问请求的响应超时造成的,一开始以为是请求量太大,超过了服务器目前的负载,但是查看了zabbix监控,发现问题时段的负载、内存、IO都没有非常明显的变化,服务器并没有达到繁忙的状态;查看这个时段请求的并发数,也不高。
然后查看nginx错误日志,发现该时段有如下报错:
connect to unix:/dev/shm/phpfpm.socket failed (11: Resource temporarily unavailable) while connecting to upstream
说明还是php-fpm进程不足导致的。
然后再观察问题时段的php-fpm进程数变化情况:
点击在新窗口中浏览此图片
发验证猜想
为了验证上面的这个猜测,我在测试环境做了一些尝试,即将php-fpm的pm.start_servers和pm.max_spare_servers都设置得比较小,然后进行ab测试,观察php-fpm创建子进程的速度,发现果然和猜测的一样,是非常慢的。当请求数比较多时,会因为创建php-fpm子进程的速度太慢,出现502的情况。
解决方案
增大php-fpm的pm.start_servers和pm.max_spare_servers的数值(最关键的是pm.max_spare_servers这个配置),保证请求量增加时,能够有足够的进程来处理请求,不需要在短时间内创建过多进程。现问题时段php-fpm的进程数确实有比较明显的变化,但是最高只到了75左右,并没有达到我们设置的pm.max_children的数值。
综上,结合502的特性,猜测:
是否是php-fpm子进程设置为dynamic模式,而我们的空闲进程数上限设置得比较低(目前设置的是35),然后当请求量增大时,创建子进程的速度跟不上请求增加的速度,进而导致部分请求无法得到响应,从而出现502?
验证猜想
只用js如何更有效的获取服务器时间看「百度都能一分钟搜索的面试题」帖子有感
Php/Js/Shell/Go jackxiang 2017-6-24 12:22
得到deltaTime 之后,随时可以用 客户端时间 + deltaTime,从而得到服务器时间
Date:Thu, 16 Mar 2017 05:36:57 GMT
_____________________________
是这个 GMT +8小时嘛 13:41:48 刚刚好 北京时间
_____________________________
HTTP/1.1 200 OK
Server: Qnginx/1.4.0
Date: Thu, 16 Mar 2017 05:36:57 GMT
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Content-Encoding: gzip
Vary: Accept-Encoding
X-NWS-LOG-UUID: 67e5ac2e-982e-4881-9066-c1564fa76005
PHP的CURL也有一个参数可只要头,不要Body:
http://justwinit.cn/post/6818/
PHP7使用交流群里讨论,我贴下地址:
https://www.oschina.net/question/260395_246269
http://bbs.chinaunix.net/thread-3675366-1-1.html
Date:Thu, 16 Mar 2017 05:36:57 GMT
_____________________________
是这个 GMT +8小时嘛 13:41:48 刚刚好 北京时间
_____________________________
HTTP/1.1 200 OK
Server: Qnginx/1.4.0
Date: Thu, 16 Mar 2017 05:36:57 GMT
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Content-Encoding: gzip
Vary: Accept-Encoding
X-NWS-LOG-UUID: 67e5ac2e-982e-4881-9066-c1564fa76005
PHP的CURL也有一个参数可只要头,不要Body:
http://justwinit.cn/post/6818/
PHP7使用交流群里讨论,我贴下地址:
https://www.oschina.net/question/260395_246269
http://bbs.chinaunix.net/thread-3675366-1-1.html
curl -XGET http://baidu.com和 curl -XPOST http://baidu.com的Tcp流区别,PUT创建新的实体。
Php/Js/Shell/Go jackxiang 2017-6-24 12:21
curl -XGET http://baidu.com
GET / HTTP/1.1
User-Agent: curl/7.29.0
Host: baidu.com
Accept: */*
HTTP/1.1 200 OK
Date: Fri, 31 Mar 2017 03:56:42 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Sat, 01 Apr 2017 03:56:42 GMT
Connection: Keep-Alive
Content-Type: text/html
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
curl -XPOST http://baidu.com
POST / HTTP/1.1
User-Agent: curl/7.29.0
Host: baidu.com
Accept: */*
HTTP/1.1 200 OK
Date: Fri, 31 Mar 2017 03:59:50 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Sat, 01 Apr 2017 03:59:50 GMT
Connection: Keep-Alive
Content-Type: text/html
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
Post加个参数:
curl -XPOST http://baidu.com -d"say=hello"
POST / HTTP/1.1
User-Agent: curl/7.29.0
Host: baidu.com
Accept: */*
Content-Length: 9
Content-Type: application/x-www-form-urlencoded
say=helloHTTP/1.1 200 OK
Date: Fri, 31 Mar 2017 04:03:47 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Sat, 01 Apr 2017 04:03:47 GMT
Connection: Keep-Alive
Content-Type: text/html
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
Get里加个参数:
curl -XGET http://baidu.com?say=hello
GET /?say=hello HTTP/1.1
User-Agent: curl/7.29.0
Host: baidu.com
Accept: */*
HTTP/1.1 200 OK
Date: Fri, 31 Mar 2017 04:05:06 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Sat, 01 Apr 2017 04:05:06 GMT
Connection: Keep-Alive
Content-Type: text/html
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
curl -XPUT http://baidu.com?say=hello
curl: (52) Empty reply from server
Head头:
PUT /?say=hello HTTP/1.1
User-Agent: curl/7.29.0
Host: baidu.com
Accept: */*
加点参数看看,其-d参数和Post一样的位置:
curl -XPUT http://baidu.com?say=hello -d'{"title":"new version of elasticsearch released!","content":"Ver 1.0 released today!","tags":["announce","elasticsearch","release"]}'
curl: (52) Empty reply from server
PUT /?say=hello HTTP/1.1
User-Agent: curl/7.29.0
Host: baidu.com
Accept: */*
Content-Length: 132
Content-Type: application/x-www-form-urlencoded
{"title":"new version of elasticsearch released!","content":"Ver 1.0 released today!","tags":["announce","elasticsearch","release"]}
curl -XDELETE http://baidu.com/blog/article/1
curl: (52) Empty reply from server
DELETE /blog/article/1 HTTP/1.1
User-Agent: curl/7.29.0
Host: baidu.com
Accept: */*
GET / HTTP/1.1
User-Agent: curl/7.29.0
Host: baidu.com
Accept: */*
HTTP/1.1 200 OK
Date: Fri, 31 Mar 2017 03:56:42 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Sat, 01 Apr 2017 03:56:42 GMT
Connection: Keep-Alive
Content-Type: text/html
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
curl -XPOST http://baidu.com
POST / HTTP/1.1
User-Agent: curl/7.29.0
Host: baidu.com
Accept: */*
HTTP/1.1 200 OK
Date: Fri, 31 Mar 2017 03:59:50 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Sat, 01 Apr 2017 03:59:50 GMT
Connection: Keep-Alive
Content-Type: text/html
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
Post加个参数:
curl -XPOST http://baidu.com -d"say=hello"
POST / HTTP/1.1
User-Agent: curl/7.29.0
Host: baidu.com
Accept: */*
Content-Length: 9
Content-Type: application/x-www-form-urlencoded
say=helloHTTP/1.1 200 OK
Date: Fri, 31 Mar 2017 04:03:47 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Sat, 01 Apr 2017 04:03:47 GMT
Connection: Keep-Alive
Content-Type: text/html
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
Get里加个参数:
curl -XGET http://baidu.com?say=hello
GET /?say=hello HTTP/1.1
User-Agent: curl/7.29.0
Host: baidu.com
Accept: */*
HTTP/1.1 200 OK
Date: Fri, 31 Mar 2017 04:05:06 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Sat, 01 Apr 2017 04:05:06 GMT
Connection: Keep-Alive
Content-Type: text/html
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
curl -XPUT http://baidu.com?say=hello
curl: (52) Empty reply from server
Head头:
PUT /?say=hello HTTP/1.1
User-Agent: curl/7.29.0
Host: baidu.com
Accept: */*
加点参数看看,其-d参数和Post一样的位置:
curl -XPUT http://baidu.com?say=hello -d'{"title":"new version of elasticsearch released!","content":"Ver 1.0 released today!","tags":["announce","elasticsearch","release"]}'
curl: (52) Empty reply from server
PUT /?say=hello HTTP/1.1
User-Agent: curl/7.29.0
Host: baidu.com
Accept: */*
Content-Length: 132
Content-Type: application/x-www-form-urlencoded
{"title":"new version of elasticsearch released!","content":"Ver 1.0 released today!","tags":["announce","elasticsearch","release"]}
curl -XDELETE http://baidu.com/blog/article/1
curl: (52) Empty reply from server
DELETE /blog/article/1 HTTP/1.1
User-Agent: curl/7.29.0
Host: baidu.com
Accept: */*
[实践OK]Linux命令date日期时间和Unix时间戳互转,Linux的时间输出,用echo `date "+%F %T" ` ,2018-04-03 11:56:12。
Php/Js/Shell/Go jackxiang 2017-6-23 17:49
背景:如Gitlab的那个备份日志就是以Unix的时间戳表示的,怎么能看到底是啥时候呢?当然用 stat 也能看,这儿主要是学习一下互相转化。
几小时几分:
echo `date "+%F %T" `
2018-04-03 11:56:12
A.将日期转换为Unix时间戳
将当前时间以Unix时间戳表示:
date +%s
输出如下:
1361542433
转换指定日期为Unix时间戳:
date -d '2013-2-22 22:14' +%s
输出如下:
1361542440
B.将Unix时间戳转换为日期时间
不指定日期时间的格式:
date -d @1361542596
输出如下:
Fri Feb 22 22:16:36 CST 2013
指定日期格式的转换:
date -d @1361542596 +"%Y-%m-%d %H:%M:%S"
输出如下:
2013-02-22 22:16:36
来自:http://blog.csdn.net/clevercode/article/details/49993237
几小时几分:
echo `date "+%F %T" `
2018-04-03 11:56:12
A.将日期转换为Unix时间戳
将当前时间以Unix时间戳表示:
date +%s
输出如下:
1361542433
转换指定日期为Unix时间戳:
date -d '2013-2-22 22:14' +%s
输出如下:
1361542440
B.将Unix时间戳转换为日期时间
不指定日期时间的格式:
date -d @1361542596
输出如下:
Fri Feb 22 22:16:36 CST 2013
指定日期格式的转换:
date -d @1361542596 +"%Y-%m-%d %H:%M:%S"
输出如下:
2013-02-22 22:16:36
来自:http://blog.csdn.net/clevercode/article/details/49993237
基本上有两个方法,一个是comm命令,一个是grep命令。分别介绍如下:
comm命令 , Compare sorted files FILE1 and FILE2 line by line. With no options, produce three-column output. Column one contains lines unique to FILE1, column two contains lines unique to FILE2, and column three contains lines common to both files. 要注意两个文件必须是排序和唯一(sorted and unique)的,默认输出为三列,第一列为是A-B,第二列B-A,第三列为A交B。这个哥们写得好,尽管我不懂linux文件流的用法,但是大致看出来了,我用了三个步骤,而用一行就搞定了,简单可用:http://m.blog.csdn.net/article/details?id=6579320
文件行数少最直观快捷的diff办法:
vimdiff <(sort a.txt|uniq) <(sort b.txt|uniq)
/proc/15750/fd/63 [只读] /proc/15750/fd/62 [只读]
——————————————————————————————
一般求差集的多一些:
求差
comm a.txt b.txt -3 | sed 's/^\t//'
差集
comm a.txt b.txt -2 -3
实践如下:
sort getosok.txt >> getosoksort.txt
sort r11.txt >> r11sort.txt
comm r11sort.txt getosoksort.txt -2 -3
再次实践,注意这两个文件都要去重,否则不太好比较,-2 -3显示左边文件有的右边没有的:
sort mysqlsort.txt|uniq //sort结合uniq命令去重复行找出重复次数大于1的行参考:http://justwinit.cn/post/3671/
sort 主机层面能ssh连接的.txt |uniq >> 主机层面能ssh连接的排序过的去过重的.txt
sort 数据库应用开发现在的.txt |uniq >> 数据库 应用开发现在的排序过的去过重的.txt
comm 数据库应用开发现在的排序过的去过重的.txt 主机层能ssh连接的排序过的去过重的.txt -2 -3
10.71.11.4* //这个是列出左边有,右边文件没有的内容,也就是 “数据库应用开发现在的排序过的且去重的.txt”里有,而右边这个“主机层面能ssh连接的排序过的.txt” 没有。
comm 主机层面能ssh连接的排序过的去过重的.txt 数据库应用开发现在的排序过的 去过重的.txt -2 -3
10.70.*.42
10.70.*.53
10.70.*.1
10.70.*.2
10.71.*.29
注意:
1. comm命令要求输入文件的内容必须是排序且唯一的
2. comm -12 表示取消第一列和第二列的输出,即只输出第三列。[/warning]
主机层面能ssh连接的排序过的有,而右边没有。
http://www.ttlsa.com/linux/linux-file-comparison-operations-text-file-of-the-intersection-difference-sets-and-difference/
comm命令 , Compare sorted files FILE1 and FILE2 line by line. With no options, produce three-column output. Column one contains lines unique to FILE1, column two contains lines unique to FILE2, and column three contains lines common to both files. 要注意两个文件必须是排序和唯一(sorted and unique)的,默认输出为三列,第一列为是A-B,第二列B-A,第三列为A交B。这个哥们写得好,尽管我不懂linux文件流的用法,但是大致看出来了,我用了三个步骤,而用一行就搞定了,简单可用:http://m.blog.csdn.net/article/details?id=6579320
文件行数少最直观快捷的diff办法:
vimdiff <(sort a.txt|uniq) <(sort b.txt|uniq)
/proc/15750/fd/63 [只读] /proc/15750/fd/62 [只读]
——————————————————————————————
一般求差集的多一些:
求差
comm a.txt b.txt -3 | sed 's/^\t//'
差集
comm a.txt b.txt -2 -3
实践如下:
sort getosok.txt >> getosoksort.txt
sort r11.txt >> r11sort.txt
comm r11sort.txt getosoksort.txt -2 -3
再次实践,注意这两个文件都要去重,否则不太好比较,-2 -3显示左边文件有的右边没有的:
sort mysqlsort.txt|uniq //sort结合uniq命令去重复行找出重复次数大于1的行参考:http://justwinit.cn/post/3671/
sort 主机层面能ssh连接的.txt |uniq >> 主机层面能ssh连接的排序过的去过重的.txt
sort 数据库应用开发现在的.txt |uniq >> 数据库 应用开发现在的排序过的去过重的.txt
comm 数据库应用开发现在的排序过的去过重的.txt 主机层能ssh连接的排序过的去过重的.txt -2 -3
10.71.11.4* //这个是列出左边有,右边文件没有的内容,也就是 “数据库应用开发现在的排序过的且去重的.txt”里有,而右边这个“主机层面能ssh连接的排序过的.txt” 没有。
comm 主机层面能ssh连接的排序过的去过重的.txt 数据库应用开发现在的排序过的 去过重的.txt -2 -3
10.70.*.42
10.70.*.53
10.70.*.1
10.70.*.2
10.71.*.29
注意:
1. comm命令要求输入文件的内容必须是排序且唯一的
2. comm -12 表示取消第一列和第二列的输出,即只输出第三列。[/warning]
主机层面能ssh连接的排序过的有,而右边没有。
http://www.ttlsa.com/linux/linux-file-comparison-operations-text-file-of-the-intersection-difference-sets-and-difference/
今天和兄弟在2017北京PHP全球开发者大会-高可用的PHP探讨了一下,mysqli::reap_async_query、curl_multi_exec两个函数,这两个函数在实现上是否真的可用于高并发?场景是啥? 1)这两个函数没法一块使用,形成类似协程的效果,有局限性。 2)这个数据库这块儿的并土用来做导入数据或导出的一些后台操作,并不在前端使用。
有个兄弟,用Swoole的Task做一些后台并行操作这样的事情,用Task的Retrun,然后,用Swoole的Finish汇总,把一些返回的状态位放到SwooleTable里或全局变量里,相关小巧。
PHP实现MySQL并发查询:http://www.cnblogs.com/shaoguan/p/6515072.html
有个兄弟,用Swoole的Task做一些后台并行操作这样的事情,用Task的Retrun,然后,用Swoole的Finish汇总,把一些返回的状态位放到SwooleTable里或全局变量里,相关小巧。
PHP实现MySQL并发查询:http://www.cnblogs.com/shaoguan/p/6515072.html
php-5.6.xx编译时出现:configure: error: Cannot find ldap libraries in /usr/lib 解决办法
Php/Js/Shell/Go jackxiang 2017-6-23 00:11
cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
版本:php-5.6.20
configure: error: Cannot find ldap libraries in /usr/lib 解决办法:
今天在centos 6.2 64位版本上安装LNMP,config php的时候出现下面错误而退出
CentOS 64 编译PHP出现 error: Cannot find ldap libraries in /usr/lib 有需要的朋友可参考参考。
在CentOS 64位下编译安装PHP5.4.8。cp -frp /usr/lib64/libpng* /usr/lib/ 结果在configure的时候提示
configure: error: Cannot find ldap libraries in /usr/lib
提示在/usr/lib 下找不到相关模块,这是因为64位的linux默认把以上文件都存在 /usr/lib64 文件夹下。
解决方法:
代码如下
cp -frp /usr/lib64/libldap* /usr/lib/
From:http://www.iitshare.com/cannot-find-ldap-libraries-in-usrlib.html
-----------------------------------这种问题到处都有---------------------------------------
configure: error: Cannot find ldap libraries in /usr/lib
提示在/usr/lib 下找不到相关模块,这是因为64位的linux默认把以上文件都存在 /usr/lib64 文件夹下。
解决办法:
cp -frp /usr/lib64/libldap* /usr/lib/
然后再./configure ...即可
From:http://www.cnblogs.com/xiangxiaodong/p/3492156.html
打包时先拷贝,再./configure:
%build
/bin/cp -frp /usr/lib64/libldap* /usr/lib/
./configure \
--prefix=%{_prefix} \
--with-libdir=%{_lib} \
--with-config-file-path=/usr/local/php/etc \
--with-config-file-scan-dir=/usr/local/php/etc/php.d \
--with-iconv-dir=/usr/local \
--with-iconv=/usr/local/libiconv \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-ldap \
--with-ldap-sasl \
--with-libxml-dir=/usr \
--with-curl \
--with-curlwrappers \
--with-mcrypt \
--with-gd \
--with-openssl \
--with-mhash \
--with-xmlrpc \
--without-pear \
--with-fpm-user=www \
--with-fpm-group=www \
--with-gettext \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-xml \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--enable-gd-native-ttf \
--enable-pcntl \
--enable-sockets \
--enable-zip \
--enable-soap \
--enable-opcache \
--enable-exif \
--enable-mbregex \
--enable-inline-optimization \
--enable-ftp \
--disable-fileinfo \
--disable-rpath \
--disable-ipv6 \
--disable-debug
make ZEND_EXTRA_LIBS='-liconv' %{?_smp_mflags}
%install
rm -rf %{buildroot}
make INSTALL_ROOT=%{buildroot} install
CentOS Linux release 7.2.1511 (Core)
版本:php-5.6.20
configure: error: Cannot find ldap libraries in /usr/lib 解决办法:
今天在centos 6.2 64位版本上安装LNMP,config php的时候出现下面错误而退出
CentOS 64 编译PHP出现 error: Cannot find ldap libraries in /usr/lib 有需要的朋友可参考参考。
在CentOS 64位下编译安装PHP5.4.8。cp -frp /usr/lib64/libpng* /usr/lib/ 结果在configure的时候提示
configure: error: Cannot find ldap libraries in /usr/lib
提示在/usr/lib 下找不到相关模块,这是因为64位的linux默认把以上文件都存在 /usr/lib64 文件夹下。
解决方法:
代码如下
cp -frp /usr/lib64/libldap* /usr/lib/
From:http://www.iitshare.com/cannot-find-ldap-libraries-in-usrlib.html
-----------------------------------这种问题到处都有---------------------------------------
configure: error: Cannot find ldap libraries in /usr/lib
提示在/usr/lib 下找不到相关模块,这是因为64位的linux默认把以上文件都存在 /usr/lib64 文件夹下。
解决办法:
cp -frp /usr/lib64/libldap* /usr/lib/
然后再./configure ...即可
From:http://www.cnblogs.com/xiangxiaodong/p/3492156.html
打包时先拷贝,再./configure:
%build
/bin/cp -frp /usr/lib64/libldap* /usr/lib/
./configure \
--prefix=%{_prefix} \
--with-libdir=%{_lib} \
--with-config-file-path=/usr/local/php/etc \
--with-config-file-scan-dir=/usr/local/php/etc/php.d \
--with-iconv-dir=/usr/local \
--with-iconv=/usr/local/libiconv \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-ldap \
--with-ldap-sasl \
--with-libxml-dir=/usr \
--with-curl \
--with-curlwrappers \
--with-mcrypt \
--with-gd \
--with-openssl \
--with-mhash \
--with-xmlrpc \
--without-pear \
--with-fpm-user=www \
--with-fpm-group=www \
--with-gettext \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-xml \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--enable-gd-native-ttf \
--enable-pcntl \
--enable-sockets \
--enable-zip \
--enable-soap \
--enable-opcache \
--enable-exif \
--enable-mbregex \
--enable-inline-optimization \
--enable-ftp \
--disable-fileinfo \
--disable-rpath \
--disable-ipv6 \
--disable-debug
make ZEND_EXTRA_LIBS='-liconv' %{?_smp_mflags}
%install
rm -rf %{buildroot}
make INSTALL_ROOT=%{buildroot} install
Linux Cut命令基本用法,grep INCREMENTAL_STEP /backup/3306/cycle_file | cut -d= -f2,-d后面就是分割符,砍甘蔗。
Php/Js/Shell/Go jackxiang 2017-6-22 23:53
save_cycle_data || { echo 'save cycle data failed' && exit 1; } #调用函数失败的写法
basedir=$(cd "$(dirname "$0")";pwd)
echo $basedir
cat /backup/3306/cycle_file
BASE_ID=base-2018-06-11-1203
INCREMENTAL_STEP=20534973839
LAST_LSN=2
获取到等号后面的位置:
获取INNODB的Last checkpoint at:
参数之f3,砍断后第三节,如下:
$git branch -a|grep -v "*" | grep -v ">"
master
remotes/origin/dev
remotes/origin/master
Cut上来:
$git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3
master
dev
master
sed 去空格和Tab:
git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3|sed "s/^[ \t]*//g"
去掉重复行:
$git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3|sed "s/^[ \t]*//g"
master
dev
master
按正顺序sort:(反着排序 -r)
$git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3|sed "s/^[ \t]*//g"|sort
dev
master
master
uniq上来去重:
git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3|sed "s/^[ \t]*//g"|sort|uniq
防止太多,限制10条,head -10上来:
git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3|sed "s/^[ \t]*//g"|sort|uniq|head -10
当然,还有更简单的,不用git branch -a:
主要是了解命令:
$git branch |sed "s# ##g"|sed "s#*##"
dev
master
addr:You have new mail in /var/spool/mail/root
basedir=$(cd "$(dirname "$0")";pwd)
echo $basedir
cat /backup/3306/cycle_file
BASE_ID=base-2018-06-11-1203
INCREMENTAL_STEP=20534973839
LAST_LSN=2
获取到等号后面的位置:
获取INNODB的Last checkpoint at:
参数之f3,砍断后第三节,如下:
$git branch -a|grep -v "*" | grep -v ">"
master
remotes/origin/dev
remotes/origin/master
Cut上来:
$git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3
master
dev
master
sed 去空格和Tab:
git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3|sed "s/^[ \t]*//g"
去掉重复行:
$git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3|sed "s/^[ \t]*//g"
master
dev
master
按正顺序sort:(反着排序 -r)
$git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3|sed "s/^[ \t]*//g"|sort
dev
master
master
uniq上来去重:
git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3|sed "s/^[ \t]*//g"|sort|uniq
防止太多,限制10条,head -10上来:
git branch -a|grep -v "*" | grep -v ">"|cut -d "/" -f3|sed "s/^[ \t]*//g"|sort|uniq|head -10
当然,还有更简单的,不用git branch -a:
主要是了解命令:
$git branch |sed "s# ##g"|sed "s#*##"
dev
master
addr:You have new mail in /var/spool/mail/root
centos 6.8 安装php-7.0.20报configure error xml2-config not found. please check your libxml2 installation 错误
Php/Js/Shell/Go jackxiang 2017-6-22 23:46
检查是否安装了libxm包
[root@rh-Linux software]# rpm -qa |grep libxml2
libxml2-2.7.6-21.el6_8.1.x86_64
libxml2-devel-2.7.6-21.el6_8.1.x86_64
libxml2-python-2.7.6-21.el6_8.1.x86_64
重新安装libxml2和libxml2-devel包, yum安装的时候发现新版本会提示更新,需要更新的可以更新,不要跳过就行了。
[root@rh-linux /]# yum install libxml2
[root@rh-linux /]# yum install libxml2-devel -y
安装完之后查找xml2-config文件是否存在
[root@rh-linux /] #find / -name "xml2-config"
/usr/bin/xml2-config
From:http://blog.csdn.net/risingsun001/article/details/43705273
[root@rh-Linux software]# rpm -qa |grep libxml2
libxml2-2.7.6-21.el6_8.1.x86_64
libxml2-devel-2.7.6-21.el6_8.1.x86_64
libxml2-python-2.7.6-21.el6_8.1.x86_64
重新安装libxml2和libxml2-devel包, yum安装的时候发现新版本会提示更新,需要更新的可以更新,不要跳过就行了。
[root@rh-linux /]# yum install libxml2
[root@rh-linux /]# yum install libxml2-devel -y
安装完之后查找xml2-config文件是否存在
[root@rh-linux /] #find / -name "xml2-config"
/usr/bin/xml2-config
From:http://blog.csdn.net/risingsun001/article/details/43705273
PHP下安装Ldap查询扩展
Php/Js/Shell/Go jackxiang 2017-6-22 23:42
php安装模块见http://fffo.blog.163.com/blog/static/211913068201401464238334/
1、官网下载
wget http://prdownloads.sourceforge.net/lam/ldap-account-manager-4.3.tar.bz2?download
2、解压
tar -xjf ldap-account-manager-4.3.tar.bz2
3、直接移动到apache 根目录
mv ldap-account-manager-4.3 /usr/local/apache/htdocs/lam
4、给它可以访问的权限
chmod 777 -R /usr/local/apache/htdocs/lam
5、进入配置目录
cd /usr/local/apache/htdocs/lam/config
6、创建主参数文件
cp config.cfg_sample config.cfg
7、创建连接ldap服务器参数文件
cp lam.conf_sample lam.conf
vim lam.conf
修改 所有的dc=1v,dc=cn
8、web访问
http://203.195.187.200/lam/templates/login.php
上面的模式是只限管理员登录模式。现在切换到用户登录模式
点击LAM配置——>编辑服务器配置文件——>默认密码是lam(可修改)——>通用设置——>安全设定
From:http://blog.csdn.net/u012461550/article/details/42608781
我的是在:
/usr/local/lam/etc/unix.conf
1、官网下载
wget http://prdownloads.sourceforge.net/lam/ldap-account-manager-4.3.tar.bz2?download
2、解压
tar -xjf ldap-account-manager-4.3.tar.bz2
3、直接移动到apache 根目录
mv ldap-account-manager-4.3 /usr/local/apache/htdocs/lam
4、给它可以访问的权限
chmod 777 -R /usr/local/apache/htdocs/lam
5、进入配置目录
cd /usr/local/apache/htdocs/lam/config
6、创建主参数文件
cp config.cfg_sample config.cfg
7、创建连接ldap服务器参数文件
cp lam.conf_sample lam.conf
vim lam.conf
修改 所有的dc=1v,dc=cn
8、web访问
http://203.195.187.200/lam/templates/login.php
上面的模式是只限管理员登录模式。现在切换到用户登录模式
点击LAM配置——>编辑服务器配置文件——>默认密码是lam(可修改)——>通用设置——>安全设定
From:http://blog.csdn.net/u012461550/article/details/42608781
我的是在:
/usr/local/lam/etc/unix.conf