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.4.5 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
PHP 8: đợi chờ là hạnh phúc? https://fullstackstation.com/php-8-doi-cho-la-hanh-phuc/ https://fullstackstation.com/php-8-doi-cho-la-hanh-phuc/#comments Tue, 14 May 2019 01:00:23 +0000 http://fullstackstation.com/?p=1628 PHP sẽ được nâng cấp lên phiên bản 8 vào chính xác ngày 23/9/2021, liệu đợi chờ có hạnh phúc khi mà Python và Nodejs đã trở nên quá thịnh hành trong lập trình web những năm vừa qua? Hãy cùng Fullstack Station điểm qua những thành tựu và ngóng chờ tương lai của PHP […]

The post PHP 8: đợi chờ là hạnh phúc? appeared first on Fullstack Station.

]]>
PHP sẽ được nâng cấp lên phiên bản 8 vào chính xác ngày 23/9/2021, liệu đợi chờ có hạnh phúc khi mà Python và Nodejs đã trở nên quá thịnh hành trong lập trình web những năm vừa qua? Hãy cùng Fullstack Station điểm qua những thành tựu và ngóng chờ tương lai của PHP 8 xem như thế nào nhé.

Trước khi tìm hiểu PHP 8, nếu bạn chưa biết PHP 7 có gì mới, thì hãy xem bài này.

Đế chế PHP

PHP là ngôn ngữ lập trình của năm 2004 (theo Tiobe Index), đã trải qua 25 năm (từ 1994) phát triển, chỉ duy nhất 1 lần đạt danh hiệu “Ngôn ngữ lập trình của năm” của Tiobe (tuổi đời PHP>Tiobe), tuy nhiên độ phủ cao với việc luôn nằm trong top 10 ngôn ngữ lập trình được sử dụng và những thành tựu mà PHP mang lại cho lập trình web thật to lớn với 79% website sử dụng PHP (theo w3techs). PHP là một đế chế hùng mạnh!

Những công ty lớn sử dụng PHP

Các công ty Google, Yahoo, Facebook, Wikipedia, WordPress đều sử dụng PHP, và đặc biệt nhất có lẽ là Facebook mạng xã hội lớn nhất hiện nay, sử dụng PHP ngay trong những ngày đầu và đã tạo ra ngôn ngữ Hack tương thích với PHP, và vẫn còn lượng lớn mã code sử dụng PHP cho đến nay.

Liệu PHP có biến mất?

PHP sẽ tồn tại ít nhất 10 năm nữa, mình tin là như vậy. Phải nói PHP giúp chúng ta tạo ra web rất nhanh và cần ít kinh nghiệm, cũng như các điều kiện để vận hành đơn giản nhất. Đó là lý do vì sao các công ty lớn ở trên vẫn còn sử dụng PHP, và khoảng 79% website đang sử dụng PHP, vậy tại sao phải lo PHP sẽ biến mất?

Dù công nghệ nào ra đời, công ty nào ra đời họ cũng cần có 1 website, là bộ mặt, là nơi kết nối mọi người. Hãy nhớ: mạng xã hội chỉ là nơi chia sẽ thông tin tóm lược, website là nơi chứa thông tin chi tiết. Còn website, còn PHP!

So sánh PHP với Node và Python, thì hiện tại Python đang khá mạnh. Tuy nhiên, PHP vẫn hơn Nodejs, và chỉ thua Python không nhiều lắm.

Đế chế PHP sẽ còn tồn tại lâu lắm, nếu bạn còn lập trình PHP thì hãy xem thêm bài “Những lỗi lập trình viên PHP hay mắc phải

PHP 8 sẽ có Just In Time (JIT)

Just In Time (JIT) là gì

“JIT” viết tắt cho Just In Time. JIT là một kĩ thuật giúp hệ thống tối ưu lại những đoạn code.

Jit compiler chạy sau khi chương trình được khởi tạo và biên dịch lại những đoạn code (thường là bytecode hoặc là một dạng tương tự để các Virtual Machine có thể hiểu được) giúp cho ứng dụng chạy nhanh hơn. Jit có thể truy xuất vào các câu truy xuất tại thời điểm “Runtime” trong khi các compiler khác không thể và từ đó chọn lọc được ra những function mà thường xuyên được sử dụng từ đó có thể tối ưu giúp chương trình thực thi hiệu quả và nhanh hơn.

Zeev, một trong những core developer của PHP đã có một demo khá là trực quan cho những gì JIT có thể mang lại.

Tại sao PHP cần JIT

PHP đã phát triển hết mức có thể

Đã có rất nhiều cải tiến cho PHP từ phiên bản 7.0 như tối ưu HashTable (một kiến trúc lưu trữ data trong php), đặc biệt tối ưu Zend VM cho opcodes và nhiều chức năng khác (xem thêm bài tìm hiểu PHP 7). Sau tất cả những cải tiến đó, PHP đã đến cực đại để có thể phát triển thêm. Vì vậy PHP 8 với JIT có thể sẽ là người thay đổi cuộc chơi.

