Laravel installation (Day #1)
เริ่มต้นโดยการเตรียมความสภาพแวดล้อมที่ใช้สำหรับเขียนโปรแกรม โดยใช้โปรแกรมดังรายการต่อไปนี้
List of required softwares
- php 7.1x64 non-thread-safe (http://windows.php.net/download#php-7.1)
- Composer-Setup (https://getcomposer.org/download/)
- git-2.11.0 x64 (https://git-scm.com/download/win)
- sublime 3.0 x64 build 3126 (https://www.sublimetext.com/)
- Docker Toolbox 1.12.2 (https://github.com/docker/toolbox/releases/tag/v1.12.2)
- Jenkins 2.40 (https://jenkins.io/content/thank-you-downloading-windows-installer/)
- Laravel 5.3 (https://github.com/laravel/framework)
- nginx 1.11.8 (http://nginx.org/en/docs/windows.html)
- MySQL5.7.17 x64(http://dev.mysql.com/downloads/mysql/)
- Heidisql MySQL Client (http://www.heidisql.com/download.php)
- Percona (https://www.percona.com/software/mysql-database/percona-server) [Optional]
- โปรแกรมที่เป็นตัวหนา-เอียง หมายถึงต้องติดตั้ง ส่วนโปรแกรมที่เหลือ unzip ไว้ใน folder แล้วใช้ได้เลย
GitHub
Register github (https://education.github.com/pack)
PHP7.1.0 NTS x64
unzip, create /www, php -S 127.0.0.1:80 , <?php phpinfo(); (NTS เสถียรกว่าเร็วกว่า แต่ไม่รับประกันเรื่อง concurrency)
Step1: Edit: php.ini to support Laravel requirement: openssl, mysql, php_pdo, และ php_mbstring
enable: (โดยการลบเครื่องหมาย ; ออก )
extension=php_curl.dll
extension=php_mbstring.dll
extension=php_mysqli.dll
extension=php_openssl.dll
extension=php_pdo_mysql.dll
extension=php_pdo_sqlite.dll; On windows:
extension_dir = “ext”
mbstring.dll คือ library สำหรับการจัดการ การแปลงตัวอักษร unicode ของภาษาต่าง ๆ เป็น Multibyte String
Save php.ini (จาก php.ini.development)
ทดสอบ build-in web server ด้วยคำสั่ง php -S 127.0.0.1:80
แล้วลองเรียกไฟล์ php เพื่อทดสอบการทำงานของ web sever
Note: เครื่องในห้อง Lab 1201A เป็น windows10 education มีการ start service ไว้หลายตัว และมี service port 80 บางตัว ที่ดันไปใช้ PID 4 ที่เป็นของ System ทำให้ไม่สามารถ end task หรือสั่งปิด service แบบปรกติ (แม้ว่า user ที่ login อยู่จะเป็น administrator role อยู่แล้ว)
ทดสอบโดยใช้คำสั่ง nestat -aon | findstr 0.0.0.0:80 | findstr 4
end process โดยใช้ taskkill /f /im nginx.exe
การแก้ไขคือต้องเปลี่ยนไปเข้า cmd แบบ administrative จากนั้น
ใช้คำสั่ง net stop http
เพื่อปิด service port 80 ก็จะสามารถใช้ port 80 ได้
currPorts เป็น Windows GUI Software ที่ช่วยให้ตรวจสอบว่าโปรแกรมอะไร run โดยเปิด port ไหนอยู่บ้าง
เนื่องจาก build-in web server ค่อนข้างมีข้อจำกัดหลาย ๆ ด้าน ใน production server จะใช้ nginx หรือ apache แทน ในตัวอย่างนี้ ขอใช้ nginx
Nginx 1.11.8 installation (Windows)
download nginx for windows: http://nginx.org/download/nginx-1.11.8.zip เมื่อ unzip เรียบร้อย ก็สั่ง start service ได้เลย
cd E:\
unzip nginx-1.11.8.zip
cd nginx-1.11.8
start nginx
(คำสั่ง start เป็นการ run nginx service แบบ daemon) ตรวจสอบว่า service ถูกเรียกให้ทำงานดังนี้
E:\nginx-1.11.8>tasklist /fi "imagename eq nginx.exe"
สั่งปิด service ด้วย nginx -s stop
และ สั่ง reload configure ใหม่ด้วยคำสั่ง nginx -s reload
จากนั้นทดลองเรียก http://localhost/ ถ้าขึ้นหน้าแรกของ nginx แสดงว่า ติดตั้งเสร็จเรียบร้อย
Nginx + PHPFPM (7.1.0)
ขั้นต่อไปเป็นการให้ nginx ทำงานร่วมกับ php ได้ โดยจะใช้ PHP-FPM ซึ่งอยู่ใน php7.1.0-nts อยู่แล้ว (PHPFPM เป็น Fast-CGI process manager) ช่วยทำให้ nginx สามารถ run php ได้
Step:1
- แก้ conf/nginx.conf เพื่อให้ เรียก index.php โดยอัตโนมัติ และ รู้จัก phpfpm โดย uncomment บรรทัดข้างล่างนี้ พร้อมทั้งแก้ไข fastcgi_pass กับ fastcgi_param (อยู่บรรทัดเดียวกัน)
http {
server {
...
location ~ \.php$ {
root html
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
- ใน block “location \.php$” ระบุว่าถ้าลงท้ายด้วย .php ให้ทำงานใน block นี้
- fastcgi_param เป็น path ของ php file ที่ร้องขอ ที่จะส่งเข้าไปยัง phpfpm เพื่อสั่ง phpfpm ให้ ทำงานรอประมวลผล
Step 2:
- สั่งให้ phpfpm ทำงานที่ port 9000 รอไว้
start php-cgi -b 127.0.0.1:9000
หลังจากนั้นลองเรียก ไฟล์ php ถ้ากำหนดค่าได้ถูกต้อง nginx จะต้องแปลภาษา php ได้
Composer installation
composer เป็นเครื่องมือที่ใช้ในการจัดการ package ที่ Laravel เลือกใช้ การติดตั้งให้เรียกตัว Composer-Setup.exe และ next ไปเรื่อย ๆ ระหว่างการติดตั้งจะต้องระบุ path ของไฟล์ php.exe ที่ให้ composer เรียกใช้ เมื่อติดตั้งเสร็จ 3 folder ดังต่อไปนี้จะถูกเพิ่มให้กับ Windows การเพื่อให้ทราบว่าจะเรียกใช้ไฟล์ได้ที่ไหน
- C:\Users\userName\AppData\Roaming\Composer\vendor\bin\laravel.*
- C:\ProgramData\ComposerSetup\bin\composer.*
- E:\php710nts
ดังนั้นเมื่อติดตั้ง composer เสร็จ เราสามารถเรียกใช้ คำสั่ง laravel, composer, php จากที่ folder ไหนก็ได้
Laravel installation
Method1: Install from Laravel installer
E:/php710nts/www/>composer global require “laravel/installer”
คำสั่งนี้ จะไป composer จะไป download /vendor/ มาอยู่ใน C:\Users\comeng\AppData\Roaming\Composer\ … (download 3 MB)
E:/php710nts/www/>laravel new blog
คำสั่งนี้จะเป็นการสร้าง laravel project (รอนาน download 33 MB)
ทดสอบ php artisan serve
Method 2: Composer create project
E:/php710nts/www/> composer create-project --prefer-dist laravel/laravel blog
- — prefer-dist ระบุว่าให้ load ใน stable version (ถ้าเป็น — prefer-source จะ load อันล่าสุดที่เป็น bug-fixed)
- laravel/laravel : laravel ตัวแรกหมายถึงชื่อโครงงาน Laravel ส่วน laravel ตัวที่สอง หมายถึง ชื่อ package
- blog หมายถึงชื่อ folder project
Method3: Install Laravel from (laravel-master.zip @ github.com)
- ติดตั้ง Laravel (laravel-master.zip=> unzip to E:\php710nts\www\blog )
- Check composer.json
- Composer install:
composer install -vvv --profile
(รอ -vvv ให้แสดง verbose โดยละเอียด — profile ให้แสดงว่า แต่ละ package ใช้เวลาเท่าไร) - edit .env.example => .env [need sublime]
- php artisan key:generate
Composer.json vs Composer.lock
Dependencies ถูกกำหนดใน composer.json เมื่อ install / update ครั้งแรก composer.lock จะถูกสร้างขึ้นมา ยกตัวอย่างใน composer.json กำหนด
“phpunit/phpunit”: “~5.0”
- ~5.0 หมายถึง >=5.0 < 6.0.0
- ~1.2 is equivalent to >=1.2 <2.0.0,
- ~1.2.3 is equivalent to >=1.2.3 <1.3.0
อ้างอิง: https://getcomposer.org/doc/articles/versions.md
หากมาดูใน composer.lock ที่ติดตั้งไว้ จะกำหนดเป็น
phpunit/phpunit”: “5.2||4.8.24
ถ้าเรา copy folder laravel ไปเครื่องอื่น โดยมี composer.lock ติดไปด้วย เมื่อสั่ง composer install ก่อน composer จะ download package มันจะ scan หา version ใน composer.lock ก่อน เพื่อป้องกัน ความไม่สอดคล้องกันของ library
ในกรณีที่สั่ง composer update ตัว composer จะ scan หา version (ที่ไม่ระบุ) ใน composer.json จากนั้น ก็ติดตั้ง version ล่าสุดที่มี based on ที่กำหนดใน composer.json แล้วก็มา update composer.lock อีกที ดังนั้นเวลาจะ update file กับคนอื่น ควร commit ส่ง composer.lock ไปด้วย
flowchart ประกอบ
Credit: https://adamcod.es/2013/03/07/composer-install-vs-composer-update.html
ดังนั้นก่อน deploy ใน production server เพื่อป้องกันปัญหา จะต้องใช้ composer install (ไม่ใช้ composer update) จะได้ลง package ที่กำหนดใน composer.lock
FAQ: ติดตั้งแล้วเกิดปัญหา Composer hitting GitHub API rate limits
Method1: ใช้ option — no-interaction เพื่อให้ load package เมื่อพร้อม
omposer install --prefer-dist --no-interaction
อ้างอิง: https://help.bitpay.com/development/composer-issues
Method2: ใช้ token ของ GitHub
ต้องมี user account ของ github ก่อน แล้วไปสร้าง token ใน github
composer config github-oauth.github.com YOUR-TOKEN-HASH-GOES-HERE
token จะถูกสร้างใน auth.json
อ้างอิง: https://coderwall.com/p/kz4egw/composer-install-github-rate-limiting-work-around
หลังติดตั้ง laravel เรียบร้อยแล้ว ต้อง configure ให้ laravel ทำงานกับ nginx โดยใช้ configuration ดังนี้
Nginx + Laravel
- แก้ conf/nginx.conf เพื่อให้ เรียก index.php โดยอัตโนมัติ และ รู้จัก phpfpm โดย uncomment บรรทัดข้างล่างนี้ พร้อมทั้งแก้ไข fastcgi_pass กับ fastcgi_param (อยู่บรรทัดเดียวกัน)
http {
server {
listen 80;
server_name localhost;
root E:\\nginx-1.11.8\\html\\blog\\public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
- ใน block “location \” กำหนดว่า ให้พยายามหา uri ที่ร้องขอมา ว่ามี ไฟล์ใน server ? มี directory? ถ้าไม่เจอทั้ง 2 อย่างให้ เอา /index.php?query_string (uri parameter ที่ส่งมา) ตัวสุดท้ายไปหา (ซึ่งเป็น route ของ laravel)
Database
Mysql server 5.7.17 มีทั้ง version ที่ติดตั้งผ่านตัว install (32bit) หรือ จะเป็น version ที่ unzip file มาวาง มีทั้ง 32bit และ 64bit (ไม่ต้องติดตั้ง) คล้าย ๆ กับ Derby (JavaDB) ส่วนตัวชอบแบบนี้มากกว่า เพราะ remove ออกง่ายดี
Install mysql (https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17-winx64.zip)
- Unzip to: E:\mysql\mysql-5.7.17-winx64\
- E:\mysql\mysql-5.7.17-winx64\> mkdir data
- E:\mysql\mysql-5.7.17-winx64\> cd bin
- ทำการ ตั้งค่า database และ รหัสผ่าน เบื้องต้นด้วยคำสั่ง:
E:\mysql\mysql-5.7.17-winx64\bin> mysqld —-initialize —-console
- จะได้ root password: A temporary password is generated for root@localhost: V_x!xxx* (จำไว้เพื่อใช้ login ในครั้งแรก)
- Start MySQL Service ด้วยคำสั่ง
E:\mysql\mysql-5.7.17-winx64\bin> mysqld —-console
MySQL Client: HeidiSQL (http://www.heidisql.com/download.php)
- ใช้ HeidiSQL login เข้าไปครั้งแรกจะ บังคับให้เปลี่ยน password เนื่องจาก expired
Percona (Fork มาจาก MySQL Optimized เรียบร้อย และมีตัวที่เป็น cluster ด้วย)
…