PHP – Fullstack Station https://fullstackstation.com Hướng dẫn lập trình, thiết kế, lập trình web, thiết kế web, lập trình javascript, lập trình fullstack từ cơ bản đến nâng cao Wed, 13 Mar 2024 08:03:58 +0000 vi hourly 1 https://wordpress.org/?v=6.8.2 https://fullstackstation.com/wp-content/uploads/2019/08/favicon.ico PHP – Fullstack Station https://fullstackstation.com 32 32 Dùng CI:GithubAction để phát hiện toàn bộ câu truy vấn N+1 trong Laravel https://fullstackstation.com/dung-cigithubaction-de-phat-hien-toan-bo-cau-truy-van-n1-trong-laravel/ https://fullstackstation.com/dung-cigithubaction-de-phat-hien-toan-bo-cau-truy-van-n1-trong-laravel/#respond Wed, 06 Mar 2024 11:53:19 +0000 https://fullstackstation.com/?p=7923 Nếu bạn không chắc hệ thống của mình đang tồn tại bao nhiêu câu truy vấn có vấn đề về N+1 Query thì bài viết này dành cho bạn. Đặc biệt dành cho các bạn quản lý dự án, team leader. Đã sử dụng Laravel thì có lẽ mọi người cũng biết đến laravel-query-detector, một […]

The post Dùng CI:GithubAction để phát hiện toàn bộ câu truy vấn N+1 trong Laravel appeared first on Fullstack Station.

]]>
Nếu bạn không chắc hệ thống của mình đang tồn tại bao nhiêu câu truy vấn có vấn đề về N+1 Query thì bài viết này dành cho bạn. Đặc biệt dành cho các bạn quản lý dự án, team leader.

Đã sử dụng Laravel thì có lẽ mọi người cũng biết đến laravel-query-detector, một thư viện nho nhỏ để phát hiện N+1 Query. Tuy nhiên, vì nhiều lý do thì trong quá trình phát triển, chúng ta chưa chú ý giải quyết vấn đề “N+1 Query” này. Đến một lúc nào đó, khi lượng truy vấn nhiều lên (mức sử dụng database) thì vấn đề N+1 Query lại trở thành chủ đề cần giải quyết càng sớm càng tốt.

Câu truy vấn N+1 (N+1 Query) là gì

Nói ngắn gọn là Laravel sinh ra nhiều câu query hơn mức cần thiết. Chính xác hơn là 1+N, tức là khi ta truy vấn 1 query, mà query đó có quan hệ 1-nhiều (1-n), nhiều-nhiều (n-n) sẽ làm nảy sinh thêm n (nhiều) câu query khác. Lý do là Laravel cho phép chúng ta viết code cho model dễ đọc, mà không cần phải hiểu cách hoạt động đằng sau của chúng.

Tất nhiên, vấn đề này nảy sinh không phải chỉ do Eloquent hay chỉ đối với mỗi mình Laravel, mà trong cả ngành công nghiệp lập trình khi mà chúng ta sử dụng các framework vì sự tiện dụng của chúng.

Trong nội dung bài viết này, sẽ không đề cập đến cách giải quyết vấn đề này trong Laravel, bạn có thể tìm kiếm trên các bài viết khác nhé.

Phát hiện câu truy vấn có vấn đề N+1 Query

Khi sử dụng laravel-query-detector, bạn sẽ phát hiện N+1 Query và dựa theo cấu hình tương ứng để nắm thông tin N+1 Query.

Trong từng API (dùng clockwork):

Trong từng màn hình (dùng cấu hình Alert):

Trong từng màn hình (sử dụng debugbar, kết hợp cấu hình Log):

Danh sách các thiết lập thì bạn có thể xem thêm tại đây: https://beyondco.de/docs/laravel-query-detector/usage


    /*
     * Define the output format that you want to use. Multiple classes are supported.
     * Available options are:
     *
     * Alert:
     * Displays an alert on the website
     * \BeyondCode\QueryDetector\Outputs\Alert::class
     *
     * Console:
     * Writes the N+1 queries into your browsers console log
     * \BeyondCode\QueryDetector\Outputs\Console::class
     *
     * Clockwork: (make sure you have the itsgoingd/clockwork package installed)
     * Writes the N+1 queries warnings to Clockwork log
     * \BeyondCode\QueryDetector\Outputs\Clockwork::class
     *
     * Debugbar: (make sure you have the barryvdh/laravel-debugbar package installed)
     * Writes the N+1 queries into a custom messages collector of Debugbar
     * \BeyondCode\QueryDetector\Outputs\Debugbar::class
     *
     * JSON:
     * Writes the N+1 queries into the response body of your JSON responses
     * \BeyondCode\QueryDetector\Outputs\Json::class
     *
     * Log:
     * Writes the N+1 queries into the Laravel.log file
     * \BeyondCode\QueryDetector\Outputs\Log::class
     */
    'output' => [
        \BeyondCode\QueryDetector\Outputs\Log::class,
        \BeyondCode\QueryDetector\Outputs\Alert::class,
    ]

Hệ thống của bạn có bao nhiêu câu truy vấn có vấn đề N+1 Query?

Vì nhiều lý do, trong 1 dự án có nhiều người với peer-review yếu, hoặc chưa quan tâm lắm đến vấn đề N+1 Query, thì khả năng bỏ qua vấn đề N+1 Query khá là cao. Vì vậy đến một lúc nào đó khi bạn trở thành người quản lý dự án đó, chịu trách nhiệm nâng cao hiệu suất sử dụng database bạn sẽ rất vất vả để tìm ra các điểm nghẽn đó.

Ý tưởng cũng khá đơn giản: viết toàn bộ testcase cho tất cả router, khi chạy test thì sử dụng laravel-query-detector ghi log các câu truy vấn có vấn đề N+1 Query ra 1 file riêng, dùng các lệnh về xử lý file để tìm kiếm và thống kê.

Viết toàn bộ testcase cho tất cả router

