You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在关闭PHP/HTML页面时终止PHP调用的Python脚本

解决PHP页面关闭后Python脚本持续运行的问题

这个问题我之前也碰到过——本质是Python脚本作为PHP的子进程,当你关闭浏览器页面时,PHP请求可能没立刻终止,就算PHP进程结束了,Python子进程也会变成孤儿进程被系统接管,继续后台运行生成图片。下面给你几个实用的解决思路:

方法1:PHP监听客户端连接,断开时杀死Python进程

这个方法的核心是让PHP检测浏览器是否断开连接,一旦检测到就主动终止Python进程。

修改你的PHP代码:

// 告诉PHP:客户端断开连接时立刻终止当前脚本
ignore_user_abort(false);

// 启动Python脚本并获取它的进程ID(PID)
$pythonCmd = "python object_detection_tutorial_cmsc265.py";
$pid = shell_exec("$pythonCmd > /dev/null 2>&1 & echo $!");

// 循环检查客户端连接状态
while (connection_status() === CONNECTION_NORMAL) {
    // 加1秒延迟,避免占用过多服务器资源
    sleep(1);
}

// 客户端已断开,杀死Python进程
exec("kill $pid");

说明:> /dev/null 2>&1是把Python的输出重定向到空设备,避免阻塞PHP;& echo $!是让shell返回Python进程的PID。

方法2:让Python脚本主动监控父进程(PHP进程)

如果不想改太多PHP代码,可以在Python脚本里加一段逻辑,定期检查父进程(也就是启动它的PHP进程)是否还活着,一旦父进程消失就自己终止。

首先需要安装psutil库(用来检测进程状态):

pip install psutil

然后修改Python脚本:

import os
import time
import psutil
import cv2

# 获取启动当前Python脚本的父进程ID(PHP进程的PID)
parent_pid = os.getppid()
loop = 0

while True:
    # 检查父进程是否存在
    try:
        # 尝试获取父进程信息,不存在会抛出异常
        psutil.Process(parent_pid)
    except psutil.NoSuchProcess:
        # 父进程已死,直接退出循环
        print("父进程已终止,停止生成图片")
        break
    
    # 你的原有图片生成逻辑
    cv2.imwrite(f'image{loop}.png', image)
    loop += 1
    
    # 原有终止条件
    if not condition:
        break
    
    # 加小延迟,降低资源消耗
    time.sleep(0.1)

方法3:使用PHP的pcntl扩展创建受控子进程

如果你的服务器PHP环境启用了pcntl扩展(一般CLI模式默认启用,Web模式可能需要手动开启),可以用更底层的进程控制方式:

ignore_user_abort(false);

// 创建子进程
$pid = pcntl_fork();
if ($pid == -1) {
    die("无法创建子进程,请检查pcntl扩展是否启用");
} elseif ($pid == 0) {
    // 子进程:执行Python脚本
    exec("python object_detection_tutorial_cmsc265.py");
    exit();
} else {
    // 父进程:监听客户端连接
    while (connection_status() === CONNECTION_NORMAL) {
        sleep(1);
    }
    // 断开连接后,向子进程发送终止信号
    pcntl_kill($pid, SIGTERM);
}

注意事项

  • 如果用kill命令无法终止Python进程,可以尝试kill -9 $pid强制终止,但可能会导致正在生成的图片损坏。
  • 有些主机商会禁用exec、shell_exec等函数,需要检查PHP配置中的disable_functions项。
  • 如果你之前是把Python脚本用&放到后台运行,一定要确保能正确获取到PID,否则无法精准终止进程。

内容的提问来源于stack exchange,提问作者alyssaeliyah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:51:57