PHP dành cho những tác vụ khác

Nói tới PHP, ta nghĩ ngay tới một ngôn ngữ dành cho phát triển Web. Tuy nhiên, những tác vụ liên quan tới việc tính toán cần sử dụng CPU ở cường độ cao thì ít khi được sử dụng. Với việc đưa vào hỗ trợ JIT, PHP có thể được sử dụng cho nhiều mục đích khác không phải web, có thể tập trung vào CPU nơi mà lợi ích về hiệu năng là rất quan trọng.

Phát triển các tính năng khác cho PHP

Với việc sử dụng JIT, đội ngũ phát triển có thể sử dụng chính PHP để tạo ra các tính năng mới thay vì sử dụng ngôn ngữ C mà không có sự khác biệt quá nhiều về hiệu năng. Điều này giúp cho giảm thiểu sự ảnh hưởng trong việc quản lý bộ nhớ, tràn bộ nhớ và các vấn đề liên quan tương tự khi phát triển dựa trên C.

Cần làm gì để trở thành lập trình viên PHP giỏi?

Vì điều kiện để trở thành lập trình viên PHP tương đối thấp và khả năng triển khai website bằng PHP đơn giản nên thường thì lập trình viên PHP là lập trình viên tồi, vì tính mì ăn liền, đơn giản, uyển chuyển của ngôn ngữ. Nhiều lập trình viên rất ghét PHP, đặc biệt là các bạn từ các ngôn ngữ C, C++, Java, Rust, Go (static typed), hãy “kệ người ta”, đừng bắt con cá leo cây, nó sẽ tưởng mình ngu cả đời, đây là website là đất diễn của PHP. Sau đây là một số tiêu chí và định hướng để trở thành lập trình viên và lập trình viên PHP giỏi mà mình tổng hợp muốn chia sẽ với các bạn.

Kỹ năng lập trình

Kỹ năng lập trình bao gồm thuật toán, cấu trúc và dữ liệu, kiến thức về hệ thống, lập trình hướng đối tượng OOP, kỹ thuật tối ưu, kỹ thuật viết code sạch, sáng sủa, khả năng viết test, unit test. Những kỹ năng này thì lập trình viên cho mảng nào cũng cần (Xem thêm Các chiêu thức trong lập trình).

Cao hơn thì quản lý máy chủ, CI/CD; quản lý, sử dụng vận hành docker, ví dụ sử dụng docker trong môi trường phát triển. Nghiên cứu về bảo mật (xem Công cụ tìm lỗi bảo mật)

Hiểu rõ ngôn ngữ PHP

Bạn cần nắm vững các hàm, cách thức tối ưu trong PHP, hạn chế các lỗi mà lập trình viên PHP hay mắc phải, ví dụ Các lỗi khi làm việc với mysql lập trình viên PHP, hay phân biệt isset(), is_null(), empty().

Phải sử dụng các công cụ như PHPMD, PHPCS để viết code hiệu quả, tăng cường tính dễ đọc, dễ bảo trì, hiệu quả thực thi cho code.

Sử dụng framework hiệu quả

Có rất nhiều PHP Framework như: CodeIgniter, Zend, Symfony, Laravel, Yii,.. cao hơn là CMS như WordPress, Joomla, Drupal… Sử dụng framework hay CMS nào là cái duyên của mỗi người, ví dụ bạn thích mà công ty đang không sử dụng thì cũng chịu. Ví dụ mình chưa bao giờ sử dụng Laravel, hơi sốc khi biết Laravel nắm khoảng ~40% thị phần PHP Framework nhưng tới giờ vẫn chưa có dự án nào dùng Laravel.

Việc biết, sử dụng nhiều framework là không tốt, vì kiến thức bị phân mảnh. Kiến thức từ các framework thực sự khá khác biệt nên khó tận dụng được kinh nghiệm từ framework trước. Bạn cần xác định rõ con đường mình muốn đi ra sao, nếu muốn đi làm việc tại quốc gia nào, thì tìm hiểu framework thịnh hành tại quốc gia đó. Tốt nhất là đừng chạy theo framework, đừng nghe ai đó nói Framework này tốt, cái kia tốt. Tập trung 1 cái thôi, rồi học các kỹ năng lập trình thêm.

Fullstack Station Tip

Có nên học PHP không?

Mình có dự án đầu tiên, công việc đầu tiên và đi làm việc ở Nhật nhờ ngôn ngữ lập trình PHP, tất nhiên đó là câu chuyện của 10 năm trước, nhưng với sự phát triển khá mạnh mẽ của WordPress, công việc bằng ngôn ngữ lập trình PHP sẽ rất nhiều. Ít nhất là hiện tại ở Nhật Bản, PHP vẫn được ưu chuộng và khá dễ kiếm việc.

Vì vậy câu trả lời là có.