Nếu bạn có viết testcase rồi thì tốt, không có thì cũng chỉ cần viết cái testcase đơn giản là gọi đến toàn bộ route rồi cho skip cũng được 😑. Làm sao đảm bảo là gọi hết đến tất cả các route thì mới phát hiện được hết được. Không có thời gian thì viết cho mấy cái route quan trọng cũng được 🥲

Cấu hình laravel-query-detector

php artisan vendor:publish --provider="BeyondCode\QueryDetector\QueryDetectorServiceProvider"

Ta sẽ có được file config/querydetector.php

...
/* Chú ý dòng này, nếu bạn có file phpunit.xml, cần thiết lập QUERY_DETECTOR_ENABLED=true */
'enabled' => env('QUERY_DETECTOR_ENABLED', null),
...
/* Tùy theo tính chất khắt khe mà đặt chốt chặn phù hợp */
'threshold' => (int) env('QUERY_DETECTOR_THRESHOLD', 1),
...
'log_channel' => env('QUERY_DETECTOR_LOG_CHANNEL', 'querydetector'),
...
'output' => [
      ...
        \BeyondCode\QueryDetector\Outputs\Log::class,
      ...
    ]

Chúng ta sẽ ghi log vào channel ‘querydetector’, vậy nên phải cấu hình channel trong file config/logging.php

'querydetector' => [
            'driver' => 'single',
            'path' => storage_path('logs/querydetector.log'),
            'level' => env('LOG_LEVEL', 'debug'),
            'days' => 14,
        ]

Như vậy toàn bộ kết quả của laravel-query-detector sẽ được ghi vào file storage/logs/querydetector.log

Thống kê

grep "Detected N+1 Query" storage/logs/querydetector.log | wc -l

Ok, như vậy là ta sẽ ra được 1 con số, được hiểu là số vấn đề N+1 Query đang tồn tại trong hệ thống. Con số này có thể không chính xác vì nhiều lý do:

  • Một route được viết testcase nhiều lần – nói 1 cách khác là được gọi nhiều lần.
  • Trong một route, số vấn đề N+1 Query là số nhiều

Nhưng nếu kết quả là số 0 thì chúc mừng bạn, hệ thống của bạn không có vấn đề (mặc dù còn phụ thuộc số lượng testcase)

Sử dụng CI: GithubAction để thống kê

Nếu bạn có sử dụng CI với GithubAction, thì với kết quả của phpUnit, bạn làm thêm 1 vài thao tác nữa sẽ được kết quả như thế này:

316 – con số thật khủng khiếp phải không nào :D, điều tuyệt vời là bạn đã biết được con số đó, và mỗi khi giải quyết N+1 Query được push lên, GithubAction sẽ comment con số cuối cùng.

File cấu hình ci.yml sẽ được chỉnh sửa thêm vào như sau:
//ci.yml
on: [ pull_request ]
jobs:
  phpUnit:
      - name: chạy phpunit
     .... "./vendor/bin/phpunit --stop-on-failure"
      - name: N+1 Query Report #Đọc kết quả querydetector, thống kê và lưu vào file n-1-query-summary.log
        run: |
          grep "Detected N+1 Query" storage/logs/querydetector.log | wc -l > storage/logs/n-1-query-summary.log
        working-directory: ${{env.working-directory}}
      - name: Read coverage summary #Đọc nội dung file n-1-query-summary.log
        id: n-1-query-summary
        uses: juliangruber/read-file-action@v1
        with:
          path: ./app/laravel/storage/logs/n-1-query-summary.log
      - name: Comment N+1 Query Summary # Comment kết quả vào PR
        uses: marocchino/sticky-pull-request-comment@v2
        with:
          recreate: true
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          header: n-1-query
          message: |
            ## N+1 Query Summary
            Number of N+1 queries: ${{ steps.n-1-query-summary.outputs.content }}
      - name: Archive N+1 query detector results # Lưu log của querydetector vào Artifact của github
        uses: actions/upload-artifact@v2
        with:
          name: n+1-query-report
          path: ./app/laravel/storage/logs/querydetector.log

File querydetector.log sẽ được upload lên artifacts của Github

Như vậy ở góc độ quản lý dự án, bạn không cần phải chạy test trên máy của mình mà vẫn đảm bảo chất lượng dự án ngày càng cải thiện, ít nhất là phải biết hiện trạng của dự án.

Fullstack Station Tips

  • Khi bạn đã biết số vấn đề còn tồn tại , có thể đưa vào CI (ci.yml chẳng hạn) để đảm bảo con số đó không tăng lên khi phát triển thêm chức năng.
  • Có thể dựa vào danh sách file có vấn đề N+1 Query trong querydetector.log để so sánh với danh sách file được thêm/sửa. Nếu nằm trong querydetector.log thì không cho pass CI 🤣

The post Dùng CI:GithubAction để phát hiện toàn bộ câu truy vấn N+1 trong Laravel appeared first on Fullstack Station.

]]>
https://fullstackstation.com/dung-cigithubaction-de-phat-hien-toan-bo-cau-truy-van-n1-trong-laravel/feed/ 0
Cải thiện chức năng tìm kiếm trong WordPress với plugin Relevanssivà Co-Authors Plus https://fullstackstation.com/cai-thien-chuc-nang-tim-kiem-trong-wordpress-voi-plugin-relevanssiva-co-authors-plus/ https://fullstackstation.com/cai-thien-chuc-nang-tim-kiem-trong-wordpress-voi-plugin-relevanssiva-co-authors-plus/#comments Thu, 28 Mar 2019 13:06:06 +0000 http://fullstackstation.com/?p=1525 Chức năng tìm kiếm trong WordPress hoạt động kém hiệu quả, việc sử dụng plugin bên ngoài dường như là điều tất yếu. Bài viết trình bày cách sử dụng plugin Relevanssi và kết hợp với Co-Authors Plus để tìm kiếm nội dung theo tên và thông tin của tác giả một cách hiệu quả. […]

