手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2024年09月的文章

转:MQ+PHP – Linking IBM’s WebSphere MQ to PHP

 我在上一篇博客在centos下处理PHP+WebSphere客户端中提到了一个英文网站:http://blog.phpdeveloper.org/?p=140,我也是参考它才完成了最终的配置,为此我也写了中文的说明,但感觉文笔不行,所以我还是贴上原文吧:

During a recent project at work I had to get PHP linked with IBM’s WebSPhere MQ software we have running on another internal server. Our goal was to use our existing web service to take the requests from external vendors and push their XML data back into the queue inside our firewall. Thankfully there’s an extension in PECL that does just that.

Here’s the basic steps I took – hopefully it’ll be useful to someone else out there in the same spot I was. This all assumes you’re working on a web server that doesn’t have an MQ server installed already:

  • Get the extension: Head over to the PECL page for mqseries and download the latest version. Unpack it into a directory on your local server
  • Get the MQ client libs: You’ll need to go to IBM’s website to download the latest client/libraries for your install (you’ll need an IBM ID to get to the downloads):
    • Go to the IBM page for the MQ client listing
    • Look for the “WebSphere MQ Clients” link under the “Related products and technologies” section and click on it
    • Scroll down to the “Download Package” section and choose from one of the mirror locations
    • Select your package from the list (I went with “Linux for System x86″ for our setup)
    • Click on the download link and fill out some required information (you didn’t think you were getting off that easy, did you?)
    • Agree to the terms and conditions and you’ll get a “Download Now” link
    • Drop the archive file (tar, tar.gz, etc) into your server and unpack into a temporary directory (mine had an issue unpacking into the local directory, not a subdirectory)
  • Install the package(s): Once you have the IBM software extracted, you should have a series of packages. You’ll need to install the “MQSeriesSDK” to get the right libraries in place to compile the PHP extension
  • Build the mqseries extension: Go into the mqseries directory and run “phpize”, “./configure” and “make” to create the .so file. The process should drop it into the default extensions directory.
  • If needed, move it: Be sure that the shared module for the extension is in the right directory for the PHP install to find it. (You can make a phpinfo() page if you’re not sure where that is.)
  • Update your php.ini: Add in a line to include the extension in your current setup. Remember, after any changes to the php.ini, you need to restart the web server.

Now for the fun part – if everything’s working and the extension shows up in your phpinfo() as active, give this script a shot and see if you can connect to your MQ server:

1 $mq_host_ip         ='127.0.0.1';
2 $queue_name     'HOST.REMOTE.Q';
3 $mq_server      'WBRK_QM_U49';
4 $mqcno array(
5         'Version' => MQSERIES_MQCNO_VERSION_2,
6         'Options' => MQSERIES_MQCNO_STANDARD_BINDING,
7         'MQCD' => array(
8                 'ChannelName'                   => 'CLIENT.CHANNEL',
9                 'ConnectionName'                => $mq_host_ip,
10                 'TransportType'                 => MQSERIES_MQXPT_TCP
11         )
12 );
13  
14 // Connect to the MQ server
15 mqseries_connx($mq_server,$mqcno,$conn,$comp_code,$reason);
16 if ($comp_code !== MQSERIES_MQCC_OK) {
17         trigger_error('Cannot open connection to server: '.$mq_server,E_USER_ERROR);
18 }else{
19       echo 'Connection good!';
20 }

Obviously you’ll need to adjust the settings to fit your server, but at least this gives you a start.

 

--END

在centos下处理PHP+WebSphere客户端

 事先申明。我是借鉴了这篇博客:http://blog.phpdeveloper.org/?p=140

