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
相关产品推荐
相关产品推荐

