كيف ناضلت مع استضافة مجانية وملحن

لن ينكر أحد أن Composer أداة ملائمة إلى حد ما ، وأن هناك مزودي خدمة استضافة مجانية أو رخيصة لا توفر أي وحدة تحكم أو أداة مضمنة للعمل مع Composer. هذا هو بالضبط نوع المكدس الذي صادفته. حسنًا ، كما تم توريث Jedi ، تتم إضافة البائع على الفور إلى .gitignore حتى لا يتكدس في مخزونه ولا يدفع المكتبات إلى جيئة وذهابا.

أول ما تبادر إلى الذهن هو جعل البرنامج النصي يمكن الوصول إليه من الويب ، والذي يمكن سحبه في الوقت المناسب وسيعمل على تحديث التبعيات أو تثبيتها.

للقيام بذلك ، نحن بحاجة إلى القيام ببعض التلاعب.

1. لتثبيت الملحن محليًا ، نحتاج إلى تنزيل composer.phar .

2. إنشاء مجلد حيث سيتم تفكيكه (فليكن var ).

3. إنشاء composer.json (حسنا ، حول هذا واحد وأعتقد أنك تعرف بالفعل إذا كنت تعمل مع الملحن).

4. حسنًا ، قم بإنشاء البرنامج النصي نفسه للعمل مع الملحن من الويب (فليكن composer.php ).

لذلك لدينا هيكل موقعنا في المستقبل:

هيكل الموقع

الملحن. فار نفسه سيكون على النحو التالي:

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


وإذا كنت رجل سعيد. بعد استدعاء البرنامج النصي ، سيتم توسيع مجلد البائع .

لكنني لم أتحول بهذه الطريقة) أول شيء تخلّى عن خططي هو وضع phar.readonly = في php.ini ، وكما قد تفكر في استضافة مجانية ، لا يمكنك تعديلها عادةً. ثم بدأت أبحث عن الحلول.

أول شيء جربته هو إنشاء user.ini والذي سيؤدي إلى تخطي الإعدادات في php.ini ، وقد عمل على الجهاز المحلي) ولكن في الاستضافة تم طعن هذه الوظيفة.

ثم حاولت استخدام خدعة أخرى. إعادة تسمية composer.phar إلى الملحن فقط ، والنتيجة هي نفسها. عملت على الشبكة المحلية ، ولكن ليس على الاستضافة.

بعد ذلك ، ومع ذلك ، بدلاً من البرنامج النصي ، اضطررت إلى فك حزم الملفات محليًا إلى var وتحميلها على الخادم.

يجدر أيضًا إغلاق البرنامج النصي بترخيص ، حتى لا يطلق عليه جميع أنواع الأشخاص. أيضا في الإصدار الأخير من البرنامج النصي ، أضفت اختيار الأمر من خلال المعلمات.

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

وأيضًا ، لا يضر بإضافة قاعدة إلى .htaccess لإعادة توجيه رأس التفويض (في حالة CGI) وإعادة التوجيه إلى HTTPS ، نظرًا لأن التفويض يترك بشكل واضح.

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


All Articles