从另一个 php 脚本终止一个脚本

Terminate a php script from another

本文关键字:脚本 一个 终止 另一个 php      更新时间:2023-09-26

我有一个带有javascript代码的php脚本,我正在向第二个php脚本发送AJAX get()请求。第二个脚本开始运行。如何从第一个脚本终止第二个脚本?

根据问题评论中的澄清,您似乎拥有的是:

  1. 用户使用 JS 与之交互的 HTML 页面(此页面可能是使用 PHP 生成的,但这与此方案无关)。
  2. 来自页面 (1) 的 AJAX 调用调用生成图像的 PHP 脚本,这是一个缓慢且昂贵的过程
  3. 您需要一个额外的 AJAX 触发器,该触发器将中止当前正在运行的脚本 (2)

我将采取的基本方法是使用脚本 (2) 在启动时创建的某种"锁定"或"触发器",并在步骤之间定期检查。触发器可以是文件,也可以是数据库中的一行等 - 关键是它需要位于多个PHP脚本可以同时访问的地方。

然后,(3)中的脚本可以是一个非常小的PHP脚本,它删除要中止的特定文件/数据库行/等。当 (2) 处的脚本下次检查时,它会发现它的锁/触发器不再存在,然后可以整理它创建和exit的任何工作数据。

确保在执行此操作时考虑安全性:JS必须知道触发器的名称,因此可以由用户操作。它应该是足够随机的,以至于某人不能恶意中止所有进程,并且其格式应该足够限制,以至于中止脚本不能被欺骗删除与其无关的文件。这实际上并不难 - 只需随机的数字和字母字符串即可 - 但是删除脚本需要确保这实际上是它收到的格式,因为它不能信任JS这样做。

对此的一种变体是有一个"心跳"系统,其中JS计时器定期使用时间戳更新锁定/触发器,以表示"是的,请继续处理此";如果(2)处的脚本发现时间戳太旧,它将中止。如果您想在用户感到无聊并离开页面时中止执行,则此方法是有利的,因为您无法可靠地将其捕获为事件并发送特定的"中止"请求(例如,考虑用户只是从互联网上拔下他们的笔记本电脑)。

除了"停止!"和"继续!"之外,你实际上可以使用这种方法与正在运行的PHP进程进行任何通信,只需将其写入文件或数据库即可。由于 PHP 中没有"事件"模型或任何类型的线程(无需涉及相当复杂的第三方扩展),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>

这只是一种可能性。