caw*_*caw 11 php user-interface abort
我有一个在服务器端使用PHP的网站.
用户访问页面,PHP进行一些计算,将数据写入MySQL数据库等.
想象一下,用户访问PHP为用户创建帐户的页面.创建包括两部分:将注册数据插入"用户"表,并将此帐户的设置插入表"设置".这是两个必须一个接一个地执行的SQL查询.如果用户在第一次查询后退出页面,则"设置"中不会插入任何值.
我怎么能避免这个问题?我想只需使用ignore_user_abort(true),对吗?
那么在每个PHP脚本的顶部调用ignore_user_abort(true)是不是很有用?我不知道它应该导致问题的任何情况.
bob*_*nce 13
对于您的具体示例,使用数据库事务(如Ignacio所述)将是更合适的方法.
在其他情况下,您可能希望确保用户不能提前中止,但与数据库无关.例如,如果更新数据库然后发送邮件,则不希望用户在邮件发出之前能够停止该过程.在这种情况下,ignore_user_abort
是合适的.
但是,请注意,一个破裂的管道,由于客户中止连接不停止执行马上,只在一点上,你下一个尝试写入脚本输出.这可以通过打电话echo
或者print
,甚至只是通过关闭PHP标签,并在打开新的前插入一些空白(... ?> <?php ...
).因此,如果您在页面顶部拥有脚本的所有"操作"部分,那么在尝试编写任何页面内容之前,您不必担心管道损坏会影响应用程序逻辑.
当然,无论如何,你应该以这种方式将动作逻辑与页面内容分开.
来自http://php.net/manual/en/function.ignore-user-abort.php#refsect1-function.ignore-user-abort-notes
在尝试向客户端发送信息之前,PHP不会检测到用户已中止连接.仅使用echo语句并不能保证发送信息