Symfony / разрешение процесса отказано

Я использую Symfony / Process для запуска теста из Laravel Dusk по маршруту web.php в Laravel. Это код, который я использую:

Route::get('/scraping', function () {

    $process = new Process('cd pathtoartisan && C:\xampp\php\php.exe artisan dusk -v');
    $process->setPTY(true);
    $process->run();

    if (!$process->isSuccessful()) {
        throw new ProcessFailedException($process);
    }

    echo '<pre>'.$process->getOutput();
});

Думаю, все будет нормально, но у меня такая ошибка:

Symfony \ Component \ Process \ Exception \ RuntimeException: не удалось открыть временный файл для записи вывода процесса: fopen (C: \ WINDOWS \ sf_proc_00.out.lock): не удалось открыть поток: в разрешении отказано

в C: ... \ laravel-master \ vendor \ symfony \ process \ Pipes \ WindowsPipes.php: 60

> $file = sprintf('%s\\sf_proc_%02X.%s',$tmpDir, $i, $name);
>        if (!$h = fopen($file.'.lock', 'w')) {
>           restore_error_handler();
>           throw new RuntimeException(sprintf('A temporary file could not be opened to write the process output: %s', $lastError)); }

Я прочитал в документации Symfony, что следующая команда должна мне помочь:

chmod -R 777 var / log /

Но я использую Windows, и я не знаю, как это получить, также я не знаю, правильная ли эта команда, или я должен дать разрешение на другой файл.


person Mmelo    schedule 02.09.2019    source источник
comment
По какой-то причине sys_get_temp_dir на вашем компьютере возвращает конструктор C:\WINDOWS`. Check your OS settings an ensure it's set to something writeable. Also check the second argument of the Process`: вам нужно использовать его вместо cd.   -  person zerkms    schedule 03.09.2019
comment
Невозможно воспроизвести на Linux, должно быть проблема с ОС   -  person Salim Djerbouh    schedule 03.09.2019


Ответы (1)


Основываясь на предложении @zerkms, попробуйте изменить временный каталог на хранилище Laravel, которое по умолчанию доступно для записи.

Route::get('/scraping', function () {
    putenv('TMPDIR=' . storage_path()); // <- override the temp dir
    $process = new Process('cd pathtoartisan && C:\xampp\php\php.exe artisan dusk -v');
    $process->setPTY(true);
    $process->run();

    if (!$process->isSuccessful()) {
        throw new ProcessFailedException($process);
    }

    echo '<pre>'.$process->getOutput();
});
person Salim Djerbouh    schedule 02.09.2019