Ngoài ra, kế hoạch ra đời PHP 8 minh chứng cho sự phát triển không dừng lại của PHP. Mặc dù trong lĩnh vực không phải là web, thì PHP không thực sự mạnh, nhưng PHP 8 có thể sẽ thay đổi cuộc chơi. PHP 7 được ra mắt đã giúp PHP lấy điểm trở lại trong lĩnh vực lập trình web với tốc độ cải thiện hơn 50% so với 5. PHP 8 sẽ còn nhanh hơn PHP 7, vậy còn gì tuyệt hơn?

Ngày nay, sự phát triển của công nghệ quá nhanh chóng, trào lưu AI và Blockchain nở rộ, việc học PHP có thể được xem như lỗi thời. Nhưng mình nghĩ công nghệ gì cũng cần phải no bụng đã, PHP là lựa chọn không hề tệ để dễ dàng kiếm việc. Việc làm trong AI và Blockchain không hề đơn giản, có thể lương cao, nhưng cạnh tranh cũng rất khốc liệt. Mài dũa kỹ năng lập trình với PHP, rồi học tiếp thêm các ngôn ngữ khác, công nghệ khác tuỳ theo nhu cầu và thời điểm.

Tham khảo

https://react-etc.net/entry/php-8-0-0-release-date-and-jit-status

The post PHP 8: đợi chờ là hạnh phúc? appeared first on Fullstack Station.

]]>
https://fullstackstation.com/php-8-doi-cho-la-hanh-phuc/feed/ 1
GraphQL là gì – Áp dụng như thế nào? https://fullstackstation.com/graphql-la-gi-ap-dung-nhu-the-nao/ https://fullstackstation.com/graphql-la-gi-ap-dung-nhu-the-nao/#comments Tue, 01 Mar 2016 09:21:21 +0000 https://www.businesscard.vn/blog/?p=336 GraphQL là gì? GraphQL là Graph Query Language do Facebook tạo ra từ năm 2012 cung cấp giao thức chung cho phép giao tiếp giữa client và server để cập nhật và lấy dữ liệu. Client truy vấn đến máy chủ GraphQL bằng các truy vấn với đặc điểm: format của dữ liệu trả về […]

The post GraphQL là gì – Áp dụng như thế nào? appeared first on Fullstack Station.

]]>
GraphQL là gì

GraphQL là gì?

GraphQL là Graph Query Language do Facebook tạo ra từ năm 2012 cung cấp giao thức chung cho phép giao tiếp giữa client và server để cập nhật và lấy dữ liệu.

Client truy vấn đến máy chủ GraphQL bằng các truy vấn với đặc điểm: format của dữ liệu trả về được mô tả trong câu truy vấn và được định nghĩa ở phía client thay vì ở server. Nói đơn giản hơn, đây là truy vấn hướng client, cấu trúc dữ liệu không khô cứng 1 khuôn mẫu từ server (REST API) mà thay đổi theo từng ngữ cảnh sao cho hiệu quả nhất đối với client mà chỉ cần dùng duy nhất 1 endpoint.

graphql là gì

Tổng quan GraphQL

Điều quan trọng là GraphQL không phải là một ngôn ngữ truy vấn thực sự, nó chỉ là giao thức giao tiếp giữa client và server, rất cả client (web, mobile) đều có thể giao tiếp với bất kỳ server nào mà sử dụng ngôn ngữ GraphQL.

Khái niệm chính về GraphQL bao gồm:

  • Cấu trúc phân tầng (Hierarchical)
  • Hướng sản phẩm (Product0-centric)
  • Định kiểu mạnh (Strong-typing)
  • Truy vấn hướng client (Client-specified queries)
  • Nội quan (Introspective)

Các bạn có thể đọc thêm ở đây. Tuy nhiên theo mình thì ở mức sử dụng là không cần nghiên cứu tài liệu dài dòng đó.

Chú ý: mấy thuật ngữ trên khá khó để diễn tả, nên các bạn đọc từ từ sẽ hiểu, nếu bạn nào có từ hay vui lòng comment bên dưới bài nhé.

GraphQL giải quyết vấn đề gì

GraphQL khắc phục điểm yếu của của REST API bởi REST có tính chất dựa trên tài nguyên cố định, ví dụ:

GET /articles/1?include=author.name,author.email,likes.user.name

Như truy vấn trên thuộc loại liên kết nhiều bảng, REST API cho articles sẽ xử lý khá nhiều và không được linh động. Đối với GraphQL thì sẽ như sau:

{
  articles(id:1) {
    title,
    content,
    author {
      name,
      email
    },
    likes {
      user {
        name
      }
    } 
  }
}

Với GraphQL, chúng ta quy định chỉ trả về title và content cho article, rất linh động và không bị thừa dữ liệu, hơn nữa cấu trúc trên nhìn khá rõ ràng mạch lạc.

Cũng giống như REST, GraphQL hoàn toàn có thể create, update, delete, nhưng với cấu trúc sáng sủa và cấu trúc phân tầng nên dễ dàng cho lập trình viên phía client.

Có nên áp dụng GraphQL không