The post Cải thiện chức năng tìm kiếm trong WordPress với plugin Relevanssivà Co-Authors Plus appeared first on Fullstack Station.

]]>
Chức năng tìm kiếm trong WordPress hoạt động kém hiệu quả, việc sử dụng plugin bên ngoài dường như là điều tất yếu. Bài viết trình bày cách sử dụng plugin Relevanssi và kết hợp với Co-Authors Plus để tìm kiếm nội dung theo tên và thông tin của tác giả một cách hiệu quả.

Mặc dù Relevanssi xác nhận có hỗ trợ Co-Authors Plus (https://www.relevanssi.com/knowledge-base/relevanssi-and-co-authors-plus/) nhưng thực tế thì không hoạt động đúng như mong đợi. Mình đã tìm ra cách xử lý và chia sẽ cho ai cần.

Giới thiệu plugin Relevanssi

Có lẽ khi cần đưa ra giải pháp tìm kiếm thường mọi người hay nghĩ đến ElasticSearch, nhưng với nền tảng dựa trên nội dung có tính chất thay đổi linh hoạt cao như WordPress (ví dụ thêm bớt taxonomies chẳng hạn) hoặc số lượng nội dung không quá lớn thì việc dùng ElasticSearch cũng không hẳn mang lại hiệu quả cao. Mặc dù bạn vẫn có thể xài plugin ElasticPress https://wordpress.org/plugins/elasticpress/ để tích hợp ElasticSearch, tuy nhiên những website không đòi hỏi lập trình phức tạp, thì việc dùng ElasticSearch theo mình nhận định là vẫn không cần thiết.

Công cụ tìm kiếm mặc định của WordPress thì càng tệ, khi nó chỉ có thể tìm kiếm trong tiêu đề và phần nội dung của bài viết. Với plugin Relevanssi tích hợp chặt chẽ vào WordPress, cho phép tìm kiếm loại nội dung được chỉ định, các trường nội dung tuỳ chỉnh (custom field), hoặc các taxonomies, ngoài ra còn có nhiều tuỳ chỉnh cấu hình hữu ích khác.

Các tính năng đặc trưng:

  • Chọn loại nội dung muốn tìm kiếm
  • Chọn taxonomies muốn tìm kiếm
  • Có thể tìm kiếm trong phần bình luận, tác giả, shortcode
  • Thiết lập từ đồng nghĩa, stopwords
  • Lưu vết tìm kiếm
  • Có thể tuỳ chỉnh trích đoạn và làm nổi bật nội dung tìm kiếm
  • Có thể dùng toán tử “OR” hay “AND” tuỳ ý, với WordPress thì mặc định là “AND” vì vậy không thể tìm kiếm với từ khoá có trong nội dung và có trong term.
Chọn Taxonomies muốn tìm kiếm

Những yếu điểm của Relevanssi

Mặc dù mình đánh giá khá cao plugin Relevanssi, nhưng vẫn có những hạn chế sau:

  • Chỉ tìm kiếm được nội dung trong bảng posts, và postmeta, ngoài ra sẽ không tìm kiếm được.
  • Không tìm kiếm với các điều kiện phức tạp như tổ hợp toán tử ORAND lồng nhau.
  • Không tìm kiếm trực tiếp dạng live-search được.

Fullstack Station Tips

Các điểm yếu ở trên có thể khắc phục được nếu bạn nắm được linh hồn của plugin này chính ở bảng relevanssi, bạn hoàn toàn có thể bổ sung dữ liệu vào bảng này từ plugin khác và thay thế column `type` với tên dữ liệu của bạn. Đồng thời ở phần query thì cần chỉnh sửa thêm tuỳ theo nhu cầu thay vì sử dụng hàm của plugin thì bạn tự viết hàm query khác, dựa vào column term lấy ra doctype là có thể . Tất nhiên muốn khắc phục được theo kiểu này thì gần như phải đục vào plugin và không khuyến khích vì bạn có thể sẽ mất khả năng cập nhật từ plugin này.

Ngoài ra, mặc định plugin dùng kiểu query “%keyword” và “keyword%” nên có thể không đáp ứng nhu cầu của bạn, thì bạn có thể dùng filter bên dưới. Tất nhiên, với truy vấn “%keyword%” thì tốc độ có chậm đi đôi chút, nhưng vẫn chấp nhận được với bộ dữ liệu khoảng 2000 bài viết và 200k dòng về term được sinh ra.

/**
 * Modify relevannssi's query
 *
 * @param string $query
 * @return string
 */
function skdr_relevanssi_partial_inside_words( $query ) {
	return "(term LIKE '%#term#%')"; 
}
add_filter( 'relevanssi_fuzzy_query', 'skdr_relevanssi_partial_inside_words' );

Giới thiệu plugin Co-Authors Plus

“Đồng tác giả” là 1 chức năng thiếu sót của WordPress trong thực tế, bởi vì 1 bài viết có thể do nhiều người cùng góp sức, Co-Authors Plus ra đời để bù dắp thiếu sót này. Mặc dù số lượng “active installation” chỉ khoảng hơn 30k, nhưng mình nghĩ thực tế các dự án dùng composer để install thì sẽ nhiều hơn nữa.

Plugin này có khả năng thiết kế nội dung đặc tả cho 1 người như: họ tên, nghề nghiệp, giới thiệu, các liên kết mạng xã hội, … Plugin rất hay và được viết tốt, nhiều chức năng và có các hàm api lấy dữ liệu.

Ví dụ dưới đây về cách thêm các trường tuỳ biến:

function skdr_coauthors_guest_author_fields($fields, $groups)
{
    $additionalFields = [

        array(
            'key' => 'real_display_name',
            'label' => __('Display name', 'seikeidenron'),
            'group' => 'name',
            'required' => true,
        ),
        array(
            'key' => 'furigana',
            'label' => __('Furigana', 'seikeidenron'),
            'group' => 'name',
            'required' => true,
        ),
        array(
            'key' => 'company',
            'label' => __('Company', 'seikeidenron'),
            'group' => 'about',
        ),
        array(
            'key' => 'job_title',
            'label' => __('Job title', 'seikeidenron'),
            'group' => 'about',
        ),
        array(
            'key' => 'photo_credit',
            'label' => __('Photo credit', 'seikeidenron'),
            'placeholder' => __('Optional'),
            'group' => 'about',
        ),
    ];
    foreach ($additionalFields as $single_field) {
        if (in_array($single_field['group'], $groups) || 'all' === $groups[0] && 'hidden' !== $single_field['group']) {
            $fields[] = $single_field;
        }
    }
    //overwirte display name
    if (is_array($groups) && $groups[0] == 'name') {
        foreach ($fields as $key => $field) {
            if ($field['key'] == 'display_name') {
                $fields[$key] = [
                    // Name

                    'key' => 'display_name',
                    'label' => __('Username (Romaji only)', 'seikeidenron'),
                    'group' => 'name',
                    'required' => true,
                ];
            }
        }
    }
    return $fields;
}
add_filter('coauthors_guest_author_fields', 'skdr_coauthors_guest_author_fields', 10, 2);

Khi mình sử dụng plugin này với Relevanssi giới thiệu ở trên thì có vấn đề này sinh là Relevanssi không index được nội dung của plugin Co-Author Plus với các trường tuỳ biến tạo thêm. Vì vậy nếu bạn có sử dụng chung plugin này hoặc như các plugin khác mà bị vấn đề không index được thì làm theo cách bên dưới.


/**
 * Add additional data 
 *
 * @param array $insert_data
 * @param WP_Post $post
 * @return array
 */
function skdr_relevanssi_indexing_data($insert_data, $post){
	global $coauthors_plus;
	$authors = get_coauthors($post->ID);

	$authorIds = [];
	foreach ((array)$authors as $author){
		if (in_array($author->ID, $authorIds)) {
			continue;
		}
		$authorIds[] = $author->ID;
                //Fullstackstation.com 
                // Giả sử chúng ta có 2 thuộc tính là real_display_name và furigana được khai báo trong Co-Authors Plus
		$author_name = $author->real_display_name?$author->real_display_name:$author->display_name; 
		if(!empty($author_name) && !isset($insert_data[$author_name])){
			$insert_data[$author_name] = array("author" => 1);
		}	
		$author_furigana = $author->furigana;
		if(!empty($author_furigana) && !isset($insert_data[$author_furigana]) ){
			$insert_data[$author_furigana] = array("author" => 1);
		}
	}
	// find author data
	return $insert_data;
}
add_filter('relevanssi_indexing_data', 'skdr_relevanssi_indexing_data', 10, 2);

Ngoài ra, bạn có thể thay đổi dữ liệu với các cột bên dưới, các cột này dùng để tính điểm khi hiển thị kết quả tìm kiếm. Kết hợp với tỉ lệ/trọng số điểm được thiết lập thông số trong màn hình quản lý của plugin sẽ tạo ra điểm số tương ứng.

$fields = array( 'content', 'title', 'comment', 'tag', 'link', 'author', 'category', 'excerpt', 'taxonomy', 'customfield', 'mysqlcolumn' );

Fullstack Station Tips

Chức năng tìm kiếm là chức năng rất quan trọng, mặc dù hiện nay đa phần chúng ta thường dựa vào Google Search, nhưng việc có bộ tìm kiếm nội bộ là rất quan trọng để lọc dữ liệu tìm kiếm theo chủ ý của chúng ta. Mình đã tìm một số plugin về chức năng tìm kiếm nhưng không có cái nào làm mình hài lòng như Relevanssi, mặc dù plugin có bản trả phí hơn 100$ mỗi năm, nhưng với bản miễn phí mình nghĩ là dùng đủ. Nếu có nhu cầu về index văn bản, mình nghĩ bạn nên cân nhắc sử dụng ElasticPress với ElasticSearch.

The post Cải thiện chức năng tìm kiếm trong WordPress với plugin Relevanssivà Co-Authors Plus appeared first on Fullstack Station.

]]>
https://fullstackstation.com/cai-thien-chuc-nang-tim-kiem-trong-wordpress-voi-plugin-relevanssiva-co-authors-plus/feed/ 1
Hướng dẫn cài đặt V8JS cho PHP trên Centos 7 https://fullstackstation.com/huong-dan-cai-dat-v8js-cho-php7-tren-centos/ https://fullstackstation.com/huong-dan-cai-dat-v8js-cho-php7-tren-centos/#respond Tue, 12 Jan 2016 02:06:48 +0000 https://www.businesscard.vn/blog/?p=14 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, […]

