#php #drupal-8
#php #drupal-8
Вопрос:
На моем сайте Drupal у меня есть несколько сценариев, которые я в настоящее время выполняю вручную с помощью drush script …. К сожалению, в том виде, в каком он настроен сейчас, мне приходится подключаться по ssh к моим промежуточным / производственным средам и запускать их.
Я хотел бы создать интерфейс на портале администратора, который позволяет администраторам запускать эти скрипты, только я бы хотел, чтобы они выполнялись в фоновом режиме. Я бы предпочел не преобразовывать их в задания cron, потому что 1) некоторые скрипты занимают часы и 2) их не нужно запускать на регулярной основе.
Я бы просто хотел, чтобы администраторы могли запускать скрипты в фоновом режиме одним нажатием кнопки. Если скрипт запущен, он должен отключить кнопку интерфейса при загрузке страницы.
Может ли кто-нибудь указать мне, как я мог бы этого добиться?
До сих пор я создавал эти маршруты:
my_module.scripts.home:
path: "/admin/config/development/my_module/scripts"
defaults:
_title: "Scripts"
_controller: 'Drupalmy_moduleControllerScriptsController::home'
requirements:
_permission: "administer site configuration"
my_module.scripts.run:
path: "/admin/config/development/my_module/scripts/run/{script}"
defaults:
_title: "Run Script"
'Drupalytp_integrationsControllerScriptsController::runScript'
name: "none"
requirements:
_permission: "administer site configuration"
И тогда мой контроллер скриптов выглядит так:
<?php
namespace Drupalmy_moduleController;
use DrupalCoreControllerControllerBase;
use SymfonyComponentHttpFoundationRedirectResponse;
use SymfonyComponentYamlYaml;
use DrupalCoreUrl;
/**
* Defines Configurations Controller class.
*
* This class controller i
*/
class ScriptsController extends ControllerBase {
/**
* Home
*/
function home() {
$build['table'] = [
'#type' => 'table',
'#header' => [
'Title',
'Description',
'Path',
'Status',
],
];
// Retrieve all scripts
$scripts_config_file = file_get_contents(drupal_get_path('module', 'my_module') . '/my_module.scripts.yml');
$script_config = Yaml::parse($scripts_config_file);
// Create Table Rows and add to table
$rows = [];
foreach($script_config as $key => $script) {
$rows[] = [
'title' => $script['title'],
'description' => $script['description'],
'path' => $script['path'],
'operations' => [
'data' => [
'#type' => 'link',
'#title' => 'Run',
'#url' => Url::fromRoute('my_module.scripts.run', ['script' => $key])
],
],
];
}
$build['table']['#rows'] = $rows;
return [
'#type' => '#markup',
'#markup' => render($build),
];
}
/**
* Run Script
*
*
*/
function runScript($script) {
// Retrieve the script
$module_path = drupal_get_path('module', 'my_module');
$script_config = Yaml::parse(file_get_contents("$module_path/my_module.scripts.yml"));
$script_data = $script_config[$script];
$script_path = $module_path . '/' . $script_data['path'];
$execute = exec("drush scr $script_path > /dev/null amp;");
Drupal::logger('ytp')->notice('<pre><code>' . print_r($execute, TRUE) . '</code></pre>');
return new RedirectResponse(Url::fromRoute('ytp_integrations.scripts.home')->toString());
}
}
Структурно это, кажется, все работает, но когда я распечатываю execute
переменную после запуска команды drush через exec
, я ничего не получаю, и код в моем скрипте не выполняется.
Я изменил команду на pwd
, и она распечатала путь, как и ожидалось, но exec
, похоже, не знает, что такое drush…
Комментарии:
1. Что вы уже пробовали? Где вы застряли?
2. @NicoHaase Я обновил свой вопрос, указав, где именно я застрял, и весь код.