サポート » マルチサイト » 部活動でWPを活用しているのですが各生徒のデータ読み込みが遅い問題の解決へのアドバイスを頂けないでしょうか

  • megumiiuchi19920715

    (@megumiiuchi19920715)



    以前にもこちらで、”部活動でWPを活用しているのですが各生徒のデータ読み込みが遅い”ことでご相談させていただきましためぐみと申します。

    GoogleSpreadSheetをウェブ上でCSVで公開しています(https://docs.google.com/spreadsheets/d/●●●●●●●●●●●●●●●●/pub?gid=●●●●●●●●&single=true&output=csv”)。
    このCSVデータを/wp-content/themes/twentyseventeen にスクリプト?コマンド?を使ってコピーすることは難しいのでしょうか。
    自分では解決するのが難しいので、以下の内容をフリーランスの方にご相談しました。

    1.公開しているGoogleSpreadSheet(CSV)を自分のWordpressサーバにコピー。
    2.そのコピーしたCSVからWEBに[SC 1 1]という感じで呼び出します。
     ※文章一番下にあるfunctionは、共有しているグーグルスプレッドシートから直接読み込む際のスクリプトですがこの方法では生徒が自分のデータを読み込むのに1分半も時間がかかってしまいます。
     ※早く読込む方法はないかと思い、上記の1、2の方法で実現できるのではないかと結論に至った次第です。

    結果、「1.」の実現が難しく時間がかかりそうなので可能かどうか調査しますと言われています。
    素人感覚では、そんなに難しい感じがしないわけでもないのですが、すでにこちらの相談から1週間弱の時間が経過していて。
    恐らく先方もお忙しいと思うのですが、一度自分でも調べてみようと思いましてこちらでご相談させていただいた次第です。

    恐れ入ります、少し複雑かもしれないのですが、もし上記の問題を解決できる方がいましたらどんな些細なことでも結構ですのでアドバイスを頂けないでしょうか。
    お忙しいところ恐縮ですが、なにとぞよろしくお願いいたします。

    ——————————
    function shortcd($who) {
    $filepath = “https://docs.google.com/spreadsheets/d/●●●●●●●●●●●●●●●●/pub?gid=●●●●●●●●&single=true&output=csv”;
    $file = new NoRewindIterator(new SplFileObject($filepath));
    $file->setFlags(SplFileObject::READ_CSV);

    foreach ($file as $value) {
    $records[] = $value ;
    }

    return $records[$who[0]][$who[1]];
    }

    add_shortcode(‘sc’, ‘shortcd’);

11件の返信を表示中 - 1 - 11件目 (全11件中)
  • データの取得自体はどうしても時間がかかる処理なのかなとは思います。
    アクセスがあるたびに、データを取得する必要は無いのかなと思いますので、 Transient_API 等を使ってデータをキャッシュしておくのはどうでしょう。

    [WordPressのTransients APIを用いて表示の高速化を図る – Simple Colors](https://www.warna.info/archives/1681/)

    [Transients API – WordPress Codex 日本語版](http://wpdocs.osdn.jp/Transients_API)

    megumiiuchi19920715

    (@megumiiuchi19920715)

    ご連絡ありがとうございます。
    キャッシュについては以前にチャレンジしたことがあります。
    ショートコードによりグーグルスプレッドシートから読み込むため、グーグルスプレッドシートのデータが変更されても新しいデータを読み込もうとはしません。
    なので、表示される速度は速くなるのですが、更新されたデータをすぐ読み込まず、また、仮に読み込むとしても速度は遅いので意味はありませんでした。

    質問させていただいた、1.の方法はやはり難しいということなのでしょうか?
    まず、そこが知りたい所です。

    munyagu

    (@munyagu)

    こんにちは

    shortcd 関数の実装はイケてないんじゃないでしょうか・・・多分

    SPL の NoRewindIterator がどのような実装になっているのか分かりませんが、名前やメソッドからして前方向へのファイル中の移動を可能にしているクラスだと思います。(後ろ方向は禁止ですが)
    SplFileObject も低レベルのファイル操作 API を実装していてファイルを全てメモリにロードせずに、巨大なファイルでも読み取ったりすることを可能にしているのだと思います。

    つまり、NoRewindIterator クラスのインスタンスでイテレート(行移動)するたびに Google Drive にアクセスしているので遅いのだと思います。

    そのURLでCSVファイルにアクセス可能なのであれば、file_get_contentscurl でファイルをメモリにロードすれば良いと思います。(ファイルが巨大でなければですが)

    そののち、ご自身でCSV ファイルを配列にする処理を記述してください。

    file_get_contents は便利ですが、サーバーによっては http のプロトコルで始まるファイルは取得できないように設定されているかもしれません。
    その場合は curl を使ってください。

    ※ファイルを全て読む仕様になっていますが、指定された $who を読み込んだら後は不要なので、ループはそこで break することでも処理は速くなります。必要なデータがCSVの上の方にある場合は。

    ishitaka

    (@ishitaka)

    こんにちは

    ひとつのセルを表示する度に、ファイルを読んでいるようなので、まとめてみてはどうでしょうか?

    function shortcd( $who ) {
    
    	(省略)
    
    	foreach ( $file as $value ) {
    		$records[] = $value ;
    	}
    	//return $records[$who[0]][$who[1]];
    
    	$out = "<p>吉田君の体重は {$records[2][1]} Kgです。</p>";
    	$out .= "<p>先月より {$records[2][2]} Kg {$records[2][3]} います。</p>";
    	$out .= "<p>部員全員の中で {$records[2][4]} 番です。</p>";
    	return $out;
    }
    
    add_shortcode( 'sc', 'shortcd' );

    キャッシュについては以前にチャレンジしたことがあります。

    チャレンジされたのは、@toro_unit さんが書かれている Transient API でしょうか?
    下記のようなコードでは、効果ありませんか?

    function shortcd( $who ) {
    	if ( false === ( $records = get_transient( 'sc_shortcode' ) ) ) {
    
    		(省略)
    
    		foreach ( $file as $value ) {
    			$records[] = $value ;
    		}
    		set_transient( 'sc_shortcode', $records, 5 * MINUTE_IN_SECONDS );	// 5分間有効
    	}
    	return $records[$who[0]][$who[1]];
    }
    
    add_shortcode( 'sc', 'shortcd' );
    megumiiuchi19920715

    (@megumiiuchi19920715)

    ishitakaさま

    わざわざスクリプトまで書いていただきましてありがとうございます。
    本当に感謝しています。
    1つ目に頂いたコードについては、1人分50セル分くらい出力してまして、現在の環境では使用できないのではないかと思ってます。
    2つ目に頂いた試してみたいと思っています。

    恐れ入ります、「(省略)」の部分は、以下の内容を入れればいいのでしょうか?

    $filepath = “https://docs.google.com/spreadsheets/d/●●●●●●●●●●●●●●●●/pub?gid=●●●●●●●●&single=true&output=csv”;
    $file = new NoRewindIterator(new SplFileObject($filepath));
    $file->setFlags(SplFileObject::READ_CSV);

    私のような初心者にいつも懇切丁寧に教えてくださり本当にありがとうございます。

    ishitaka

    (@ishitaka)

    以下の内容を入れればいいのでしょうか?

    はい、そうです。
    なお、 @megumiiuchi19920715 さんのコードが正しいかどうかは検証していませんので、あしからずご了承くださいませ。

    ishitaka

    (@ishitaka)

    なお、このフォーラムでコードを貼り付ける場合は、コードを選択し [code] ボタンをクリック(逆クォートで囲む)してください。
    詳細は下記ページを参照してください。
    https://wpdocs.osdn.jp/フォーラムへようこそ#.E3.82.B3.E3.83.BC.E3.83.89.E3.81.AE.E6.8A.95.E7.A8.BF

    • この返信は1 ヶ月前に  ishitaka さんが編集しました。
    megumiiuchi19920715

    (@megumiiuchi19920715)

    munyaguさま

    貴重な情報をありがとうございます。
    頂いた内容について素晴らしいと思うのですが、私のような初心者には到底実現ができず、また、この内容をいつもお世話になってるフリーランスの方にオブラートに包んで伝えたとしてもレベルが高すぎて傷つけてしまって、今後業務を請け負ってもらえないかもしれない不安があります(いつも安くやっていただいているので)。
    それくらいレベルの高いことをお伝えいただいたことは分かるのですが…

    munyagu

    (@munyagu)

    全くレベルは高くありません。
    SplFileObject や NoRewindIterator を使える方がレベルが高いと思います。
    私はこれらのクラスは、ファイルが巨大すぎて処理できない場合など、特別な要件がないかぎり、ややこしそうなので使いたくないくらいです。

    megumiiuchi19920715

    (@megumiiuchi19920715)

    恐れ入ります、それで今回質問させていただいてます

    1.公開しているGoogleSpreadSheet(CSV)を自分のWordpressサーバにコピー。

    の件なのですが、技術的には難しいものでしょうか。
    コピーするスクリプトを実行すれば
    容易に出来るものだと考えていたのですが。

    munyagu

    (@munyagu)

    私の結論は先に記述したように、メモリの読み込む、というものです。
    高速化するためにWordPressのサーバーにコピーする必要はない、というものです。

    私の提案は同じ環境で試したわけではないので、実際にどうかは試してみないと分かりません。
    shortcd 関数を少し書き換えるだけで試せるので、試していただけたらと思います。

11件の返信を表示中 - 1 - 11件目 (全11件中)
  • このトピックに返信するにはログインが必要です。