0
<?php

require_once( dirname(__FILE__) . '/shared.php');

function tabelle_holen_hosters( $condition = "" ) {
    global $wpdb;
    $sql = "SELECT * FROM whatever" . $condition;

    if( $table = $wpdb->get_results( $sql, ARRAY_A ) ) {
        return $table;
    } else {
        echo "SQL ERROR in tabelle_holen()";
        var_dump( $table );
        return false;
    }
}

$test = tabelle_holen_hosters( " WHERE working=1 AND alexacheck=0 LIMIT 200" );
?>
<table>
<tbody>
<?php
foreach ( $test as $row ){
    $rank = (int) alexaRank( $row['hoster'] );

    if ($rank == 0)
        $rank = 999999999;

    echo '<tr>';
    echo '<td>' . $row['hoster_id'] . '</td>';
    echo '<td>' . $row['hoster'] . '</td>';
    echo '<td>' . $rank . '<td>';
    echo '</tr>';

    $wpdb->update(
    'fhw_filehosters',
        array(
            'alexa' => $rank,
            'alexacheck' => 1
        ),
        array( 'hoster_id' => $row['hoster_id'] ),
        array(
            '%d',
            '%d'
        ),
        array( '%d' )
    );
    flush(); // <----- NOT working.
}
?>
</tbody>
</table>
<?php
function alexaRank( $url ) {
    $request_url = "http://data.alexa.com/data?cli=10&url=".$url;
    $xml = simplexml_load_file($request_url) or die("feed not loading");
    return $xml->SD->POPULARITY['TEXT'];
}

私はこのスクリプトを持っています。 wordpress なしで wordpress データベース クラスを使用します。行数を 200 に制限しました。そうしないと、ページロードに何年もかかり、Alexa 関数からの xml の php 実行時間が非常に長くかかるなどの問題が発生するからです。そのデータベースでチェックする URL がたくさんあり、1 つのアクションですべてを更新したい、つまり 200 の制限を削除したいと考えています。一度に 50 を実行し、出力してから続行するようにするには、どうすればよいですか? アヤックス?どうすればいいですか?

更新 1:

コメントで言ったように、私は自分のウェブサイトでこれを(バックグラウンドで)実現する何かを探していますが、実際には、この時点でphpの実行時間制限になるかどうかはわかりませんが、「一度に」解決策についてはキューの最後で flush() をテストしましたが、機能していません!

しかし、質問を更新した今、ルーチン関数を探しています。答えは非常に一般的であり、私はその経験者ではありません。実際のコードをいくつか見てみたいと思います。それが多すぎて「プログラムを書いて」になりがちな場合は、時間をかけて掘り下げてこれを理解しなければなりません。次に、最も役立つ答えを受け入れます。

4

7 に答える 7

2

当面の質問 (スクリプトの実行中に出力を開始する方法) には簡単に答えられます。

flush();

ただし、PHP の実行時間制限によって制限されている場合、問題は解決しません。したがって、AJAX が残ります。

  • スクリプトを 2 つのファイルに分けます。1 つは空<table>の JavaScript を含むファイルで、もう 1 つは AJAX 経由で呼び出され、実際の処理を行い、テーブルの行を返します。
  • 次のように処理される行数を制限しますLIMIT $start, 50。ここで、$startGET/POST パラメーターを介して提供されます。
  • JavaScript では、最初に start=0 で PHP スクリプトを呼び出し、次に応答を処理した後、start を 50 増やして再度呼び出します。応答が空になるまで繰り返します。
于 2013-03-12T13:43:38.073 に答える
0

行を更新するだけで、どの項目が更新されたかを知りたい場合は、Web サーバーは必要ありません。「エコー」の代わりに、ロガー -> KLoggerを使用して、更新情報をディスクに書き込むことができます。この場合、 PHP CLIを使用すると利点があります。max_execution_time(0) を設定して、memory_limit を増やすことができます。さらに、apache や nginx を使用するよりも少し速いと思います。一括更新を行いますか? この記事を見てください。または、 MySQLを使用することもできます。作業中と alexacheck で異なるステータスが多数ある場合は、インデックスを作成することを忘れないでください。

于 2013-03-13T09:02:21.847 に答える
0

私は通常、関数ob_startob_flushを使用します。それは私のために働いています。

于 2013-03-16T04:21:15.960 に答える
0

このような長時間実行されるプロセスは、ジョブ キューの候補になる可能性があります。

  1. 一度に 50 個の URL をキューに入れます。
  2. 各ジョブ キュー ワーカーは、完了時に結果をメイン アプリケーションに送信します。
  3. アプリケーションは、結果がキューから到着したときに結果の表示を処理します。

これはすべて非同期で行う必要があります。

アプリケーションが「メンテナンス」モードになったとき。同じジョブ キューを引き続き使用できます。言及されたコメントの 1 つと同様に、ジョブを 1 日 2 回キューに送信する cron ジョブを使用することもできます。

于 2013-03-15T07:16:37.953 に答える
0