Bạn nên áp dụng GraphQL nếu bạn có định hướng phát triển nhiều dòng sản phẩm, vì đặc tính của GraphQL là phục vụ client, nên càng nhiều client thì GraphQL càng tỏ rõ ưu điểm.

The post GraphQL là gì – Áp dụng như thế nào? appeared first on Fullstack Station.

]]>
https://fullstackstation.com/graphql-la-gi-ap-dung-nhu-the-nao/feed/ 3
Top những lỗi lập trình PHP mắc phải khi làm việc với Mysql https://fullstackstation.com/top-nhung-loi-mysql-cua-lap-trinh-vien-php-cu-ma-moi/ https://fullstackstation.com/top-nhung-loi-mysql-cua-lap-trinh-vien-php-cu-ma-moi/#respond Fri, 15 Jan 2016 01:40:49 +0000 https://www.businesscard.vn/blog/?p=268 Bạn có dám chắc là không mắc các lỗi lập trình PHP liệt kê ở đây không? Hãy cùng đọc và nhìn lại dự án của mình nhé. Lỗi lập trình PHP không sử dụng MyISAM, InnoDB đúng lúc MySQL có nhiều engine CSDL, nhưng thường chúng ta hay dùng MyISAM và InnoDB. Từ phiên […]

The post Top những lỗi lập trình PHP mắc phải khi làm việc với Mysql appeared first on Fullstack Station.

]]>
Bạn có dám chắc là không mắc các lỗi lập trình PHP liệt kê ở đây không? Hãy cùng đọc và nhìn lại dự án của mình nhé.

Lỗi lập trình PHP không sử dụng MyISAM, InnoDB đúng lúc

MySQL có nhiều engine CSDL, nhưng thường chúng ta hay dùng MyISAM và InnoDB. Từ phiên bản Mysql 5.5 trở đi, thì InnoDB là engine mặc định được sử dụng. Vì đa phần ngày nay, các mã nguồn mở như diễn đàn, quản trị nội dung viết bằng PHP thường sử dụng InnoDB, tuy nhiên, do MyISAM không hỗ trợ các ràng buộc khóa ngoại và các nghiệp vụ (transaction), nên tốc độ nhanh hơn là InnoDB, vì vậy, không phải là chọn MyISAM hay InnoDB cho toàn bộ các bảng dữ liệu là sự lựa chọn hoàn toàn tốt.

Làm sao cho hiệu quả?

Bạn cần xác định rõ, bảng nào có dùng ràng buộc dữ liệu hay nghiệp vụ transaction thì phải chọn InnoDB, bảng nào chỉ đọc là chính thì nên dùng MyISAM.

Không kiểm tra dữ liệu đầu vào

Có một điều quan trọng cần ghi nhớ đó là “đừng bao giờ tin tưởng vào những gì người sử dụng nhập”. Cần kiểm tra tất cả các chuỗi được nhập vào ở phía PHP server – không dựa trên JavaScript. Các cuộc tấn công SQL injection đơn giản nhất phụ thuộc vào mã ví dụ như:

$username = $_POST["name"]; $password = $_POST["password"]; 
$sql = "SELECT userid FROM usertable WHERE username='$username' AND password='$password';"; // thực thi truy vấn...

Nó có thể bị bẻ khóa khi nhập vào “admin’; –” ở ô username. Chuỗi SQL lúc này sẽ tương đương với:

SELECT userid FROM usertable WHERE username='admin';

Người tấn công có thể login như “admin”; mà không cần phải biết mật khẩu.

Làm sao tránh?

Hãy sử dụng:

  • mysql_real_escape_string() cho biến kiểu chuỗi.
  • intval() cho biến integer.
  • filter_var(). Đây là một hàm rất mạnh được sử dụng nhiều trong những năm gần đây, với các tính năng: xác định tính hợp lệ của dữ liệu, lọc các ký tự không mong muốn.  Xem các loại filter tại đây.

Ví dụ cụ thể:

$validEmail = "contact@fullstackstation.com";
echo filter_var($validEmail, FILTER_VALIDATE_EMAIL);
//contact@fullstackstation.com
$invalidEmail = "contact@.com";
var_dump(filter_var($invalidEmail, FILTER_VALIDATE_EMAIL));
//bool(false)

Bạn thấy ví dụ trên, rất đơn giản để xác định được email có hợp lệ hay không.

Ngoài ra, còn có thêm FILTER_CALLBACK rất hữu dụng cho bạn khi cần lọc các dữ liệu mà PHP không cung cấp bộ lọc phù hợp.

function trimString($value)
{
    return trim($value);
}

$username = filter_var(' you need to trim me ', FILTER_CALLBACK, array('options' => 'trimString'));
echo $username;
//you need to trim me

Không sử dụng UTF-8 đúng chuẩn

Xu hướng toàn cầu hóa khá mạnh mẽ, khiến cho các trang web cần có ít nhất 2 ngôn ngữ: tiếng Anh và ngôn ngữ địa phương như tiếng Việt.

