Выполнить php-скрипт в фоновом режиме из администратора Drupal

#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 Я обновил свой вопрос, указав, где именно я застрял, и весь код.