やってやれないことはなさそうですが、
セキュリティや動作面での不安は残りますね。
上司・お客さんにもセキュリティの問題がある旨を報告し、
言った言わないの問題を避ける為に念書もらうとかの話になってきます。
なのでオススメはしません。
まずは下記を徹底するべきです。
- インデックスを張る等して高速な検索を実現する
- 何個もテーブルを結合しまくるような超重いクエリを1訪問者に使わせる権限与えるな
- ページネーションを実装する等して時間稼ぎする
- フロントエンドでは砂時計を回転させる等して待たせる
前提として想定しうる内容はこれですね。
Laravelだろうがなんだろうが、MySQLのrootレベルの権限を持たせたアカウントとでSQL文を発行するだけです。
参考記事: MySQLでクエリをキャンセル - Qiita
show processlist
のSQL文を発行すれば一覧が帰ってくるとして、
「Aユーザーが検索して遅いので取り消したいクエリ」を正確に見抜くのが問題ですね。
Bユーザーが「別に遅いけどブラウザ開きっぱなしで待ってよう」としているものを誤って停止させましたという話になるようではとんでもない不具合です。
もし、Laravelにそういった機能がない場合、この状況だとどういった解決案が考えられるのでしょうか?
Laravelは裏でPDOを利用してMySQLとの通信を実現しています。
https://readouble.com/laravel/5.7/ja/database.html
このPDOを使って$conn->query("select * from users");
みたいな命令をした瞬間
PHPは待ちぼうけして結果が帰ってくるまでは次の行は実行しません。
なので実行した後にプロセスIDを掴んで、外部に保存するというフローは実現できません。
なのでクエリを投げる前に、クエリビルダで作った実行予定SQLを何らかの方法で取り出しておき、
Redis等のデータベースなんかに「私このユーザーとしてこのSQLを送信しますよ」という情報を覚えさせておき
結果が帰ってきたらRedis上から消すというフローを実装しておきます。
フロント側は別口のAjax/FetchでRedisの登録を見ながら投げられたクエリを察知、
Redisのデータを見ながらshow processlist
でプロセスIDを取り出して、
KILL CONNECTION [ID]
を発行してプロセスを停止させるといった事は考えられます。
ですが、そんな仕組み必要なんですか?
DBのチューニングはしましたか?
インデックスは張りましたか?
不要なカラムは結果から取り除きましたか?
クエリの実行計画は確認しましたか?
http://nippondanji.blogspot.com/2009/03/mysqlexplain.html
それによりテーブルの正規・非正規の設計を見直しましたか?
ユーザーには時間が掛かる旨の同意を取らせましたか?
そこまで全部やって
なお重い、何分・何時間もかかるなら質問文のような発想に至ったのであればわかります。
しかし、実際MySQLの実行計画すら見てないのでは?
だったら同じ1エンジニアとしてプロセスをKILLする手法を推奨するわけにはいきません。
それはWebサービスの安定性を削ったり、悪用されかねないような機能の実装になります。
極力使わなくて済む方向で考える事を推奨します。
もし質問文の発端が上司・顧客だったならば
「知人に機密情報伏せて軽く相談したら、絶対やめたほうがいいよってアドバイスもらった」
みたいな報告・連絡をしましょう。