2

ランダムではなく特定の順序でURLをローテーションするURLローテータースクリプトを作成したいと思います。

ローテーションするURLが100個あるとします。それらを注文すると、ローテーターは最初のURLから最後のURLまで表示し、最初のURLに戻ります。

可能であれば、データベースのない単純なphpスクリプトにすることはできますか?

4

2 に答える 2

3

はい、データベースなしで実行できます。URLの任意の配列と、数字を含むテキストファイルを使用して簡単なスクリプトを作成できます。番号は、表示するURLの配列のインデックスを追跡します。スクリプトがロードされたら、ファイルを読み取り、番号を取得して、関連付けられたURLを表示します。次に、数値をインクリメントして、数値が配列のサイズを超えない限りファイルに書き戻します。次に、ファイルにゼロを書き戻します。

ファイル内のURL(およびカウンターなし)でこれを実現するには、すべてのURLを1行のテキストに配置します。|それらをパイプ文字で区切ります。次の行にゼロを入れます。最初の行を読み、パイプ文字を分解して配列を作成します。配列から最初の要素を取得し、そのURLを使用して、最初の配列要素を配列の最後に移動します。パイプ文字を含む配列を文字列に戻し、ファイルの内容をテキストファイルに上書きします。

計画に応じて、これはCookieで機能する場合と機能しない場合があります。Cookieはクライアントブラウザに保存されるため、個々の訪問者が見たものだけを追跡できます。オーディエンス全体を考慮する必要がある場合は、個々のインデックスではなく、追跡するグループ配列インデックスが必要になるため、これは役に立ちません。

于 2012-04-27T13:56:37.087 に答える
1
<?php
define('FILEDB', 'count.db');
define('URLDB', 'url.db');

function readURLS()
{
  $fp = fopen(URLDB, 'r');

  if( null == $fp )
    return false;

  $retval = array();
  while (($line = fgets($fp)) !== false)
  {
    $retval[] = $line;
  }

  return $retval;
}

$list = readURLS();

if( false === $list )
{
  echo "No URLs available";
}
else
{
  $fp = fopen(FILEDB, 'a+');

  $count = (fread($fp, filesize(FILEDB)) + 1) % count($list);

  ftruncate($fp, 0);
  fwrite($fp, "{$count}");
  fclose($fp);

  echo $list[$count];
}

これは機能します。


新しい要件で更新されました。
url.dbという名前のファイル(またはdefine('URLDB', 'xxx') 各行の後に入力するものはすべてURLエントリ)が必要です。

count.dbは存在できますが、存在する必要はありません。シンプルなものを作成することをお勧めします0

url.db'リクエスト'ごとにファイル内のすべてのURLエントリを順番に表示します。

ただし、これは同時安全ではありません。人物Aがページをリクエストし、人物Bも同様にリクエストした場合、count.dbAが新しいコンテンツを書き込む前にBが読み取った場合、AとBが同じURLを参照する可能性があります。count.db

于 2012-04-27T14:13:45.117 に答える