Laravel Dusk和内存使用-如何关闭浏览器和自定义进程
Laravel Dusk and memory usage - how to close the browser and custom process
我在控制器中使用 Laravel Dusk 供用户使用我的网站获取任何网站的屏幕截图。
我的代码:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Laravel\Dusk\ElementResolver;
use Exception;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Laravel\Dusk\Browser;
use Laravel\Dusk\Chrome\ChromeProcess;
use Facebook\WebDriver\WebDriverBy;
use Mail;
class ScreenController extends Controller {
public function take_screenshoot() {
$process = (new ChromeProcess)->toProcess();
if ($process->isStarted()) {
$process->stop();
}
$process->start();
$options = (new ChromeOptions)->addArguments([
'--disable-gpu',
'--headless',
'--window-size=1920,1080',
'--no-sandbox'
]);
$capabilities = DesiredCapabilities::chrome()->setCapability(ChromeOptions::CAPABILITY, $options);
$driver = retry(5, function () use ($capabilities) {
return RemoteWebDriver::create('http://localhost:9515', $capabilities, 50000, 60000);
}, 50);
$browser = new Browser($driver, new ElementResolver($driver, ''));
$browser->resize(1920, 1080);
$browser->visit('http://www.example.com')->mouseover('iframe');
$screenshoot_name = md5(time());
$browser->driver->takeScreenshot(base_path('tests/Browser/screenshots/'.$screenshoot_name.'.png'));
echo "<img src='/tests/Browser/screenshots/".$screenshoot_name.".png></img>";
$process->stop();
}
这里的一切都按预期运行良好,只是每个用户请求(用户访问)的内存使用量越来越高...如何解决该问题?为什么$process->stop();
不关闭浏览器?
更新
我试过了:
$browser->quit();
和
$browser->driver->quit();
但我收到错误:
Facebook \ WebDriver \ Exception \ WebDriverCurlException Curl error
thrown for http DELETE to /session/8a4f02f2d13648ccfbdead97b338e4f4
Failed to connect to localhost port 9515: Connection refused
更新 2.0
这是我 运行
时得到的
# ps -aux | less
我在使用包装 chrome 的包时遇到了类似的问题。我最后做的是 运行 在命令行上这样做:
pkill -f -- "chromium-browser"
这杀死了其中包含 chromium-browser
的所有进程。我确定有一种方法可以将其添加到代码中,以便在完成后触发。
killall -o 1m chrome
是正确答案...它将删除所有 chrome 'zombie' 早于 1 分钟的进程
我遇到了完全相同的问题并最终解决了它添加:
$browser->quit();
$process->stop();
请注意顺序很重要。如果我换行,我会得到与您提到的相同的错误:
Facebook \ WebDriver \ Exception \ WebDriverCurlException Curl error thrown for http DELETE to /session/8a4f02f2d13648ccfbdead97b338e4f4 Failed to connect to localhost port 9515: Connection refused
我在控制器中使用 Laravel Dusk 供用户使用我的网站获取任何网站的屏幕截图。
我的代码:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Laravel\Dusk\ElementResolver;
use Exception;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Laravel\Dusk\Browser;
use Laravel\Dusk\Chrome\ChromeProcess;
use Facebook\WebDriver\WebDriverBy;
use Mail;
class ScreenController extends Controller {
public function take_screenshoot() {
$process = (new ChromeProcess)->toProcess();
if ($process->isStarted()) {
$process->stop();
}
$process->start();
$options = (new ChromeOptions)->addArguments([
'--disable-gpu',
'--headless',
'--window-size=1920,1080',
'--no-sandbox'
]);
$capabilities = DesiredCapabilities::chrome()->setCapability(ChromeOptions::CAPABILITY, $options);
$driver = retry(5, function () use ($capabilities) {
return RemoteWebDriver::create('http://localhost:9515', $capabilities, 50000, 60000);
}, 50);
$browser = new Browser($driver, new ElementResolver($driver, ''));
$browser->resize(1920, 1080);
$browser->visit('http://www.example.com')->mouseover('iframe');
$screenshoot_name = md5(time());
$browser->driver->takeScreenshot(base_path('tests/Browser/screenshots/'.$screenshoot_name.'.png'));
echo "<img src='/tests/Browser/screenshots/".$screenshoot_name.".png></img>";
$process->stop();
}
这里的一切都按预期运行良好,只是每个用户请求(用户访问)的内存使用量越来越高...如何解决该问题?为什么$process->stop();
不关闭浏览器?
更新 我试过了:
$browser->quit();
和
$browser->driver->quit();
但我收到错误:
Facebook \ WebDriver \ Exception \ WebDriverCurlException Curl error thrown for http DELETE to /session/8a4f02f2d13648ccfbdead97b338e4f4 Failed to connect to localhost port 9515: Connection refused
更新 2.0 这是我 运行
时得到的# ps -aux | less
我在使用包装 chrome 的包时遇到了类似的问题。我最后做的是 运行 在命令行上这样做:
pkill -f -- "chromium-browser"
这杀死了其中包含 chromium-browser
的所有进程。我确定有一种方法可以将其添加到代码中,以便在完成后触发。
killall -o 1m chrome
是正确答案...它将删除所有 chrome 'zombie' 早于 1 分钟的进程
我遇到了完全相同的问题并最终解决了它添加:
$browser->quit();
$process->stop();
请注意顺序很重要。如果我换行,我会得到与您提到的相同的错误:
Facebook \ WebDriver \ Exception \ WebDriverCurlException Curl error thrown for http DELETE to /session/8a4f02f2d13648ccfbdead97b338e4f4 Failed to connect to localhost port 9515: Connection refused