我有一个带有 javascript 代码的 php 脚本,我正在向第二个 php 脚本发送 AJAX get() 请求。第二个脚本开始运行。如何从第一个终止第二个脚本?
2 回答
根据问题评论中的澄清,您所拥有的似乎是:
- 用户使用 JS 与之交互的 HTML 页面(此页面可能是使用 PHP 生成的,但这与此场景无关)。
- 来自页面 (1) 的 AJAX 调用调用生成图像的 PHP 脚本,这是一个缓慢且昂贵的过程
- 你想要一个额外的 AJAX 触发器,它将中止当前正在运行的脚本 (2)
我将采取的基本方法是在脚本 (2) 启动时创建某种“锁定”或“触发器”,并在步骤之间定期检查。触发器可以是一个文件,也可以是数据库中的一行,等等——关键是它需要位于多个 PHP 脚本可以同时访问的地方。
(3) 处的脚本可以是一个非常小的 PHP 脚本,用于删除您要中止的特定文件/数据库行/等。当(2)处的脚本接下来检查时,它会发现它的锁/触发器不再存在,然后可以整理它创建的任何工作数据和exit
。
确保在执行此操作时考虑到安全性:触发器的名称必须为 JS 所知,因此可以由用户操作。它应该是足够随机的,以至于有人不能恶意中止所有进程,并且在其格式上受到足够的限制,以至于中止脚本不能被欺骗删除与它无关的文件。这实际上并不难 - 只需一个随机的数字和字母字符串即可 - 但删除脚本需要确保它实际上是它接收的格式,因为它不能信任 JS 这样做。
对此的一个变体是有一个“心跳”系统,其中一个 JS 计时器定期更新锁/触发器,并带有时间戳说“是的,请继续处理这个”;如果 (2) 处的脚本发现时间戳太旧,它将中止。如果您想在用户感到无聊并离开页面时中止执行,这种方法是有利的,因为您无法可靠地将其捕获为事件并发送特定的“中止”请求(例如,考虑用户只需拔掉他们的来自互联网的笔记本电脑)。
超越“停止!” 和“继续前进!”,您实际上可以使用这种方法与正在运行的 PHP 进程进行通信,只需将其写入文件或数据库即可。由于 PHP 中没有“事件”模型或任何类型的线程(无需进入相当复杂的第 3 方扩展),PHP 脚本在开始运行后发现事情发生变化的唯一方法是主动查询它们,所以可以说,长时间运行的脚本应该尽可能地结构化,以便他们可以定期“检查他们的邮件”。
您可以中断 ajax 查询。
例如,如果您在 file1.php 中使用 jQuery,您可以通过 ajax 调用请求 file2.php:
<script>
var jqxhr = $.get( "file2.php", function( data ) {
// do some thing.
alert( "Get was performed." );
});
</script>
稍后在同一个 file1.php 中,稍后通过单击按钮或其他用户操作/事件处理程序,
<script>
//kill the request
jqxhr.abort();
</script>
这只是一种可能。