The post Hướng dẫn cài đặt V8JS cho PHP trên Centos 7 appeared first on Fullstack Station.

]]>
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.

The post Hướng dẫn cài đặt V8JS cho PHP trên Centos 7 appeared first on Fullstack Station.

]]>
https://fullstackstation.com/huong-dan-cai-dat-v8js-cho-php7-tren-centos/feed/ 0
Xu hướng công nghệ lập trình web và mobile 2016 https://fullstackstation.com/xu-huong-cong-nghe-lap-trinh-web-va-mobile-2016/ https://fullstackstation.com/xu-huong-cong-nghe-lap-trinh-web-va-mobile-2016/#comments Thu, 31 Dec 2015 17:01:50 +0000 https://www.businesscard.vn/blog/?p=34 Xu hướng công nghệ lập trình Xu hướng lập trình thì thường xoay quanh ngôn ngữ lập trình, tuy nhiên trong bài viết này mình tập trung nói về các công nghệ giúp cho việc lập trình dễ dàng hơn như cải thiện tốc độ, chất lượng code cũng như dễ dàng cộng tác, làm […]

The post Xu hướng công nghệ lập trình web và mobile 2016 appeared first on Fullstack Station.

]]>
Xu hướng công nghệ web 2016
Xu hướng công nghệ lập trình web và mobile 2016

Xu hướng công nghệ lập trình

