Joomler!.net - Decided on Joomla!

Wiki or Wordpress? No it is JContentPlus.

 

Archives

Blog

Demo

Home » Blog » クエリ
0 votes
Written by:Joomler! 10422 hits Thursday, 27 August 2009 09:11

サイトの不具合を、オンラインでコードを書き換えていました。原因は、クエリだったようだ。どうもおかしいとは思っていましたが、私の目は悪い物は見ないようにできているようです。

Jboardのトピック表示で、ページナビと表示数があってない・・・。おかしい。dumpするわけにもいかず(恥ずかしいし)、ログファイル出力するコードを挿入してからファイルにdumpして確認していました。

 
2 votes
Written by:Joomler! 8968 hits Monday, 10 November 2008 17:23

1週間くらい前からだろうか、次のバージョンのJBackup(早くしなきゃ)の最終テストとしながら、ダミー記事20,000タイトル(1タイトル、2000ワード。SQLデータで260MBにもなる。)をテスト用Joomla!1.5に入れ何度もテストを行っています。ところが、何度やってもなかなかサイトが表示されない。おかしい。あまりにも遅い(表示に5分以上かかる)のでプラグインをオフにしてみた。・・・でも、遅いではないか。えっ!これってJoomla!の限界!?

20,000タイトルごときで、と思う方もいるかもしれない。・・・まあ、20,000タイトルなんてそんなサイトなかなか無いと思うが、記事としてではなく、データとして20,000以上あるものは、ざらにあるのではないか。

そこで、何が原因か少し設定を変えて試してみた。

  • 全モジュール(メインメニュー以外オフ)

あら、あっさりと、速くなったではないか・・・。そこで一つずつオフにしたモジュールをオンにしていった。で、オンにしたら極端に遅くなったモジュールを列挙。

  • mod_latestnews
    ちなみにこのモジュールの入り口から出口までの所要時間は、なんと104秒もかかりました。
  • mod_mostread
    これもほぼ同じです。

対策を考えて、そしてその対策を行った結果、104秒かかっていた処理時間が、1秒になった。なんと104分の1です。んだこれ。mod_latestnewsもmod_mostreadも同様なので208秒(3分28秒)くらいかかっていた時間が、2秒です。3分もサイトが表示されるのを待っている人なんてクリックしてから、「ご飯だよ~。」と呼ばれた人くらいのものだ。

で、その対策は以下

$query = 'SELECT a.*,' .

$query = 'SELECT a.title, a.access, a.sectionid,' .

のように変更するだけです。

念のため、phpMyAdminでも変更前のクエリで実行してみたらほぼ同じように104秒前後の結果でした。

クエリは、必要なフィールドだけにしましょう。(気をつけようっと)

これってJoomla!1.5(もしかしたらうちの1.0.xも・・)を使っている方すべてに言えることなのでこの対策をするだけで少しはみなさんのサイトも速くなるかもしれませんね。しかし、もっと効率の良い方法が、無いものなのか考えどころですね。もっとHackしてしまったらもう少し速くなると思いますが、Hackする部分が多くなってしまいますのでこのあたりにしておきます。

 
1 votes
Written by:Joomler! 7728 hits Thursday, 12 June 2008 16:56

Joomla!のエクステンションで$_SERVER['REQUEST_URI']をそのまま使っているエクステンションを見かけたので問い合わせから連絡しておいた。私も恥ずかしいこといっぱいしているのでお構いなしです。Thinking

なぜ、そのまま使ってはいけないのかは「REQUEST_URI クロスサイトスクリプティング」ででも検索したら出てくるので書きませんが、mod_QRcodeを作成時に自動でURLを作成できるようにしようと思ったのですが、断念した覚えがあります。Joomla!1.5では使えそうなメソッドが用意されていますが、1.0.xでは自分が開いているサイトのURIを知ることは非常に難しいです。(もちろん、スクリプト付きでも良いなら別ですよ。)Joomla!標準のエクステンションだけならやりようもあるでしょうが、サードパーティーのエクステンションをもカバーしようと思うとはっきり言って至難の業です。$_SERVER['REQUEST_URI']ってユーザーがリクエストしたそのままが得られるだけなのでスクリプトがくっついていようが、SQLインジェクションをねらったクエリが付いていようがおかまいなしです。

簡単な例:Joomla!1.5で例えば下記のようなURLが正しいURLとすると

http://demo.joomler.net/the-news/1-latest-news/86-example-go.html

以下だとどうでしょう・・・

http://demo.joomler.net/the-news/1-latest-news/9999999999999999999/86-example-go.html

のように異なるURLでも同じページにアクセスできてしまいます。この場合はクエリの間に数字を入れただけですが、このように正しいURLでは無くても該当ページにアクセスできます。

なので、そのREQUEST_URIを使ってブックマークなんてとんでもないですよね。

