今使っています 友達の中には難しいと思っていて、あえて挑戦しない人もいるかもしれません。実際、PHPというツールを使えば、それは難しいことではなく、簡単であるとも言えます。 まず、訪問者カウンターのアイデアについて説明します。訪問者がこのページを閲覧すると、サーバー (Apache など) がそのページが閲覧された回数をドキュメントから読み取ります (num.txt は、以下の例)、1 を加えて num.txt に保存し、その回数に 1 を加えた値をブラウザに表示します。
別の訪問者がこのページを閲覧すると、サーバーは上記のプロセスを繰り返すことで、PHP によるアクセスカウンターの生成が実現されます。 PHP には直接のカウンタ関数はありませんが、その強力な機能を使用すると、自分で簡単にカウンタを作成できます。
次に、プログラムで使用する必要がある関数について説明します。
1. ファイルを開く操作: int fopen(string filename, string mode); ここで、string filename は、開かれるファイルの名前です。文字列形式。たとえば、「num.txt」です。文字列モードはファイルを開く方法であり、文字形式である必要があります。
「r」、読み取り専用形式、ファイル ポインターはファイルの先頭を指します。 「r+」、読み取りおよび書き込み可能、ファイル ポインターはファイルの先頭を指します。 'w'、書き込み専用形式。ファイル ポインタはファイルの先頭を指します。ファイルの長さは 0 に切り捨てられます。ファイルが存在しない場合は、ファイルの作成が試行されます。 「w+」、読み取りおよび書き込み可能。ファイル ポインターはファイルの先頭を指し、ファイルの長さは 0 に切り捨てられます。ファイルが存在しない場合は、ファイルの作成が試行されます。
'a'、追加フォーム (書き込み専用)、ファイル ポインターはファイルの末尾を指します。ファイルが存在しない場合は、ファイルの作成が試行されます。 「a+」、読み取りおよび書き込み可能。ファイル ポインターはファイルの末尾を指します。ファイルが存在しない場合は、ファイルの作成が試行されます。
2. ファイル読み取り操作: string fgets(int fp, int length); ここで、int fp はデータを読み取るファイル ストリーム ポインターであり、fopen 関数は値を返します。 int length は読み取られる文字数で、実際に読み取られる文字数は length-1 です。
3. ファイル書き込み操作: int fputs(int fp, string str, int [length]); ここで、int fp は情報が書き込まれるファイル ストリーム ポインターであり、その値は fopen 関数によって返されます。 string str は、ファイルに書き込まれる文字列です。 int length は書き込まれる長さです (オプション)。 length が選択されていない場合は、文字列全体が書き込まれます。それ以外の場合は、長さの文字を書き込みます。
4. ファイルを閉じる操作: int fclose(int fp); ここで、int fp は fopen 関数によって返されるファイル ストリーム ポインターです。 次に、PHP によって生成されたアクセス カウンターのプロトタイプを見てみましょう: (num.txt ファイルが存在すると仮定します)
<ol class="dp-xml"><li class="alt"><span><span class="tag"><</span><span> ?php $</span><span class="attribute">fp</span><span> = </span><span class="attribute-value">fopen</span><span>("num.txt", "r"); </span></span></li><li><span>//只读方式打开num.txt文件 </span></li><li class="alt"><span>$</span><span class="attribute">num</span><span> = </span><span class="attribute-value">fgets</span><span>($fp,5); </span></li><li><span>//读取4位数字 </span></li><li class="alt"><span>$num++; </span></li><li><span>//浏览次数加一 </span></li><li class="alt"><span>fclose($fp); </span></li><li><span>//关闭文件 </span></li><li class="alt"><span>$</span><span class="attribute">fp</span><span> = </span><span class="attribute-value">fopen</span><span>("num.txt", "w"); </span></li><li><span>//只写方式打开num.txt文件 </span></li><li class="alt"><span>fputs($fp, $str1); </span></li><li><span>//写入加一后结果 </span></li><li class="alt"><span>fclose($fp); </span></li><li><span>//关闭文件 </span></li><li class="alt"><span>echo "$num"; </span></li><li><span>//浏览器输出浏览次数 </span></li><li class="alt"><span class="tag">?></span><span> </span></span></li></ol>
これはカウンターのプロトタイプにすぎず、表示できるだけであることに注意してください。 PHP は非常に強力な画像処理能力を備えており、簡単かつ動的に WEB 画像を生成できます。
上記のプロトタイプを以下に修正して、本当に実用的なカウンターにします。 PHP でアクセスカウンターを生成する考え方は、プロトタイプのメソッドを使用してアクセス数を取得し、標準形式に変換し、画像処理を行って画像に出力して表示します。 カウント画像を生成したい場合は、次の関数が必要です:
1. 文字列長関数: int strlen(string str); ここで、string str は長さを計算する文字列です。
2. 文字列の追加: たとえば、$string1 と $string2 を追加します: $string = $string2
3. 新しい画像関数を作成します: int imagecreate(int x_size, int y_size); ここで、x_size、y_size は新しい画像の幅と高さ (ピクセル単位) です。
4. カラー関数: int imagecolorallocate(int im, int red, int green, int blue); ここで、int im は画像の識別番号です。 int red、green、blue はそれぞれ赤、緑、青の色の成分で、値の範囲は 0 ~ 255、つまり対応する色の RGB です。
5. 画像を色で塗りつぶす関数: int imagefill(int im, int x, int y, int col); ここで、int x、int y は、色の塗りつぶしが開始される画像の座標です。画像は (0, 0) です。 int col は色の識別番号です。
6. 画像内に横書きテキストを書き込む関数: int imagestring(int im, int font, int x, int y, string s, int col); ここで、int im は画像の識別番号です。 int font はフォントの識別番号です。 int x、int y はフォントの書き込みを開始する座標で、(0,0) は左上隅です。 string s は書き込まれる文字列です。 int col はフォントの色の識別番号です。
7. 画像内に直線を描く関数: int imageline(int im, int x1, int y1, int x2, int y2, int col); ここで、int im は画像の識別番号です。 int x1、int y1、int x2、int y2 は描画された線の開始座標と終了座標です。 int col は、線の色の識別番号です。
8. 画像を GIF 形式に出力する関数: int imagegif(int im, string filename); ここで、int im は画像の識別番号です。文字列 filename は生成されたイメージの名前です (オプション)。 filename が空の場合は、直接出力されます。
9. イメージを解放します: int imagedestroy(int im); ここで、int im は解放されるイメージの識別番号です。 この関数は、識別番号 im のイメージとそのイメージによって占有されているシステム リソースを解放します。 次のようにホームページでこのカウンターを呼び出して PHP を実装し、アクセスカウンターを生成できます: 以下は counter.php3 のプログラムリストです:
<ol class="dp-xml"><li class="alt"><span><span class="tag"><</span><span> ? </span></span></li><li><span>Header("Content-type: image/gif"); </span></li><li class="alt"><span>//定义输出为图像类型 </span></li><li><span>$</span><span class="attribute">n</span><span>=</span><span class="attribute-value">10</span><span>; </span></li><li class="alt"><span>//变量$n是显示位数 </span></li><li><span>$</span><span class="attribute">fp</span><span> = </span><span class="attribute-value">fopen</span><span>("num.txt", "r"); </span></li><li class="alt"><span>$</span><span class="attribute">str1</span><span> = </span><span class="attribute-value">fgets</span><span>($fp,$n+1); </span></li><li><span>$str1++; fclose($fp); </span></li><li class="alt"><span>$</span><span class="attribute">fp</span><span> = </span><span class="attribute-value">fopen</span><span>("num.txt", "w"); </span></li><li><span>fputs($fp, $str1); </span></li><li class="alt"><span>fclose($fp); </span></li><li><span>//同原型 </span></li><li class="alt"><span>$</span><span class="attribute">str2</span><span> = ""; </span></li><li><span>$</span><span class="attribute">len1</span><span> = </span><span class="attribute-value">strlen</span><span>($str1); </span></li><li class="alt"><span>for ($</span><span class="attribute">i</span><span>=</span><span class="attribute-value">1</span><span>;$i</span><span class="tag"><</span><span>=$n;$i++) </span></li><li><span>{ $</span><span class="attribute">str2</span><span> = "0".$str2; }; </span></li><li class="alt"><span>//得到$n位0 </span></li><li><span>$</span><span class="attribute">len2</span><span> = </span><span class="attribute-value">strlen</span><span>($str2); </span></li><li class="alt"><span>//计算访问人数的位数 </span></li><li><span>$</span><span class="attribute">dif</span><span> = $len2 - $len1; </span></li><li class="alt"><span>$</span><span class="attribute">rest</span><span> = </span><span class="attribute-value">substr</span><span>($str2, 0, $dif); </span></li><li><span>$</span><span class="attribute">string</span><span> = $rest.$str1; </span></li><li class="alt"><span>//位数如果不够$n位,在前面补0 </span></li><li><span>for ($</span><span class="attribute">i</span><span>=</span><span class="attribute-value">0</span><span>;$i</span><span class="tag"><</span><span>=$n-1;$i++) </span></li><li class="alt"><span>{ $str[$i]=substr($string,$i,1); }; </span></li><li><span>//以数组存储每位 </span></li><li class="alt"><span> $</span><span class="attribute">font</span><span> = </span><span class="attribute-value">4</span><span>; </span></li><li><span> //定义字号 </span></li><li class="alt"><span> $</span><span class="attribute">im</span><span> = </span><span class="attribute-value">imagecreate</span><span>($n*11-1,16); </span></li><li><span>//新建图象 </span></li><li class="alt"><span> $</span><span class="attribute">black</span><span> = </span><span class="attribute-value">ImageColorAllocate</span><span>($im, 0,0,0); </span></li><li><span>$</span><span class="attribute">white</span><span> = </span><span class="attribute-value">ImageColorAllocate</span><span>($im, 255,255,255); </span></li><li class="alt"><span>//定义颜色 </span></li><li><span>imagefill($im, 0,0,$black); </span></li><li class="alt"><span>//把计数器的底色设置成黑色 </span></li><li><span>ImageString($im,$font,1,0,$str[0],$white); </span></li><li class="alt"><span> for ($</span><span class="attribute">i</span><span>=</span><span class="attribute-value">1</span><span>;$i</span><span class="tag"><</span><span>=$n-1;$i++) </span></li><li><span>{ imageline($im, $i*11-1,0,$i*11-1,16, $white); ImageString($im,$font,$i*11+1,0,$str[$i],$white); }; </span></li><li class="alt"><span>//将每位写入图象,并以竖线分隔 </span></li><li><span>ImageGif($im); </span></li><li class="alt"><span> //图象输出 </span></li><li><span>ImageDestroy($im); </span></li><li class="alt"><span>//释放图象 </span></li><li><span class="tag">?></span><span> </span></span></li></ol>
另外,为了方便,还可以用将计数器作为一个函数MyCounter(),这样只许需在主页开头加入require(“filename”);使MyCounter()成为此主页的一部分,需要的时候,将 MyCounter();?>加在需要计数器的地方就可以完成PHP生成访问计数器。