Xu hướng lập trình thì thường xoay quanh ngôn ngữ lập trình, tuy nhiên trong bài viết này mình tập trung nói về các công nghệ giúp cho việc lập trình dễ dàng hơn như cải thiện tốc độ, chất lượng code cũng như dễ dàng cộng tác, làm việc nhóm. Những vấn đề về xu hướng công nghệ lập trình sẽ giúp bạn nâng cao khả năng lập trình cũng như chất lượng dự án.

Môi trường phát triển

  • [Môi trường chạy code, build] VagrantDocker: mặc dù sự phát triển rất mạnh của docker trong năm 2015, nhưng với sự khác biệt giữa Docker và Vagrant thì mỗi môi trường đều sử dụng cho từng mục đích phù hợp. Một số bạn vẫn còn sử dụng máy cá nhân để cài đặt môi trường phát triển vẫn ổn, tuy nhiên sẽ rất khó cộng tác với các thành viên khác trong nhóm vì không thông nhất được môi trường phát triển.  Nếu bạn vẫn chưa sử dụng 1 trong 2 công nghệ này, thì hãy tìm hiểu và áp dụng càng sớm càng tốt nhé. Mình có xu hướng ủng hộ Docker hơn vì tính đa năng và dễ làm việc cộng tác.
  • [Task Runner/Automation] GruntGulp: Cả 2 công cụ này với hàng ngàn plugin hỗ trợ giúp cho việc phát triển lập trình dễ dàng nhanh chóng khi tự động debug, test, build. Mình thiên về Gulp vì việc cấu hình tương tự như ngôn ngữ lập trình chứ không phải Over Configure phức tạp của Grunt.
  • [IDE] Atom, Sublime Text: trước đây mình sử dụng khá nhiều IDE cho việc phát triển, lập trình web như Aptana Studio, Zend Studio, PHP Storm, Text Wrangler nhưng đều không đáp ứng nhu cầu công việc. Hoặc là nặng nề, chậm chạp hoặc thiếu plugin cần thiết, nhưng với Sublime Text thì mình hoàn toàn làm chủ được việc lập trình, Atom thì có xu hướng phát triển mạnh trong năm 2015 vừa rồi tuy khá mạnh mẽ nhưng do còn mới nên lượng plugin không phong phú bằng. Điểm mạnh của Atom là open source/free, nên mình dự đoán khi cộng đồng phát triển nhiều plugin thì sẽ có nhiều lập trình viên sử dụng hơn trong năm 2016 này.

Frontend Javascript Framework

  • Angular Js/2[Beta]: Với lượng fan cực khủng từ 1.x, nên cùng những tính năng nổi trội từ phiên bản 2: nhanh và uyển chuyển, nâng cấp được từ 1.x, có thể render từ server, hỗ trợ TypeScript (chính) & Dart sẽ giúp cho AngularJs/2 tiếp tục củng cố thị phần của mình.
  • React Js: Được sử dụng cho các sản phẩm chính thức của các tên tuổi lớn Facebook, Instagram, Mapbox, Box, Paypal, Reddit… [Xem thêm tại đây], phải nói rằng sự phát triển của ReactJs nhanh hơn rất nhiều so với AngularJs thời đầu [Mặc dù chỉ là phần V trong MVC]. Theo cá nhân mình, ReactJs sẽ tiếp tục phát triển mạnh mẽ trong các năm tiếp theo. Đọc thêm bài React là quyết định của doanh nghiệp, không hẳn là sự lựa chọn do công nghệ.
  • Polymer Project: không nổi tiếng như 2 anh chàng trên, nhưng với xu hướng lập trình web component, Polymer sẽ dần có chỗ đứng vì bản chất là component sẽ giúp cho nó hoạt động 1 cách độc lập không phụ thuộc các frontend framework khác và đặc biệt là hỗ trợ hoàn toàn Material Design

Ngôn ngữ lập trình

  • Javascript: với hi vọng là ngôn ngữ của tất cả, điều này chắc chắn gây tranh cãi :), nhưng… Tuy nhiên với sự ra đời Ecma Script 6(ES6) trong năm vừa rồi, đã đưa javascript lên đẳng cấp mới với những tính năng mới lạ như Arrow, Class, xử lý chuỗi dễ dàng, giá trị tham số (mặc định, không xác định, thông qua phần từ của mảng), Promise, Map, Module… . Những đặc tính của Javascript được sử dụng cho cả browser và server với Nodejs/V8 giúp cho việc sử dụng lại code chung logic cho cả browser và server, giúp cho việc phát triển ứng dụng web chạy nhanh, thời gian phát triển, lập trình nhanh. Với sự hỗ trợ từ V8/V8Js cho PHP, Python… việc thực thi javascript từ server không còn là mảnh đất riêng của Nodejs nữa!
  • PHP 7: được chờ đợi nhất trong năm 2015 của dân lập trình PHP, việc ra đời chính thức phiên bản 7 đã giúp ngôn ngữ PHP nâng cao vị thế với các ngôn ngữ phát triển web như Rails, Python, Java, Nodejs, .Net, … . Với việc thay đổi cấu trúc khai báo hàm (Scalar Type Hints & Return Types) giúp cho PHP thoát kiếp “ngôn ngữ không chặt chẽ”, cùng với sự cải thiện tốc độ gấp đôi so với PHP 5.x đã khiến mình không còn khái niệm nghiên cứu thêm ngôn ngữ khác nhanh hơn nữa. Tuy nhiên một số PHP Framework có thể mất thêm 1 thời gian ngắn nữa để hoàn toàn tương thích với PHP7. Đối với các phiên bản PHP Framework còn hỗ trợ PHP 5.3 thì khả năng sẽ không chạy tốt trên PHP 7, vì PHP 7 đã loại bỏ các hàm deprecated từ PHP 5.3.
  • Swift 3: Sự phát triển ngôn ngữ lập trình iOS mới này sẽ bước lên phiên bản 3 dự kiến vào mùa thu 2016. Với Swift, rõ ràng việc phát triển các sản phẩm cho iOS tiện lợi và nhanh chóng hơn rất nhiều. Mặc dù Objective-C chưa có thông báo hồi kết, nhưng với những đặc tính nổi trội của Swift và cũng như động thái phát triển lên phiên bản 3 đã cho thấy Apple đang tập trung vào Swift rất nhiều. Nếu bạn vẫn đang còn sử dụng Objective-C để phát triển cho iOS, hãy dành thời gian nghiên cứu xu hướng Swift!
  • Sự phát triển ổn định của Python 3, Rails 4, Java thì không có gì đáng chờ đợi trong năm 2016 cả!

