использование SncRedisBundle на platform.sh

Я пытаюсь разместить свое приложение на платформе platform.sh, моя проблема в том, что я использую SncRedisBundle со следующим конфигом:


#config.yml

imports:
- { resource: platformSh/parameters_platform.php } #platform.sh cloud provider configuration's

snc_redis:
clients:
doctrine:
type: predis
alias: doctrine
dsn: "%redis_url%&database=4"doctrine:
metadata_cache:
client: doctrine
entity_manager: default          # the name of your entity_manager connection
document_manager: default        # the name of your document_manager connection
result_cache:
client: doctrine
entity_manager: [default]  # you may specify multiple entity_managers
query_cache:
client: doctrine
entity_manager: default
second_level_cache:
client: doctrine
entity_manager: default

#platformSh/parameters_platform.php
$relationships = getenv("PLATFORM_RELATIONSHIPS");

var_dump('$relationships : ', $relationships, @$_ENV['PLATFORM_RELATIONSHIPS']);

if (!$relationships) {
return;
}

$relationships = json_decode(base64_decode($relationships), true);

foreach ($relationships['database'] as $endpoint) {
if (empty($endpoint['query']['is_master'])) {
continue;
}

$container->setParameter('database_driver', 'pdo_' . $endpoint['scheme']);
$container->setParameter('database_host', $endpoint['host']);
$container->setParameter('database_port', $endpoint['port']);
$container->setParameter('database_name', $endpoint['path']);
$container->setParameter('database_user', $endpoint['username']);
$container->setParameter('database_password', $endpoint['password']);
$container->setParameter('database_path', '');
}

if (!empty($relationships['redis'])) {
$redisConstructedDsn = 'redis://'.$relationships['redis'][0]['host'].$relationships['redis'][0]['port'].'?password=';
$container->setParameter('redis_url', $redisConstructedDsn);

var_dump('$redisConstructedDsn : ', $redisConstructedDsn);
} else {
var_dump('$relationships :', $relationships);
}# Store session into /tmp.
ini_set('session.save_path', '/tmp/sessions');

Когда я нажимаю на platform.sh, их процесс сборки включает в себя вызов обновления композитора, который заканчивается следующим образом:

Генерация оптимизированных файлов автозагрузки

Incenteev \ ParameterHandler \ ScriptHandler :: buildParameters
Sensio \ Bundle \ DistributionBundle \ композитор \ ScriptHandler :: buildBootstrap
Sensio \ Bundle \ DistributionBundle \ композитор \ ScriptHandler :: ClearCache
Скрипт Sensio \ Bundle \ DistributionBundle \ Composer \ ScriptHandler :: clearCache
обработка события symfony-scripts прекращается с исключением

[RuntimeException] Произошла ошибка при выполнении команды «cache: clear —no-warmup»:
string (17) «$ Relations:»
BOOL (ложь)
НОЛЬ

[Predis \ Подключение \ ConnectionException] php_network_getaddresses: getaddrinfo не удалось: имя или служба неизвестна [tcp: // localhost&базы данных = 4: 6379]

        .

Я связался с их командой поддержки, которая сказала мне это:

Привет,

Могу ли я узнать, пытаетесь ли вы получить PLATFORM_RELATIONSHIPS во время
фаза сборки?

Это недоступно, поскольку сборка не зависит от среды.

Если вам нужно подключить БД / Redis / другие сервисы, пожалуйста, сделайте это в
фаза развертывания (т. е. Deploy Hook).


редактировать: поддержка ответила мне, что проблема лежит в этом разделе composer.json:

"scripts": {
"symfony-scripts": [
"Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::prepareDeploymentTarget"],
"post-install-cmd": [
"@symfony-scripts"],
"post-update-cmd": [
"@symfony-scripts"],
"compile": [
"app/console assetic:dump"]
},

например, "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache" но также "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets" вынуждают Symfony очистить кеш, который выполняется слишком рано (на этапе сборки, где platform.sh не предоставляет env., необходимый для работы redis и mysql для работы …)


Я не знаю, как это исправить, platform.sh хочет, чтобы я изменил файл composer.json, но я нахожу его странным & опасно. Как бы вы сделали?

0

Решение

в вашем platform.app.yaml установите

flavor: 'none'

и просто создайте файл parameters.dist.yml с поддельными значениями (добавьте redis_url: xxx в этот файл). Эти поддельные значения будут переопределены в вашем параметре_platform.php

Вот код хука моего platform.app.yaml:

hooks:
# Build script; can modify the filesystem, but cannot access services
build: |
set -x -e

# remove the development front-controller if present
(>&2 rm web/app_dev.php || true)

SYMFONY_ENV=prod composer install --prefer-dist --optimize-autoloader --classmap-authoritative --no-progress --no-ansi --no-interaction --no-dev
(>&2 SYMFONY_ENV=prod app/console cache:clear --no-warmup)
(>&2 SYMFONY_ENV=prod app/console cache:warmup)
# Keep the cache in a persistant directory
# If your cache can be readonly, you can skip this step
(>&2 mkdir -p tmp/cache && mv app/cache/prod tmp/cache/ && mv app/bootstrap.php.cache tmp/bootstrap.php.cache)
yarn
gulp

# Deploy script, can access services, but the filesystem is read-only
deploy: |
set -x -e

# "install" cache
# If your cache can be readonly, you can skip these steps
rm -rf app/cache/prod
(>&2 SYMFONY_ENV=prod app/console --env=prod cache:clear)
(>&2 SYMFONY_ENV=prod app/console --env=prod doctrine:schema:update --dump-sql --force)
cp -Rp tmp/bootstrap.php.cache app/bootstrap.php.cache
cp -Rp tmp/cache/prod app/cache/

Platform.php нашего проекта:

if (empty($relationships['redis'])) {
return;
}

$redis = array_shift($relationships['redis']);

$container->setParameter('redis_host', $redis['host']);
$container->setParameter('redis_port', $redis['port']);
2

Другие решения

Других решений пока нет …