如何让PHP Cron任务在同一Chrome标签页后台运行?
看起来你是想用Windows任务计划(虽然你写的是Cron,但实际用的是schtasks)每分钟触发本地XAMPP的PHP脚本,但每次运行都会新开Chrome标签页对吧?咱们先搞清楚问题根源:每次调用chrome.exe http://localhost/bot/bot.php时,Chrome默认会启动新标签页(甚至新进程)来加载URL。要实现“在后台更新单个标签”的效果,我给你几个方案,按推荐程度排序:
方案1:直接用PHP CLI运行脚本(最推荐,无浏览器依赖)
其实你根本不需要通过Chrome来触发PHP脚本——XAMPP自带了PHP的命令行工具,直接运行脚本效率更高,还不会有任何窗口或标签页的问题。
修改你的.bat文件,把调用Chrome的部分换成直接调用PHP CLI:
set doc=C:\xampp\htdocs\bot cd "%doc%" copy /y nul "file.php" ECHO ^<?php echo 'This is executed via scheduler task!'; ?^> >file.php rem 替换原来的schtasks命令,直接执行PHP脚本 schtasks /create /tn "Cron" /tr "C:\xampp\php\php.exe C:\xampp\htdocs\bot\bot.php" /sc minute /mo 1
这样任务每次运行时,会直接通过PHP命令行执行你的脚本,完全在后台静默运行,既没有窗口弹出,也不会有重复标签的问题,是最省心的方案。
方案2:用PowerShell控制Chrome刷新已有标签(适合必须用浏览器的场景)
如果你的脚本必须依赖Chrome的浏览器环境(比如需要DOM渲染、JS执行等),可以用PowerShell脚本检测已打开的目标标签页,存在就刷新,不存在再打开新窗口:
- 新建一个PowerShell脚本文件(比如
RefreshChromeTab.ps1),内容如下:
# 定义要监控的目标URL $targetUrl = "http://localhost/bot/bot.php" # 查找Chrome进程中包含目标URL的窗口 $chromeWindow = Get-Process chrome | Where-Object { $_.MainWindowTitle -match [regex]::Escape($targetUrl) } if ($chromeWindow) { # 如果找到目标窗口,激活并发送F5刷新 $wshell = New-Object -ComObject WScript.Shell $wshell.AppActivate($chromeWindow.MainWindowTitle) Start-Sleep -Milliseconds 300 # 给窗口激活留一点时间 $wshell.SendKeys("{F5}") } else { # 如果没找到,打开新的Chrome窗口加载目标URL Start-Process "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" $targetUrl }
- 修改你的.bat文件中的
schtasks命令,改为调用这个PowerShell脚本:
set doc=C:\xampp\htdocs\bot cd "%doc%" copy /y nul "file.php" ECHO ^<?php echo 'This is executed via scheduler task!'; ?^> >file.php schtasks /create /tn "Cron" /tr "powershell.exe -ExecutionPolicy Bypass -File C:\路径\到\你的\RefreshChromeTab.ps1" /sc minute /mo 1
注意替换C:\路径\到\你的\RefreshChromeTab.ps1为你实际保存脚本的路径。
这个脚本会自动判断是否已经打开了目标URL的Chrome窗口,有就刷新,没有才新开,完美解决重复标签的问题。
方案3:调整Chrome全局设置(不推荐,影响日常使用)
你可以在Chrome的设置里开启“打开链接时始终在当前标签页打开”,但这会改变你平时使用Chrome的习惯,所有链接都会在当前标签打开,影响体验,所以不推荐这种方式。
总结一下,优先选方案1,直接用PHP CLI执行脚本,既高效又没有浏览器相关的麻烦;如果必须用浏览器,方案2的PowerShell脚本是靠谱的替代方案。
内容的提问来源于stack exchange,提问作者Trance84