React Js/React Native [Mobile/Web/Desktop and …smartWatch or smartTv !!!]

Mình chia React Native ra thành một mục riêng vì đây không phải là một ngôn ngữ lập trình mà là một nền tảng để phát triển sản phẩm di động “native”, web, desktop và… bằng Javascript. Trước đây, để phát triển sản phẩm mobile [iOS/Android] “hybrid” bằng javascript có thể dùng Phonegap/Cordova với một số framework nổi tiếng như Ionic Framework hay Onsen UI, hoặc jQuery Mobile. Tuy nhiên, điểm yếu của Hybrid là tốc độ chậm vì phải thông qua Phonegap/Cordova và không hỗ trợ một vài tính năng native (Ví dụ: với Phonegap/Cordova phải mở Apple Map trong iOS, với React Native thì có thể chạy Apple Map ngay trong chính ứng dụng).

Tất nhiên, React Js và React Native là khác nhau, nhưng sự kết hợp của 2 framework này giúp chúng ta có thể build ứng dụng cho Web, Desktop [Node Webkit], Mobile Native chỉ bằng Javascript, với việc dùng lại code tới 80%, đúng như câu “learn once, write anywhere.” (học một lần, viết mọi nơi). Bạn có thể tham khảo dự án này: Calculate for web, mobile, desktop.

Kết luận

Với những xu hướng công nghệ lập trình web trên có thể cho những lập trình fullstack có thể kiếm thêm thu nhập cho những dự án riêng ngoài thời gian làm việc cho công ty. Riêng mình thì đặc biệt quan tâm nhóm javascript với nhóm “React Js/React Native/Nodejs/Node Webkit”. Nhóm này có thể build ra 1 ứng dụng từ A->Z chỉ với Javascript, đúng với chủ trương của full stack: càng đơn giản càng kiếm được nhiều.

Còn bạn có những xu hướng lập trình gì để chờ đợi trong 2016, hãy chia sẽ với mọi người nhé. Fullstack Station sẽ cố gắng cập nhật những công nghệ fullstack cho các bạn nhanh nhất có thể.

The post Xu hướng công nghệ lập trình web và mobile 2016 appeared first on Fullstack Station.

]]>
https://fullstackstation.com/xu-huong-cong-nghe-lap-trinh-web-va-mobile-2016/feed/ 1
Lập trình viên: nhìn lại năm 2015 https://fullstackstation.com/lap-trinh-vien-nhin-lai-nam-2015/ https://fullstackstation.com/lap-trinh-vien-nhin-lai-nam-2015/#comments Thu, 31 Dec 2015 03:20:58 +0000 https://www.businesscard.vn/blog/?p=112 1. HTTP/2 được chính thức sử dụng (2/2015) HTTP 2 phát triển dựa trên SPDY (pronounced speedy) một giao thức mạng mở được phát triển bởi Google. Sự khác biệt thì rất nhiều nhưng tóm lại sự khác biệt lớn nhất giữa 2 giao thức là: HTTP2 hỗ trợ các truy vấn ghép, nén nội dung, […]

The post Lập trình viên: nhìn lại năm 2015 appeared first on Fullstack Station.

]]>
1. HTTP/2 được chính thức sử dụng (2/2015)

HTTP 2 phát triển dựa trên SPDY (pronounced speedy) một giao thức mạng mở được phát triển bởi Google.

Sự khác biệt thì rất nhiều nhưng tóm lại sự khác biệt lớn nhất giữa 2 giao thức là: HTTP2 hỗ trợ các truy vấn ghép, nén nội dung, ưu tiên và quản lý thông minh hơn các luồng dữ liệu. Điều đó gây ra việc giảm độ trễ và tăng tốc tải nội dung web. Xem thêm tại bài HTTP/2 là gì? Fullstack Station đang sử dụng HTTP/2.

2. Facebook phát hành React Native (3/2015)

React Native có lẽ là ngôi sao lớn nhất của thế giới lập trình trong năm vừa qua khi đạt hơn 24000 stars, 4200 forks, 1700 watch, 4500 commits và trên 450 contributes trên Github chỉ trong 9 tháng. Hiện tại React Native đã hỗ trợ Android và iOS, nếu bạn chưa biết gì về React Native, hãy xem bài viết của mình tại đây.

3. Ecma Script 6 (ES6) chính thức được chấp thuận (6/2015)

Ecma Script 6 hay có tên gọi khác là Ecma Script 2015, là một trong các phiên bản mới nhất của bộ tiêu chuẩn ECMAScript – một bộ đặc tả tiêu chuẩn dành cho Javascript do Hiệp hội các nhà sản xuất máy tính Châu Âu (European Computer Manufacturers AssociationECMA) đề xuất. Phiên bảnECMAScript phổ biến ở thời điểm hiện tại (đầu 2015), và được hầu hết các trình duyệt hỗ trợ là ES5ES5.1 (ra mắt vào khoảng năm 2009 và 2011)

4. PHP phát hành phiên bản 7 chính thức (12/2015)

Là sự kiện được chờ đợi nhất trong cộng đồng lập trình PHP, việc ra đời thế hệ 7 được phát triển từ PHPNG đã giúp PHP tiến một bước dài với việc nâng cao tốc độ thực thi, tính nhất quát và chặt chẽ của code, đưa ra một vài toán tử kiểu mới giúp lập trình nhanh gọn hơn.

5. Facebook và LinkedIn là 2 ngôi sao sáng nhất với các dự án mã nguồn mở trong năm vừa qua:

