高速!通过命令行创建静态Heroku网站(需要具备Git技能)
此文假设可以使用类Unix的命令行。
gitのインストール
你可以先用下面的命令来确认一下,因为它们通常是默认安装的。
$ git --version
创建Heroku账户
Heroku客户端安装
在使用Heroku进行推送时需要创建SSH密钥。
将SSH密钥注册到Heroku。
在命令行中执行以下操作
$ curl -o- https://raw.githubusercontent.com/nanananamememe/open_heroku/master/make.sh | bash
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 261 100 261 0 0 1003 0 --:--:-- --:--:-- --:--:-- 1007
mkdir: my_site: File exists
Reinitialized existing Git repository in ~/my_site/.git/
Creating app... done, ⬢ hoge-piyo-99999
https://hoge-piyo-99999.herokuapp.com/ | https://git.heroku.com/hoge-piyo-99999.git
On branch master
nothing to commit, working directory clean
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 299 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> PHP app detected
remote: -----> Bootstrapping...
remote: -----> Installing platform packages...
remote: NOTICE: No runtime required in composer.lock; using PHP ^5.5.17
remote: - apache (2.4.20)
remote: - nginx (1.8.1)
remote: - php (5.6.29)
remote: -----> Installing dependencies...
remote: Composer version 1.2.4 2016-12-06 22:00:51
remote: -----> Preparing runtime environment...
remote: NOTICE: No Procfile, using 'web: vendor/bin/heroku-php-apache2'.
remote: -----> Checking for additional extensions to install...
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing...
remote: Done: 13.5M
remote: -----> Launching...
remote: Released v3
remote: https://hoge-piyo-99999.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy.... done.
To https://git.heroku.com/hoge-piyo-99999.git
* [new branch] master -> master
通过执行命令行,将创建一个没有广告显示的免费网站,该网站将在执行命令的文件夹的顶层目录下创建名为my_site的文件夹。Heroku应用程序会自动创建,并作为远程存储库添加到my_site文件夹中。
编辑网站
$ cd my_site;
$ echo '<p><a href="test.html">test.html</a></p>' >> index.html;
$ echo 'This is a pen. This is a apple. huuunmm! Applepen!!' > test.html;
$ git add .;
$ git commit -a -m test;
$ git push heroku master;
$ heroku open;
请问一下,index.html上有没有链接到test.html呢?
然后就可以大胆地写HTML、JavaScript、CSS之类的东西,提交并推送,来构建网站了。
只有这些还不足以解释shell脚本的含义.
#!/bin/sh
app=$1; #←引数を取得
if [ -z "$app" ];then
app="my_site"; #←引数空ならmy_siteに
fi
mkdir $app; #←ディレクトリ作成
cd $app; #←ディレクトリ移動
git init; #←git初期化
heroku create; #←herokuアプリ作成
echo '{}' > composer.json; #←コンポーサー設定作成、このファイルの有無でphpアプリか判断される
echo '<b>Hellow World!!</b> Yes we can!!' > index.html; #←ヘロ〜
git add .; #←composer.jsonとindex.htmlをgitのインデックスに登録
git commit -a -m first; #←コミット
git push heroku master; #←プッシュ&デプロイーン
heroku open; #←ブラウザーに『Hellow World!』と表示されたらハッピー
因此,为了更进一步,让我们使用Redis进行一个应用程序的示例来添加一个附加组件。
-
- 実ソース https://github.com/nanananamememe/short_url
サンプル https://infinite-forest-33516.herokuapp.com/
使用以下命令从GitHub克隆源代码并创建Heroku应用程序,并添加Redis。
会多次出现“heroku-redis状态正在创建。”。
这是因为Redis服务器正在启动的原因,所以在此期间应用程序将不会运行,这是等待启动的提示信息。
当出现“已创建Heroku-redis状态。”时,表示启动完成。应该会在浏览器中打开一个URL缩短网站。(大概)
$ curl -o- https://raw.githubusercontent.com/nanananamememe/open_heroku/master/make_short_url.sh | bash
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 519 100 519 0 0 1038 0 --:--:-- --:--:-- --:--:-- 1040
Cloning into 'short_url'...
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 12 (delta 0), reused 12 (delta 0), pack-reused 0
Unpacking objects: 100% (12/12), done.
Checking connectivity... done.
Creating app... done, ⬢ hoge-piyo-99999
https://hoge-piyo-99999.herokuapp.com/ | https://git.heroku.com/hoge-piyo-99999.git
Creating heroku-redis:hobby-dev on ⬢ hoge-piyo-99999... free
Your add-on is being provisioned and will be available shortly
! Data stored in hobby plans on Heroku Redis are not persisted.
redis-hoge-99999 is being created in the background. The app will restart when complete...
Use heroku addons:info redis-hoge-99999 to check creation progress
Use heroku addons:docs heroku-redis to view documentation
Counting objects: 12, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (9/9), done.
Writing objects: 100% (12/12), 2.63 KiB | 0 bytes/s, done.
Total 12 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> PHP app detected
remote: -----> Bootstrapping...
remote: -----> Installing platform packages...
remote: NOTICE: No runtime required in composer.json; requirements
remote: from dependencies in composer.lock will be used for selection
remote: - php (7.1.0)
remote: - apache (2.4.20)
remote: - nginx (1.8.1)
remote: -----> Installing dependencies...
remote: Composer version 1.2.4 2016-12-06 22:00:51
remote: Loading composer repositories with package information
remote: Installing dependencies from lock file
remote: - Installing predis/predis (v1.0.3)
remote: Downloading: 100%
remote:
remote: Generating optimized autoload files
remote: -----> Preparing runtime environment...
remote: NOTICE: No Procfile, using 'web: vendor/bin/heroku-php-apache2'.
remote: -----> Checking for additional extensions to install...
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing...
remote: Done: 14M
remote: -----> Launching...
remote: Released v3
remote: https://hoge-piyo-99999.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/hoge-piyo-99999.git
* [new branch] master -> master
heroku-redis state creating.
heroku-redis state creating.
heroku-redis state creating.
Allrady heroku-redis state created.
使用PHP生成短链接的说明
由于使用缩短URL,在 http://hogehoge.heroku.com/ 之后将作为搜索关键字处理,需要在.htaccess文件中进行重定向。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
使用predis进行与redis的连接。
{
"require": {
"predis/predis": "1.0.3"
}
}
<?php
require 'vendor/autoload.php';
Predis\Autoloader::register();
$domain = getenv('HTTP_HOST'); //ホスト名取得
$redisUrl = getenv('REDIS_URL'); //redis設定取得
if (!$redisUrl) { //redis設定が取得できなければエスケープ
echo 'heroku-redisアドオン作成中。しばらくお待ち下さい...';
exit;
}
$redis = new Predis\Client($redisUrl); //preisを介してredisに接続
$url = empty($_POST['url'])?null:trim($_POST['url']); //短縮対象のURLが送信されていれば変数に格納
$key = trim(getenv('REQUEST_URI'), '/'); //http://hogehoge.heroku.com/以降を検索キーとして取得
if ($url) { //短縮対象のURLが送信されていれば
if (!preg_match('/^https?:\/\//', $url)) { //URLの最初がhttpかhttpsかでなければ頭にhttp://を追加
$url = 'http://' . $url;
}
$hash = strtr(trim(base64_encode(crc32(md5($url))), '='), '+/', '-_'); //$urlを元に検索キー生成
$redis->set($hash, $url); //redisセット
$redis->expire($hash, 43260); //redis保存期限の設定(秒)とりあえず | 60秒 x 60分 x 24時間 x 30日 = 43260
}
if ($key) { //検索キーが設定されていれば
$redirect = $redis->get($key); //redisからurlを取得
if ($redirect) { //urlが正常に取得できればリダイレクト
header("Location: {$redirect}");
} else {
echo 'このURLの有効期限は切れました。';
exit;
}
} else {
$jump = "http://{$domain}/{$hash}"; // 短縮後URLを作成
require 'form.php'; //form.phpを読み込み
}
Shell脚本的说明
#!/bin/sh
app=$1; #引数を取得
if [ -z "$app" ];then
app="short_url"; #引数空ならshort_urlに
fi
git clone https://github.com/nanananamememe/short_url $app; #githubより短縮URL作成のソースをクローン
cd $app; #チェーンジディレクトリ
heroku create; #ヘロクアプリ生成
heroku addons:create heroku-redis:hobby-dev; #サーバーへredisアドオンを追加
git push heroku master; #短縮URL作成のソースをヘロクにプッシュ
state=`heroku addons:info heroku-redis|grep State|awk '{print $2}'`; #redisサーバーの状態を取得
hold="creating" #状態が作成中の場合はこのメッセージ、$stateが一致した場合は延々とwhileが回ります。
while [ $state = $hold ]
do
echo "heroku-redis state $state."; #作成中のメッセージ
sleep 10s; #10秒待機
state=`heroku addons:info heroku-redis|grep State|awk '{print $2}'`; #redisサーバーの状態を取得
done;
echo "Allrady heroku-redis state $state."; #redisサーバー作成完了
heroku open; #ブラウザを起動
以上。