Laravel installation (Day #1)

Warodom Werapun
http://warodom.werapun.com
5 min readJan 11, 2017

เริ่มต้นโดยการเตรียมความสภาพแวดล้อมที่ใช้สำหรับเขียนโปรแกรม โดยใช้โปรแกรมดังรายการต่อไปนี้

List of required softwares

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”

หากมาดูใน 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

https://github.com/settings/tokens/new?scopes=repo&description=Generate%20token%20for%20laravel%20installation

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 ด้วย)

--

--