Hướng dẫn cài đặt V8JS cho PHP trên Centos 7

Hướng dẫn cài đặt V8JS cho PHP trên Centos 7

Nội dung chính

Giới thiệu

Từ khi Google giới thiệu V8 Engine, không ngoa khi nói rằng đó là nền tảng cho Javascript thăng hoa, vài dự án nổi tiếng phát triển dựa trên V8 là Google Chrome, Node Js, Mongo Db. Trong đó, với Google Chrome, giờ đã chiếm thị phần quá nửa trên thị phần trình duyệt, cũng nhờ đó mà javascript cho trình duyệt cũng trở nên phát triển trong thời kỳ rực rỡ, và hơn hết là Node Js, nền tảng thực thi javascript dựa trên V8 chạy ở phía server rất mạnh mẽ không kém gì các ngôn ngữ PHP, Python, Ruby, .Net mà còn nhỉnh hơn trong các ứng dụng thời gian thực (realtime). Bài viết này sẽ hướng dẫn cài đặt V8JS trên Cent OS 7.

V8 Engine là gì?

Trang chủ V8 [Github]

Như đã giới thiệu cơ bản ở trên, V8 là một bộ máy (engine) được viết bằng C++ thực thi Javascript theo EcmaScript (đọc thêm bài ES2015 là gì), biên dịch Javascript ra mã máy (IA-32, x86-64, ARM, hay là MIPS ISAs …)

Do biên dịch Javascript ra mã máy, nên tốc độ của V8 Engine là rất nhanh, cũng như được nâng cấp kỹ thuật cache để gia tăng tốc độ cho Javascript.

Từ trước khi V8 Engine ra đời, Javascript chỉ thực hiện ở trên trình duyệt: chậm và thiếu nhiều tính năng. Node Js ra đời dựa trên V8 Engine và đã chiếm được rất nhiều tình cảm từ cộng đồng lập trình viên trên toàn thế giới. Ngay tại thời điểm bạn đọc bài viết này, Node Js được dùng bởi hầu hết lập trình viên Frontend thông qua Bower hoặc NPM cho cả Frontend, và phía server.

V8 Js là gì?

Trang chủ thư viện PHPV8/V8Js [Github]

Node Js thực thi Javascript cho ngôn ngữ phía server và rất mạnh mẽ. Tuy nhiên, tại thời điểm viết bài Node Js cũng chỉ mới có 7 năm tuổi đời, còn PHP có đến 20+ tuổi đời, số lượng lập trình viên PHP trên thế giới rất đông đảo. Vậy làm sao lập trình viên PHP tận dụng được sức mạnh của V8 trong sản phẩm của mình?

Tận dụng được sức mạnh của V8: thực thi Javascript trong PHP là lý do V8 Js ra đời. Bộ thư viện mở rộng V8Js giúp PHP có thể thực thi Javascript ngay trong chính ngôn ngữ PHP.

<?php
class Foo {
  var $bar = null;
}
$v8 = new V8Js();
$v8->foo = new Foo;
// This prints "no"
$v8->executeString('print( "bar" in PHP.foo ? "yes" : "no" );');
?>

Đoạn code ở trên cho thấy có thể sử dụng javascript ngay trong PHP. Đọc đến đây bạn có thể có bạn đặt câu hỏi: Chạy javascript trên Server làm gì?

Bạn có thể viết ứng dụng từ React Js phát triển cho client-side (Đọc thêm bài React Js là gì?), và sử dụng lại code đó cho server-side, được gọi từ PHP code. Bản thân cách sử dụng lại code này có thể đạt được bởi dùng Node Js, nhưng nếu bạn đã có website sử dụng PHP và muốn phát triển client-side bằng React Js thì V8Js sẽ giúp bạn đạt được điều này một cách dễ dàng.

Hướng dẫn cài đặt V8 Js

Chuẩn bị:

  • CentOS 7
  • Quyền sudo, hoặc tài khoản root.

Bước 1: chuẩn bị các thư viện cần thiết

yum -y update
# Install EPEL repo
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# Install build tools
yum -y install gcc-c++ pcre-devel zlib-devel make unzip 
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

Bước 2: cài đặt PHP 5 hoặc 7

Nếu bạn đã có PHP rồi có thể bỏ qua bước này.

PHP 7:

