指定两个字符串,通过程序的判断两个字符串是否互为变型词。

    $str = 'abcd';
    $compare_str = 'cdab';
    compare_func($str,$compare_str); //此时返回true
    //或
    $str = '123a';
    $str = '123';
    compare_func($str,$compare_str); //此时返回false

解题思路:

  • 如果两个字串是互为变型词,那么字串长度是一致的。
  • 遍历第一个字串的每个字符获取其Ascii做下标,统计出现次数,存入Ascii数组。再遍历第二个字串中每个字符的Ascii做下标,直接从Ascii数组中减去出现次数即可。
function compare_func($str,$compare_str)
{
    $strl = strlen($str);
    $compare_strl = strlen($compare_str);
    // 若两个字串的长度等于零或不一致返回false
    if ($strl + $compare_strl === 0 || $strl !== $compare_strl)
        return false;
    // 存储出现过的字符
    $ascii = [];
    for ($i = 0;$i < $strl;$i++) {
        // 以每个字符的Ascii码作为下标
        $ascii[ord($str[$i])] ++;
    }
    for ($i = 0;$i < $strl;$i++) {
        // 这里如果已经等于零了,再自减必然为负数,那么直接返回false
        if ( $ascii[ord($compare_str[$i])] -- == 0 ){
            return false;
        }
    }
    return true;
}

一、安装Redis和简单配置

1. 下载Redis安装包

  • 地址:http://redis.io/download , 本文选择Stable(3.0)版本
wget http://download.redis.io/releases/redis-3.0.5.tar.gz

2. 安装Redis

tar xzf redis-3.0.5.tar.gz
cd redis-3.0.5
make

3. 启动Redis

./src/redis-server &

附加内容 :

  • Redis默认不是后台启动,不加 “&” 时会一直停留在命令界面
  • 最好搭配配置文件一起启动例如:
./src/redis-server ./redis.conf
  • redis.conf中设置 “daemonize no” 为 “daemonize yes” 也代表redis以后台的方式启动,前提时redis-server启动时带上redis.conf

二、安装phpredis扩展

1. 下载phpredis扩展安装包

wget http://pecl.php.net/get/redis-2.2.7.tgz , 本文选择2.2.7版本

2. 安装phpredis

tar zxvf redis-2.2.7.tgz
cd redis-2.2.7
/opt/server/php-5.5.7/bin/phpize
./configure
make
make install
  • 以上步骤完成后需要在php.ini中添加如下代码:
extension=/opt/server/php-5.5.7/lib/php/extensions/no-debug-non-zts-20121212/redis.so

3.重启web组件(本文使用Nginx + php5-fpm)

/opt/server/nginx/sbin/nginx -s reload
kill -USR2 `cat /opt/server/php-5.5.7/var/run/php-fpm.pid`

三、配置Yii2的redis扩展(本文使用Yii2 basic 版)

  • 官方提供的文档地址:https://github.com/yiisoft/yii2-redis/blob/master/docs/guide/README.md

1. 安装Yii2的redis扩展

cd /www/html/basic
php composer.phar require --prefer-dist yiisoft/yii2-redis

2. 配置basic/config/web.php

在components数组中添加如下内容:

'redis' => [
    'class' => 'yii\redis\Connection',
    'hostname' => 'localhost',
    'port' => 6379,
    'database' => 0,
],

3. 使用

$redis = Yii::$app->redis;
$redis->get('key');
$redis->set('k','v');

附加(一些报错解决)

basic/vendor/yiisoft/yii2-redis/Connection.php文件的源码中265行开始(因实际而定)

  • 变量 errorNumber 、errorDescription ,没提前定义Yii2 一直报undefined
  • “@”把报错屏蔽了,一直查不到原因,删掉”@”才发现stream_socket_client、stream_socket_server()这两个函数禁用了

更改前

$this->_socket = @stream_socket_client( 
            $this->unixSocket ? 'unix://' . $this->unixSocket : 'tcp://' . $this->hostname . ':' . $this->port,
            $errorNumber,      
            $errorDescription,
            $this->connectionTimeout ? $this->connectionTimeout : ini_get("default_socket_timeout")
);

更改后

//也可以不定义这两个变量,通常项目都会忽略notice报错,视实际情况而定
$errorNumber = '';
$errorDescription = '';
//----如果报错:Warning:stream_socket_server() has been disabled for security reasons... 请看下面解决方法
//----这里"@" ↓↓↓ 把报错屏蔽了,需要删除"@"才能看见上面的报错,
$this->_socket = stream_socket_client( 
            $this->unixSocket ? 'unix://' . $this->unixSocket : 'tcp://' . $this->hostname . ':' . $this->port,
            $errorNumber,      //----这两个变量没有提前定义一直报undefined
            $errorDescription, //----这两个变量没有提前定义一值报undefined
            $this->connectionTimeout ? $this->connectionTimeout : ini_get("default_socket_timeout")
);