Tất nhiên, sẽ thừa để nói ở đây là nên sử dụng UTF-8! Vì chắc chắc một điều là nếu bạn muốn lập trình website có ngôn ngữ tiếng Việt thì bắt buộc character-set phải là UTF-8 rồi. Nhưng có một điều mà bạn sẽ cần cân nhắc đó là chọn collation nào?

utf8_general_ci, utf8_unicode_ci hay là utf8_bin?

Theo các tài liệu nghiên cứu, thì utf8_general_ci chạy nhanh hơn utf8_unicode_ci, nhưng utf8_unicode_ci phổ (hỗ trợ) nhiều ngôn ngữ hơn. Nếu bạn bắt đầu làm quen với một công ty mới, thiết kế website cho khách hàng ở một quốc gia sử dụng tiếng mà bạn không biết nên dùng collation nào, lời khuyên là hãy dùng utf8_unicode_ci. Chậm mà chắc!

Đối với dự án nào yêu cầu độ tìm kiếm chính xác, hãy sử dụng utf8_bin, vì nó so sánh phân biệt HOA-thường (case-sensitive) còn 2 anh bạn ở trên là case-insensitive. Hơn nữa, nó so sánh mức binary, nên độ chính xác cao hơn là văn bản thường.

Thường ưu tiên hàm PHP hơn hàm SQL

Khi người dùng mới làm quen với MySQL, thì thường xu hướng để giải quyết vấn đề là sử dụng ngôn ngữ mà họ biết. Điều đó có thể dẫn tới những đoạn code không cần thiết và chậm hơn. Ví dụ, thay vì sử dụng phương thức avg() của MySQL thì người dùng lại sử dụng vòng lặp trong PHP để tính giá trị trung bình của tất cả các giá trị trong một tập kết quả trả về. Nhìn chung, nên sử dụng những thế mạnh của CSDL khi phân tích dữ liệu sẽ tạo hiệu quả cao hơn.

Đây là một số hàm, từ khóa hữu ích của Mysql, bạn nên nghiên cứu trước khi dùng bằng PHP:

  • UNION: bạn thường viết cả đống code PHP để lấy dữ liệu thay vì dùng UNION.
  • COUNT: nhớ count 1 tên cột (field) thôi, đừng COUNT(*)
  • MAX, MIN: đừng có lấy cả đống dữ liệu về chỉ để tính min, max
  • AVG: đã nói ở trên
  • RAND: ORDER BY RAND() chẳng hạn, rất hữu dụng đó chứ!
  • CONCAT: kết dữ liệu ngay trên kết quả từ Mysql

Trên đây là một vài kỹ thuật mà nếu mới viết PHP sử dụng Mysql cũng nên học trước, nếu bạn sử dụng hàm php quá nhiều sẽ dẫn đến lỗi lập trình php nhiều hơn và cũng khó phân tách giữa cơ sở dữ liệu và lập trình.

Không tối ưu hóa các truy vấn

99% các vấn đề về hiệu suất trong PHP đều bị gây ra bởi CSDL và các truy vấn tệ có thể làm chậm đi rất nhiều ứng dụng web của chúng ta. MySQL’s EXPLAIN statement, Query Profiler và nhiều công cụ khác có thể giúp chúng ta tìm ra những câu truy vấn không cần thiết.

Thông thường, nếu sử dụng PHP Framework, do phải thiết kế để đáp ứng rất nhiều nhu cầu của rất nhiều dự án khác nhau, nên các framework này không được tối ưu ở phần truy vấn, hoặc không được bật lên ngay từ đầu (bạn cần xem các phần nâng cao của các framework mới thấy). Do vậy, mỗi khi bắt đầu nghiên cứu PHP Framework mới, bạn cần chú ý nhất đến phần Model cơ bản và cả nâng cao. Hơn hết, nhớ khẩu quyết: “Fat Models Skinny Controllers” trong mô hình MVC nhé.

Sử dụng sai kiểu dữ liệu

MySQL cung cấp nhiều kiểu dữ liệu số, chuỗi, thời gian. Nếu chúng ta muốn lưu trữ ngày tháng thì sử dụng kiểu DATE hoặc DATETIME. Nếu sử dụng kiểu INTEGER hoặc STRING sẽ làm cho câu lệnh truy vấn trở nên phức tạp và đôi khi không thể sử dụng được. Hoặc khi bạn lưu địa chỉ IP, có thể thể dùng IP2LONG sau đó lưu vào dữ liệu, cách này tuy tiết kiệm được không gian lưu trữ, nhưng khó quản lý về mặt tìm kiếm.

Người dùng có thể tự định nghĩa kiểu dữ liệu của riêng mình, ví dụ lưu trữ tuần tự (serialized) các đối tượng, mảng PHP trong một chuỗi, để quản lý CSDL dễ dàng hơn, cách này có ưu điểm là có thể mở rộng, lưu trữ được nhiều dữ liệu chỉ trong 1 trường (field) duy nhất, nhưng điểm yếu của nó là khó tìm kiếm. Bạn thường phải sử dụng kiểu dữ liệu TEXT cho dữ liệu tự định nghĩa này, nếu dùng varchar thì ứng dụng bạn sẽ bùm vào một ngày không xa.

