2009-04-01 4 views
3

リンクのクリックを追跡するPHPリダイレクトページがあります。基本的にそれはありません:それは最初のクライアントへのリダイレクトを送信することが可能です場合ユーザーをリダイレクトして、phpとmysqlを使って訪問をログに記録します。

- get url from $_GET 
- connect to database 
- create row for url, or update with 1 hit if it exists 
- redirect browser to url using Location: header 

私は思っていたので、それはそれが仕事だと上取得した後、クリックしてログインすることができます。仕事の中で物事を切り替えるだけだろうか?

+0

あなたは非常にタイムクリティカルな作業をしていますか?私はあなたが本当にそれをやることによって、その多くの時間を失っているとは思わない。 – Mark

+0

私はMarkと同意し、SQLの挿入文は通常かなり速いです。実際には、作成/更新ロジックを実行するストアドプロシージャを作成することができます。 1つのCALLステートメントだけが必要です。 –

+0

はい、 "Location"ヘッダーを設定しても実行中のスクリプトは終了しないので、その意味で機能します。ヘッダーを設定した後にflush()を呼び出してブラウザに直ちに送信する必要があります。 –

答えて

4

あなたはこれを行うことができます:Location:ヘッダー

  • コールflush()
  • がデータベースに接続する送信$_GET
  • から

    1. GETのURLを
    2. 1を持つURLの行、または更新を作成します存在する場合ヒット

    これは、接続がまだ開いていて、それについてはブラウザが何をしているのかによって決まります(ただし、flush()が動作しなくなる条件を除き)。少なくともLocation:ヘッダーをブラウザに出力するので、好きな場合はリダイレクトできます。

    これで十分でない場合は、毎分または毎秒のファイルにデータをダンプして、スクリプトがデータベースにポストプロセッシング用にピックアップすることをお勧めします。 で十分でない場合は、pcntl_fork()で遊ぶことができます。これはと非常に Apache SAPIの下でやるべきことです。

  • 1

    ほとんどのデータベースでは、クエリが遅延して挿入されるため、データベースがアイドル状態のときにのみ処理されます。データが重要でない限り(mysqldが死んだ場合やRAMがフラッシュされた場合にクエリを失うことになります)、あなたはその可能性が最も高いでしょう。 http://dev.mysql.com/doc/refman/5.1/en/insert-delayed.html

    0

    これは問題ありません。 PHPはリダイレクトヘッダをクライアントにフラッシュする前に実行を終了します。それでも疑問がある場合は、ファイルに保存してブラウザからロードしてみてください。

    <?php 
    header('location: /'); 
    sleep(2); 
    ?> 
    

    リダイレクトは2秒間発生しません。

    関連する問題