Tredun ohjelmistokehittäjien kurssimateriaaleja
Herokun avulla voidaan käynnistää (deploy) palvelinkoodia (esim. PHP tai node.js). Koodin voi imuroida sinne suoraan omasta Github-repostansa.
Luo itsellesi uusi Heroku-sovellus näiden ohjeiden mukaisesti:
Herokussa ei ole MySQL-tietokantaa automaattisesti, joten käytämme PostgreSQL:ää sen tilalla.
Lisää sovellukselle tietokanta Postgres Database On Heroku. Postgres-tietokannan lisääminen tapahtuu sovelluksen välilehdellä Resources, More add-ons ja etsimällä hakusanalla postgres (valitse ja asenna Heroku Postgres). Valitse sovellus, johon lisäät tietokannan.
Voit ottaa yhteyden Herokun Postgres-tietokantaan PHPPGAdmin-ohjelmalla.
Löydät tarvittavast kirjatumistiedot (url, database name, username, password) avaamalla Heroku Postgres-tietokannan ja sen alta kohdan Settings -> Database credentials.
Heroku:ssa tietokannan kirjautumistiedot saadaan suoraan ympäristömuuttujan DATABASE_URL avulla eli siellä ei tarvita erillistä .env-tiedostostoa.
Tämä pitää ottaa huomioon kooditasolla, kun otetaan yhteys tietokantaan. Muuta siis tietokantayhteyden ottamiseen tarkoitettu koodi haarautumaan sen perusteella onko ympäristömuuttuja DATABASE_URL olemassa:
if(getenv("DATABASE_URL")){
// The connection parameters are extracted from the DATABASE_URL environment variable
$db = parse_url(getenv("DATABASE_URL"));
$host = $db["host"];
$port = $db["port"];
$dbname = ltrim($db["path"], "/");
$user = $db["user"];
$password = $db["pass"];
$connectionString = "pgsql:host=$host;dbname=$dbname;port=$port";
} else {
$host = getenv('DB_HOST');
$port = getenv('DB_PORT');
$dbname = getenv('DB_NAME');
$user = getenv('DB_USERNAME');
$password = getenv('DB_PASSWORD');
if (getenv('DB_DBTYPE') === "MySql"){
$connectionString = "mysql:host=$host;dbname=$dbname;port=$port;charset=utf8";
} else {
$connectionString = "pgsql:host=$host;dbname=$dbname;port=$port";
}
}
Herokussa oleva PostgreSQL-tietokanta on vielä täysin tyhjä. Voit luoda taulut käsin PHPMyAdmin-ohjelmalla (UI:n kautta tai ajamalla SQL-lausekkeita CREATE-table jne.) mutta tämä on hidaasta ja tuottaa helposti virheitä eikä tietokannan rakenne ole tallessa versionhallinnassa (github). Tämän takia otamme käyttöön tietokannan päivittämistyökalun, jonka avulla voimme tallentaa tietokantaskemat versionhallintaan sekä alustaa tietokannan automaattisesti.
Käytämme tässä Phinx-nimistä ohjelmaa. Asenna Phinx composerin avulla:
composer require robmorgan/phinx
Luo migrations-kansio database-kansion sisälle. Luo phinx.yml-konfiguraatiotiedosto projektisi juureen. Tallenna sinne käyttämiesi tietokantojen tiedot:
HUOM! Lisää phinx.yml tiedosto .gitignore:een (sisältää salasanoja!).
paths:
migrations: '%%PHINX_CONFIG_DIR%%/database/migrations'
seeds: '%%PHINX_CONFIG_DIR%%/database/seeds'
environments:
default_migration_table: phinxlog
default_database: development
production:
adapter: pgsql
host: <your_heroku_db_url>
name: <your_heroku_db_name>
user: <your_heroku_db_username>
pass: <your_heroku_db_password>
port: 5432
charset: utf8
development:
adapter: mysql
host: localhost
name: news
user: root
pass: mypass123
port: 3306
charset: utf8
development_pg:
adapter: pgsql
host: localhost
name: news
user: postgres
pass: mysecretpassword
port: 5432
charset: utf8
version_order: creation
Luo uusi migration eli tietokantaskemaversio, anna nimi CamelCase-muodossa (esim. InitialNews):
vendor/bin/phinx create InitialNews
Tämä luo sinulle pohjan (kansioon database/migrations), johon voit lisätä koodin, joka luo tarvittavat tietokantataulut. Käytännössä kirjoitat koodin change-metodille:
public function change()
{
public function change()
{
$news = $this->table('uutinen',['id' => false, 'primary_key' => ['uutinenID']]);
$news->addColumn('uutinenID', 'integer', ['identity' => true])
->addColumn('otsikko', 'string', ['limit' => 50])
->addColumn('sisalto', 'string')
->addColumn('kirjoituspvm', 'datetime')
->addColumn('poistamispvm', 'datetime')
->addColumn('kirjoittaja', 'string', ['limit' => 50])
->save();
$users = $this->table('users',['id' => false, 'primary_key' => ['userID']]);
$users->addColumn('userID', 'integer', ['identity' => true])
->addColumn('firstname', 'string', ['limit' => 50])
->addColumn('lastname', 'string', ['limit' => 50])
->addColumn('username', 'string', ['limit' => 50])
->addColumn('password', 'string', ['limit' => 255])
->addIndex(['username'], [
'unique' => true,
'name' => 'idx_username'])
->save();
}
Testaa nyt tietokantayhteys kirjoittamalla (bash):
vendor/bin/phinx status -e production
Jos kaikki menee hyvin, näet ruudulla:
Jos saat seuraavan PDO-virheen:
Koneessasi olevaan PHP:hen ei ole aktivoituna PostgreSQL-tukea. Tämän voi lisätä poistamalla “;” merkin tiedostosta c:/xampp/php/php.ini siltä riviltä, jossa otetaan käyttöön PDO_pgsql ekstensio (4. rivi kuvassa):
Nyt voit ajaa uuden tietokantaversion Herokuun asti migrate-komennolla:
vendor/bin/phinx migrate -e production
Jos tämä onnistui, status pitäisi olla nyt up.
Voit nyt tarkistaa tietokannan rakenteen ottamalla PHPPGAdmin-yhteyden Herokuun.
Jos tietokannan rakenne ei ole haluttu, voit aina ottaa takapakkia:
vendor/bin/phinx rollback -e production
Jos haluat testata tietokannan hallintaa lokaalilla Postgres-tietokannalla, käynnistä ensin sellainen PostgreSQL Dockerin avulla ja luo sinne tyhjä tietokanta (esim. news, UTF-8 encoding) käyttäen PHPPGAdmin-ohjelmaa ja aja sitten:
vendor/bin/phinx migrate -e development_pg
# This file configures the Apache web server such that:
# - index.php is served
# - any other request is rerouted to index.php.
RewriteEngine On
RewriteRule ^/index\.php$ - [L,NC]
RewriteRule . index.php [L]