重定向用户,然后使用PHP和MySQL记录他的访问。

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

我想知道是否可以先将重定向发送给客户端,让它继续工作,然后再记录点击。只是简单地调换顺序会起作用吗?

你所做的事情非常时间紧迫吗?我认为你用现在的方式做并不会浪费太多时间。 - Mark
我同意马克的看法,SQL插入语句通常非常快。事实上,您可以编写一个存储过程来执行创建/更新逻辑。你只需要一个调用语句即可。 - St. John Johnson
是的,设置“Location”头不会终止正在运行的脚本,因此在这个意义上它是有效的-您还应该在设置头后调用flush(),以便立即将其发送到浏览器。 - J.C. Inacio
不,我所做的并不是非常时间紧迫的。然而,这只是一个业余项目,不是工作,让事情尽可能快速/高效只是一种乐趣。 - Bart van Heukelom
3个回答

4
你可以这样做:
  1. $_GET获取url。
  2. 发送Location:头文件。
  3. 调用flush()函数。
  4. 连接数据库。
  5. 为url创建行,如果已存在则更新1次点击。
这并不一定会立即导致浏览器立即跳转,因为你的连接仍然保持打开状态,浏览器对此的处理取决于它自己,但是(除非有导致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秒内发生。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接