Các dự án mã nguồn mở của Facebook đạt 10.000 stars trên Github:

  • React: 33,000 stars;
  • React Native: 24,000 stars;
  • Pop: 13,500 stars
  • HHVM: 13,000 stars
  • Immutable.js hơn 10,000 stars.

Không ồn ào và mạnh mẽ như Facebook, nhưng việc LinkedIn mở các dự án của họ thành mã nguồn mở như Pinot, Burrow và Gobblin, và tiến hành cập nhật các dự án Samza, Rest.li, Kafka và Voldemort đã trở thành mã nguồn mở trước đó đã khiến cho cộng đồng lập trình viên đón nhận nồng nhiệt.

6. Microsoft phát hành Microsoft Edge trên Window 10

Hẳn dân lập trình web chẳng ưa gì Internet Explorer, làm được một cái website mà chạy không có lỗi trên IE thật sự là điều không tưởng. Cái sự thật xấu hổ cho Microsoft trong cuộc đua Trình duyệt web có thể chấm dứt từ đây khi ra đời Microsoft Edge, cùng với động thái nâng cấp “miễn phí”  các phiên bản Window 8 lên Window 10, có thể nỗi kinh hoàng của các “web developer” sẽ kết thúc.

 

 

 

The post Lập trình viên: nhìn lại năm 2015 appeared first on Fullstack Station.

]]>
https://fullstackstation.com/lap-trinh-vien-nhin-lai-nam-2015/feed/ 1
Tìm hiểu PHP 7 (Đã phát hành chính thức) https://fullstackstation.com/tim-hieu-php-7/ https://fullstackstation.com/tim-hieu-php-7/#respond Mon, 30 Nov 2015 14:44:05 +0000 https://www.businesscard.vn/blog/?p=72 Bạn có phải là một nhà phát triển web hoặc là chủ của một trang web? Các trang web của bạn có sử dụng các CMS dựa trên PHP như WordPress, Drupal, Joomla hay Magento? Nếu vậy thì tôi có những tin tốt dành cho bạn: PHP 7 tính năng hoàn chỉnh mới được phát […]

The post Tìm hiểu PHP 7 (Đã phát hành chính thức) appeared first on Fullstack Station.

]]>
Bạn có phải là một nhà phát triển web hoặc là chủ của một trang web? Các trang web của bạn có sử dụng các CMS dựa trên PHP như WordPress, Drupal, Joomla hay Magento? Nếu vậy thì tôi có những tin tốt dành cho bạn: PHP 7 tính năng hoàn chỉnh mới được phát hành gần đây. Phiên bản 7.0.0 này chứa rất nhiều tính năng rất tuyệt, vì vậy chúng tôi đã quyết định dành hẳn một bài viết này để nói về nó.

1. Tên là PHP 7 (không phải 6)

Phiên bản ổn định hiện nay đang được sử dụng là phiên bản PHP 5.6. Sau một số tranh luận thì nhóm phát triển đã quyết định họ sẽ bỏ qua cái tên PHP 6 cho phiên bản lớn tiếp theo. PHP 6 đã tồn tại trong quá khứ như một dự án thử nghiệm nhưng không bao giờ đạt đến giai đoạn trở thành một phiên bản hoàn chỉnh.

Để tránh việc người dùng sẽ bị lẫn lộn giữa phiên bản thử nghiệm trước đó và bản phát triển mới nhất này, thì bản phát hành mới sẽ mang tên PHP 7.

PHP 7

2. Sử dụng Zend Engine hoàn toàn mới

Zend engine đã tạo ra sức mạnh cho PHP từ năm 1999 khi nó được giới thiệu với bản phát hành mới PHP 4. Zend – bạn đừng nhầm lẫn với Zend Framework – là một engine thực thi mã nguồn mở được viết bằng C để thông dịch ngôn ngữ PHP. Loạt PHP 5.X hiện tại sử dụngZend Engine II tăng cường chức năng của engine ban đầu, bổ sung thêm một mô hình đối tượng mở rộngnâng cao hiệu suất thực thi đáng kể cho ngôn ngữ này.

PHP 7 có một phiên bản engine hoàn toàn mới có tên gọi là PHP#NG (Next Generation).

PHPNG a new core for PHP 7

3. Tốc độ nhanh gấp hai lần

Ưu điểm dễ nhận biết nhất của engine mới PHPNG là sự cải thiện hiệu suất đáng kể. Đội ngũ phát triển của PHPNG đã tái cấu trúc Zend Engine, đáng chú ý là tối ưu hóa việc sử dụng bộ nhớ và bổ sung thêm một bộ biên dịch just-in-time (JIT) cho phép biên dịch vào thời điểm chạy chứ không phải trước khi thực hiện.

Kết quả thu được ra sao? Bạn có thể thấy bảng so sánh tốc độ thực thi như hình dưới đây được cung cấp bởi Zend Performance Team. Bằng cách sử dụng PHP 7 không chỉ giúp code của bạn thực thi nhanh hơn mà bạn cũng sẽ cần ít máy chủ hơn để phục vụ cùng một số lượng user. Bạn có thể kiểm nghiệm với Fullstack Station, hiện trang web đang sử dụng Nginx/HTTP2 với PHP7.

Tốc độ WordPress trên PHP 7
Tốc độ các framework trên PHP 7

4. Quản lý lỗi dễ dàng hơn

Ít nhất cũng phải nói rằng, việc kiểm soát và có khả năng bắt các fatal error chưa bao giờ là công việc dễ dàng đối với các lập trình viên PHP. Engine Exceptions mới sẽ cho phép bạn thay thế những loại lỗi này với các ngoại lệ (exception). Nếu ngoại lệ không bắt được thì PHP sẽ tiếp tục trả về các fatal error giống như các phiên bản PHP 5.X hiện hành.

Các đối tượng EngineException mới không mở rộng Exception Base Class. Điều này đảm bảo khả năng tương thích ngược và các kết quả từ hai kiểu exception khác nhau trong việc quản lý lỗi: truyền thốngengine exceptions.

