我如何在免费托管和Composer方面苦苦挣扎

没有人会否认Composer是一种相当便捷的工具,并且有免费或廉价的托管服务提供商,它们不提供任何控制台或内置工具来使用Composer。 这正是我遇到的那种堆栈。 好吧,正如绝地遗赠者一样, 供应 商会立即添加到.gitignore中,以免混乱他们的存储库,也不会来回移动库。

首先想到的是使脚本可以从Web上访问,可以在正确的时间将其拉出,它将更新依赖关系或安装依赖关系。

为此,我们需要进行一些操作。

1.要在本地安装composer,我们需要下载composer.phar

2.创建一个将在其中解压缩的文件夹(将其命名为var )。

3.创建composer.json (好吧,关于这一点,我想您已经知道是否使用过composer)。

4.好吧,创建脚本本身以与Web上的作曲家一起使用(将其命名composer.php )。

因此,我们有了未来站点的结构:

网站结构

Composer.phar本身将如下所示:

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


如果你是一个快乐的人。 调用脚本后,它将展开供应商文件夹。

但是我并没有这样想。)破坏我计划的第一件事是在php.ini中设置phar.readonly = On ,并且您可能已经猜到免费托管,您通常无法对其进行编辑。 然后,我开始寻找解决方法。

我尝试的第一件事是创建user.ini ,它将覆盖php.ini中的设置,它在本地计算机上工作),但是在托管时,此功能被刺死。

然后我尝试使用另一种技巧。 将composer.phar重命名为composer ,结果是相同的。 它可以在局域网上运行,但不能在主机上运行。

然后,都必须使用脚本而不是脚本,将文件本地解压缩到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/zh-CN439424/


All Articles