Cómo luché con el alojamiento gratuito y el compositor

Nadie negará que Composer es una herramienta bastante conveniente y que hay proveedores de alojamiento gratuitos o baratos que no proporcionan ninguna consola o herramienta integrada para trabajar con Composer. Este es exactamente el tipo de pila que encontré. Bueno, como el Jedi legó, el proveedor se agrega inmediatamente a .gitignore para no saturar su repositorio y no conducir bibliotecas de aquí para allá.

Lo primero que se me ocurrió fue hacer que un script fuera accesible desde la Web, que se pueda extraer en el momento adecuado y actualizará las dependencias o las instalará.

Para hacer esto, necesitamos realizar algunas manipulaciones.

1. Para instalar el compositor localmente, necesitamos descargar composer.phar .

2. Cree una carpeta donde se desempaquetará (deje que sea var ).

3. Crea composer.json (bueno, sobre este creo que ya sabes si trabajaste con compositor).

4. Bueno, cree el script para trabajar con el compositor desde la Web (déjelo ser composer.php ).

Entonces tenemos la estructura de nuestro sitio futuro:

estructura del sitio

Composer.phar en sí será el siguiente:

<?php use Composer\Console\Application; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\StreamOutput; // ,       ini_set("memory_limit", -1); ini_set("max_execution_time", 0); //  $root = __DIR__ . "/../"; //   $dir = "{$root}/var"; //  Phar    ,    if (file_exists("{$dir}/vendor/autoload.php") === false) { $composerPhar = new Phar("{$root}/composer.phar"); $composerPhar->extractTo($dir); } //      require_once("{$dir}/vendor/autoload.php" . ''); //         putenv("COMPOSER_HOME={$dir}/bin/composer"); //     vendor        WebRoot chdir($root); //   $input = new ArrayInput(['command' => 'install']); //    $stream = fopen('php://temp', 'w+'); $output = new StreamOutput($stream); // ""  $application = new Application(); $application->setAutoExit(false); $application->run($input, $output); //     echo stream_get_contents($stream); 


Y si eres un chico feliz. Después de llamar al script, expandirá la carpeta del proveedor .

Pero no resultó así) Lo primero que rompió mis planes fue configurar phar.readonly = On en php.ini , y como habrás adivinado en el hosting gratuito, generalmente no puedes editarlo. Entonces comencé a buscar soluciones.

Lo primero que probé fue crear user.ini, que anulará la configuración en php.ini , funcionó en la máquina local) Pero en el alojamiento, esta funcionalidad fue apuñalada.

Luego intenté usar un truco más. Cambie el nombre de composer.phar a solo compositor , el resultado es el mismo. Funcionó en LAN, pero no en hosting.

Luego, de todos modos, en lugar de un script, tuve que descomprimir los archivos localmente en var y subirlos al servidor.

También vale la pena cerrar el script con autorización, para que todo tipo de personas no lo llamen. También en la versión final del script, agregué la elección del comando a través de los parámetros.

 <?php use Composer\Console\Application; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\BufferedOutput; use Symfony\Component\Console\Output\OutputInterface; // ,       ini_set("memory_limit", -1); ini_set("max_execution_time", 0); //  Web     ,  -     if (isset($_SERVER['HTTP_AUTHORIZATION']) AND !empty($_SERVER['HTTP_AUTHORIZATION'])) { list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)), 2); } elseif (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION']) AND !empty($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) { list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', base64_decode(substr($_SERVER['REDIRECT_HTTP_AUTHORIZATION'], 6)), 2); } //  ,     -   $config = [ 'user' => 'admin', 'password' => 'admin', ]; //      if ((isset($_SERVER['PHP_AUTH_USER']) && $_SERVER['PHP_AUTH_USER'] == $config['user'] && isset($_SERVER['PHP_AUTH_PW']) && $_SERVER['PHP_AUTH_PW'] == $config['password'])) { unset($_SERVER['PHP_AUTH_USER']); unset($_SERVER['PHP_AUTH_PW']); } else { $uniqueID = uniqid(); header("WWW-Authenticate: Basic realm='{$uniqueID}'"); header('HTTP/1.0 401 Unauthorized'); exit(); } //  $root = realpath(__DIR__ . "/../"); //   $dir = "{$root}/var"; //  Phar    ,    if (file_exists("{$dir}/vendor/autoload.php") === false) { $composerPhar = new Phar("{$root}/composer.phar"); $composerPhar->extractTo($dir); } //      require_once("{$dir}/vendor/autoload.php" . ''); //         putenv("COMPOSER_HOME={$dir}/bin/composer"); //     vendor        WebRoot chdir($root); //   ,             ,      ) //  composer update,       ?command=install $params = !empty($_GET) ? $_GET : ['command' => 'update']; //  . $input = new ArrayInput($params); //    $output = new BufferedOutput( OutputInterface::VERBOSITY_NORMAL //true ); // ""  $application = new Application(); $application->setAutoExit(false); $application->run($input, $output); $content = $output->fetch(); echo "<pre>"; //     echo $content; echo "<br>"; echo (file_exists("{$root}/vendor/autoload.php")) ? 'Autoload <b>installed</b>' : 'Autoload <b>Missing</b>'; 

Además, no está de más agregar una regla a .htaccess para reenviar el encabezado de autorización (en el caso de CGI) y una redirección a HTTPS, ya que la autorización se deja en claro.

 RewriteEngine On #   CGI,    ,      RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] #  HTTPS,        RewriteCond %{HTTPS} off RewriteCond %{HTTP:SSL} !=1 [NC] RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L] 

Source: https://habr.com/ru/post/439424/


All Articles