ホーム > フォーラム > 質問箱 > X2.0.16a JP > X2.0.16a JP d3pipesの更新時に新着が表示されない

X2.0.16a JP d3pipesの更新時に新着が表示されない
投稿者: siziru | 投稿日時: 2011/6/28 11:52 | 閲覧: 18825回
siziru

現在ブログのポータルサイトを運営しており、各ブログからのRSS取得に「d3pipes」を利用しています。

総ブログ数が180件ほどなのですが、1時間に1回のRSS巡回に5~10分ほどかかります。
その際にd3pipesの「新着一覧」が一時的に見れなくなります。(恐らく処理中のため表示まで時間がかかる)

新着記事の取得中も更新前の記事が表示され、全てのページを読み込み終わってからキャッシュを入れ替えるような方法はないのでしょうか?

新着記事ブロックは非同期ブロック、各パイプの表示数は1件です。
ブロックでの指定で180件のパイプ指定ができなかったため、テンプレートから直接全パイプを表示するようにしています。

◆現在のポータルサイト
http://www.e-com-shimada.jp/portal/
タグ:

コメント(12)

新しいものから | 古いものから | ネスト表示 | RSS feed
Re: X2.0.16a JP d3pipesの更新時に新着が表示されない 
投稿者: domifara | 投稿日時: 2011/7/1 7:14
domifara
引用:
現在ブログのポータルサイトを運営しており、各ブログからのRSS取得に「d3pipes」を利用しています。

総ブログ数が180件ほどなのですが、1時間に1回のRSS巡回に5~10分ほどかかります。
その際にd3pipesの「新着一覧」が一時的に見れなくなります。(恐らく処理中のため表示まで時間がかかる)

そりゃそうなりますよ。


引用:

新着記事の取得中も更新前の記事が表示され、全てのページを読み込み終わってからキャッシュを入れ替えるような方法はないのでしょうか?


siziru さんのいうように、
「新着記事の取得中も更新前の記事が表示され」というのは
キャシュだけでは不可能でしょう
面白そうな難題だったので、考えてみました。
「データベースに保存しているものから表示する方法」
http://xodomifara.lolipop.jp/doxo/modules/chalog/?action=BlogView&id=79
まあ、これは置いておいて

「全てのページを読み込み終わってからキャッシュを入れ替えるような方法はないのでしょうか?」
http://xodomifara.lolipop.jp/doxo/modules/chalog/?action=BlogView&id=80
意図したように動くのか?数件のデータではわからないのです。
こちらの方(改造箇所が少ない)をパックしてみました。
 d3pipes_block_asyncHACK.zip

ファイルを一つだけ上書きになります
ソースの原本をパックアップを取ってから試してみてください。

解凍したら
xoops_trust_path/modules/d3pipes/include/
直下に追加1つ追加
common_functions_ext.php

xoops_trust_path/modules/d3pipes/joints/union/
直下に2つ追加
D3pipesUnionMergesortcache.class.php
D3pipesUnionSeparatedcache.class.php

xoops_trust_path/modules/d3pipes/main/
直下に改造分1つ入れ替え(このソースのバックアップを忘れずに)
jsbackend.php

早くならないかもしれません。
そしたら、追加したソースを削除して、jsbackend.phpを元のソースに戻してください。
私のブログに
http://xodomifara.lolipop.jp/doxo/modules/chalog/?action=BlogView&id=80
同時にページを見られる場合の問題点とか
改造内容が書いてあります。
Re: X2.0.16a JP d3pipesの更新時に新着が表示されない 
投稿者: domifara | 投稿日時: 2011/7/1 19:34 | 親コメント: #20838
domifara

追記:
siziru さんのサイトは、巡回先が増える一方のはずなので、前投稿の
引用:
「全てのページを読み込み終わってからキャッシュを入れ替えるような方法はないのでしょうか?」

http://xodomifara.lolipop.jp/doxo/modules/chalog/?action=BlogView&id=80

の方法は、
siziru さん以外の他の人にも利用できる改造なので良いのですが
siziru さんのサイトの場合、
今後巡回先が増え続けたら、タイムアウトでデータのfetchに失敗すると予想されます。
だから根本的な解決にはならない

http://xodomifara.lolipop.jp/doxo/modules/chalog/?action=BlogView&id=81
のように、
表示用phpとfetch用phpとを分離して

