关于redis中的发布与订阅以及shell脚本与php之间的相互传值及将php-fpm配置成init.d/service服务-ldd命令检查软件依赖-vim里paste模式防止出现粘贴问题

一、关于redis中的发布与订阅以及shell脚本与php之间的相互传值

    redis的发布订阅是一个很方便的消息队列功能,用过rabbmitmq或者beanstalk的话就对这不陌生了。消息队列就是一边往队列里写东西,每次写入消息后另一方立马就感知到了消息并且去处理消息。比起beanstalk目前我觉得redis的消息队列缺少了一个任务放回策略。不过对于消息队列一般的功能也够用了 publish:November 3, 2017 -Friday。

    消息队列的发布方php代码:

$redis = new \Redis();
$redis->connect('192.168.162.19', 6379);
$redis->auth('data');
$channel = 'English';
$message = 'new word';
#向频道发送消息,返回接收到此信息的订阅者数量
$clients = $redis->publish($channel, $message);

    也可以直接在redis命令行下操作:返回的0和1表示有几个终端接收到了消息。

192.168.162.19:6379> publish English 13
(integer) 0
192.168.162.19:6379> publish English 13q
(integer) 1

     接收到的PHP代码:

#设置socket连接不超时
ini_set('default_socket_timeout', -1);   
$redis = new Redis();
#此处连接redis时不要输入超时时间,如果配置了超时时间为某个时间值,则会出现redis read error错误并停止消除队列监听。
$redis->connect('192.168.162.19', 6379);
$redis->auth('data');

#设置客户端监听redisu订阅频道,如有消息执行回调函数callback_function
$result=$redis->subscribe(array('English'), 'callback_function');
function callback_function($instance, $channelName, $message)
{
    print_r($instance);
    echo $channelName. $message;
    #$instance->unsubscribe(array('English'));
    #exit(88);
}
exit('99');

 命令行下执行上面的php接收方代码,则发布发发布一条消息后,接收方就会打印出$instance,$channelName和$message的内容。这里需要注意的是。

1,$instance虽然是redis连接资源,但它不能使用redis的get,set之类的方法,只能使用subscribe,psubscribe,unsubscribe,punsubscribe四个命令。故如果要在callback_function中再调用redis拿数据的话,需要重新调用redis连接或其它方式。
2,在回调方法中调用unsubscribe取消订阅消息并不能停止客户端的php脚本,此时只是不接收消息,但是在linux服务器上的php脚本依然是阻塞状态。
3,psubscribe和punsubscribe与不带p的命令的区别就是带p的命令可以执行preg模式匹配。其它一样。
4,正因为2的原因,如果在执行一次订阅处理操作后要退出订阅并只能在php程序中执行exit(我未发现其它办法)。

        因为我在开发的一个程序是用shell脚本执行php进行sphinx数据同步的整套程序,执行过程中shell和php需要相互交互传递数据。

        shell调用php传递参数的方式之前也有发表过相关的文章,shell调用php之后如果要获取php的执行结果,也有两种方法:

1,php中直接执行shell命令设置变量或者通过第三方比如redis、比如文件缓存得来交互数据。不过这个有些麻烦。
2,如果shell中只需要得到php执行的一个结果,比如成功与否,则完全可以在php执行结束时输出状态码。然后shell中使用$?来取得这个状态码。

    php中使用exit函数输出状态码,但是需要注意:exit的参数status如果是一个字符串,在退出之前该函数会打印status,如果status是一个 integer,该值会作为退出状态码,并且不会被打印输出。退出状态码应该在范围0至254,不应使用被PHP保留的退出状态码255。状态码0用于成功中止程序。

void exit ([ string $status ] )
void exit ( int $status )
#以下这两行的执行意义完全不同。
exit('99')
exit(99)

另外:连接redis时使用pconnect和connet的区别,有篇文章写得不错:

1. 当使用pconnect时,连接会被重用,连接的生命周期是fpm进程的生命周期,而非一次php的执行。 

2.如果代码中使用pconnect,close的作用仅是使当前php不能再进行redis请求,但无法真正关闭redis长连接,连接在后续请求中仍然会被重用,直至fpm进程生命周期结束。

二、将php-fpm配置成init.d/service服务-ldd命令检查软件依赖-vim里paste模式防止出现粘贴时连续缩进排列混乱

