Bug(バグ) #3352
完了プラグインチャンネルサーバに接続できない場合に管理画面のプラグインリスト画面が表示できない場合がある
0%
説明
概要¶
プラグインチャンネルサーバに接続できない場合に管理画面のプラグインリスト画面(/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) {}
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"
Youichi Kimura さんがほぼ9年前に更新
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
を持っているためです。
Youichi Kimura さんが8年以上前に更新
- ステータス を New(新規) から Pending Review(レビュー待ち) に変更
- 担当者 を Youichi Kimura にセット
- 進捗率 を 0 から 50 に変更
- 3.6 で発生するか を Unknown (未調査) から Yes (はい) に変更
- 3.8 で発生するか を Unknown (未調査) から Yes (はい) に変更
下記 Pull Request にて修正しました
https://github.com/openpne/OpenPNE3/pull/343
isao sano さんが約8年前に更新
- 関連している Backport(バックポート) #4038: プラグインチャンネルサーバに接続できない場合に管理画面のプラグインリスト画面が表示できない場合がある を追加
isao sano さんが約8年前に更新
- 関連している Backport(バックポート) #4039: プラグインチャンネルサーバに接続できない場合に管理画面のプラグインリスト画面が表示できない場合がある を追加
Shinichi Urabe さんがほぼ8年前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
Youichi Kimura さんが7年以上前に更新
再現手順:
- OpenPNE に「opPlugin:install 経由でインストールされたプラグインではなく」かつ「package.xml がないプラグイン」を plugins ディレクトリに追加する
- OpenPNE.yml に以下の記述を追加する
default_plugin_channel_server: "localhost:8081"
- symfony cc を実行
- 下記コマンドを実行して応答しない状態のプラグインチャンネルサーバーを再現する (nc コマンドがインストールされた環境が必要)
nc -l -p 8081
- 管理画面の「プラグイン設定」を開く
- この時、実行中の nc コマンドでは以下のような出力が確認できます
GET /channel.xml HTTP/1.1 Host: localhost:8081 User-Agent: PEAR/1.9.0/PHP/5.6.22-0+deb8u1 Connection: close
- 500 Internal Server Error のエラーが返る