fetch用phpは、巡回先を分割してcronなどで別途サイト側が
定期的に時間をずらして動かすというのが
私の思考シュミレーションレベルでの私の結論です。
Re: X2.0.16a JP d3pipesの更新時に新着が表示されない 
投稿者: domifara | 投稿日時: 2011/7/2 7:50 | 親コメント: #20838
domifara
引用:
xoops_trust_path/modules/d3pipes/main/
直下に改造分1つ入れ替え(このソースのバックアップを忘れずに)
jsbackend.php

早くならないかもしれません。


やっばりキャシュからのも、phpファイルを2つに分けなければ
速くはらなかったです。

改定しました。

 d3pipes_block_asyncHACK.zip


●インストール方法
解凍したら
xoops_trust_path/modules/d3pipes/include/
直下に追加1つ追加
common_functions_ext.php

xoops_trust_path/modules/d3pipes/joints/union/
直下に2つ追加
D3pipesUnionMergesortcache.class.php
D3pipesUnionSeparatedcache.class.php

xoops_trust_path/modules/d3pipes/main/
直下に2つ追加
jsbackendcache.php
jsbackendfetch.php


そして、テンプレート
d3pipes_block_async.html

<{*
<a href="<{$block.mod_url}>/index.php?page=jsbackend&amp;pipe_ids=<{","|implode:$block.pipe_ids}>&amp;max_entries=<{$block.max_entries}>&amp;union_class=<{$block.union_class}>&amp;link2clipping=<{$block.link2clipping}>&amp;unique_id=<{$block.unique_id}>">DEBUG</a>
*}>

<div class="d3pipes_async_block" id="<{$block.mydirname}>_async_block_<{$block.unique_id}>"></div>

<script type="text/javascript">
<!-- 
	d3pipes_add_script( "<{$block.mod_url}>/index.php?page=jsbackendcache&pipe_ids=<{","|implode:$block.pipe_ids|escape:"url"}>&max_entries=<{$block.max_entries}>&union_class=<{$block.union_class}>&link2clipping=<{$block.link2clipping}>&keep_pipeinfo=<{$block.keep_pipeinfo}>&unique_id=<{$block.unique_id}>" ) ;
	d3pipes_add_script( "<{$block.mod_url}>/index.php?page=jsbackendfetch&pipe_ids=<{","|implode:$block.pipe_ids|escape:"url"}>&max_entries=<{$block.max_entries}>&union_class=<{$block.union_class}>&link2clipping=<{$block.link2clipping}>&keep_pipeinfo=<{$block.keep_pipeinfo}>&unique_id=<{$block.unique_id}>" ) ;
//-->
</script>
<noscript><{$block.lang_async_noscript}></noscript>

と変更します

もしも、効果を認められないときは、原本のテンプレートに戻してください。
Re: X2.0.16a JP d3pipesの更新時に新着が表示されない 
投稿者: domifara | 投稿日時: 2011/7/2 11:46 | 親コメント: #20841
domifara
引用:
引用:
xoops_trust_path/modules/d3pipes/main/
直下に改造分1つ入れ替え(このソースのバックアップを忘れずに)
jsbackend.php

早くならないかもしれません。
そして、テンプレート
d3pipes_block_async.html

<{*
<a href="<{$block.mod_url}>/index.php?page=jsbackend&amp;pipe_ids=<{","|implode:$block.pipe_ids}>&amp;max_entries=<{$block.max_entries}>&amp;union_class=<{$block.union_class}>&amp;link2clipping=<{$block.link2clipping}>&amp;unique_id=<{$block.unique_id}>">DEBUG</a>
*}>

<div class="d3pipes_async_block" id="<{$block.mydirname}>_async_block_<{$block.unique_id}>"></div>

<script type="text/javascript">
<!-- 
	d3pipes_add_script( "<{$block.mod_url}>/index.php?page=jsbackendcache&pipe_ids=<{","|implode:$block.pipe_ids|escape:"url"}>&max_entries=<{$block.max_entries}>&union_class=<{$block.union_class}>&link2clipping=<{$block.link2clipping}>&keep_pipeinfo=<{$block.keep_pipeinfo}>&unique_id=<{$block.unique_id}>" ) ;
	d3pipes_add_script( "<{$block.mod_url}>/index.php?page=jsbackendfetch&pipe_ids=<{","|implode:$block.pipe_ids|escape:"url"}>&max_entries=<{$block.max_entries}>&union_class=<{$block.union_class}>&link2clipping=<{$block.link2clipping}>&keep_pipeinfo=<{$block.keep_pipeinfo}>&unique_id=<{$block.unique_id}>" ) ;
