use*_*863 6 php iis exec google-chrome-headless
我的环境是Windows Server 2016和IIS10。在我的PHP脚本中,我试图以无头模式运行Google Chrome,以获取外部网页的html代码:
<?php
$chromeApp = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe";
$command = "\"$chromeApp\" --headless --disable-gpu \
--dump-dom $urladdress > page.html";
exec ($command);
?>
Run Code Online (Sandbox Code Playgroud)
如果我运行该代码有效
>C:\php script.php
从命令行。如果我运行实际的命令,它也可以工作:
>"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" \
--headless --disable-gpu --dump-dom https://google.com > page.html
Run Code Online (Sandbox Code Playgroud)
但是,如果我从浏览器运行该脚本,它将创建一个空的page.html文件,并挂起直到超时。但是,如果我在执行IIS期间重新启动IIS,则会得到page.html文件,其中填充了所需的数据。
这可能是个问题吗?
这里有 4 个进程在起作用。
CMD.exe 正在获取 Chrome.exe 的输出并将其通过管道传输到您的文件。它会在 Chrome.exe 完成后执行此操作,或者可能间歇性地执行部分操作。当我运行与上面类似的代码时,我的 Chrome.exe 无法完成。我可以看到 Chrome.exe 仍在 TaskManager 中运行,消耗 25% CPU(在我的一个核心上为 100%)。
我猜测重新启动 IIS 会以某种方式强制刷新命令的进度。在我的大多数情况下,在执行 IISReset 之前,page.html 文件中存在数据,但并不是全部。(Windows 资源管理器显示 0KB,但打开文件仍显示文件中的数据)。
至于要尝试的事情,请尝试使用 --no-sandbox 作为参数,因为这可能会造成干扰,因为该进程是在非交互式会话下运行的。