我有一个php应用程序连接到一个只有两个表的数据库:users
和folders
。当您登录应用程序并按下按钮时,folders
表中会插入大量记录。该过程大约需要15分钟才能完成。在这个时候,所有的应用程序都被卡住了。在我的应用程序的标题中,我有类似
select * from users where id = {$_SESSION['user_id']}
但是在folders
表中插入了数万条记录之后,第二条查询才会被执行。在我等待15分钟并完成导入后,我可以访问我想要的任何页面。我该如何解决这个问题?
我最初忘记提及的一件非常重要的事情(我为此道歉)是一个oracle数据库。我之前为MySql测试过它(仅仅是为了好奇)它没有任何问题,但对于oracle它似乎有这个问题。使用OCI8建立连接。
答案 0 :(得分:3)
15分钟的人口应该在后台任务中发生,然后看看用户是否存在是微不足道的。如果没有向用户显示某种消息。
例如githubs fork功能,你会看到一本书被扫描,直到后台任务完成。
这可以通过使用具有用户ID和已处理列的第三个表来完成。后台任务正在寻找已处理= 0和处理。
用户正在寻找processed = 1继续,如果已处理= 0则显示友好页面。
当procssing在后台完成时,然后更新DB中的标志
答案 1 :(得分:2)
我认为您应该制作单独的longprocess.php
文件并使用header()
将其重定向到shortprocess.php
。现在,用户不必等待,因为longprocess.php
将在15分钟后退出,shortprocess.php
会立即向用户发送数据。
longprocess.php
<?php
header('Location: shortprocess.php');
//time taking sql query here
exit;
?>
P.S。因为两个php
文件都将使用单独的数据库连接,因此它可能不会影响其他脚本的性能。
答案 2 :(得分:0)
谢谢大家的回答和努力,但错误在于我:事实证明问题不是来自数据库,而是来自PHP的会话。在标题中,在执行查询之前,我使用'session_start()'而不使用session_write_close()。所以,在session_start()调用之后,我开始了15分钟的查询。在那段时间内任何查看另一个页面的尝试都是不可能的,因为session_write_close函数还没有被调用(当脚本结束时会自动调用它),这让我觉得数据库阻塞了脚本,但实际上它是我的PHP代码那是错的。