//-->
</script>
<noscript><{$block.lang_async_noscript}></noscript>

と変更します


効果を認められないですね。
d3pipes_add_script による javascript の追加では、追加の2つのスクリプトの処理順が決まっていないみたいです。
処理順がランダムになるみたいです
Re: X2.0.16a JP d3pipesの更新時に新着が表示されない 
投稿者: domifara | 投稿日時: 2011/7/2 14:37 | 親コメント: #20840
domifara

話がそれた投稿を続けたので
くかえしますが、
siziru さんのサイトは、
巡回先が増える一方のはずなので、前投稿のような方法良くなくて

http://xodomifara.lolipop.jp/doxo/modules/chalog/?action=BlogView&id=81
のように、
表示用php と fetch用phpとを分離して

fetch用phpは、巡回先を分割してcronなどで別途サイト側が
(パラメータはソースにベタ打ちでもいいでしょう?)
定期的に時間をずらして動かすというのが良いだろうというのが私の結論です。
Re: X2.0.16a JP d3pipesの更新時に新着が表示されない 
投稿者: siziru | 投稿日時: 2011/7/4 10:59 | 親コメント: #20843
siziru

様々な方法の提案ありがとうございます。

引用:
siziru さんのサイトは、
巡回先が増える一方のはずなので、前投稿のような方法良くなくて

http://xodomifara.lolipop.jp/doxo/modules/chalog/?action=BlogView&id=81
のように、
表示用php と fetch用phpとを分離して

fetch用phpは、巡回先を分割してcronなどで別途サイト側が
(パラメータはソースにベタ打ちでもいいでしょう?)
定期的に時間をずらして動かすというのが良いだろうというのが私の結論です。


別の業務でシステムの改良に手が出せないため、
すぐに実施はできませんが、今月中にdomifaraさんの意見を参考に、
負荷の分散を実施してみます。

xhldを初期に使用していたのですが、
アクセス時の更新作業で500エラーになってしまい、悩んだ末でのd3pipesへ変更したのが今の状態です。

アクセス数が増えることは分かっていたのですが、具体的にどうすればいいのか
ということが見つからないまま登録数ばかりが増えてしまって・・・・

外部記事中心のブログポータルはやはり難しいですね
Re: X2.0.16a JP d3pipesの更新時に新着が表示されない 
投稿者: siziru | 投稿日時: 2011/8/2 17:22 | 親コメント: #20844
siziru

現在テストサイトを立ち上げ、
本サイトに向けてテスト中なのですが、なかなかうまく反映されません。
(データベースからの読み込みはされている)

動作テストとして何件かデータベースに格納するようにしたのですが、
最新の情報を抜き出してくれず、過去の記事が表示されてしまいます。
(基準があるのかも不明、切り抜きの2番目だったり、5番目だったり様々)

http://www.e-com-shimada.jp/portal2/

ご紹介いただいたプログラムについて、何かこちらで勘違いをしてしまったのか・・・・
もし見ていましたら、細かい使い方をお教えいただけないでしょうか?
Re: X2.0.16a JP d3pipesの更新時に新着が表示されない 
投稿者: domifara | 投稿日時: 2011/8/4 9:35 | 親コメント: #20859
domifara
引用:
現在テストサイトを立ち上げ、
本サイトに向けてテスト中なのですが、なかなかうまく反映されません。
(データベースからの読み込みはされている)

動作テストとして何件かデータベースに格納するようにしたのですが、
最新の情報を抜き出してくれず、過去の記事が表示されてしまいます。
(基準があるのかも不明、切り抜きの2番目だったり、5番目だったり様々)

http://www.e-com-shimada.jp/portal2/

ご紹介いただいたプログラムについて、何かこちらで勘違いをしてしまったのか・・・・
もし見ていましたら、細かい使い方をお教えいただけないでしょうか?


http://xodomifara.lolipop.jp/doxo/modules/chalog/?action=BlogView&id=79
で書いた用にあのクエリーには問題点があります
切り抜きdbからの表示は最後に登録されたものを出すだけクエリーなんですが
RSSの取得は、Rssを表示すればわかると思いますが、何件かまとめて発信元がされています
一度に取得するので、発信元がどういう順番で発信しているかにより
切り抜きdbに保存するときにどれが最後に登録されるか特定できません。
普通は新しいものが最後のものが多いのですが、決まっているわけではないので。