Cách sử dụng kiểu dữ liệu varchar cũng cần lưu ý. Nhiều bạn khai báo: username varchar(255) chẳng hạn, mặc dù tuy không sai nhưng cần nhớ thiết lập kiểm soát (validation) rõ ràng. Hoặc trong trường hợp là dùng OAuth, lưu mấy token của mấy anh Facebook, Twitter thì mỗi anh mỗi kiểu, ngắn dài khác nhau, cũng phải đọc tài liệu về định hướng mở rộng tương lai, có thể độ dài chuỗi sẽ khác đó nha. Không riêng gì lỗi lập trình PHP, nếu bạn sử dụng các ngôn ngữ lập trình khác mà không sử đúng loại dữ liệu thì chứng tỏ thiết kế chương trình cũng chưa tốt.

Sử dụng * trong câu truy vấn SELECT, COUNT

Điều tối kỵ là sử dụng * để trả về tất cả các cột trong bảng, hoặc sử dụng tất cả các field chỉ để COUNT. Chúng ta chỉ nên trích xuất dữ liệu mà chúng ta cần.

Cái vụ này thì nói mãi, mà vẫn cứ đầy rẫy lập trình viên dùng đó, đừng có khinh thường nó. Nhưng lỗi lập trình php này thì thường xảy ra đối với các bạn lập trình php hơn vì đa phần là thường mới vào nghề, kinh nghiệm chưa có nhiều nên không để ý những vấn đề này.

Thiếu hoặc thừa chỉ mục

Như một quy luật chung, chỉ mục chỉ được áp dụng cho những cột có tên trong mệnh đề WHERE của câu lệnh truy vấn SELECT. Ví dụ, giả sử chúng ta có một user table với một numeric ID (là khóa chính) và một địa chỉ email. Trong quá trình đăng nhập vào, MySQL phải xác định vị trí đúng của ID bằng cách tìm kiếm một địa chỉ email. Với một chỉ mục, MySQL có thể sử dụng thuật toán tìm kiếm nhanh để xác định vị trí của email gần như ngay lập tức. Nếu không có chỉ mục, MySQL phải kiểm tra từng mẩu tin cho tới khi tìm thấy địa chỉ mail. Thêm chỉ mục là cần thiết, tuy nhiên, chúng lại được tạo lại mỗi khi bảng INSERT hay UPDATE. Điều đó có thể ảnh hưởng đến hiệu suất. Vì vậy, chỉ nên thêm chỉ mục khi nào mà trường đó được sử dụng để so sánh một cách nhiều lần: ví dụ như đăng nhập username/password, hoặc các title của bài viết , còn content thì phải FULL-INDEX (cho mục đích tìm kiếm).

Quên sao lưu dự phòng dữ liệu

Hiếm khi CSDL bị hỏng nhưng cũng phải đề phòng trường hợp này có thể xảy ra. Các ổ đĩa cứng, server hoặc web host có thể ngừng hoạt động. Mất CSDL MySQL của ứng dụng là việc rất nghiêm trọng. Để tránh điều này xảy ra, chúng ta phải đảm bảo thường xuyên sao chép dữ liệu tự động hoặc thủ công.

Mục này nói là lỗi lập trình PHP không thì không đúng, tất cả các ngôn ngữ lập trình khác đều cần sao lưu dữ liệu thường xuyên để tránh điều đáng tiếc xảy ra.

Chưa biết Percona hay MariaDB?

Percona Server: https://www.percona.com/software/mysql-database/percona-server

MariaDB: https://mariadb.org/

Rất nhiều lập trình viên đã chuyển qua sử dụng MariaDB (hoàn toàn tương thích với Mysql), lý do chính là do Oracle đã mua lại Mysql và các bản cập nhật ít hơn, cũng như không mở thảo luận các vấn đề này với cộng đồng. Nói tóm lại, cộng đồng lập trình sử dụng Mysql nhiều là do tính mở của nó! Nếu bạn vẫn còn sử dụng Mysql gốc, đây vẫn được coi là lỗi lập trình php!

Chưa biết NoSQL là gì?

Ah uh, chưa biết Nosql cũng là rào cản của bạn trong xu hướng lập trình hiện nay. NoSQL không giúp cho bạn lập trình tốt hơn, cũng không phải là lỗi lập trình php, nó cũng không có transaction phức tạp, nhưng với NoSQL bạn có thể nghĩ đến việc  mô hình dữ liệu động, uyển chuyển không còn bị ràng buộc trong n field nhất định nữa. Nếu bạn thực sự chưa biết Mysql và Nosql khác biệt như thế nào, hãy tham khảo bảng so sánh này giữa Mysql và Mongo DB (một đại diện của NoSQL).

