プロジェクト

全般

プロフィール

Bug(バグ) #3352

プラグインチャンネルサーバに接続できない場合に管理画面のプラグインリスト画面が表示できない場合がある

Yuya Watanabeほぼ11年前に追加. 約7年前に更新.

ステータス:
Won't fix(対応せず)
優先度:
High(高め)
担当者:
対象バージョン:
開始日:
2013-05-21
期日:
進捗率:

0%

3.6 で発生するか:
Yes (はい)
3.8 で発生するか:
Yes (はい)

説明

概要

プラグインチャンネルサーバに接続できない場合に管理画面のプラグインリスト画面(/pc_backend.php/plugin/list)が表示できない場合がある.

具体的には,インストールしているプラグインが多い状態で plugins.openpne.jp に接続できない場合に実行時間が大きくなり,設定によっては画面がレンダリングされない.

原因

プラグインリスト画面(/pc_backend.php/plugin/list)を表示する際,コード部としては下記部分を通るが,それぞれのプラグインについてインスタンスを生成しようとする.このとき,各生成プロセスでは registerChannel() を呼び出しており,ここで数秒ほどブロックされ,例外を握りつぶした後処理を終了して次のインスタンス生成処理に移る.このプロセスが全プラグインに対して行われるため,全体として実行時間が大きくなって表示が遅くなり,数が多い場合には表示されない.

lib/plugin/opInstalledPluginManager.class.php
 67   public function getInstalledPlugins()
 68   {
 69     $result = array();
 70 
 71     $plugins = sfContext::getInstance()->getConfiguration()->getAllOpenPNEPlugins();
 72     foreach ($plugins as $pluginName)
 73     {
 74       $result[$pluginName] = $this->getPluginInstance($pluginName);
 75     }
 76 
 77     return $result;
 78   }
lib/plugin/opPluginManager.class.php
 50       try
 51       {
 52         $environment->registerChannel($this->channel, true);     
 53       }
 54       catch (sfPluginException $e) {}

関連するチケット

関連している OpenPNE 3 - Backport(バックポート) #4038: プラグインチャンネルサーバに接続できない場合に管理画面のプラグインリスト画面が表示できない場合がある Fixed(完了) 2016-11-14
関連している OpenPNE 3 - Backport(バックポート) #4039: プラグインチャンネルサーバに接続できない場合に管理画面のプラグインリスト画面が表示できない場合がある Fixed(完了) 2016-11-14

履歴

#1 Yuya Watanabeほぼ11年前に更新

  • 説明 を更新 (diff)

#2 Yuya Watanabeほぼ11年前に更新

おそらく同じ原因になると思うのでここに記述しておきます.


リリースしようとするプラグインの開発者ロールが lead であるとき, プラグインチャンネルサーバに接続できない状態で opPlugin:define を実行したとき下記のようなメッセージを出力する.

実際には本文に書かれている部分で例外が握りつぶされている状態のため,その影響が開発者ロールの部分に影響しているのではないかと思う.

$ ./symfony opPlugin:define opCommunityTopicPlugin 1.0.5 stable "release" 
Warning: Invalid argument supplied for foreach() in /path_to_openpne_dir/lib/plugin/opPluginManager.class.php on line 102
PEAR_PackageFileManager2 Error: Package validation failed:
Error: Invalid tag order in <package>, found <date> expected one of "lead" 

#3 Shinichi Urabe9年以上前に更新

  • 優先度Normal(通常) から High(高め) に変更

#4 kaoru n8年以上前に更新

  • 対象バージョンOpenPNE 3.9.0-old にセット

#5 Youichi Kimura8年以上前に更新

opPlugin::__construct() より抜粋:

    $info = $this->getPackageInfo();
    if ($info)
    {
      $this->version = (string)$info->version->release;
      $this->summary = (string)$info->summary;
    }
    else
    {
      try
      {
        $manager = new opPluginManager($dispatcher);
        $package = $manager->getEnvironment()->getRegistry()->getPackage($pluginName, opPluginManager::getDefaultPluginChannelServerName());
        if ($package)
        {
          $this->version = $package->getVersion();
          $this->summary = $package->getSummary();
        }
      }
      catch (Exception $e)
      {
        $message = array(
          'fail to get plugin package information cause: '.get_class($e).' : '.$e->getMessage(),
          'priority' => sfLogger::NOTICE
        );
        $dispatcher->notify(new sfEvent($this, 'application.log', $message));

        $this->version = '';
        $this->summary = '';
      }
    }