http://xodomifara.lolipop.jp/doxo/modules/chalog/?action=BlogView&id=81
普通はRSSは、最新のデータが最後のデータなので
私が試したところが少ないのでたまたまうまくいったのでしょう


それで、最後に登録されるものを
DBに保存の前に一段ソート処理を追加してやるといいのですが
あんまり使わないモードですが
d3パイプには、日付で降順のソートのモード「発行日新着順ソート」があります、
でも
これだと、最後のデータは一番古いものになってしまいます。

逆の昇順のソート「発行日逆順ソート」がありません

xoops_trust_path/modules/d3pipes/joints/sort/D3pipesSortPubtimedsc.class.php

<?php

require_once dirname(dirname(__FILE__)).'/D3pipesSortAbstract.class.php' ;
require_once dirname(dirname(dirname(__FILE__))).'/include/common_functions.php' ;

class D3pipesSortPubtimedsc extends D3pipesSortAbstract {

	// $max_entires : max entries aggregated
	function execute( $entries , $max_entries = 10 )
	{
		// sort by pubtime DESC
		usort( $entries , array( $this , 'compare' ) ) ;

		return $entries ;
	}

	function compare( $a , $b )
	{
		if( @$a['pubtime'] == @$b['pubtime'] ) return intval( @$a['headline'] ) < intval( @$b['headline'] ) ? -1 : 1 ;
		else return @$a['pubtime'] > @$b['pubtime'] ? -1 : 1 ;
	}
}

?>

が「発行日新着順ソート」の処理です
function compare( $a , $b )
のところを
function compare( $b , $a )
と反対にすれば、逆順になります
改造して
「発行日新着順ソート」を「dbへ切り抜きとして保存」の前に「発行日新着順ソート」を一段処理を追加してみてください。

これを変えた場合、
既にdbへ切り抜き保存されていると、新しく保存されないので
一度dbへ切り抜きを削除する必要があります

たぶん、これで、パブリック日が最後のものが
dbへ切り抜き保存の最後となり、パイプごとdbのidの最大がパブリック日が最後のものになるのでは?
あくまで、思考シュミレーションなんですけど
この方法パブリック日を持ってない規格外rssはどうしようもないです。
Re: X2.0.16a JP d3pipesの更新時に新着が表示されない 
投稿者: domifara | 投稿日時: 2011/8/4 17:46 | 親コメント: #20860
domifara
引用:
引用:
現在テストサイトを立ち上げ、
本サイトに向けてテスト中なのですが、なかなかうまく反映されません。

まちがえました
「発行日新着順ソート」は改造せずに


「発行日新着順ソート」を「dbへ切り抜きとして保存」の前に「発行日新着順ソート」を一段処理を追加してみてください。

たぶん、これで、パブリック日が最後のものが
dbへ切り抜き保存の最後となり、パイプごとdbのidの最大がパブリック日が最後のものになるはず
Re: X2.0.16a JP d3pipesの更新時に新着が表示されない 
投稿者: domifara | 投稿日時: 2011/8/4 18:06 | 親コメント: #20861
domifara

テストで自分のサイトでやってみましたが
たぶん、これで、パブリック日が最後のものが
dbへ切り抜き保存の最後となり、パイプごとdbのidの最大がパブリック日が最後のものになります

「発行日新着順ソート」は改造せずに

手順
各パイプ管理で
1. 「発行日新着順ソート」を「dbへ切り抜きとして保存」の前に「発行日新着順ソート」を
一段処理を追加します(後ろにずらす)

2.切り抜き管理で 0日を指定してすべて削除します。
この段階で jsbackenddb.php よりの 表示は的なくなります。
3.一づつ表示をすると出てくるのですが

3.面倒なので
キャシュがあると、dbも更新されないので
「TRUST_PATH/cache下の外部取得・キャッシュ・切り抜き各ジョイントのキャッシュをすべて削除する」


4.一度原本の
jsbackend.php
に変えて、全取得をする

5.jsbackenddb.php に変更する

でいけると思います。
http://xodomifara.lolipop.jp/karidown/jsbackenddb.php
(右クリックで)
Re: X2.0.16a JP d3pipesの更新時に新着が表示されない 
投稿者: siziru | 投稿日時: 2011/8/5 12:54 | 親コメント: #20862
siziru

ご指摘ありがとうございます!

さっそくテストサイトで実施してみて、
結果はまたご報告しますね。
Re: X2.0.16a JP d3pipesの更新時に新着が表示されない 

    投票(0)

    新しいものから | 古いものから | RSS feed
     
    To Top