Để cho phép các lập trình viên có thể bắt được cả hai, PHP 7 giới thiệu một Parent Classmới dưới cái tên là BaseException.

Quản lý ngoại lệ

5. Hỗ trợ các hệ thống Windows 64-Bit

PHP là một thành viên nổi bật của stack LAMP (Linux – Apache – MySQL – PHP), có nghĩa môi trường gốc của nó là Linux – nhưng bạn cũng có thể chạy nó trên một hệ thống Windows. Các phiên bản PHP 5.X chưa cung cấp số integer 64-bit hoặc hỗ trợ các tập tin lớn, vì vậy cho đến tận bây giờ các bản build x64 đã được coi là thử nghiệm.

PHP 7 sẽ thay đổi điều này với việc giới thiệu nhất quán hỗ trợ 64-bit nghĩa là cả các số nguyên 64-bit và các file lớn sẽ được hỗ trợ, cho phép bạn tự tin chạy ngôn ngữ này trên hệ điều hành Windows 64-bit của bạn trong tương lai.

PHP 7 hỗ trợ Windows 64 bit

6. Các toán tử mới Spaceship và Null Coalescing

Toán tử Spaceship chạy dưới tên chính thức là Combined Comparison Operator (toán tử so sánh kết hợp). Ký hiệu của toán tử mới trông như thế này: <=> (giống như một con tàu vũ trụ đơn giản, nếu bạn chịu khó tưởng tượng).

Toán tử spaceship này trả về 0 nếu cả hai toán hạng bằng nhau, 1 nếu toán hạng bên trái lớn hơn, và -1 nếu toán hạng bên phải lớn hơn. Nó cũng được gọi là một toán tử so sánh three-way, và đã tồn tại trong những ngôn ngữ lập trình phổ biến khác như Perl và Ruby.

Toán tử spaceship

Toán tử Null Coalescing được thể hiện bằng hai dấu chấm hỏi (??). Bạn có thể sử dụng nó khi muốn kiểm tra xem liệu một cái gì đó có tồn tại và trả về một giá trị mặc định hay không. Toán tử coalesce trả về kết quả của toán hạng đầu tiên nếu nó tồn tại và không null, và trả về toán hạng thứ hai trong các trường hợp khác.

Đây là cách mà toán tử mới này giảm được thời gian với những việc khai báo cơ bản:

Toán tử mới của PHP 7

7. Cho phép khai báo kiểu chính xác

Bạn đã bao giờ muốn ngăn chặn các giá trị trả về không mong muốn bằng cách khai báo giá trị trả về của một function? Vâng, bản PHP 7 mới này cho phép các lập trình viên nâng cao chất lượng code của họ với sự giúp đỡ của các khai báo kiểu trả về.

Hình dưới đây mô tả một trường hợp rất đơn giản nơi mà function foo() được giả thiết là trả về một mảng. Bạn hãy tìm thêm những ví dụ phức tạp hơn ở link này nhé!

Định nghĩa kiểu trả về trong PHP 7

Để mở rộng các tính năng này nhiều hơn, PHP 7 giới thiệu 4 kiểu khai báo mới cho các kiểu vô hướng: int, float, stringbool. Những kiểu vô hướng mới này cho phép các lập trình viên biểu thị rằng họ đang mong đợi các giá trị integer, float, string, hoặc boolean được trả về. Các kiểu vô hướng mới được giới thiệu bởi PHP 7 cũng sẽ được hỗ trợ bởi Type Hints cho phép các lập trình viên tập trung vào kiểu của các tham số kể từ các bản PHP 5.X.

8. Bổ sung thêm các class Anonymous

PHP 7 cho phép bạn sử dụng các class vô danh (anonymous), đây là một đặc trưng đã có trong những ngôn ngữ lập trình hướng đối tượng khác như C# và Java. Một class anonymous là một class không có tên. Đối tượng mà nó khởi tạo có cùng chức năng như một đối tượng của một lớp có tên.

Cú pháp giống như chúng ta sử dụng trong các class PHP truyền thống, chỉ có thiếu cái tên class. Nếu các lớp vô danh (anonymous classes) được sử dụng tốt, chúng có thể làm tăng tốc độ thực thi. Các lớp vô danh là tuyệt vời khi một class chỉ được sử dụng một lần trong suốt quá trình thực thi và trong những trường hợp một class không cần phải được ghi tài liệu.

Class vô danh trong PHP 7

9. Thuận tiện khi Imports từ cùng Namespace

Đặc trưng mới Group Use Declarations sẽ là một món quà đáng giá dành cho những ai muốnimport nhiều class từ cùng namespace. Cú pháp mới cắt bỏ sự rườm rà, làm cho code của bạn trở nên gọn gàng và dễ nhìn hơn, và giúp tiết kiệm cho bạn rất nhiều thời gian ngồi gõ code.

Nó cũng sẽ giúp việc đọc code và debug trở nên dễ dàng hơn, việc khai báo sử dụng group giúp bạn xác định các import thuộc về cùng module.

Import cùng namespace trong PHP 7

10. Loại bỏ các chức năng cũ không còn được hỗ trợ

Mục tiêu của PHP 7 là nhằm giải phóng không gian để cho phép phát triển, vì vậy nó là cần thiết để giải thoát khỏi nhiều chức năng bị phản đối và cũ, các Server API và các extension không được hỗ trợ. Nếu bạn muốn xem chi tiết thì hãy click đâyđây nữa nhé!

Tất cả các mục bị gỡ bỏ đã không được tán thành một thời gian trong PHP 5, vì vậy hầu như bạn đã không sử dụng chúng trong một thời gian dài. Tuy nhiên cũng xin lưu ý nếu bạn có một ứng dụng đang chạy kế thừa từ các phiên bản PHP cũ hơn thì bản PHP 7 này có thểsinh ra lỗi trên ứng dụng của bạn.

The post Tìm hiểu PHP 7 (Đã phát hành chính thức) appeared first on Fullstack Station.

]]>
https://fullstackstation.com/tim-hieu-php-7/feed/ 0