Bagaimana saya berjuang dengan hosting gratis dan Komposer

Tidak ada yang akan menyangkal bahwa Komposer adalah alat yang cukup nyaman, dan bahwa ada penyedia hosting gratis atau murah yang tidak menyediakan konsol atau alat bawaan untuk bekerja dengan Komposer. Ini persis seperti tumpukan yang saya temui. Nah, seperti yang diwariskan Jedi, vendor segera ditambahkan ke .gitignore agar tidak mengacaukan repositori mereka dan tidak mendorong perpustakaan ke sana kemari.

Hal pertama yang terlintas dalam pikiran adalah membuat skrip dapat diakses dari Web, yang dapat ditarik pada waktu yang tepat dan itu akan memperbarui dependensi atau menginstalnya.

Untuk melakukan ini, kita perlu melakukan beberapa manipulasi.

1. Untuk menginstal komposer secara lokal, kita perlu mengunduh composer.phar .

2. Buat folder tempat akan dibongkar (biarkan var ).

3. Buat composer.json (baik, yang ini saya pikir Anda sudah tahu jika Anda bekerja dengan komposer)

4. Nah, buat skrip itu sendiri untuk bekerja dengan komposer dari Web (biarkan itu menjadi composer.php ).

Jadi kami memiliki struktur situs masa depan kami:

struktur situs

Composer.phar sendiri adalah sebagai berikut:

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


Dan jika Anda pria yang bahagia. Setelah memanggil skrip, itu akan memperluas folder vendor .

Tapi saya tidak jadi seperti itu) Hal pertama yang merusak rencana saya adalah mengatur phar.readonly = Aktif di php.ini , dan seperti yang Anda duga tentang hosting gratis, Anda biasanya tidak dapat mengeditnya. Kemudian saya mulai mencari solusi.

Hal pertama yang saya coba adalah membuat user.ini yang akan menimpa pengaturan di php.ini , ini bekerja pada mesin lokal) Tetapi pada hosting fungsi ini ditusuk.

Lalu saya mencoba menggunakan satu trik lagi. Ganti nama composer.phar menjadi hanya composer , hasilnya sama saja. Ini bekerja pada LAN, tetapi tidak pada hosting.

Kemudian, semua sama, alih-alih skrip, saya harus membongkar file secara lokal ke var dan mengunggahnya ke server.

Sebaiknya tutup skrip dengan otorisasi, sehingga semua jenis orang tidak menyebutnya. Juga dalam versi terakhir dari skrip saya menambahkan pilihan perintah melalui parameter.

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

Juga, tidak ada ruginya menambahkan aturan ke .htaccess untuk meneruskan header otorisasi (dalam kasus CGI) dan pengalihan ke HTTPS, karena otorisasi tidak jelas.

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


All Articles