2016-04-24 11 views
3

Webサイト(Laravel 4.2)でセッションストレージとしてRedisを使用しています。時々私はエラーに追いつく。私は ">" charがsetexコマンドを破ったと思います。Redis "unknown command"エラー

production.ERROR: exception 'Predis\ServerException' with message 'ERR unknown command '>'' in 

production.ERROR: exception 'Predis\ServerException' with message 'ERR unknown command 'tml>'' 

production.ERROR: exception 'Predis\ServerException' with message 'ERR unknown command '</div>'' 

これらのエラーは本番サーバーではほとんど発生せず、再現できません。これらのエラーがなぜ発生するのか、どうすればそれらを防ぐことができますか?

key: laravel:xxxxxxxxxxxxxxx 

value: s:217:"a:4:{s:6:"_token";s:40:"xxxxxxxxxxx";s:4:"lang";s:2:"fr";s:9:"_sf2_meta";a:3:{s:1:"u";i:1461777248;s:1:"c";i:1461777248;s:1:"l";s:1:"0";}s:5:"flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}}"; 

exception 'Predis\ServerException' with message 'ERR unknown command 'ml>'' in vendor/predis/predis/lib/Predis/Client.php:282 

更新

私はRedisのを使用しています

コード例。

public function view($username = null) 
    { 
     $username = mb_strtolower($username); 
     $redis = $this->getRedis(); 
     try{ 
      $view = $redis->get(User::getCacheKeyByUsername($username)); 
     }catch (\Exception $exception){ 
      $view = null; 
     } 
     if($view === null || Session::has("admin")){ 
      $user = User::where('username', '=', $username)->where("status", 1)->first(); 
      if (empty($user)) { 
       return Redirect::to(Session::get("lang") . '/all'); 
      } 
      $view = View::make("view", array("user" => $user)); 
      if(!Session::has("admin")){ 
       try{ 
        $redis->setex(User::getCacheKeyByUsername($username), 3600, $view); 
       }catch (\Exception $exception){ 
        Log::error($exception->getMessage()); 
       } 
      } 
     } 
     return $view; 
    } 
+0

文字列の補間が間違っていますか? –

+0

@Ferid Movsumov、この問題は解決しましたか? – mnv

+0

@mnv残念ながら問題は依然として存在します。 –

答えて

1

あなたのエラーログからは、基本的に何が言えますか?:redisは、<>のような特殊文字を好きではないので、それらをエンコードする必要があります。

エンコードにはhtmlspecialcharsを使用し、取得時にデータをデコードするにはhtmlspecialchars_decodeを使用してください。

0

あなたのredisクライアントに何か問題があります。コードはエラーではなく、クライアントとRedisサーバー間のTCP通信で発生するため、再現することはできません。

私はこの質問を更新し、どのクライアントモジュールがあなたが使用しているのかを言及することをお勧めします。それはpredisですか?

UNIXの場合は、phpredisをコンパイルしてインストールしてください。それはPHPモジュールであり、私はそれに何の問題もなかった。 telnetの


再現telnet host portを行い、指示に従ってください:

通常要求GET aは次のようになります。

*2 
$3 
get 
$1 
a 
$-1 

は今これを考慮する - gem aを尋ねる:

*2 
$3 
gem 
$1 
a 
-ERR unknown command 'gem' 

プロトコルは有効ですが、コマンド "gem"は無効です。

*1 
$3 
ml> 
-ERR unknown command 'ml>' 

ここにあなたのエラーは次のとおりです。

は今これを検討してください。有効なプロトコル、無効なコマンド。ここで

*2 
$3 
get 
$1 
<html> 
$-1 
-ERR unknown command 'ml>' 

が再びあなたのエラーです:

はまた、これを検討してください。無効なstrlen("<html>");

このRedisのクライアントエラーではなく、ユーザー・エラー理由:

多くのRedisのクライアントがPHPmagic methodsを使用しています。

これは、$redis->bla()を呼び出すと、「bla」部分を抽出し、そのパラメータにパラメータを付けてredisサーバに転送することを意味します。

ただし、$redis->ml>()は実行できません。これは構文エラーです。これはコードからではなく、redisクライアントからのエラーです。

HTMLの一部のようにも見えます。あなたはHTMLのデータを赤字で保存しているようです。私は、クライアントがstrlen()またはcount()を計算せず、間違った情報を「telnet回線を介して」送信していることを推測できます。

+0

-1のおかげで。もう一度 - 赤いライブラリで何かが間違っています。 Telnetでエラーを再現する方法を編集します。 – Nick

+0

あなたの答え@Nickに感謝しますが、どうすればこの問題を解決できますか? –

+0

私はこのエラーをpredisクライアント内で検索します。私はあなたに結果を知らせます。 –

関連する問題