当然在其中遇到了不少问题,我在这里一一说明:
1、准备工作
a. pecl mqseries :http://pecl.php.net/package/mqseries
b. ibm mq client: http://www-01.ibm.com/software/integration/wmq/clients/
2、步骤:
1、先安装ibm mq client :下载地址最终是要翻墙的,我这里不教翻墙技术。下载完后,解开压缩,在centos下面,直接rpm -ivh 
   MQSeriesRuntime-7.5.0-3.x86_64.rpm,和rpm -ivh MQSeriesSDK-7.5.0-3.x86_64.rpm ,由于我们只是当成一个client库来连接,因此安装这两个就够了
2、编译mqseries。在这里我吃药了,我下载的是0.14版的,我一看更新时间是2014年。我想这是最新的总没问题吧。结果。。。./configure到最后的时候,说--with-libdir=lib64找不到,让我指定。可是我明明指定了也不能安装。于是google了一下,发现这曾经是一个BUG。在2012年解决掉了。在bug.php.net里。写的是bug fixed。所以我下载了0.13的,然后再安装,果然成功了
3、测试
PHP代码
  1. <?php  
  2. $mq_host_ip         ='127.0.0.1';  
  3. $queue_name     = 'HOST.REMOTE.Q';  
  4. $mq_server      = 'WBRK_QM_U49';  
  5. $mqcno = array(  
  6.         'Version' => MQSERIES_MQCNO_VERSION_2,  
  7.         'Options' => MQSERIES_MQCNO_STANDARD_BINDING,  
  8.         'MQCD' => array(  
  9.                 'ChannelName'                   => 'CLIENT.CHANNEL',  
  10.                 'ConnectionName'                => $mq_host_ip,  
  11.                 'TransportType'                 => MQSERIES_MQXPT_TCP  
  12.         )  
  13. );  
  14.   
  15. // Connect to the MQ server  
  16. mqseries_connx($mq_server,$mqcno,$conn,$comp_code,$reason);  
  17. if ($comp_code !== MQSERIES_MQCC_OK) {  
  18.         trigger_error('Cannot open connection to server: '.$mq_server,E_USER_ERROR);  
  19. }else{  
  20.       echo 'Connection good!';  
  21. }  
$mq_server从手册上看得知这应该是:queue_manager,所以应该是manager的名称
如果你访问的mq不是默认的端口号,还要加上端口号。我在这里走了不少弯路。我原来connectionName是写成:127.0.0.1:1234,报错2387,意思是host not avarible。查了下资料,原来端口号应该是 ip(port),也就是说得:127.0.0.1(1234) 这样的形式才OK。于是改好后再测试就通过啦。
 
----
我是在一台干净的Centos上安装的。所以做了很多准备工作:
1、 yum install php php-devel(devel里面才有phpize)
2、yum install gcc gcc-c++ g++
然后在安装的时候还有提示:you will need re2c ...于是找到这个博客:http://denghai260.blog.163.com/blog/static/726864092012260242533/
里面说道:
XML/HTML代码
  1. wget http://sourceforge.net/projects/re2c/files/re2c/0.13.5/re2c-0.13.5.tar.gz/download  
  2. tar -zxvf re2c-0.13.5.tar.gz  
  3. cd re2c-0.13.5  
  4. ./configure && make && make install  
至此,遇到的所有的问题都解决了。
 
 

如何在微信里关闭窗口

众所周知,微信里的网页就是一个webview。但是它是在程序里面,所以原生的window.close()是无效的。那么我们该怎么办?其实很简单就一句代码:

XML/HTML代码
  1. WeixinJSBridge.call('closeWindow');  

你可以在你的链接或者button上加一句就OK了:

XML/HTML代码
  1. <a href="###" onclick="WeixinJSBridge.call('closeWindow');">CLOSE </a>  
  2.   
  3. 或者  
  4.   
  5. <a href="javascript:WeixinJSBridge.call('closeWindow');">CLOSE</a>  

试试看。窗口是不是关掉了?

Tags: 微信

ssdb的Yii cache扩展

google的leveldb越来越被很多人接受。国内的ideawu基于leveldb还写了一个ssdb的前置扩展用来实现了很多功能,比如标准的getset和hget,hset还有zset,zget,也实现了队列。当然pub/sub就没有办法实现了。毕竟它和redis还是有点区别。