1、将php-fpm配置成init.d/service服务

php-fpm在php5.3.3及以上已经内嵌了php-fpm,只需要在configure的时候添加编译参数 –enable-fpm –with-fpm-user=www –with-fpm-group=www。以后的版本中不支持以前的php-fpm(start|restart|stop|reload),对php-fpm的管理可以使用两种方法:
        A,使用信号机制,重启时发送重启信号USR2,详细介绍:配置nginx,Apache支持pathinfo模式 及 php-fpm常用重启、启动、停止命令_php-fpm 启动-CSDN博客
        B,注册php-fpm服务以对服务进行管理。

    注册服务是通过pid来操作php-fpm的。所以首先php的配置文件中需要打开pid配置,找到php-fpm.conf开启pid = run/php-fpm.pid项,以在php-fpm启动时生成pid文件。接着找到这个管理php-fpm的二进制文件init.d.php-fpm,复制到服务目录/etc/init.d/php-fpm并添加执行权限

[root@123 ~]# ll /etc/init.d/php-fpm
ls: cannot access /etc/init.d/php-fpm: No such file or directory
[root@123 ~]# locate init.d.php-fpm
/opt/download/php-7.1.3/sapi/fpm/init.d.php-fpm
/opt/download/php-7.1.3/sapi/fpm/init.d.php-fpm.in
[root@123 ~]# sudo cp //opt/download/php-7.1.3/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@123 ~]# chmod +x /etc/init.d/php-fpm
[root@123 ~]# /etc/init.d/php-fpm reload
Reload service php-fpm  done
[root@123 ~]# service php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done

这样就可以使用service php-fpm start|stop|restart|reload来管理php-fpm,另外可以把php-fpm加进开机启动chkconfig --add php-fpm

2,查看共享库列表的ldd命令:  

    ldd命令用于打印程序或者库文件所依赖的共享库列表。安装了一个软件比如nginx,其加载的动态库我们不知道是哪个版本,比如lua库,比如python库,使用这个就可以查看所依赖的共享库列表,然后通过变得库链接来实现变更加载库,而不需要重装软件。
--version:打印指令版本号; 
-v:详细信息模式,打印所有相关信息; 
-u:打印未使用的直接依赖; 
-d:执行重定位和报告任何丢失的对象; 
-r:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数;

[root@123 ~]# ldd /opt/modules/nginx/sbin/nginx    
        linux-vdso.so.1 =>  (0x00007fff03de9000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fb0f4545000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb0f4327000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fb0f40f0000)
        liblua-5.1.so => /usr/lib64/liblua-5.1.so (0x00007fb0f3ec3000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fb0f3c3e000)
        libpcre.so.0 => /lib64/libpcre.so.0 (0x00007fb0f3a11000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007fb0f37a4000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007fb0f33bf000)
        libz.so.1 => /lib64/libz.so.1 (0x00007fb0f31a9000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fb0f2e15000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb0f4753000)
        libfreebl3.so => /lib64/libfreebl3.so (0x00007fb0f2c11000)
        libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fb0f29cd000)
        libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fb0f26e6000)
        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fb0f24e1000)
        libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fb0f22b5000)
        libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fb0f20aa000)
        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fb0f1ea6000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fb0f1c8c000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fb0f1a6d000)

    如果要显示更详细的信息,加上-v,一般上面的信息就够了。上图可以清楚地看到nginx中加载的lua是/usr/lib64/liblua-5.1.so,这对在nginx中出现问题时的排查非常有帮助。之前有篇nginx+lua中出现报错lua: module ffi not found 的解决方法就是依靠ldd这个命令得以解决:Lua包的管理工具luarocks的安装使用,lua: module ‘ffi‘ not found:报错的最终完美解决-CSDN博客

3,vim下的粘贴模式:paste模式

        在vim中进行粘贴时有时会碰到每往下一行就自动进行了缩进,越到后面缩进越来越大,如果手动把他们对齐编辑,非常浪费时间。实际这个问题是可以在vim中设置进入paste模式来解决的,命令:

:set paste
然后再粘贴就能完美解决。要解除paste模式。:set nopaste

paste模式主要帮我们做了如下事情:
textwidth设置为0
wrapmargin设置为0
set noai
set nosi
softtabstop设置为0
revins重置
ruler重置
showmatch重置
formatoptions使用空值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戈的IT生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值