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

浏览器标签意外关闭后,popen启动的外部脚本能否执行完成?

浏览器关闭后,popen启动的外部进程会停止吗?

默认情况下会停止。当浏览器意外关闭导致HTTP连接中断后,你的PHP脚本会随之终止执行,而通过popen()启动的/home/username/bin/something作为PHP进程的子进程,通常会被系统一同回收,无法完成后续执行。

如果你需要外部脚本在浏览器关闭后仍能执行完成,可以尝试以下几种方案:

  • 让PHP脚本忽略连接中断
    在PHP脚本开头添加以下代码,确保客户端断开后脚本继续运行:

    ignore_user_abort(true);
    set_time_limit(0); // 取消脚本执行时长限制,需确保服务器配置允许
    

    这种方法下,PHP脚本会继续执行直到完成,外部进程也会随之运行结束,但要注意如果外部脚本运行时间过长,需要确认服务器的max_execution_time相关配置没有强制限制。

  • 将外部进程转为后台运行
    修改popen()的命令,让外部脚本脱离PHP进程的控制,在系统后台执行:

    $f = popen("/home/username/bin/something --json arg1 arg2 > /dev/null 2>&1 &", "rb");
    

    其中:

    • > /dev/null:将标准输出重定向到空设备,避免占用PHP进程的输出流
    • 2>&1:将标准错误输出重定向到和标准输出相同的位置
    • &:让进程在后台运行
      这种方式下,PHP进程即使终止,外部脚本也会独立在系统后台完成执行,但你将无法再通过fgets()读取它的输出内容,适合不需要实时处理输出的场景。
  • 使用nohup保障进程稳定运行
    配合nohup命令让外部进程忽略挂起信号,进一步提升稳定性:

    $f = popen("nohup /home/username/bin/something --json arg1 arg2 > /dev/null 2>&1 &", "rb");
    

    nohup会让进程不受终端会话关闭的影响,即使PHP进程终止,外部脚本也能持续运行直到完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:45:44