Tham khảo: http://www.sitepoint.com/mysql-mistakes-php-developers/ (bài viết này có từ 5 năm trước, nhưng giá trị của nó thì vẫn còn nguyên cho các bạn mới bước chân vào giới lập trình PHP)

The post Top những lỗi lập trình PHP mắc phải khi làm việc với Mysql appeared first on Fullstack Station.

]]>
https://fullstackstation.com/top-nhung-loi-mysql-cua-lap-trinh-vien-php-cu-ma-moi/feed/ 0
Giới thiệu hệ thống hỏi đáp, thảo luận Phanbook https://fullstackstation.com/gioi-thieu-thong-hoi-dap-thao-luan-phanbook/ https://fullstackstation.com/gioi-thieu-thong-hoi-dap-thao-luan-phanbook/#comments Sun, 10 Jan 2016 18:07:49 +0000 https://www.businesscard.vn/blog/?p=228 Hệ thống hỏi đáp, thảo luận là gì? Hệ thống hỏi đáp, thảo luận không phải là 1 diễn đàn! Nếu bạn đã là 1 dân IT chính hiệu thì chắc bạn không lạ gì anh chàng StackOverflow, hay là anh chàng tất tần tật Quora. Phanbook chính là một hệ thống đặt câu hỏi, trả lời hay […]

The post Giới thiệu hệ thống hỏi đáp, thảo luận Phanbook appeared first on Fullstack Station.

]]>
Hệ thống hỏi đáp, thảo luận là gì?

Hệ thống hỏi đáp, thảo luận không phải là 1 diễn đàn! Nếu bạn đã là 1 dân IT chính hiệu thì chắc bạn không lạ gì anh chàng StackOverflow, hay là anh chàng tất tần tật Quora. Phanbook chính là một hệ thống đặt câu hỏi, trả lời hay thảo luận một vấn đề gì đó tương tự như StackOverflow.

Nói 1 cách tóm gọn là Câu hỏi & Trả lời (Hỏi & đáp), thảo luận, bình chọn để tìm ra câu trả lời tốt nhất.

Hệ thống hỏi đáp, thảo luận khác gì với diễn đàn?

Điều quan trọng của người sử dụng khi đặt vấn đề là cần câu trả lời 1 cách chính xác và hiệu quả nhất. Đối với diễn đàn, điều này hoàn toàn làm được, nhưng rất là rối, bởi các diễn đàn không có công cụ bình chọn câu trả lời chính xác nhất. Một số diễn đàn chỉnh sửa lại với việc thêm các chức năng: cám ơn, đồng ý, bình chọn…Tuy nhiên, các tính năng này thường không mang lại hiệu quả bởi mục đích của diễn đàn tạo ra không với mục đích đó.

Dạo một vòng quanh các trang website lớn được người dùng đặt câu hỏi nhiều như: VNExpress, Webtretho, Songkhoe, hay các diễn đàn về nghe nhìn như: VNPhoto, Tinh Tế

Các website này được thiết kế ban đầu không dùng cho mục đích đặt câu hỏi và trả lời! Nhưng vì những nội dung hay, phong phú và tập hợp nhiều chuyên gia trong các lĩnh vực liên quan, dẫn đến người sử dụng đặt câu hỏi rất là nhiều, nhưng với độ lớn của dữ liệu ngày càng phình to lên, việc tổng hợp câu hỏi và trả lời với mục đích phục vụ người dùng mới gặp rất nhiều khó khăn. Thật sự là rắc rối nếu muốn tìm ra một câu hỏi đúng ý của mình, cũng như tìm ra câu trả lời chính xác! 🙁

Các hệ thống hỏi đáp, thảo luận mã nguồn mở

Nhìn nhận ra vấn đề này, nhiều bạn đã phát triển ra các hệ thống để giải quyết như: Hỏi đáp 24, Hỏi đáp tiếng AnhTư vấn sức khỏe 24h, Hỏi đáp nhanh 1, Hỏi đáp nhanh 2…

