Como lutei com hospedagem gratuita e compositor

Ninguém negará que o Composer é uma ferramenta bastante conveniente e que existem provedores de hospedagem gratuitos ou baratos que não fornecem nenhum console ou ferramenta interna para trabalhar com o Composer. Esse é exatamente o tipo de pilha que me deparei. Bem, como os Jedi legaram, o fornecedor é imediatamente adicionado ao .gitignore para não bagunçar seu repositório e não direcionar bibliotecas para lá e para cá.

A primeira coisa que veio à mente foi tornar um script acessível a partir da Web, que pode ser extraído no momento certo e atualizará as dependências ou as instalará.

Para fazer isso, precisamos realizar algumas manipulações.

1. Para instalar o compositor localmente, precisamos fazer o download do compositer.phar .

2. Crie uma pasta onde será descompactada (seja var ).

3. Crie composer.json (bem, acho que você já sabe se trabalhou com o compositor).

4. Bem, crie o próprio script para trabalhar com o compositor da Web (que seja compositer.php ).

Portanto, temos a estrutura do nosso futuro site:

estrutura do site

O próprio Composer.phar será o seguinte:

<?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); 


E se você é um cara feliz. Depois de chamar o script, ele expandirá a pasta do fornecedor .

Mas eu não fui assim) A primeira coisa que quebrou meus planos foi definir phar.readonly = On no php.ini e, como você deve ter adivinhado sobre hospedagem gratuita, geralmente não pode editá-lo. Então comecei a procurar soluções alternativas.

A primeira coisa que tentei foi criar o user.ini, que substituirá as configurações do php.ini , funcionou na máquina local) Mas, na hospedagem, essa funcionalidade foi esfaqueada.

Então eu tentei usar mais um truque. Renomeie composer.phar para apenas compositor , o resultado é o mesmo. Funcionou na LAN, mas não na hospedagem.

Mesmo assim, em vez de um script, tive que descompactar os arquivos localmente em var e enviá-los para o servidor.

Também vale a pena fechar o script com autorização, para que todo tipo de pessoa não o chame. Também na versão final do script, adicionei a escolha do comando através dos 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>'; 

Além disso, não é necessário adicionar uma regra ao .htaccess para encaminhar o cabeçalho da autorização (no caso de CGI) e um redirecionamento para HTTPS, já que a autorização é clara.

 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/pt439424/


All Articles