我有一个 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
我想知道是否可以先将重定向发送到客户端,以便它可以继续工作,然后记录点击。会简单地改变工作吗?
我有一个 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
我想知道是否可以先将重定向发送到客户端,以便它可以继续工作,然后记录点击。会简单地改变工作吗?
你可以这样做:
$_GET
Location:
标头flush()
这不一定会导致浏览器立即继续运行,因为您的连接仍处于打开状态,浏览器对此的处理取决于它,但是(除非导致flush()
无法工作的条件)它至少会获得Location:
标头输出到浏览器,以便它可以根据需要进行重定向。
如果这还不够好,我建议将您的数据转储到每分钟或每秒的文件中,然后脚本会选择这些文件进行后处理到数据库中。如果这还不够好,你可以玩pcntl_fork()
; 在 Apache SAPI 下这是一件非常麻烦的事情。
大多数数据库使您能够插入延迟查询,因此它只会在数据库空闲时处理。你最有可能这样做......只要数据不重要(如果 mysqld 死掉或 RAM 被刷新,你将丢失查询)。 http://dev.mysql.com/doc/refman/5.1/en/insert-delayed.html
没事儿。PHP 将在将重定向标头刷新到客户端之前完成执行。如果您仍有疑问,请尝试将其保存在文件中并从浏览器加载:
<?php
header('location: /');
sleep(2);
?>
重定向不应在 2 秒内发生。