Các trang Hỏi đáp tiếng Anh và Hỏi đáp nhanh có hệ thống bình chọn để biết câu trả lời tốt nhất, có thiết kế tốt vì sử dụng mã nguồn mở Question2Answer, hoặc một số hệ thống hỏi đáp, thảo luận khác như sau:

  • Askbot dựa trên nền tảng Django viết bằng Python và đi theo mô hình giống StackExchange.
  • Discourse – Một mã nguồn hoàn hảo để sử dụng như là website dạng Câu hỏi và trả lời. Mọi chức năng cần thiết dường như đã có sẵn để bạn có thể xây dựng một trang như Stack Overflow hay Quora.
  • LampCMS: Được viết bằng PHP và sử dụng cơ sở dữ liệu MongoDB để để đạt được tốc độ và có khả năng mở rộng tốt. Nó được cấp phép dưới bản quyền LGPL-3.
  • Shapado là mã nguồn viết bằng Ruby.
  • OSQA là một mã nguồn viết bằng Python dựa trên Django tương tự StackExchange.
  • Question2Answer là một mã nguồn viết bằng PHP. Nó rất dễ dàng cài đặt và tùy chỉnh. Họ có cung cấp một số Themes và Plugins mà các nền tảng tương tự không cung cấp.
  • Reddit là mã nguồn của trang web nổi tiếng Reddit. Nơi lý tưởng cho dạng Q&A giống như http://www.reddit.com/r/AskReddit và nó là mã nguồn mở được viêt bằng Python.
  • ThinkUp là mã nguồn viêt bằng PHP. Nó là dạng lưu trữ Q&A kiểu giống luồng như là Twitter và Facebook.
  • Wecenter là mã nguồn của Trung Quốc được viết bằng PHP.
  • Azquestion là mã nguồn của Việt Nam được xây dựng từ MEAN Stack (MongoDB, ExpressJS, AngularJS, NodeJS). Ứng dụng sẽ có các chức năng cơ bản của 1 website hỏi đáp như đăng ký/đăng nhập (hỗ trợ đăng nhập qua facebook, google), đăng câu hỏi, trả lời, vote, follow câu hỏi. Ngoài ra còn hỗ trợ gửi thông báo thời gian thực (realtime) và chat giữa các thành viên thông qua việc sử dụng SocketIO.

Phanbook là gì?

Phanbook là mã nguồn của Việt Nam được viết bằng PHP (PhalconPHP Framework).  Xem demo tại http://meta.phanbook.com/ hoặc http://discourse.phanbook.com/ hoặc video https://www.youtube.com/watch?v=sC8jpfCDGT81

Trong bài viết này, mình không đi sâu vào so sánh Phanbook và các hệ thống khác. Các bạn có thể chọn cho mình một hệ thống phù hợp với khả năng lập trình của bạn (PHP hay Javascript, Python, Ruby), tuy nhiên Phanbook có một số ưu điểm đáng khen như sau:

  • Được xây dựng dựa trên PhalconPHP, là một nền tảng có tốc độ rất nhanh vì được viết bằng C và load như module trong Apache, hoặc PHP-FPM. Nằm trong danh sách Best Php Framework 2015 do Sitepoint bình chọn.
  • Được xây dựng bởi người Việt: bản thân mình không phải cuồng tín “Người VN ưu tiên dùng hàng VN”, nhưng quả thực có rất ít mã nguồn mở đáng giá do chúng ta phát triển. Bản thân PhalconPHP nằm vị trí thấp trong top là bởi vì cấu trúc rất uyển chuyển nên PhalconPHP đòi hỏi lập trình viên có kiến thức về kiến trúc tốt do vậy ít người sử dụng. Nên mình đánh giá cao những bạn tham gia phát triển Phanbook này.
  • Hệ thống hỏi đáp, thảo luận Phanbook có đầy đủ tính năng:
    • Hệ thống tín nhiệm, huy chương cho người tham gia hỏi đáp.
    • Dễ dàng tối ưu Search Engine Optimization
    • Đăng nhập dễ dàng với Single Sign On, Social Login
    • Chống spam
    • Hỗ trợ đa giao diện
    • Hệ thống viết bài hỗ trợ: HTML,  BBCode, Markdown
    • Hỗ trợ  đa ngôn ngữ
    • Cho phép nhận biết sự thay đổi qua từng phiên bản của nội dung
  • Ngoài ra, Phanbook có thêm các tính năng của một hệ thống quản trị nội dung (CMS) và phải nhắc lại là chạy rất nhanh 😀

Ghi chú: mình không phải là thành viên của dự án Phanbook này, cũng như không có mối quan hệ với bất kỳ thành viên nào phát triển dự án này. Đánh giá của mình hoàn toàn khách quan.

Cơ hội nào cho bạn?

Có rất nhiều chủ đề cần hỏi đáp: sức khỏe, pháp luật, hôn nhân & gia đình, công nghệ thông tin, nghe nhìn đa phương tiện. Những lĩnh vực này không thuộc một phạm trù nào cả vì nó có rất nhiều yếu tố chi phối: thời gian, địa điểm, hoàn cảnh, …Nó khác hoàn toàn với diễn đàn, website hỏi đáp thuần túy, hoặc Wiki. Do vậy, nhu cầu là có thật và rất cần thiết để xây dựng 1 sản phẩm hỏi đáp, nhưng đừng ôm đồm nhiều lĩnh vực quá.

Thị trường sản phẩm dành riêng cho người Việt vẫn còn rất nhiều cơ hội để thử sức. Hi vọng qua bài viết này, nếu bạn có ý tưởng về hệ thống hỏi đáp, thảo luận Phanbook sẽ giúp ích được cho bạn.

The post Giới thiệu hệ thống hỏi đáp, thảo luận Phanbook appeared first on Fullstack Station.

]]>
https://fullstackstation.com/gioi-thieu-thong-hoi-dap-thao-luan-phanbook/feed/ 3
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