不是必须,但默认同步阻塞;可通过proc_open配合重定向与detached标志实现可控异步调用,或用nohup+日志避免SIGHUP中断,强依赖结果时推荐消息队列方案。
PHP调用Python脚本必须等它结束吗?
不是必须,但默认是同步阻塞的。PHP用 exec、shell_exec 或 proc_open 调用Python时,如果不做处理,PHP会一直卡住直到Python进程退出——哪怕那个PY脚本要跑30秒。
异步的核心思路就一个:让PHP不等结果,把Python丢给系统后台跑。常见做法是加 &(Linux/macOS)或 start /B(Windows),但光加符号不够,还得解决输出、错误、进程残留问题。
用 proc_open 启动后台Python并立即返回
proc_open 是最可控的方式,能重定向stdin/stdout/stderr,还能拿到进程资源句柄。关键是设置好管道和分离标志:
- 用
['/dev/null', 'w']重定向stdout和stderr,避免管道阻塞 - 在命令末尾加
> /dev/null 2>&1 &(Linux)或用proc_open的bypass_shell+detached标志(PHP 7.4+) - 调用后立刻
proc_close($proc),不要proc_wait
示例(Linux):
立即学习“PHP免费学习笔记(深入)”;