Wie ich mit kostenlosem Hosting und Composer zu kämpfen hatte

Niemand wird leugnen, dass Composer ein recht praktisches Tool ist und dass es kostenlose oder billige Hosting-Anbieter gibt, die keine Konsole oder kein integriertes Tool für die Arbeit mit Composer bereitstellen. Dies ist genau die Art von Stapel, auf die ich gestoßen bin. Nun, wie die Jedi hinterlassen haben, wird der Anbieter sofort zu .gitignore hinzugefügt, um das Repository nicht zu überladen und die Bibliotheken nicht hin und her zu fahren.

Das erste, was mir in den Sinn kam, war, ein Skript über das Web zugänglich zu machen, das zum richtigen Zeitpunkt abgerufen werden kann und die Abhängigkeiten aktualisiert oder installiert.

Dazu müssen wir einige Manipulationen durchführen.

1. Um den Composer lokal zu installieren, müssen Sie composer.phar herunterladen .

2. Erstellen Sie einen Ordner, in den es entpackt wird (lassen Sie es var sein ).

3. Erstellen Sie composer.json (nun, ich denke, Sie wissen bereits, ob Sie mit Composer gearbeitet haben).

4. Erstellen Sie das Skript selbst, um mit dem Komponisten aus dem Web zu arbeiten (lassen Sie composer.php sein).

Wir haben also die Struktur unserer zukünftigen Site:

Standortstruktur

Composer.phar selbst lautet wie folgt:

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


Und wenn Sie ein glücklicher Kerl sind. Nach dem Aufrufen des Skripts wird der Herstellerordner erweitert.

Aber ich bin nicht so gekommen.) Das erste, was meine Pläne gebrochen hat, war, phar.readonly = On in php.ini zu setzen . Wie Sie vielleicht beim kostenlosen Hosting vermutet haben, können Sie es normalerweise nicht bearbeiten. Dann suchte ich nach Problemumgehungen.

Das erste, was ich versuchte, war, user.ini zu erstellen, die die Einstellungen in php.ini überschreibt . Es funktionierte auf dem lokalen Computer. Aber auf dem Hosting wurde diese Funktionalität erstochen.

Dann habe ich noch einen Trick versucht. Benennen Sie composer.phar in nur composer um . Das Ergebnis ist dasselbe. Es funktionierte im LAN, aber nicht beim Hosting.

Trotzdem musste ich die Dateien anstelle eines Skripts lokal in var entpacken und auf den Server hochladen.

Es lohnt sich auch, das Skript mit einer Autorisierung zu schließen, damit es nicht von allen möglichen Personen aufgerufen wird. Auch in der endgültigen Version des Skripts habe ich die Auswahl des Befehls über die Parameter hinzugefügt.

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

Es schadet auch nicht, .htaccess eine Regel für die Weiterleitung des Autorisierungsheaders (im Fall von CGI) und eine Weiterleitung an HTTPS hinzuzufügen, da die Autorisierung frei bleibt.

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


All Articles