# Install PHP 7
yum -y install --enablerepo=webtatic php70w php70w-common php70w-fpm php70w-cli php70w-opcache php70w-pear php70w-devel php70w-intl php70w-mbstring php70w-mcrypt

PHP 5.6:

# Install PHP 5.6
yum -y install --enablerepo=webtatic php56w php56w-common php56w-fpm php56w-cli php56w-opcache php56w-pear php56w-devel php56w-intl php56w-mbstring php56w-mcrypt

Bước 3: Cài đặt GIT

[Quan trọng]: do GIT cài đặt sẵn, hoặc bạn cài từ lệnh YUM thì phiên bản này cũ không phù hợp với một số lệnh mới để cài đặt V8

# Install Git latest  
yum -y install curl-devel expat-devel gettext-devel openssl openssl-devel zlib-devel bzip2
yum -y install gcc perl-ExtUtils-MakeMaker

cd /usr/src && 
    git clone https://github.com/git/git
cd /usr/src/git && make prefix=/usr/local/git all && make prefix=/usr/local/git install
yum -y remove git

# Use new Git
PATH /usr/local/git/bin:$PATH

Bước 4: Cài đặt V8

# Install Depot Tools
cd /usr/src && git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
PATH /usr/src/depot_tools:$PATH

# Install v8
cd /usr/src && fetch v8
cd /usr/src/v8 && make native library=shared snapshot=off -j 4

cp -R /usr/src/v8/out/native/lib.target/lib* /lib64/
cp /usr/src/v8/out/native/obj.target/tools/gyp/libv8_libplatform.a /usr/lib64/
cp -R /usr/src/v8/include /usr/local

Bước 5: Cài đặt V8Js

PHP 7:

# Install v8js 
echo "/usr/lib64" | pecl install v8js-1.0.0

PHP 5.6:

# Install v8js 
echo "/usr/lib64" | pecl install v8js

Bạn có thể thấy đây là mục đích cuối cùng, cài V8Js, nhưng đó lại là bước dễ nhất! Nhưng để đạt được bước này, mình đã trải qua nghiên cứu, cài đặt thử nghiệm trên CentOs 6, 7 trong mấy ngày để tìm đủ các thư viện để hoàn thiện các bước từ 1->4.

Đến bước này thì bạn đã cài đặt V8Js thành công rồi đó.

Thêm dòng này vào php.ini

echo extension=v8js.so > /etc/php.d/v8js.ini

Bước 6: Kiểm tra

php -m | grep v8
#### Display ####
# v8js
# Check V8Js class
php -r 'var_dump(get_declared_classes());' | grep V8
#### Display ####
# string(4) "V8Js"
# string(13) "V8JsException"
# string(19) "V8JsScriptException"
# string(22) "V8JsTimeLimitException"
# string(24) "V8JsMemoryLimitException"
# string(8) "V8Object"
# string(10) "V8Function"
# Check method
php -r '$class = new ReflectionClass("V8Js"); var_dump($class->getMethods());'
#### Display ####
# array(14) {
# [0]=>
# object(ReflectionMethod)#2 (2) {
# ["name"]=>
# string(11) "__construct"
# ["class"]=>
# string(4) "V8Js"
# }
# [1]=>
# object(ReflectionMethod)#3 (2) {
# ["name"]=>
# string(7) "__sleep"
# ["class"]=>
# string(4) "V8Js"
# }
# Excute test v8js
php -r '$v8 = new V8Js(); var_dump($v8->executeString("1+2+3"));'
#### Display ####
# int(6)

Nếu bạn chạy các dòng trên có kết quả như trên thì bạn đã hoàn toàn cài đặt V8Js thành công rồi. Từ bây giờ bạn có thể sử dụng Javascript trong PHP một cách thoải mái rồi nhé.

Docker: V8Js/PHP7/Nginx trên CentOS 7

Dành cho mục đích test V8Js trên PHP là cái quái gì? Mình đã tạo ra 1 image và phát hành trên Docker Hub:

https://hub.docker.com/r/virusvn/docker-centos-v8js/

Chỉ cần pull về, thực hiện SSH vào trong container thì sẽ thực thi được các lệnh Javascript trong PHP. Nếu bạn chưa biết Docker là gì, thì Fullstack Station cũng đã viết 1 bài giới thiệu tại đây.

Read more