opPlugin::getPackageInfo() は、プラグインの package.xml がローカルに存在すればその情報を返し、ファイルが無ければ false を返すメソッドです。

抜粋した上記のコードはプラグインのバージョンと説明文を取得する処理です。
もしプラグインの package.xml が存在する場合は、plugins.openpne.jp を使用せず package.xml の情報のみ使用しています。
もし package.xml が存在しない場合は、plugins.openpne.jp からパッケージ情報を取得してそこから不足しているバージョン情報等を埋めています。


package.xml が存在しない場合にプラグインチャンネルサーバーからパッケージ情報を取得しようとしている理由は http://trac.openpne.jp/ticket/3610 に記載があり、

チャネルサーバからダウンロードしてインストールした場合、プラグインのディレクトリ直下にpackage.xmlがないため。

とされています。実際に ./symfony opPlugin:install タスクを使用してプラグインをインストールすると package.xml のない状態でインストールされます。
この場合はプラグインチャンネルサーバーからパッケージ情報を取得しようとしますが、実際には plugins/.registry/ ディレクトリ以下にキャッシュされているため plugins.openpne.jp への接続は行われません。

問題となるのは、opPlugin:install によってインストールされたプラグインではなく、かつ package.xml を持たないプラグインです。このようなプラグインは plugins.openpne.jp からパッケージ情報の取得が試みられますが、この取得はほぼ失敗すると考えられます。そもそも plugins.openpne.jp にプラグインをリリースしているプラグインは前述の opPlugin:install の場合を除いて必ず package.xml を持っているためです。

#6 Youichi Kimura7年以上前に更新

  • ステータスNew(新規) から Pending Review(レビュー待ち) に変更
  • 担当者Youichi Kimura にセット
  • 進捗率0 から 50 に変更
  • 3.6 で発生するかUnknown (未調査) から Yes (はい) に変更
  • 3.8 で発生するかUnknown (未調査) から Yes (はい) に変更

下記 Pull Request にて修正しました
https://github.com/openpne/OpenPNE3/pull/343

#7 isao sano7年以上前に更新

  • 関連している Backport(バックポート) #4038: プラグインチャンネルサーバに接続できない場合に管理画面のプラグインリスト画面が表示できない場合がある を追加

#8 isao sano7年以上前に更新

  • 関連している Backport(バックポート) #4039: プラグインチャンネルサーバに接続できない場合に管理画面のプラグインリスト画面が表示できない場合がある を追加

#10 Shinichi Urabe7年以上前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

#11 Youichi Kimura約7年前に更新

再現手順:

  1. OpenPNE に「opPlugin:install 経由でインストールされたプラグインではなく」かつ「package.xml がないプラグイン」を plugins ディレクトリに追加する
  2. OpenPNE.yml に以下の記述を追加する
    • default_plugin_channel_server: "localhost:8081" 
      
  3. symfony cc を実行
  4. 下記コマンドを実行して応答しない状態のプラグインチャンネルサーバーを再現する (nc コマンドがインストールされた環境が必要)
    • nc -l -p 8081
      
  5. 管理画面の「プラグイン設定」を開く
    • この時、実行中の nc コマンドでは以下のような出力が確認できます
    • GET /channel.xml HTTP/1.1
      Host: localhost:8081
      User-Agent: PEAR/1.9.0/PHP/5.6.22-0+deb8u1
      Connection: close
      
  6. 500 Internal Server Error のエラーが返る

#12 isao sano約7年前に更新

  • ステータスPending Testing(テスト待ち) から Won't fix(対応せず) に変更
  • 進捗率70 から 0 に変更

OpenPNE 3.8.23 にて対応済みであったため、対応せずとします。

他の形式にエクスポート: Atom PDF