サニタイズしてクリーニングすればと思うかもしれない。でもそれが本当に、そのサイトの管理者が意図するJoomla!の正しいURIってわかりますか?(もちろん使っているエクステンションが限定されていればそれ相応にサニタイズできると思います。)

Joomla!1.5で用意されているメソッドを使っても上記の例のような場合はそのまま出力されてしまいます。

結果、mod_QRcodeでは、モジュールのコピーを可能にして個々にURLの指定をするようにしましたので外部のリクエストに左右されません。

私も気をつけようっと・・・。Party

 
0 votes
Written by:Joomler! 12973 hits Thursday, 16 August 2007 20:49

Yahoo! Pipesで実際に英語RSSを日本語に翻訳するWebサービスを作成してみます。

  • 左のUser inputsからURL Inputをドラッグpipesetojtranlink.jpg
    Name:クエリになるので簡潔に。
    Prompt:Pipesのページを開いたときにここの文言が表示される。
    (ユーザーへの入力を促すタイトル)
    Position:たぶんクエリの順番かも?
    (入力しなくても大丈夫)
    Default:既に入力済の値を設定するかどうか
    (URLならいらないから空白)
    Debug:デバッグ出力のための実際に使えるRSSリンクを入力。
  • また左からSourcesのFetch Feedをドラッグ
    はじめのURL Inputの下の○からパイプをドラッグしてInput Box右の小さな○につなぐ
  • DeprecatedのBabelFishをドラッグ
    翻訳したい言語に設定(今回はEnglish To Japanese)し、2.のFetch Feed下部の○とBabel Fish上部の○をパイプでつなぐ
  • OperatorsからRenameをドラッグ
    ここでデータをマッピングします。
    item:y:title:これはたぶん翻訳していない元のタイトル。(事実そうなってる)
    item:link:ここにはリンクが入っていますがCopy Asを選択し、適当な名前でコピーします。
    これはただのフラグとして使用するだけなのでマッピングできるものならどれでもいいと思いますが・・・。
    このフラグを使ってGoogleのWEB翻訳リンクとするか、しないかを分岐します。
    そしてパイプで接続。
  • OperatorsからRegexをドラッグ
    これは正規表現で置き換えをしてくれるモジュールです。
    左のものを真ん中の条件で右と置き換えるってな具合に。
    今回は4つのルールを作成しています。
    • item.translatelink -> ^(.*)$ ->
    • item.translatelink -> ^1$ -> グーグルのWEB翻訳してくれるURL
    • item.translatelink -> ^0$ -> なにもなし
    • item.link ->^(.*)$ -> ${translatelink}$1
      それからパイプを接続。今回は最後の出力(Pipe Output)にも接続しましょう。
  • pipesetojtranslink1.jpg次はUser Inputから Text Inputをドラッグして5のRegexの隣くらいに置く
    Name:tlink(これもクエリになるので簡潔な名前に)
    Promt:URL Inputに同じなのでわかりやすく。
    Position:URL Inputに同じ。
    Default:1 これはリンクをGoogle WEB翻訳へのリンクにするかどうかのフラグです。今回は英語から日本語なので最初から1を入力済としています。
    Debug:1 Windowの下部にデバッグ出力を見ることができます。そのための値です。実際のこの値を参照してデバッグ出力されます。
    そしてパイプを接続するのですが、今回は先に作成したRegexの1番目の真ん中では無く右のInput Box右の小さな○に接続します。
    ここでRegexからText Inputのデータの流れを解説
    Regexに来た時点ですでにRSSはすべてタイトルを除いて翻訳済です。Regexでは次の作業を行っています。
    • translatelinkを初期化します。(ユーザー入力値に置き換える。)
    • ユーザー入力値に置き換えられたtranslatelinkの値を参照して"1"ならtranslatelinkをGoogleのWEB翻訳リンクに置き換えます。
    • 再度ユーザー入力値(translatelink)を参照して"0"ならtranslatelinkを空にします。
    • item.linkの前にtranslatelinkの値を足します。(空なら空を、Google WEB翻訳リンクならそのリンクを足します。)

以上で作業は完了です。

上のメニューからSaveをクリックし、Back to My Pipesから元の画面に戻ります。すると先ほど作成されたPipesが表示されていますのでクリックしするとURL入力欄とtlink入力欄に1が入力済で表示されているはずです。試しに何かの英語RSSリンクを入力して実行してみてください。

最後に・・・My Pipesの画面から作成したPipesの上にマウスカーソルをのせるとPublish他のメニューが出ますのでPublishをクリックして公開します。これで誰でも利用可能なWEBサービスが完成しました。

 

JContentPlus for Joomla!1.5 powered by Joomler!.net

joomler.net is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla!(R) name is used under a limited license from Open Source Matters in the United States and other countries.
joomler.net is not affiliated with or endorsed by Open Source Matters or the Joomla! Project.