解决方法:编辑php.ini把disable_functions=…中找到stream_socket_server()、stream_socket_client删除并保存,重启web组件即可

@[toc]

使用php-java-brigde与JAVA通信

前些天因为要开发有关网银的应用,签名一定要用java的API,花了点时间研究。

环境

  • Centos 6.5

实施过程:

运行java需要安装JDK,这个步骤本文省略,请自行安装

1.下载php-java-brigde应用包

  • 地址:http://osdn.jp/projects/sfnet_php-java-bridge/releases/
  • 本文应用版本:php-java-bridge_6.2.1_documentation.zip

2.解压php-java-brigde

  1. 解压出 documentationJavaBridge.war 两个文件(夹)
    • 命令:unzip php-java-bridge_6.2.1_documentation.zip
  2. 根据文档:documentation/README 中的描述执行以下命令
    • 命令:java -classpath JavaBridge.war TestInstallation
      • 经上面命令后,从javabridge.war中得出以下文件:
        php-java
        ├── documentation
        ├── ext
        ├── java
        ├── JavaBridge.war
        ├── RESULT.html
        └── test.php

3.启动JavaBridge.jar

  1. 如何启动javaBridge.jar呢?:
    • 使用: java -jar ext/JavaBridge.jar –h 查看帮助,得知启动方式
    • Example 1: java -jar JavaBridge.jar
    • Example 2: java -jar JavaBridge.jar HTTP_LOCAL:8080 3 JavaBridge.log
    • Example 3: java -Djavax.net.ssl.keyStore=mySrvKeystore -Djavax.net.ssl.keyStorePassword=YOURPASSWD -jar JavaBridge.jar HTTPS:8443 3 JavaBridge.log
  2. 本文参考Example 2 来启动:
    • **java -jar ext/JavaBridge.jar SERVLET_LOCAL:8080 3 /var/log/JavaBridge.log **
    • 如需后台运行请在命令后加 “&”:
    • java -jar ext/JavaBridge.jar SERVLET_LOCAL:8080 3 /var/log/JavaBridge.log &

4.准备完毕,测试是否成功

vim test.php

require_once './java/Java.inc';
$javaObj = new Java('java.lang.System');
var_dump($javaObj);

只要正常打印出对象就说明已经链接成功了!

5.调用自定义的jar包

创建一个java文件Demo.java

/*一个简单的测试*/
class Demo
{
        // 返回两数和
        public int test(int num1,int num2)
        {
                return num1+num2;
        }
}

编译Demo.java和打包成jar

  • 编译:
    • javac Demo.java
    • 生成 Demo.class
  • 打包成jar
    • jar -cvf /usr/java/packages/lib/ext/Demo.jar Demo.class
    • jar -cvf [目标] [源]
  • 为什么上面的目标位置是/usr/java/packages/lib/ext/? 在启动JavaBridge.jar时会显示如下信息:
    • 标黑的那一行会告诉你,自定义的jar包该放在哪个位置

l@y:/home/www/html/php-java$ java -jar ext/JavaBridge.jar SERVLET_LOCAL:8080 3 /var/log/JavaBridge.log
java.io.FileNotFoundException: /var/log/JavaBridge.log (权限不够)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.(FileOutputStream.java:221)
at java.io.FileOutputStream.(FileOutputStream.java:110)
at php.java.bridge.Util.redirectJavaOutput(Util.java:1320)
at php.java.bridge.Util.redirectOutput(Util.java:1314)
at php.java.bridge.JavaBridge.initLog(JavaBridge.java:264)
at php.java.bridge.Standalone.checkServlet(Standalone.java:206)
at php.java.bridge.Standalone.init(Standalone.java:172)
at php.java.bridge.Standalone.main(Standalone.java:302)
Aug 20 02:34:22 JavaBridge INFO : VM : 1.7.0_79@http://java.oracle.com/
Aug 20 02:34:22 JavaBridge INFO : JavaBridge version : 6.2.1
Aug 20 02:34:22 JavaBridge INFO : logFile : /var/log/JavaBridge.log
Aug 20 02:34:22 JavaBridge INFO : default logLevel : 3
Aug 20 02:34:22 JavaBridge INFO : socket : SERVLET_LOCAL:8080
Aug 20 02:34:22 JavaBridge INFO : java.ext.dirs : /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/ext:/usr/java/packages/lib/ext
Aug 20 02:34:22 JavaBridge INFO : php.java.bridge.base: /home/l
Aug 20 02:34:22 JavaBridge INFO : thread pool size : 20
Aug 20 02:34:22 JavaBridge INFO : JavaBridgeRunner started on port INET_LOCAL:8080

调用刚刚写好的方法
——注:当新增自定义jar包到扩展目录时,请重新启动JavaBridge
vim test.php

require_once './java/Java.inc';
$javaObj = new Java('Demo');    //创建Demo实例
echo $javaObj->test(3,5);    //求两数之和

结果输出:8

这样我们就完成了一次PHP JAVA的简单通信,深入研究请看documentaction/README 或查阅更多资料