まず第一に、ベースコードとフロントエンドコードで作業を分割するのに最適です。

  1. ajax.getdata.php //ここでは、指定されたパラメーターに従ってデータを取得します

    $page = $_GET["page"]; // I skip the validation, you should do it be yourself
    
    require_once( dirname(__FILE__) . '/shared.php');
    
    function tabelle_holen_hosters( $condition = "" ) {
        global $wpdb;
        $sql = "SELECT * FROM whatever" . $condition;
    
        if( $table = $wpdb->get_results( $sql, ARRAY_A ) ) {
            return $table;
        } else {
            echo "SQL ERROR in tabelle_holen()";
            var_dump( $table );
            return false;
        }
    }
    
    function alexaRank( $url ) {
    
        $request_url = "http://data.alexa.com/data?cli=10&url=".$url;
        $xml = simplexml_load_file($request_url) or die("feed not loading");
        return $xml->SD->POPULARITY['TEXT'];
    }
    
    $limit = 200;
    
    $start= $page*$limit;
    
    $test = tabelle_holen_hosters( " WHERE working=1 AND alexacheck=0 LIMIT $start,$limit" );
    
    
    
     $str = '<table>';
    
    foreach ( $test as $row ){
    
        $rank = (int) alexaRank( $row['hoster'] );
    
        if ($rank == 0)
            $rank = 999999999;
    
        $str.= '<tr>';
        $str.= '<td>' . $row['hoster_id'] . '</td>';
        $str.= '<td>' . $row['hoster'] . '</td>';
        $str.= '<td>' . $rank . '<td>';
        $str.= '</tr>';
    
        $wpdb->update(
        'fhw_filehosters',
            array(
                'alexa' => $rank,
                'alexacheck' => 1
            ),
            array( 'hoster_id' => $row['hoster_id'] ),
            array(
                '%d',
                '%d'
            ),
            array( '%d' )
        );
    
    }
    
    $str.='</table>';
    
    echo $str;
    
    exit;
    
    ?>
    
  2. index.html // フロントエンド ビューを構築し、サーバーに ajax リクエストを送信します。

    <div id="content">
    </div>
    
    <div id="controls">
    <span onCLick="goPrev()">
    Prev
    </span>
    <span onCLick="goNext()">
    Next
    </span>
    </div>
    
    <script>
    var page=0;
    
    //this functions can be moved to separate file
    
    function goNext(){
    page++;
    //here should be some limit for max page
    readData();
    }
    
    function goPrev(){
    if(page==0) return false;
    page--;
    readData();
    }
    
    function readData(){
    $.ajax({
    "url":"/path/to/ajax.getdata.php?page="+page,
    }).done(function(data){
    $("#content").html(data);
    });
    }
    
    readData();
    </script>
    
    </body>
    </html>
    

そのため、一度に表示するレコード数を自分で定義し、コントロールをクリックして次または前のページに移動できます。

于 2013-03-19T10:05:04.520 に答える
0

それについてどのように考えるべきかを次に示します。

  • 1 つの大きなマザー オブ ゴッド ループを作成します。
  • $total カウンターと $temp カウンターを保持します。
  • ループを 100 (n) 回繰り返し、そのたびにカウンターを増やします。
  • 100 個の制限 (または 50 個または 200 個など) に達すると、一時カウンターがリセットされます。
  • プログラムを 3 秒間 (またはそのような) スリープ状態にします。
  • 一時変数を n 回繰り返し処理しますが、$total カウンターに対応するデータを要求します。

また

  • 1 つの大きなマザー オブ ゴッド ループを作成します。
  • カウンターは1つ。
  • ループの反復ごとにカウンターを増やします。
  • カウンターヒットが定義された最大値になったら、リセットします。
  • 寝る。
  • 繰り返す。

どちらにしても利益。

ここで、いくつかのコードといくつかの説明が必要なので:

PHP マニュアルには次のように書かれています。

int sleep ( int $seconds )
"Delays the program execution for the given number of seconds."

したがって、プログラムの実行が遅れます。実行時間を遅らせた場合、制限に達することはできません。

だからあなたはこれを行うことができます:

$i = 0;
$max = 50;
$sleepTime = 3;

foreach ( $test as $row ){
    $rank = (int) alexaRank( $row['hoster'] );

    if ($rank == 0)
    $rank = 999999999;

    echo '<tr>';
    echo '<td>' . $row['hoster_id'] . '</td>';
    echo '<td>' . $row['hoster'] . '</td>';
    echo '<td>' . $rank . '<td>';
    echo '</tr>';

    $wpdb->update('fhw_filehosters', array(
        'alexa' => $rank,
        'alexacheck' => 1
    ),
    array(
        'hoster_id' => $row['hoster_id']
    ),
    array(
        '%d',
        '%d'
    ),
    array( '%d' )
    );
    ii($i === $max)
    {
        $i = -1;
        sleep($sleepTime);
    }
    $i++;
}

少なくとも試してみてください。学習する最善の方法は実験することです。

于 2013-03-15T01:03:35.357 に答える
0

別の見方をすると、サイトにアクセスした 1 人のユーザーに対して更新できる特定の行だけがあるかどうかです。幻想を得るために、それはすべて更新されています。

オンライン ブラウザ ゲームでは、これはよくあることです。彼らはすべてが最新であると錯覚させますが、実際には更新されたのはプレーヤーの情報だけです.

または、サーバーホストに「スケジュールされたスクリプト」のオプションがあるかどうかを確認することもできます。これを許可するものをいくつか知っています。一定の間隔で、または 1 日の特定の時間にスクリプトを実行するようにトリガーします。

これが何らかの形で役立つことを願っています。

于 2013-03-19T12:03:30.777 に答える