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

PHP调用Python脚本run.py时被执行两次的问题及解决方法

解决PHP调用Python脚本被执行两次的问题

这种情况我之前也碰到过,结合你描述的「PHP里的echo只输出一次1,但Python脚本跑了两次、浏览器显示两次"ok"」的现象,咱们一步步排查:

1. 先确认PHP代码有没有重复调用

先打开你的PHP脚本仔细看一遍,是不是不小心写了两次调用run.py的代码?比如:

echo 1;
exec('python run.py');
exec('python run.py'); // 这里重复了!

如果是这种情况,删掉多余的那行调用就搞定了。

2. 检查Python脚本本身的逻辑

有时候问题不在PHP,而是run.py自己的代码导致输出两次"ok"。打开run.py看看:

  • 是不是写了两次print("ok")?
  • 有没有循环或者条件分支会重复执行输出语句?
    比如这种情况:
print("ok")
# 后面又不小心写了一次
print("ok")

修改Python脚本,确保只输出一次即可。

3. 排查是否有重复的HTTP请求触发PHP

虽然你说echo只输出一次1,但还是建议看看服务器的访问日志(比如Apache的access.log或者Nginx的access.log),确认是不是有两次请求打到了你的PHP脚本上:

  • 如果日志里有两次请求,大概率是浏览器自动请求favicon.ico导致的:很多浏览器访问页面时会默认请求网站图标,如果你的服务器配置把不存在的路径都指向了这个PHP脚本(比如单页应用的重定向规则),就会触发第二次执行。解决方法是在PHP脚本开头加个过滤:
    // 拦截favicon请求
    if ($_SERVER['REQUEST_URI'] === '/favicon.ico') {
        exit;
    }
    echo 1;
    // 调用Python的代码
    
  • 也可以试试用浏览器的隐私模式打开页面,排除插件、预加载等因素导致的重复请求。

4. 用日志精准定位问题

如果上面的方法都没找到原因,那就加日志来排查:

  • 在PHP脚本开头加日志,记录执行时间:
    file_put_contents('php_exec.log', date('Y-m-d H:i:s') . ' PHP脚本执行了一次' . PHP_EOL, FILE_APPEND);
    echo 1;
    exec('python run.py');
    
  • 在run.py里也加日志:
    import datetime
    with open('python_exec.log', 'a') as f:
        f.write(f"{datetime.datetime.now()} Python脚本执行了一次\n")
    print("ok")
    

运行后查看两个日志文件:

  • 如果php_exec.log只有1条,python_exec.log有2条:说明PHP确实只跑了一次,但被调用了两次Python——这时候要检查PHP代码里是不是引入了其他文件,而那个文件里也调用了run.py;
  • 如果php_exec.log有2条:那就是PHP被执行了两次,回到第三步排查请求来源。

5. 检查PHP调用Python的方式

如果你用了proc_open()这种复杂的进程调用方法,可能因为错误的处理逻辑导致重复执行。可以先换成简单的shell_exec()测试:

echo 1;
$output = shell_exec('python /绝对路径/run.py'); // 建议用绝对路径避免问题
echo $output;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:15:04