3

我有一个 PHP 重定向页面来跟踪对链接的点击。基本上它是:

 - 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

我想知道是否可以先将重定向发送到客户端,以便它可以继续工作,然后记录点击。会简单地改变工作吗?

4

3 回答 3

4

你可以这样做:

  1. 从获取网址$_GET
  2. 发送Location:标头
  3. 称呼flush()
  4. 连接到数据库
  5. 为 url 创建行,如果存在,则使用 1 次命中进行更新

这不一定会导致浏览器立即继续运行,因为您的连接仍处于打开状态,浏览器对此的处理取决于它,但是(除非导致flush()无法工作的条件)它至少会获得Location:标头输出到浏览器,以便它可以根据需要进行重定向。

如果这还不够好,我建议将您的数据转储到每分钟或每秒的文件中,然后脚本会选择这些文件进行后处理到数据库中。如果还不够好,你可以玩pcntl_fork(); 在 Apache SAPI 下这是一件非常麻烦的事情。

于 2009-04-01T19:05:26.150 回答
1

大多数数据库使您能够插入延迟查询,因此它只会在数据库空闲时处理。你最有可能这样做......只要数据不重要(如果 mysqld 死掉或 RAM 被刷新,你将丢失查询)。 http://dev.mysql.com/doc/refman/5.1/en/insert-delayed.html

于 2009-04-01T18:55:05.130 回答
0

没事儿。PHP 将在将重定向标头刷新到客户端之前完成执行。如果您仍有疑问,请尝试将其保存在文件中并从浏览器加载:

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

重定向不应在 2 秒内发生。

于 2009-04-01T20:30:46.070 回答