基于标准的ssdb的类,写了个小扩展,扩展了Yii的Cache类:

PHP代码
  1. class CSsdbCache extends CCache  
  2. {  
  3.     /** 
  4.      * @var string hostname to use for connecting to the redis server. Defaults to '127.0.0.1'. 
  5.      */  
  6.     public $hostname = '127.0.0.1';  
  7.     /** 
  8.      * @var int the port to use for connecting to the ssdb server. Default port is 8888. 
  9.      */  
  10.     public $port = 8888;  
  11.     /** 
  12.      * @var float 
  13.      */  
  14.     public $timeout = 2000;  
  15.     public $serializer = false;  
  16.     public $_cache;  
  17.     protected $_cachekeys = 'ssdb_cachekey';  
  18.       
  19.     public function init() {  
  20.         parent::init();  
  21.     }  
  22.     /** 
  23.      * @return SSDB 
  24.      */  
  25.     public function getSsdbCache() {  
  26.         if ($this->_cache !== null)  
  27.             return $this->_cache;  
  28.         else {  
  29.             return $this->_cache = new SimpleSSDB($this->hostname, $this->port, $this->timeout);  
  30.         }  
  31.     }  
  32.     public function getkeys() {  
  33.         return $this->getSsdbCache()->hkeys($this->_cachekeys, """"$this->getSsdbCache()->hsize($this->_cachekeys));  
  34.     }  
  35.     /** 
  36.      * Retrieves a value from cache with a specified key. 
  37.      * This is the implementation of the method declared in the parent class. 
  38.      * @param string $key a unique key identifying the cached value 
  39.      * @return string|boolean the value stored in cache, false if the value is not in the cache or expired. 
  40.      */  
  41.     protected function getValue($key) {  
  42.         return unserialize($this->getSsdbCache()->get($key));  
  43.     }  
  44.   
  45.     /** 
  46.      * Stores a value identified by a key in cache. 
  47.      * This is the implementation of the method declared in the parent class. 
  48.      * @param string  $key    the key identifying the value to be cached 
  49.      * @param string  $value  the value to be cached 
  50.      * @param integer $expire the number of seconds in which the cached value will expire. 0 means never expire. 
  51.      * @return boolean true if the value is successfully stored into cache, false otherwise 
  52.      */  
  53.     protected function setValue($key$value$expire) {  
  54.         $this->getSsdbCache()->hset($this->_cachekeys, $key, 1);  
  55.         if ($expire > 0) {  
  56.             //$expire += time();  
  57.             return $this->getSsdbCache()->setx($key, serialize($value), (int) $expire);  
  58.         }  
  59.         else {  
  60.             return $this->getSsdbCache()->set($key, serialize($value));  
  61.         }  
  62.     }  
  63.     /** 
  64.      * Stores a value identified by a key into cache if the cache does not contain this key. 
  65.      * This is the implementation of the method declared in the parent class. 
  66.      * @param string  $key    the key identifying the value to be cached 
  67.      * @param string  $value  the value to be cached 
  68.      * @param integer $expire the number of seconds in which the cached value will expire. 0 means never expire. 
  69.      * @return boolean true if the value is successfully stored into cache, false otherwise 
  70.      */  
  71.     protected function addValue($key$value$expire) {  
  72.         return $this->setValue($key$value$expire);  
  73.     }  
  74.     /** 
  75.      * Deletes a value with the specified key from cache 
  76.      * This is the implementation of the method declared in the parent class. 
  77.      * @param string $key the key of the value to be deleted 
  78.      * @return boolean if no error happens during deletion 
  79.      */  
  80.     protected function deleteValue($key) {  
  81.         $this->getSsdbCache()->hdel($this->_cachekeys, $key);  
  82.         return $this->getSsdbCache()->del($key);  
  83.     }  
  84.     /** 
  85.      * @return boolean whether the flush operation was successful. 
  86.      */  
  87.     protected function flushValues() {  
  88.         $this->getSsdbCache()->multi_del($this->getkeys());  
  89.         return $this->getSsdbCache()->hclear($this->_cachekeys);  
  90.     }  
  91. }  

其实代码很简单,不过由于ssdb默认没有serialize功能,所以在存储之前,得先主动的serialize,然后get的时候unserialize。不然就没有办法存储数组了。

由于ssdb没有flush功能。所以利用hget/hset将所有的key存储下来。flush的时候把hget获取的key读出来删除。然后再清掉这个hget的key

最后还有expire。ssdb里的setx第三个参数。。。居然不是expire,而是ttl。开始的时候,一直都当成expire。结果浪费了很长时间

Tags: yii

如何在终端输出带颜色的字体?

终端显示颜色,在以前的想法当中,都是因为有了.profile的配色方案。而我一般也都是 采用默认的(snakevil是写过一个bash带颜色的方案的。我觉得太花哨了就没有使用)

为什么突然间又想到这个?是因为在使用PHP输出LOG的时候,千篇一率,从屏幕中找关键字很累,所以就想着,是不是用PHP也可以输出这种带颜色的关键字?当然,这是因为我正好看到了一个PHP是这么输出的,它就是laraval,它的工具(laraval.phar)在命令行的输出就是有不同颜色的,它给了我指引,意思就是,这个想法是可以实现的。

OK。找资料,知道在终端中用指定的字符来做为背景色和字体色(http://blog.csdn.net/acmee/article/details/6613060)

文中这样介绍:

XML/HTML代码
  1. 一、shell下的实现方法  
  2.   
  3.        先来讲在shell下,如何实现。用echo命令就可以实现,参看以下例子:  
  4.   
  5.        echo  -e  "\033[32mHello, world!"  
  6.   
  7.        当你在终端里敲下这条命令后,是不是发现系统用绿色输出了"Hello,world!",不止如此,连之后的命令提示符都变成了绿色?不要着急,听我继续说。echo命令-e选项的作用是激活终端对反斜线转义符(即\)的解释。引号内\033用于引导非常规字符序列,在这里的作用就是引导设置输出属性,后边的[32m就是将前景色设置为绿色,字母m表示设置的属性类别,数字代表属性值。设置可以单独使用,例如:  
  8.   
  9.        echo -e  "\033[0m"  
  10.   
  11.        这行命令的作用是恢复属性为默认值,也就是说0m设置项用于恢复默认值。现在你的终端是不是又一切正常了?  
  12.   
  13.        理解了这些,剩下的就简单了。用这种命令,除了设置文本前景色,还可以设置很多属性。下边列出其他的设置项:  
  14.   
  15.       --------------------------------------------------------------------------  
  16.   
  17.       \033[0m 关闭所有属性  
  18.       \033[1m 设置高亮度  
  19.       \033[4m 下划线  
  20.       \033[5m 闪烁  
  21.       \033[7m 反显  
  22.       \033[8m 消隐  
  23.       \033[30m 至 \33[37m 设置前景色  
  24.       \033[40m 至 \33[47m 设置背景色  
  25.       \033[nA 光标上移n行   
  26.       \033[nB 光标下移n行  
  27.       \033[nC 光标右移n行  
  28.       \033[nD 光标左移n行  
  29.       \033[y;xH设置光标位置  
  30.       \033[2J 清屏  
  31.       \033[K 清除从光标到行尾的内容  
  32.       \033[s 保存光标位置   
  33.       \033[u 恢复光标位置  
  34.       \033[?25l 隐藏光标  
  35.       \033[?25h 显示光标  
  36.   
  37.       --------------------------------------------------------------------------  
  38.   
  39.       各数字所代表的颜色如下:  
  40.   
  41.       字背景颜色范围:40----49  
  42.       40:黑  
  43.       41:深红  
  44.       42:绿  
  45.       43:黄色  
  46.       44:蓝色  
  47.       45:紫色  
  48.       46:深绿  
  49.       47:白色  
  50.   
  51.       字颜色:30-----------39  
  52.       30:黑  
  53.       31:红  
  54.       32:绿  
  55.       33:黄  
  56.       34:蓝色  
  57.       35:紫色  
  58.       36:深绿   
  59.       37:白色  
  60.   
  61.       另外,同类的多种设置项可以组合在一起,中间用分号(;)隔开。如下:  
  62.   
  63.       echo -e "\033[20;1H\033[1;4;32mHello,world\033[0m"  
  64.   
  65.       这行命令首先\033[20;1H将光标移动到终端第20行第1列,之后的\033[1;4;32m将文本属性设置为高亮、带下划线且颜色为绿色,然后输出Hello,world;最后\033[0m将终端属性恢复为默认值,这样就不会看到连命令完成后的命令提示符也变了样儿了。  
  66.   
  67.       通过以上各种命令的组合就可以实现对终端输出地复杂控制。  
  68.   
  69. 二、如何在C编程中实现?  
  70.   
  71.       理解了以上在Shell中的实现方法,关于在C中如何实现就很简单了。可以说只需要用printf函数代替上边的echo -e就OK了。参见下例:  
  72.   
  73.       int color = 32;  
  74.   
  75.       printf("\033[20;1H\033[1;4;%dmHello, world.\033[0m", color);  
  76.   
  77.       这个例子类似上边shell中最后那个例子,只是这里颜色值通过变量color来指定(当然,也可以直接指定)。  
  78.   
  79. 三、联想  
  80.   
  81.       看到这里你可能会想,是不是在其他编程语言里也可以用类似的方法实现对终端输出的控制呢?答案是肯定的!比如在python中,可以如下输出:  
  82.   
  83.       color=32  
  84.   
  85.       print “\033[20;1H\033[1;4;%dHello, world.\033[0m"%color  
  86.   
  87.       这个例子的效果跟上边C的例子是相同的。  

其实在看到这一段之前,snakevil在自己的github的项目(https://github.com/snakevil/bashrc.x)中也介绍过,其实我相对还是喜欢ubuntu的默认配色,snakevil的这个配色我是真心不是特别喜欢。。

但究竟怎么用PHP输出呢?在用PHP输出之前,找了一下网络,发现已经有有用perl实现过了。那么说实在的。如果没有使用到一些特别的函数,其实php和perl实在是太象了,所以,可以直接参考(http://perldoc.perl.org/Term/ANSIColor.html),这里的代码,除了那个类外,都还是可以复刻的。于是,再随便找了点,果然还是有现成的PHP代码的(http://www.if-not-true-then-false.com/2010/php-class-for-coloring-php-command-line-cli-scripts-output-php-output-colorizing-using-bash-shell-colors/)

好吧。这个URL太长了。还是直接贴代码吧:

PHP代码
  1. <?php  
  2.    
  3.     class Colors {  
  4.         private $foreground_colors = array();  
  5.         private $background_colors = array();  
  6.    
  7.         public function __construct() {  
  8.             // Set up shell colors  
  9.             $this->foreground_colors['black'] = '0;30';  
  10.             $this->foreground_colors['dark_gray'] = '1;30';  
  11.             $this->foreground_colors['blue'] = '0;34';  
  12.             $this->foreground_colors['light_blue'] = '1;34';  
  13.             $this->foreground_colors['green'] = '0;32';  
  14.             $this->foreground_colors['light_green'] = '1;32';  
  15.             $this->foreground_colors['cyan'] = '0;36';  
  16.             $this->foreground_colors['light_cyan'] = '1;36';  
  17.             $this->foreground_colors['red'] = '0;31';  
  18.             $this->foreground_colors['light_red'] = '1;31';  
  19.             $this->foreground_colors['purple'] = '0;35';  
  20.             $this->foreground_colors['light_purple'] = '1;35';  
  21.             $this->foreground_colors['brown'] = '0;33';  
  22.             $this->foreground_colors['yellow'] = '1;33';  
  23.             $this->foreground_colors['light_gray'] = '0;37';  
  24.             $this->foreground_colors['white'] = '1;37';  
  25.    
  26.             $this->background_colors['black'] = '40';  
  27.             $this->background_colors['red'] = '41';  
  28.             $this->background_colors['green'] = '42';  
  29.             $this->background_colors['yellow'] = '43';  
  30.             $this->background_colors['blue'] = '44';  
  31.             $this->background_colors['magenta'] = '45';  
  32.             $this->background_colors['cyan'] = '46';  
  33.             $this->background_colors['light_gray'] = '47';  
  34.         }  
  35.    
  36.         // Returns colored string  
  37.         public function getColoredString($string$foreground_color = null, $background_color = null) {  
  38.             $colored_string = "";  
  39.    
  40.             // Check if given foreground color found  
  41.             if (isset($this->foreground_colors[$foreground_color])) {  
  42.                 $colored_string .= "\033[" . $this->foreground_colors[$foreground_color] . "m";  
  43.             }  
  44.             // Check if given background color found  
  45.             if (isset($this->background_colors[$background_color])) {  
  46.                 $colored_string .= "\033[" . $this->background_colors[$background_color] . "m";  
  47.             }  
  48.    
  49.             // Add string and end coloring  
  50.             $colored_string .=  $string . "\033[0m";  
  51.    
  52.             return $colored_string;  
  53.         }  
  54.    
  55.         // Returns all foreground color names  
  56.         public function getForegroundColors() {  
  57.             return array_keys($this->foreground_colors);  
  58.         }  
  59.    
  60.         // Returns all background color names  
  61.         public function getBackgroundColors() {  
  62.             return array_keys($this->background_colors);  
  63.         }  
  64.     }  
  65.    

用法也比较简单:

PHP代码
  1. <?php  
  2.    
  3.     // Create new Colors class  
  4.     $colors = new Colors();  
  5.    
  6.     // Test some basic printing with Colors class  
  7.     echo $colors->getColoredString("Testing Colors class, this is purple string on yellow background.""purple""yellow") . "\n";  
  8.     echo $colors->getColoredString("Testing Colors class, this is blue string on light gray background.""blue""light_gray") . "\n";  
  9.     echo $colors->getColoredString("Testing Colors class, this is red string on black background.""red""black") . "\n";  
  10.     echo $colors->getColoredString("Testing Colors class, this is cyan string on green background.""cyan""green") . "\n";  
  11.     echo $colors->getColoredString("Testing Colors class, this is cyan string on default background.""cyan") . "\n";  
  12.     echo $colors->getColoredString("Testing Colors class, this is default string on cyan background.", null, "cyan") . "\n";  
  13.    

当然,如果你觉得这个代码太麻烦,还有一个简单的方法:

PHP代码
  1. function colorize($text$status) {  
  2.  $out = "";  
  3.  switch($status) {  
  4.   case "SUCCESS":  
  5.    $out = "[42m"//Green background  
  6.    break;  
  7.   case "FAILURE":  
  8.    $out = "[41m"//Red background  
  9.    break;  
  10.   case "WARNING":  
  11.    $out = "[43m"//Yellow background  
  12.    break;  
  13.   case "NOTE":  
  14.    $out = "[44m"//Blue background  
  15.    break;  
  16.   default:  
  17.    throw new Exception("Invalid status: " . $status);  
  18.  }  
  19.  return chr(27) . "$out" . "$text" . chr(27) . "[0m";  
  20. }  
  21.   
  22. echo colorize("Your command was successfully executed...""SUCCESS");  

四种颜色也够了。不过。。。NOTE的blue background。。。如果你的字符还是黑色的,真心看不到字符串了。

至此,介绍完毕,你可以试试(我已经用在项目中了)