您必須允許應用程序終止數據庫查詢,並且需要在客戶端和服務器之間實現更復雜的交互,否則可能導致安全漏洞。
Start-Request應該包含一個會話和一個頁面ID(安全ID,所以不是3和4和5,但是是一種不可猜測但是獨特的某種類型的散列)。後端然後將此ID與查詢連接起來。這可以在數據庫的某個額外表格中完成,或者如果您有redis,也可以通過redis-way完成,但也可以通過SQL查詢中的註釋來完成,例如「Session fid98a08u4j,Page 940jfmkvlz」=>s:<session>p:<page>
。
/* s:fid98a08u4jp:940jfmkvlz */ select * from ...
如果用戶按下「取消」,則向服務器發送帶會話和頁面ID的取消請求。然後,php代碼使用show processlist
獲取正在運行的SQL查詢的列表,並搜索會話和頁面以提取查詢ID。
那麼php發送
kill query <id>
到MySQL的服務器。
這可能會導致不使用事務時出現問題,這可能會損壞複製。甚至一個kill query
可能需要一段時間的國家'殺害'。
所以這應該是幾個變種的最後可能。但有時候需要完成,我甚至曾經有一個程序可以列出你自己的正在運行的查詢來殺死它們,這是因爲「配額」而需要的(你不能同時運行兩個或三個報告請求)。
好吧,不知道它有什麼用處,但是如果你的db用戶允許這樣做,你可以發出'kill * process_id *'命令。但是,你必須以某種方式知道* PROCESS_ID *,除非你執行一些骯髒的把戲,比如追加* USER_ID *爲每個SQL或類似的東西評論這是不可能的。是的,這可能是不安全的,你可能會終止其他用戶啓動的連接或者造成其他安全隱患。 – J0HN
的phpmyadmin做它...它應該是可能的... – Catalin