Laravel Dusk и использование памяти - как закрыть браузер и пользовательский процесс - PullRequest
1 голос
/ 07 июня 2019

Я использую 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(); не закрывает браузер?

enter image description here

ОБНОВЛЕНИЕ Я пытался:

$browser->quit();

и

$browser->driver->quit();

но я получил ошибку:

Facebook \ WebDriver \ Exception \ WebDriverCurlException Выдана ошибка http для DELETE для / session / 8a4f02f2d13648ccfbdead97b338e4f4подключиться к локальному порту 9515: соединение отклонено

ОБНОВЛЕНИЕ 2.0 Это то, что я получаю при запуске

# ps -aux | less

enter image description here

Ответы [ 3 ]

3 голосов
/ 17 июня 2019

Вы должны попытаться unset() уничтожить $driver, а также $browser. Вы можете сделать это следующим образом:

уничтожить водителя

unset($driver);

уничтожить браузер

unset($browser);

Примечание: вы используете $driver для создания $brwoser. Так что оба должны быть уничтожены.

Отредактировано:

Если вы хотите быстрее освободить память, вы можете также установить значение объекта на null Как:

$browser = null; 
$driver = null;
1 голос
/ 07 июня 2019

У меня были похожие проблемы при использовании пакета, в который был включен Chrome В итоге я запустил это в командной строке:

pkill -f -- "chromium-browser"

Это убило все процессы, которые содержали chromium-browser в нем. Я уверен, что есть способ добавить это к коду для запуска после завершения.

0 голосов
/ 26 июня 2019
 killall -o 1m chrome

- правильный ответ ... Он удалит весь процесс chrome 'zombie' старше 1 минуты

...