2016-02-10 5 views
2

В Laravel когда-нибудь я изменил значения среды с помощью sed с:Как выполнить что-то вроде sed -i '/^MAIL_DRIVER=/s/=.*/=log/' .env с помощью PHP для обновления значения переменной в файле laravel dotenv

sed -i '/^MAIL_DRIVER=/s/=.*/=log/' .env 

Можно ли предложить и альтернативу сделать это с помощью PHP?

UPDATE: Я использовал файл Laravel/dotenv .env в качестве примера, чтобы дать некоторый контекст вопросу, но меня не интересует, как изменить переменные окружения программным образом. Мой интерес заключается в том, как выполнять sed «как» операции с php функция манипулирования файлами или если существует некоторая библиотека для этого. Я также знаю, что могу использовать систему o passthru, это то, что я уже делаю. Я просто любопытно о том, как манипулировать файлами таким образом, используя PHP.

+0

Просьба уточнить, - вы хотите обновить файл на постоянной основе, или просто изменить настройки? –

+0

Постоянно изменяйте файл. Я использовал Laravel/dotenv .env файл в качестве примера, но меня интересует общее решение о том, как выполнить с PHP ту же операцию, что и с sed в Linux. –

+0

Хорошо, в этом случае вам нужно решение @ Богдана –

ответ

0

Вам не нужен системный вызов для достижения этого. Вы должны использовать putenv()

putenv('MAIL_DRIVER=/log');

+0

OP хочет обновить содержимое файла .env (команда 'sed' изменит содержимое файла), и ваше решение только временно обновит значение в памяти. Как указано в документации 'putenv': **« Переменная среды будет существовать только на время текущего запроса. В конце запроса среда восстанавливается в исходное состояние ». **. – Bogdan

0

Хотя Laravel использует dotenv библиотеку для чтения, он не дает никакой возможности программно обновить файл .env. Однако вы можете обновить значение конфигурации, используя preg_replace. Вот одна линия решение:

file_put_contents(base_path('.env'), preg_replace("/(MAIL_DRIVER)=(.*)/", "$1=log", file_get_contents(base_path('.env')))); 

Вот и решение расширить на несколько строк и объяснил:

// Read the .env file contents 
$env = file_get_contents(base_path('.env')); 

// Replace the value using regex matching 
$env = preg_replace("/(MAIL_DRIVER)=(.*)/", "$1=log", $env); 

// Write the updated contents to the file 
file_put_contents(base_path('.env'), $env); 
+0

Это просто * неправильно * - функции getenv() и putenv() используются для этой точной цели. –

+0

@KaloyanDoichinov Пожалуйста, просмотрите мой комментарий к вашему ответу для уточнения. – Bogdan

+0

Я понимаю, но OP говорит: «Я обновляю ценности среды», моя презумпция состояла в том, что они не знали о другом способе их изменения. Возможно, я ошибаюсь, это стоит уточнить. –