Hướng dẫn php website structure best practices - các phương pháp hay nhất về cấu trúc trang web php

Chào mừng

Có rất nhiều thông tin lỗi thời trên Web dẫn đầu người dùng PHP mới lạc lối, truyền bá các thông lệ xấu và mã không an toàn. PHP: đúng cách là một tài liệu tham khảo nhanh, dễ đọc cho các tiêu chuẩn mã hóa phổ biến PHP, liên kết đến các hướng dẫn có thẩm quyền trên web và những gì những người đóng góp coi là thực tiễn tốt nhất vào thời điểm hiện tại.

Show

Không có cách thức kinh điển để sử dụng PHP. Trang web này nhằm giới thiệu các nhà phát triển PHP mới về một số chủ đề mà họ có thể không khám phá cho đến khi quá muộn và nhằm mục đích đưa ra một số ý tưởng mới mẻ về những chủ đề mà họ đã làm trong nhiều năm mà không bao giờ xem xét lại. Trang web này cũng sẽ không cho bạn biết công cụ nào sẽ sử dụng, mà thay vào đó cung cấp các đề xuất cho nhiều tùy chọn, khi có thể giải thích sự khác biệt trong cách tiếp cận và trường hợp sử dụng.

Đây là một tài liệu sống và sẽ tiếp tục được cập nhật với nhiều thông tin và ví dụ hữu ích hơn khi chúng có sẵn.

Bản dịch

PHP: Cách đúng được dịch sang nhiều ngôn ngữ khác nhau:

  • Tiếng Anh
  • Español
  • Français
  • Indonesia
  • Ý
  • Polski
  • Bồ Đào Nha làm brasil
  • Român
  • Slovenščina
  • Srpski
  • Türkçe
  • ъ
  • Р р
  • Bạn có thể
  • الع
  • فار
  • ภาษา
  • 한국어판
  • 日本語
  • 简体
  • 繁體

Sách

Phiên bản gần đây nhất của PHP: đúng cách cũng có sẵn ở các định dạng PDF, EPUB và MOBI. Đi đến Leanpub

Làm thế nào để đóng góp

Giúp làm cho trang web này trở thành tài nguyên tốt nhất cho các lập trình viên PHP mới! Đóng góp trên GitHub

Bắt đầu

Sử dụng phiên bản ổn định hiện tại (8.1)

Nếu bạn bắt đầu với PHP, hãy bắt đầu với bản phát hành ổn định hiện tại của PHP 8.1. Php 8.x thêm nhiều tính năng mới trên các phiên bản 7.x và 5.x cũ hơn. Động cơ đã được viết lại phần lớn và PHP hiện thậm chí còn nhanh hơn các phiên bản cũ hơn. Php 8 là bản cập nhật chính của ngôn ngữ và chứa nhiều tính năng và tối ưu hóa mới.

Bạn nên cố gắng nâng cấp lên phiên bản ổn định mới nhất một cách nhanh chóng - Php 7.4 đã kết thúc cuộc đời. Nâng cấp là dễ dàng, vì không có nhiều lần nghỉ tương thích ngược. Nếu bạn không chắc chắn phiên bản nào là một hàm hoặc tính năng, bạn có thể kiểm tra tài liệu PHP trên trang web PHP.NET.

Máy chủ web tích hợp

Với PHP 5.4 trở lên, bạn có thể bắt đầu học PHP mà không cần cài đặt và định cấu hình máy chủ web đầy đủ. Để khởi động máy chủ, hãy chạy lệnh sau từ thiết bị đầu cuối của bạn trong root web dự án của bạn:

> php -S localhost:8000
  • Tìm hiểu về máy chủ Web Line Line được tích hợp

Thiết lập Mac

MacOS được đóng gói sẵn với PHP nhưng thông thường là một chút phía sau bản phát hành ổn định mới nhất. Có nhiều cách để cài đặt phiên bản PHP mới nhất trên macOS.

Cài đặt PHP qua homebrew

Homebrew là một trình quản lý gói cho các macOS giúp bạn dễ dàng cài đặt PHP và các tiện ích mở rộng khác nhau. Kho lưu trữ lõi Homebrew cung cấp các công thức của người Viking cho Php 5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0 và Php 8.1. Cài đặt phiên bản mới nhất với lệnh này:

Bạn có thể chuyển đổi giữa các phiên bản PHP Homebrew bằng cách sửa đổi biến

phpcbf -w --standard=PSR1 file.php
3 của bạn. Ngoài ra, bạn có thể sử dụng Brew-php-Switcher để tự động chuyển phiên phiên bản PHP.

Bạn cũng có thể chuyển đổi giữa các phiên bản PHP theo cách thủ công bằng cách hủy liên kết và liên kết phiên bản mong muốn:

brew unlink php
brew link --overwrite 

brew unlink php
brew link --overwrite 

Cài đặt PHP qua MacPorts

Dự án MacPorts là một sáng kiến ​​cộng đồng nguồn mở để thiết kế một hệ thống dễ sử dụng để biên dịch, cài đặt và nâng cấp một phần mềm lệnh mở, X11 hoặc Aqua trên hệ điều hành OS X.

MacPorts hỗ trợ các nhị phân được biên dịch sẵn, vì vậy bạn không cần phải biên dịch lại mọi phụ thuộc từ các tệp tarball nguồn, nó sẽ cứu cuộc sống của bạn nếu bạn không có gói nào được cài đặt trên hệ thống của bạn.

Tại thời điểm này, bạn có thể cài đặt

phpcbf -w --standard=PSR1 file.php
4,
phpcbf -w --standard=PSR1 file.php
5,
phpcbf -w --standard=PSR1 file.php
6,
phpcbf -w --standard=PSR1 file.php
7,
phpcbf -w --standard=PSR1 file.php
8,
phpcbf -w --standard=PSR1 file.php
9,
php-cs-fixer fix -v --rules=@PSR1 file.php
0,
php-cs-fixer fix -v --rules=@PSR1 file.php
1,
php-cs-fixer fix -v --rules=@PSR1 file.php
2 hoặc
php-cs-fixer fix -v --rules=@PSR1 file.php
3

sudo port install php74
sudo port install php81

Và bạn có thể chạy lệnh

php-cs-fixer fix -v --rules=@PSR1 file.php
5 để chuyển PHP hoạt động của mình:

sudo port select --set php php81

Cài đặt PHP qua PHPBrew

PHPBrew là một công cụ để cài đặt và quản lý nhiều phiên bản PHP. Điều này có thể thực sự hữu ích nếu hai ứng dụng/dự án khác nhau yêu cầu các phiên bản PHP khác nhau và bạn không sử dụng máy ảo.

Cài đặt PHP thông qua trình cài đặt nhị phân Liip

Một tùy chọn phổ biến khác là php-osx.liip.ch cung cấp một phương thức cài đặt lớp lót cho các phiên bản 5.3 đến 7.3. Nó không ghi đè lên các nhị phân PHP do Apple cài đặt, nhưng cài đặt mọi thứ ở một vị trí riêng biệt (/usr/local/PHP5).

Biên dịch từ nguồn

Một tùy chọn khác cho phép bạn kiểm soát phiên bản PHP bạn cài đặt, là tự biên dịch nó. Trong trường hợp đó, hãy chắc chắn đã cài đặt các công cụ dòng lệnh của Xcode hoặc Apple thay thế cho XCode có thể tải xuống từ Trung tâm phát triển Apple Apple Mac.

Trình cài đặt tất cả trong một

Các giải pháp được liệt kê ở trên chủ yếu tự xử lý PHP và không cung cấp những thứ như Apache, Nginx hoặc máy chủ SQL. Các giải pháp tất cả trong một trong một như MAMP và XAMPP sẽ cài đặt các phần mềm khác này cho bạn và gắn kết tất cả chúng lại với nhau, nhưng dễ dàng thiết lập đi kèm với sự đánh đổi tính linh hoạt.

cài đặt Windows

Bạn có thể tải xuống các nhị phân từ windows.php.net/doad. Sau khi trích xuất PHP, nên đặt đường dẫn vào gốc của thư mục PHP của bạn (nơi đặt PHP.exe) để bạn có thể thực thi PHP từ bất cứ đâu.

Để học tập và phát triển cục bộ, bạn có thể sử dụng máy chủ web tích hợp với PHP 5.4+, vì vậy bạn không cần phải lo lắng về việc định cấu hình nó. Nếu bạn muốn có một mạng lưới tất cả trong một, bao gồm một máy chủ web toàn diện và MySQL cũng vậy, các công cụ như XAMPP, EasyPhp, OpenServer và Wamp sẽ giúp đưa môi trường phát triển Windows tăng nhanh và chạy nhanh. Điều đó nói rằng, các công cụ này sẽ khác một chút so với sản xuất, vì vậy hãy cẩn thận với sự khác biệt về môi trường nếu bạn đang làm việc trên Windows và triển khai đến Linux.

Nếu bạn cần chạy hệ thống sản xuất của mình trên Windows, thì IIS7 sẽ cung cấp cho bạn hiệu suất ổn định và tốt nhất. Bạn có thể sử dụng PHPManager (một plugin GUI cho IIS7) để tạo cấu hình và quản lý PHP đơn giản. IIS7 đi kèm với fastcgi được tích hợp và sẵn sàng để đi, bạn chỉ cần định cấu hình PHP như một người xử lý. Để hỗ trợ và tài nguyên bổ sung, có một khu vực chuyên dụng trên IIS.NET cho PHP.

Nói chung, việc chạy ứng dụng của bạn trên các môi trường khác nhau trong phát triển và sản xuất có thể dẫn đến các lỗi kỳ lạ xuất hiện khi bạn phát hành. Nếu bạn đang phát triển trên Windows và triển khai đến Linux (hoặc bất cứ thứ gì không phải là cửa sổ) thì bạn nên xem xét sử dụng máy ảo.

Chris Tankersley có một bài đăng trên blog rất hữu ích về những công cụ anh ấy sử dụng để thực hiện phát triển PHP bằng Windows.

Cấu trúc thư mục chung

Một câu hỏi phổ biến trong số những người bắt đầu với các chương trình viết cho web là, tôi đặt đồ của mình ở đâu? Trong những năm qua, câu trả lời này đã liên tục là nơi mà

php-cs-fixer fix -v --rules=@PSR1 file.php
6 là. Mặc dù câu trả lời này chưa hoàn thành, nhưng nó là một nơi tuyệt vời để bắt đầu.

Vì lý do bảo mật, các tệp cấu hình không thể truy cập được bởi khách truy cập trang web; Do đó, các tập lệnh công khai được lưu trong một thư mục công cộng và cấu hình riêng và dữ liệu được lưu bên ngoài thư mục đó.

Đối với mỗi nhóm, CMS hoặc Framework One hoạt động, một cấu trúc thư mục tiêu chuẩn được sử dụng bởi mỗi thực thể đó. Tuy nhiên, nếu một người đang bắt đầu một dự án một mình, việc biết cấu trúc hệ thống tập tin nào sẽ sử dụng có thể gây khó khăn.

Paul M. Jones đã thực hiện một số nghiên cứu tuyệt vời về các thực tiễn phổ biến của hàng chục ngàn dự án GitHub trong lĩnh vực PHP. Ông đã biên soạn một cấu trúc tệp và thư mục tiêu chuẩn, bộ xương gói PHP tiêu chuẩn, dựa trên nghiên cứu này. Trong cấu trúc thư mục này,

php-cs-fixer fix -v --rules=@PSR1 file.php
6 nên trỏ đến
php-cs-fixer fix -v --rules=@PSR1 file.php
8, các bài kiểm tra đơn vị phải nằm trong thư mục
php-cs-fixer fix -v --rules=@PSR1 file.php
9 và các thư viện của bên thứ ba, được cài đặt bởi nhà soạn nhạc, thuộc thư mục
> php -i
0. Đối với các tệp và thư mục khác, tuân thủ bộ xương gói PHP tiêu chuẩn sẽ có ý nghĩa nhất đối với những người đóng góp của một dự án.

Hướng dẫn kiểu mã

Cộng đồng PHP rất lớn và đa dạng, bao gồm vô số thư viện, khung và các thành phần. Thông thường các nhà phát triển PHP chọn một số trong số này và kết hợp chúng thành một dự án duy nhất. Điều quan trọng là mã PHP tuân thủ (càng gần càng tốt) với kiểu mã chung để giúp các nhà phát triển dễ dàng trộn và kết hợp các thư viện khác nhau cho các dự án của họ.

Nhóm Interop Framework đã đề xuất và phê duyệt một loạt các đề xuất phong cách. Không phải tất cả chúng đều liên quan đến kiểu mã, mà là những người là PSR-1, PSR-12 và PSR-4. Những khuyến nghị này chỉ là một bộ quy tắc mà nhiều dự án như Drupal, Zend, Symfony, Laravel, CakePHP, PHPBB, AWS SDK, Fuelphp, Lithium, v.v. đang áp dụng. Bạn có thể sử dụng chúng cho các dự án của riêng bạn hoặc tiếp tục sử dụng phong cách cá nhân của riêng bạn.

Lý tưởng nhất, bạn nên viết mã PHP tuân thủ một tiêu chuẩn đã biết. Đây có thể là bất kỳ sự kết hợp nào của PSR, hoặc một trong các tiêu chuẩn mã hóa được thực hiện bởi Pear hoặc Zend. Điều này có nghĩa là các nhà phát triển khác có thể dễ dàng đọc và làm việc với mã của bạn và các ứng dụng triển khai các thành phần có thể có tính nhất quán ngay cả khi làm việc với nhiều mã của bên thứ ba.

  • Đọc về PSR-1
  • Đọc về PSR-12
  • Đọc về PSR-4
  • Đọc về tiêu chuẩn mã hóa quả lê
  • Đọc về các tiêu chuẩn mã hóa Symfony

Bạn có thể sử dụng PHP_CodesNiffer để kiểm tra mã chống lại bất kỳ một trong các đề xuất này và các plugin cho các trình chỉnh sửa văn bản như văn bản siêu phàm để được cung cấp phản hồi thời gian thực.

Bạn có thể tự động sửa bố cục mã bằng cách sử dụng một trong các công cụ sau:

  • Một là trình sửa lỗi tiêu chuẩn mã hóa PHP có cơ sở mã được thử nghiệm rất tốt.
  • Ngoài ra, công cụ làm đẹp và sửa lỗi mã PHP được bao gồm trong PHP_CodesNiffer có thể được sử dụng để điều chỉnh mã của bạn cho phù hợp.

Và bạn có thể chạy phpcs theo cách thủ công từ shell:

phpcs -sw --standard=PSR1 file.php

Nó sẽ hiển thị lỗi và mô tả cách khắc phục chúng. Nó cũng có thể hữu ích để đưa lệnh này vào một cái móc git. Bằng cách đó, các nhánh có chứa vi phạm đối với tiêu chuẩn đã chọn không thể vào kho lưu trữ cho đến khi các vi phạm đó đã được khắc phục.

Nếu bạn có PHP_CodesNiffer, thì bạn có thể khắc phục các vấn đề về bố cục mã được báo cáo bởi nó, tự động, với trình làm đẹp và bộ sửa lỗi của mã PHP.

phpcbf -w --standard=PSR1 file.php

Một tùy chọn khác là sử dụng Trình sửa tiêu chuẩn mã hóa PHP. Nó sẽ cho thấy loại lỗi nào mà cấu trúc mã đã có trước khi nó sửa chúng.

php-cs-fixer fix -v --rules=@PSR1 file.php

Tiếng Anh được ưa thích cho tất cả các tên biểu tượng và cơ sở hạ tầng mã. Nhận xét có thể được viết bằng bất kỳ ngôn ngữ nào dễ đọc bởi tất cả các bên hiện tại và tương lai, những người có thể đang làm việc trên cơ sở mã.

Cuối cùng, một tài nguyên bổ sung tốt để viết mã PHP sạch là mã sạch PHP.

Nổi bật về ngôn ngữ

Mô hình lập trình

PHP là một ngôn ngữ linh hoạt, năng động, hỗ trợ nhiều kỹ thuật lập trình. Nó đã phát triển đáng kể trong những năm qua, đáng chú ý là thêm một mô hình hướng đối tượng vững chắc trong Php 5.0 (2004), các hàm ẩn danh và không gian tên trong PHP 5.3 (2009), và các đặc điểm trong Php 5.4 (2012).

Lập trình hướng đối tượng

PHP có một tập hợp rất đầy đủ các tính năng lập trình hướng đối tượng bao gồm hỗ trợ cho các lớp, các lớp trừu tượng, giao diện, kế thừa, nhà xây dựng, nhân bản, ngoại lệ, v.v.

  • Đọc về PHP hướng đối tượng
  • Đọc về các đặc điểm

Lập trình chức năng

PHP hỗ trợ các chức năng hạng nhất, có nghĩa là một hàm có thể được gán cho một biến. Cả hai chức năng do người dùng xác định và tích hợp có thể được tham chiếu bởi một biến và được gọi linh hoạt. Các chức năng có thể được truyền dưới dạng đối số cho các chức năng khác (một tính năng gọi là các hàm bậc cao hơn) và các chức năng có thể trả về các chức năng khác.

Recursion, một tính năng cho phép một hàm tự gọi, được hỗ trợ bởi ngôn ngữ, nhưng hầu hết mã PHP đều tập trung vào lặp.

Các chức năng ẩn danh mới (với hỗ trợ đóng cửa) có mặt kể từ Php 5.3 (2009).

Php 5.4 đã thêm khả năng liên kết đóng cửa với phạm vi đối tượng và cũng được cải thiện hỗ trợ cho các thiết bị gọi để chúng có thể được sử dụng thay thế cho các chức năng ẩn danh trong hầu hết các trường hợp.

  • Tiếp tục đọc về lập trình chức năng trong PHP
  • Đọc về các chức năng ẩn danh
  • Đọc về lớp đóng cửa
  • Thêm chi tiết trong việc đóng cửa RFC
  • Đọc về các thiết bị gọi
  • Đọc về các chức năng gọi động với
    > php -i
    1

Lập trình meta

PHP hỗ trợ các hình thức lập trình meta khác nhau thông qua các cơ chế như API phản xạ và phương pháp ma thuật. Có nhiều phương pháp ma thuật có sẵn như

> php -i
2,
> php -i
3,
> php -i
4,
> php -i
5,
> php -i
6, v.v. cho phép các nhà phát triển kết nối với hành vi của lớp. Các nhà phát triển Ruby thường nói rằng PHP đang thiếu
> php -i
7, nhưng nó có sẵn là
> php -i
8 và
> php -i
9.

  • Đọc về Phương pháp ma thuật
  • Đọc về sự phản ánh
  • Đọc về quá tải

Không gian tên

Như đã đề cập ở trên, cộng đồng PHP có rất nhiều nhà phát triển tạo ra nhiều mã. Điều này có nghĩa là một mã PHP thư viện có thể sử dụng cùng tên lớp như tên khác. Khi cả hai thư viện được sử dụng trong cùng một không gian tên, chúng va chạm và gây rắc rối.

Không gian tên giải quyết vấn đề này. Như được mô tả trong Hướng dẫn tham khảo PHP, các không gian tên có thể được so sánh với các thư mục hệ điều hành mà các tệp tên gọi; Hai tệp có cùng tên có thể cùng tồn tại trong các thư mục riêng biệt. Tương tự như vậy, hai lớp PHP có cùng tên có thể cùng tồn tại trong các không gian tên PHP riêng biệt. Nó đơn giản như vậy.

Điều quan trọng là bạn phải đặt tên mã của bạn để nó có thể được sử dụng bởi các nhà phát triển khác mà không sợ va chạm với các thư viện khác.

Một cách được đề xuất để sử dụng các không gian tên được nêu trong PSR-4, nhằm mục đích cung cấp một tệp tiêu chuẩn, quy ước lớp và không gian tên tiêu chuẩn để cho phép mã cắm và chơi.

Vào tháng 10 năm 2014, PHP-FIG đã không sử dụng tiêu chuẩn tự động tải trước: PSR-0. Cả PSR-0 và PSR-4 vẫn có thể sử dụng hoàn toàn. Loại thứ hai yêu cầu PHP 5.3, vì vậy nhiều dự án chỉ dành cho PHP 5.2 thực hiện PSR-0.

Nếu bạn sẽ sử dụng một tiêu chuẩn tự động tải cho một ứng dụng hoặc gói mới, hãy xem vào PSR-4.

  • Đọc về các không gian tên
  • Đọc về PSR-0
  • Đọc về PSR-4

Thư viện PHP tiêu chuẩn

Thư viện PHP tiêu chuẩn (SPL) được đóng gói với PHP và cung cấp một bộ sưu tập các lớp và giao diện. Nó được tạo thành chủ yếu từ các lớp cơ sở hạ tầng thường cần thiết (ngăn xếp, xếp hàng, đống, v.v.) và các trình lặp có thể đi qua các cơ sở dữ liệu này hoặc các lớp của riêng bạn thực hiện giao diện SPL.

  • Đọc về SPL
  • Khóa học video SPL trên Lynda.com (đã trả tiền)

Giao diện dòng lệnh

PHP được tạo để viết các ứng dụng web, nhưng cũng hữu ích cho các chương trình giao diện dòng lệnh (CLI). Các chương trình PHP dòng lệnh có thể giúp tự động hóa các tác vụ phổ biến như kiểm tra, triển khai và quản trị ứng dụng.

Các chương trình CLI PHP rất mạnh mẽ vì bạn có thể sử dụng mã ứng dụng của mình trực tiếp mà không phải tạo và bảo mật GUI web cho nó. Chỉ cần chắc chắn không đặt các tập lệnh CLI PHP của bạn vào Root Web công khai của bạn!not to put your CLI PHP scripts in your public web root!

Thử chạy PHP từ dòng lệnh của bạn:

> php -i

Tùy chọn


if ($argc !== 2) {
    echo "Usage: php hello.php " . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
0 sẽ in cấu hình PHP của bạn giống như hàm

if ($argc !== 2) {
    echo "Usage: php hello.php " . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
1.

Tùy chọn


if ($argc !== 2) {
    echo "Usage: php hello.php " . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
2 cung cấp một vỏ tương tác, tương tự như vỏ tương tác Ruby, IRB hoặc Python. Có một số tùy chọn dòng lệnh hữu ích khác, quá.

Hãy cùng viết một chương trình đơn giản, xin chào, $ tên CLI. Để dùng thử, hãy tạo một tệp có tên


if ($argc !== 2) {
    echo "Usage: php hello.php " . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
3, như dưới đây.


if ($argc !== 2) {
    echo "Usage: php hello.php " . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;

PHP thiết lập hai biến đặc biệt dựa trên các đối số mà tập lệnh của bạn được chạy.


if ($argc !== 2) {
    echo "Usage: php hello.php " . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
4 là một biến số nguyên chứa số lượng đối số và

if ($argc !== 2) {
    echo "Usage: php hello.php " . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
5 là một biến mảng chứa mỗi giá trị đối số. Đối số đầu tiên luôn là tên của tệp tập lệnh PHP của bạn, trong trường hợp này là

if ($argc !== 2) {
    echo "Usage: php hello.php " . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
3.

Biểu thức


if ($argc !== 2) {
    echo "Usage: php hello.php " . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
7 được sử dụng với số khác không để cho shell biết rằng lệnh không thành công. Mã thoát thường được sử dụng có thể được tìm thấy ở đây.

Để chạy tập lệnh của chúng tôi, ở trên, từ dòng lệnh:

brew unlink php
brew link --overwrite 
0
  • Tìm hiểu về việc chạy PHP từ dòng lệnh

Xdebug

Một trong những công cụ hữu ích nhất trong phát triển phần mềm là trình gỡ lỗi thích hợp. Nó cho phép bạn theo dõi việc thực thi mã của bạn và giám sát nội dung của ngăn xếp. XDebug, trình gỡ lỗi PHP, có thể được sử dụng bởi các IDE khác nhau để cung cấp các điểm dừng và kiểm tra ngăn xếp. Nó cũng có thể cho phép các công cụ như PHPunit và Kcachegrind thực hiện phân tích bảo hiểm mã và hồ sơ mã.

Nếu bạn thấy mình bị ràng buộc, sẵn sàng dùng đến ____ 98/________ 99, và bạn vẫn có thể tìm thấy giải pháp - có lẽ bạn cần sử dụng trình gỡ lỗi.

Cài đặt XDebug có thể khó khăn, nhưng một trong những tính năng quan trọng nhất của nó là gỡ lỗi từ xa - nếu bạn phát triển mã cục bộ và sau đó kiểm tra nó bên trong VM hoặc trên một máy chủ khác, việc gỡ lỗi từ xa là tính năng mà bạn sẽ muốn bật ngay lập tức.

Theo truyền thống, bạn sẽ sửa đổi tệp apache vhost hoặc .htaccess của bạn với các giá trị này:

brew unlink php
brew link --overwrite 
1

Máy chủ từ xa của người dùng từ xa và cổng từ xa sẽ tương ứng với máy tính cục bộ của bạn và cổng mà bạn định cấu hình IDE của mình để nghe. Sau đó, nó chỉ là vấn đề đưa IDE của bạn vào chế độ Lắng nghe cho các kết nối và tải URL:

brew unlink php
brew link --overwrite 
2

IDE của bạn bây giờ sẽ chặn trạng thái hiện tại khi tập lệnh thực thi, cho phép bạn đặt các điểm dừng và thăm dò các giá trị trong bộ nhớ.

Debuggers đồ họa giúp nó rất dễ dàng để bước qua mã, kiểm tra các biến và mã eval so với thời gian chạy trực tiếp. Nhiều IDE có hỗ trợ dựa trên plugin hoặc plugin để gỡ lỗi đồ họa với XDebug. MACGDBP là một GUI XDebug độc lập miễn phí, nguồn mở, độc lập cho Mac.

  • Tìm hiểu thêm về xdebug
  • Tìm hiểu thêm về MACGDBP

Quản lý phụ thuộc

Có rất nhiều thư viện PHP, khung và các thành phần để lựa chọn. Dự án của bạn có thể sẽ sử dụng một số trong số đó - đây là những phụ thuộc dự án. Cho đến gần đây, PHP không có cách tốt để quản lý các phụ thuộc dự án này. Ngay cả khi bạn quản lý chúng theo cách thủ công, bạn vẫn phải lo lắng về máy tự động tải. Đó không còn là một vấn đề.

Hiện tại có hai hệ thống quản lý gói chính cho PHP - nhà soạn nhạc và lê. Nhà soạn nhạc hiện là người quản lý gói phổ biến nhất cho PHP, tuy nhiên trong một thời gian dài, Pear là người quản lý gói chính được sử dụng. Biết lịch sử Pear, là một ý tưởng tốt, vì bạn vẫn có thể tìm thấy các tài liệu tham khảo cho nó ngay cả khi bạn không bao giờ sử dụng nó.

Nhà soạn nhạc và Packagist

Nhà soạn nhạc là Trình quản lý phụ thuộc được đề xuất cho PHP. Liệt kê các phụ thuộc dự án của bạn trong một tệp

brew unlink php
brew link --overwrite 
00 và, với một vài lệnh đơn giản, nhà soạn nhạc sẽ tự động tải xuống các phụ thuộc dự án của bạn và tự động tải thiết lập cho bạn. Nhà soạn nhạc tương tự như NPM trong thế giới Node.js, hoặc Bundler trong thế giới Ruby.

Có rất nhiều thư viện PHP tương thích với nhà soạn nhạc và sẵn sàng để được sử dụng trong dự án của bạn. Các gói này được liệt kê trên Packagist, kho lưu trữ chính thức cho các thư viện PHP tương thích với nhà soạn nhạc.

Cách cài đặt Trình soạn thảo

Cách an toàn nhất để tải xuống nhà soạn nhạc là làm theo các hướng dẫn chính thức. Điều này sẽ xác minh trình cài đặt không bị hỏng hoặc giả mạo. Trình cài đặt cài đặt nhị phân

brew unlink php
brew link --overwrite 
01 trong thư mục làm việc hiện tại của bạn.

Chúng tôi khuyên bạn nên cài đặt trình soạn thảo trên toàn cầu (ví dụ: một bản sao duy nhất trong

brew unlink php
brew link --overwrite 
02). Để làm như vậy, hãy chạy lệnh này tiếp theo:

brew unlink php
brew link --overwrite 
3

LƯU Ý: Nếu trên không thành công do quyền, tiền tố với

brew unlink php
brew link --overwrite 
03. If the above fails due to permissions, prefix with
brew unlink php
brew link --overwrite 
03.

Để chạy một nhà soạn nhạc được cài đặt cục bộ, bạn đã sử dụng

brew unlink php
brew link --overwrite 
04, trên toàn cầu, nó chỉ đơn giản là ____105.

Cài đặt trên Windows

Đối với người dùng Windows, cách dễ nhất để đứng dậy và chạy là sử dụng trình cài đặt Composersetup, thực hiện cài đặt toàn cầu và thiết lập

brew unlink php
brew link --overwrite 
06 của bạn để bạn có thể gọi
brew unlink php
brew link --overwrite 
05 từ bất kỳ thư mục nào trong dòng lệnh của bạn.

Cách xác định và cài đặt các phụ thuộc

Nhà soạn nhạc theo dõi các phụ thuộc dự án của bạn trong một tệp có tên

brew unlink php
brew link --overwrite 
00. Bạn có thể quản lý nó bằng tay nếu bạn thích hoặc sử dụng chính nhà soạn nhạc. Lệnh
brew unlink php
brew link --overwrite 
09 sẽ thêm sự phụ thuộc của dự án và nếu bạn không có tệp
brew unlink php
brew link --overwrite 
00, sẽ được tạo. Dưới đây, một ví dụ bổ sung Twig như một sự phụ thuộc của dự án của bạn.

brew unlink php
brew link --overwrite 
4

Ngoài ra, lệnh

brew unlink php
brew link --overwrite 
11 sẽ hướng dẫn bạn thông qua việc tạo tệp
brew unlink php
brew link --overwrite 
00 đầy đủ cho dự án của bạn. Dù bằng cách nào, một khi bạn đã tạo tệp
brew unlink php
brew link --overwrite 
00 của mình, bạn có thể yêu cầu nhà soạn nhạc tải xuống và cài đặt các phụ thuộc của bạn vào thư mục
> php -i
0. Điều này cũng áp dụng cho các dự án mà bạn đã tải xuống đã cung cấp tệp
brew unlink php
brew link --overwrite 
00:

brew unlink php
brew link --overwrite 
5

Tiếp theo, thêm dòng này vào ứng dụng của bạn tệp PHP chính của bạn; Điều này sẽ yêu cầu PHP sử dụng trình tải tự động của Composer cho các phụ thuộc dự án của bạn.

brew unlink php
brew link --overwrite 
6

Bây giờ bạn có thể sử dụng các phụ thuộc dự án của mình và chúng sẽ được tự động tải theo yêu cầu.

Cập nhật sự phụ thuộc của bạn

Nhà soạn nhạc tạo một tệp có tên

brew unlink php
brew link --overwrite 
16 lưu trữ phiên bản chính xác của mỗi gói mà nó đã tải xuống khi bạn lần đầu tiên chạy
brew unlink php
brew link --overwrite 
17. Nếu bạn chia sẻ dự án của mình với những người khác, hãy đảm bảo tệp
brew unlink php
brew link --overwrite 
16 được bao gồm, để khi họ chạy
brew unlink php
brew link --overwrite 
17, họ sẽ nhận được các phiên bản giống như bạn. Để cập nhật các phụ thuộc của bạn, hãy chạy
brew unlink php
brew link --overwrite 
20. Don Tiết sử dụng
brew unlink php
brew link --overwrite 
20 khi triển khai, chỉ
brew unlink php
brew link --overwrite 
17, nếu không bạn có thể kết thúc với các phiên bản gói khác nhau khi sản xuất.

Điều này hữu ích nhất khi bạn xác định các yêu cầu phiên bản của bạn một cách linh hoạt. Chẳng hạn, yêu cầu phiên bản của

brew unlink php
brew link --overwrite 
23 có nghĩa là bất cứ thứ gì mới hơn
brew unlink php
brew link --overwrite 
24, nhưng ít hơn
brew unlink php
brew link --overwrite 
25. Bạn cũng có thể sử dụng ký tự đại diện
brew unlink php
brew link --overwrite 
26 như trong
brew unlink php
brew link --overwrite 
27. Bây giờ, lệnh của nhà soạn nhạc ____ ____120 sẽ nâng cấp tất cả các phụ thuộc của bạn lên phiên bản mới nhất phù hợp với các hạn chế mà bạn xác định.

Cập nhật thông báo

Để nhận thông báo về phát hành phiên bản mới, bạn có thể đăng ký thư viện.

Kiểm tra sự phụ thuộc của bạn cho các vấn đề bảo mật

Trình kiểm tra bảo mật PHP cục bộ là một công cụ dòng lệnh, sẽ kiểm tra tệp

brew unlink php
brew link --overwrite 
16 của bạn và cho bạn biết nếu bạn cần cập nhật bất kỳ phụ thuộc nào của bạn.

Xử lý các phụ thuộc toàn cầu với nhà soạn nhạc

Nhà soạn nhạc cũng có thể xử lý các phụ thuộc toàn cầu và nhị phân của chúng. Việc sử dụng là thẳng, tất cả những gì bạn cần làm là tiền tố lệnh của bạn với

brew unlink php
brew link --overwrite 
30. Ví dụ, nếu bạn muốn cài đặt phpunit và có sẵn trên toàn cầu, bạn sẽ chạy lệnh sau:

brew unlink php
brew link --overwrite 
7

Điều này sẽ tạo ra một thư mục

brew unlink php
brew link --overwrite 
31 trong đó các phụ thuộc toàn cầu của bạn cư trú. Để có sẵn các gói được cài đặt, các nhị phân có sẵn ở mọi nơi, bạn đã thêm thư mục
brew unlink php
brew link --overwrite 
32 vào biến
brew unlink php
brew link --overwrite 
06 của bạn.

  • Tìm hiểu về nhà soạn nhạc

Một người quản lý gói kỳ cựu mà một số nhà phát triển PHP thích là lê. Nó hoạt động tương tự như nhà soạn nhạc, nhưng có một số khác biệt đáng chú ý.

Pear yêu cầu mỗi gói phải có một cấu trúc cụ thể, điều đó có nghĩa là tác giả của gói phải chuẩn bị cho việc sử dụng với lê. Sử dụng một dự án không được chuẩn bị để làm việc với lê là không thể.

Pear cài đặt các gói trên toàn cầu, có nghĩa là sau khi cài đặt chúng khi chúng có sẵn cho tất cả các dự án trên máy chủ đó. Điều này có thể tốt nếu nhiều dự án dựa vào cùng một gói với cùng một phiên bản nhưng có thể dẫn đến các vấn đề nếu phiên bản xung đột giữa hai dự án phát sinh.

Cách cài đặt lê

Bạn có thể cài đặt PEAR bằng cách tải xuống trình cài đặt

brew unlink php
brew link --overwrite 
34 và thực hiện nó. Tài liệu lê có hướng dẫn cài đặt chi tiết cho mọi hệ điều hành.

Nếu bạn đang sử dụng Linux, bạn cũng có thể xem Trình quản lý gói phân phối của bạn. Debian và Ubuntu, chẳng hạn, có gói

brew unlink php
brew link --overwrite 
35 APT.

Cách cài đặt gói

Nếu gói được liệt kê trong danh sách gói lê, bạn có thể cài đặt nó bằng cách chỉ định tên chính thức:

brew unlink php
brew link --overwrite 
8

Nếu gói được lưu trữ trên một kênh khác, bạn cần phải

brew unlink php
brew link --overwrite 
36 kênh trước và cũng chỉ định nó khi cài đặt. Xem các tài liệu sử dụng kênh để biết thêm thông tin về chủ đề này.

  • Tìm hiểu về lê

Xử lý phụ thuộc lê với nhà soạn nhạc

Nếu bạn đã sử dụng Composer và bạn cũng muốn cài đặt một số mã lê, bạn có thể sử dụng trình soạn thảo để xử lý các phụ thuộc lê của mình. Ví dụ này sẽ cài đặt mã từ

brew unlink php
brew link --overwrite 
37:

brew unlink php
brew link --overwrite 
9

Phần đầu tiên

brew unlink php
brew link --overwrite 
38 sẽ được sử dụng để cho nhà soạn nhạc biết rằng nó nên khởi tạo (hoặc khám phá ra trong thuật ngữ PEAR) The Pear repo. Sau đó, phần
brew unlink php
brew link --overwrite 
39 sẽ tiền tố tên gói như thế này:

pear-channel/Package

Tiền tố của Pear Pear, được mã hóa cứng để tránh mọi xung đột, vì kênh lê có thể giống như tên nhà cung cấp gói khác, sau đó tên ngắn kênh (hoặc URL đầy đủ) có thể được sử dụng để tham khảo kênh nào.

Khi mã này được cài đặt, nó sẽ có sẵn trong thư mục nhà cung cấp của bạn và tự động có sẵn thông qua trình tải tự động của nhà soạn nhạc:

vendor/pear-pear2.php.net/PEAR2_HTTP_Request/pear2/HTTP/Request.php

Để sử dụng gói lê này, chỉ cần tham chiếu nó như vậy:

brew unlink php
brew link --overwrite 
0
  • Tìm hiểu thêm về việc sử dụng lê với nhà soạn nhạc

Thực hành mã hóa

Những thứ cơ bản

PHP là một ngôn ngữ rộng lớn cho phép các lập trình viên ở tất cả các cấp khả năng sản xuất mã không chỉ nhanh chóng mà còn hiệu quả. Tuy nhiên, trong khi tiến bộ qua ngôn ngữ, chúng ta thường quên những điều cơ bản mà chúng ta đã học (hoặc bỏ qua) để ủng hộ những cắt ngắn và/hoặc thói quen xấu. Để giúp chống lại vấn đề chung này, phần này nhằm mục đích nhắc nhở các lập trình viên về các thực tiễn mã hóa cơ bản trong PHP.

  • Tiếp tục đọc về những điều cơ bản

Ngày và giờ

PHP có một lớp có tên DateTime để giúp bạn khi đọc, viết, so sánh hoặc tính toán theo ngày và giờ. Có nhiều chức năng liên quan đến ngày và thời gian trong PHP bên cạnh DateTime, nhưng nó cung cấp giao diện hướng đối tượng đẹp cho các mục đích sử dụng phổ biến nhất. DateTime có thể xử lý các múi giờ, nhưng đó nằm ngoài phạm vi của phần giới thiệu ngắn này.

Để bắt đầu làm việc với DateTime, hãy chuyển đổi chuỗi ngày và thời gian RAW thành một đối tượng bằng phương thức nhà máy

brew unlink php
brew link --overwrite 
40 hoặc làm
brew unlink php
brew link --overwrite 
41 để có được ngày và thời gian hiện tại. Sử dụng phương thức
brew unlink php
brew link --overwrite 
42 để chuyển đổi DateTime trở lại chuỗi cho đầu ra.

brew unlink php
brew link --overwrite 
1

Tính toán với DateTime là có thể với lớp DateInterval. DateTime có các phương thức như

brew unlink php
brew link --overwrite 
43 và
brew unlink php
brew link --overwrite 
44 lấy DateInterVal làm đối số. Không viết mã mong đợi cùng một số giây mỗi ngày. Cả tiết kiệm ánh sáng ban ngày và thay đổi múi giờ sẽ phá vỡ giả định đó. Sử dụng khoảng thời gian ngày thay thế. Để tính toán chênh lệch ngày sử dụng phương pháp
brew unlink php
brew link --overwrite 
45. Nó sẽ trả về DateInterval mới, siêu dễ hiển thị.

brew unlink php
brew link --overwrite 
2

Bạn có thể sử dụng so sánh tiêu chuẩn trên các đối tượng DateTime:

brew unlink php
brew link --overwrite 
3

Một ví dụ cuối cùng để chứng minh lớp Dateperiod. Nó được sử dụng để lặp lại các sự kiện định kỳ. Nó có thể lấy hai đối tượng DateTime, bắt đầu và kết thúc và khoảng thời gian mà nó sẽ trả về tất cả các sự kiện ở giữa.

brew unlink php
brew link --overwrite 
4

Một phần mở rộng API PHP phổ biến là carbon. Nó kế thừa mọi thứ trong lớp DateTime, do đó liên quan đến các thay đổi mã tối thiểu, nhưng các tính năng bổ sung bao gồm hỗ trợ nội địa hóa, cách thêm để thêm, trừ và định dạng một đối tượng DateTime, cộng với một phương tiện để kiểm tra mã của bạn bằng cách mô phỏng ngày và thời gian bạn chọn.

  • Đọc về DateTime
  • Đọc về định dạng ngày (tùy chọn chuỗi định dạng ngày được chấp nhận)

Mô hình thiết kế

Khi bạn đang xây dựng ứng dụng của mình, việc sử dụng các mẫu chung trong mã và các mẫu phổ biến của bạn rất hữu ích cho cấu trúc tổng thể của dự án của bạn. Sử dụng các mẫu phổ biến là hữu ích vì nó giúp quản lý mã của bạn dễ dàng hơn nhiều và cho phép các nhà phát triển khác nhanh chóng hiểu mọi thứ phù hợp với nhau.

Nếu bạn sử dụng một khung thì hầu hết các mã cấp cao hơn và cấu trúc dự án sẽ dựa trên khung đó, vì vậy rất nhiều quyết định mẫu được đưa ra cho bạn. Nhưng vẫn tùy thuộc vào bạn để chọn ra các mẫu tốt nhất để theo dõi trong mã bạn xây dựng trên đỉnh của khung. Mặt khác, nếu bạn không sử dụng khung để xây dựng ứng dụng của mình thì bạn phải tìm các mẫu phù hợp nhất với loại và kích thước của ứng dụng mà bạn xây dựng.

Bạn có thể tìm hiểu thêm về các mẫu thiết kế PHP và xem các ví dụ làm việc tại:

https://designpatternsphp.readthedocs.io/

Làm việc với UTF-8

Phần này ban đầu được viết bởi Alex Cabal tại các thực tiễn tốt nhất của PHP và đã được sử dụng làm cơ sở cho lời khuyên UTF-8 của chúng tôi.

Không có người nào. Hãy cẩn thận, chi tiết, và nhất quán.

Ngay bây giờ PHP không hỗ trợ Unicode ở mức thấp. Có nhiều cách để đảm bảo rằng các chuỗi UTF-8 được xử lý OK, nhưng nó không dễ dàng và nó đòi hỏi phải đào vào hầu hết các cấp của ứng dụng web, từ HTML đến SQL đến PHP. Chúng tôi sẽ nhắm đến một bản tóm tắt ngắn gọn, thực tế.

UTF-8 ở cấp độ PHP

Các hoạt động chuỗi cơ bản, như kết hợp hai chuỗi và gán chuỗi cho các biến, don don cần bất cứ điều gì đặc biệt cho UTF-8. Tuy nhiên, hầu hết các chức năng chuỗi, như

brew unlink php
brew link --overwrite 
46 và
brew unlink php
brew link --overwrite 
47, không cần xem xét đặc biệt. Các chức năng này thường có đối tác
brew unlink php
brew link --overwrite 
48: ví dụ,
brew unlink php
brew link --overwrite 
49 và
brew unlink php
brew link --overwrite 
50. Các chuỗi
brew unlink php
brew link --overwrite 
48 này được cung cấp cho bạn thông qua tiện ích mở rộng chuỗi Multibyte và được thiết kế đặc biệt để hoạt động trên các chuỗi Unicode.

Bạn phải sử dụng các chức năng

brew unlink php
brew link --overwrite 
48 bất cứ khi nào bạn hoạt động trên chuỗi Unicode. Ví dụ: nếu bạn sử dụng
brew unlink php
brew link --overwrite 
53 trên chuỗi UTF-8, thì có một cơ hội tốt, kết quả sẽ bao gồm một số nhân vật nửa bị cắt xén. Chức năng chính xác để sử dụng sẽ là đối tác Multibyte,
brew unlink php
brew link --overwrite 
54.

Phần khó là nhớ sử dụng các hàm

brew unlink php
brew link --overwrite 
48 mọi lúc. Nếu bạn quên thậm chí chỉ một lần, chuỗi unicode của bạn có cơ hội bị cắt xén trong quá trình xử lý tiếp theo.

Không phải tất cả các hàm chuỗi đều có đối tác

brew unlink php
brew link --overwrite 
48. Nếu có một người cho những gì bạn muốn làm, thì bạn có thể không gặp may.

Bạn nên sử dụng hàm

brew unlink php
brew link --overwrite 
57 ở đầu mỗi tập lệnh PHP bạn viết (hoặc ở đầu tập lệnh bao gồm toàn cầu của bạn) và hàm
brew unlink php
brew link --overwrite 
58 ngay sau khi tập lệnh của bạn xuất ra trình duyệt. Xác định rõ ràng việc mã hóa các chuỗi của bạn trong mỗi kịch bản sẽ giúp bạn tiết kiệm rất nhiều đau đầu trên đường.

Ngoài ra, nhiều hàm PHP hoạt động trên các chuỗi có tham số tùy chọn cho phép bạn chỉ định mã hóa ký tự. Bạn phải luôn luôn chỉ ra rõ ràng UTF-8 khi được cung cấp tùy chọn. Ví dụ:

brew unlink php
brew link --overwrite 
59 có tùy chọn mã hóa ký tự và bạn phải luôn chỉ định UTF-8 nếu xử lý các chuỗi đó. Lưu ý rằng kể từ Php 5.4.0, UTF-8 là mã hóa mặc định cho
brew unlink php
brew link --overwrite 
59 và
brew unlink php
brew link --overwrite 
61.

Cuối cùng, nếu bạn đang xây dựng một ứng dụng phân tán và không thể chắc chắn rằng tiện ích mở rộng

brew unlink php
brew link --overwrite 
62 sẽ được bật, thì hãy xem xét sử dụng gói nhà soạn nhạc Symfony/PolyFill-MBString. Điều này sẽ sử dụng
brew unlink php
brew link --overwrite 
62 nếu nó có sẵn và quay trở lại các chức năng không UTF-8 nếu không.

UTF-8 ở cấp cơ sở dữ liệu

Nếu tập lệnh PHP của bạn truy cập MySQL, thì có một cơ hội chuỗi của bạn có thể được lưu trữ dưới dạng chuỗi không UTF-8 trong cơ sở dữ liệu ngay cả khi bạn tuân theo tất cả các biện pháp phòng ngừa ở trên.

Để đảm bảo các chuỗi của bạn đi từ PHP sang MySQL dưới dạng UTF-8, hãy đảm bảo cơ sở dữ liệu và bảng của bạn được đặt thành bộ và đối chiếu ký tự

brew unlink php
brew link --overwrite 
64 và bạn sử dụng ký tự
brew unlink php
brew link --overwrite 
64 trong chuỗi kết nối PDO. Xem mã ví dụ bên dưới. Điều này là cực kỳ quan trọng.

Lưu ý rằng bạn phải sử dụng bộ ký tự

brew unlink php
brew link --overwrite 
64 để hỗ trợ UTF-8 hoàn chỉnh, không phải bộ ký tự
brew unlink php
brew link --overwrite 
67! Xem đọc thêm cho lý do tại sao.

UTF-8 ở cấp trình duyệt

Sử dụng chức năng

brew unlink php
brew link --overwrite 
58 để đảm bảo rằng tập lệnh PHP của bạn xuất các chuỗi UTF-8 cho trình duyệt của bạn.

Trình duyệt sau đó sẽ cần được trả lời bởi phản hồi HTTP rằng trang này nên được coi là UTF-8. Ngày nay, người ta thường đặt bộ ký tự trong tiêu đề phản hồi HTTP như thế này:

brew unlink php
brew link --overwrite 
5

Cách tiếp cận lịch sử để thực hiện điều đó là bao gồm thẻ Charset

brew unlink php
brew link --overwrite 
69 trong thẻ trang của bạn ____ ____170.

brew unlink php
brew link --overwrite 
6

đọc thêm

  • Hướng dẫn sử dụng PHP: Hoạt động chuỗi
  • Hướng dẫn sử dụng PHP: Chức năng chuỗi
    • brew unlink php
      brew link --overwrite 
      
      46
    • brew unlink php
      brew link --overwrite 
      
      47
    • brew unlink php
      brew link --overwrite 
      
      53
  • Hướng dẫn sử dụng PHP: Chức năng chuỗi đa
    • brew unlink php
      brew link --overwrite 
      
      49
    • brew unlink php
      brew link --overwrite 
      
      50
    • brew unlink php
      brew link --overwrite 
      
      54
    • brew unlink php
      brew link --overwrite 
      
      57
    • brew unlink php
      brew link --overwrite 
      
      58
    • brew unlink php
      brew link --overwrite 
      
      59
    • brew unlink php
      brew link --overwrite 
      
      61
  • Stack Overflow: Những yếu tố nào làm cho php unicode không tương thích?
  • Stack Overflow: Thực tiễn tốt nhất trong PHP và MySQL với chuỗi quốc tế
  • Cách hỗ trợ toàn bộ Unicode trong cơ sở dữ liệu MySQL
  • Mang Unicode đến PHP với UTF-8 di động
  • Stack Overflow: DomDocument LoadHTML không mã hóa UTF-8 một cách chính xác

Quốc tế hóa (I18N) và nội địa hóa (L10N)

Tuyên bố miễn trừ trách nhiệm cho người mới đến: I18N và L10N là chữ số, một loại viết tắt trong đó các số được sử dụng để rút ngắn các từ - trong trường hợp của chúng tôi, quốc tế hóa trở thành i18n và nội địa hóa, l10n.

Trước hết, chúng ta cần xác định hai khái niệm tương tự và những điều liên quan khác:

  • Quốc tế hóa là khi bạn tổ chức mã của mình để nó có thể được điều chỉnh theo các ngôn ngữ hoặc vùng khác nhau mà không cần tái cấu trúc. Hành động này thường được thực hiện một lần - tốt nhất là vào đầu dự án, nếu không bạn có thể sẽ cần một số thay đổi lớn trong nguồn! is when you organize your code so it can be adapted to different languages or regions without refactorings. This action is usually done once - preferably, at the beginning of the project, or else you will probably need some huge changes in the source!
  • Nội địa hóa xảy ra khi bạn điều chỉnh giao diện (chủ yếu) bằng cách dịch nội dung, dựa trên công việc i18N được thực hiện trước đó. Nó thường được thực hiện mỗi khi một ngôn ngữ hoặc khu vực mới cần hỗ trợ và được cập nhật khi các phần giao diện mới được thêm vào, vì chúng cần có sẵn trong tất cả các ngôn ngữ được hỗ trợ. happens when you adapt the interface (mainly) by translating contents, based on the i18n work done before. It usually is done every time a new language or region needs support and is updated when new interface pieces are added, as they need to be available in all supported languages.
  • Số nhiều xác định các quy tắc cần thiết giữa các ngôn ngữ riêng biệt để tương tác với các chuỗi và bộ đếm. Chẳng hạn, trong tiếng Anh khi bạn chỉ có một mục, nó là số ít và bất cứ thứ gì khác với đó được gọi là số nhiều; Số nhiều trong ngôn ngữ này được biểu thị bằng cách thêm một s sau một số từ, và đôi khi thay đổi các phần của nó. Trong các ngôn ngữ khác, chẳng hạn như tiếng Nga hoặc tiếng Serbia, có hai dạng số nhiều ngoài số ít - bạn thậm chí có thể tìm thấy các ngôn ngữ với tổng số bốn, năm hoặc sáu dạng, như tiếng Slovenia, Ailen hoặc tiếng Ả Rập. defines the rules required between distinct languages to interoperate strings containing numbers and counters. For instance, in English when you have only one item, it is singular, and anything different from that is called plural; plural in this language is indicated by adding an S after some words, and sometimes changes parts of it. In other languages, such as Russian or Serbian, there are two plural forms in addition to the singular - you may even find languages with a total of four, five or six forms, such as Slovenian, Irish or Arabic.

Những cách phổ biến để thực hiện

Cách dễ nhất để quốc tế hóa phần mềm PHP là sử dụng các tệp mảng và sử dụng các chuỗi đó trong các mẫu, chẳng hạn như

brew unlink php
brew link --overwrite 
81. Tuy nhiên, cách này hầu như không được khuyến nghị cho các dự án nghiêm túc, vì nó đặt ra một số vấn đề bảo trì dọc theo đường - một số có thể xuất hiện ngay từ đầu, chẳng hạn như đa nguyên. Vì vậy, xin vui lòng, hãy thử điều này nếu dự án của bạn sẽ chứa nhiều hơn một vài trang.

Cách cổ điển nhất và thường được coi là tài liệu tham khảo cho I18N và L10N là một công cụ UNIX có tên

brew unlink php
brew link --overwrite 
82. Nó có từ năm 1995 và vẫn là một triển khai hoàn chỉnh để dịch phần mềm. Nó đủ dễ dàng để chạy, trong khi vẫn thể thao các công cụ hỗ trợ mạnh mẽ. Đó là về gettext chúng ta sẽ nói chuyện ở đây. Ngoài ra, để giúp bạn không bị lộn xộn đối với dòng lệnh, chúng tôi sẽ trình bày một ứng dụng GUI tuyệt vời có thể được sử dụng để dễ dàng cập nhật nguồn L10N của bạn.

Các công cụ khác

Có những thư viện phổ biến được sử dụng hỗ trợ GetText và các triển khai khác của I18N. Một số trong số chúng có vẻ dễ dàng hơn để cài đặt hoặc thể thao các tính năng bổ sung hoặc định dạng tệp i18n. Trong tài liệu này, chúng tôi tập trung vào các công cụ được cung cấp với Core PHP, nhưng ở đây chúng tôi liệt kê các công cụ khác để hoàn thành:

  • AURA/INTL: Cung cấp các công cụ quốc tế hóa (I18N), dịch mã thông điệp mỗi địa phương theo định hướng gói. Nó sử dụng các định dạng mảng cho tin nhắn. Không cung cấp trình trích xuất tin nhắn, nhưng không cung cấp định dạng tin nhắn nâng cao thông qua tiện ích mở rộng
    brew unlink php
    brew link --overwrite 
    
    83 (bao gồm cả các tin nhắn số nhiều).
  • Oscarotero/GetText: Hỗ trợ GetText với giao diện OO; Bao gồm các chức năng trợ giúp được cải tiến, trình trích xuất mạnh mẽ cho một số định dạng tệp (một số trong số chúng không được hỗ trợ bởi lệnh
    brew unlink php
    brew link --overwrite 
    
    82) và cũng có thể xuất sang các định dạng khác ngoài các tệp
    brew unlink php
    brew link --overwrite 
    
    85. Có thể hữu ích nếu bạn cần tích hợp các tệp dịch của mình vào các phần khác của hệ thống, như giao diện JavaScript.
  • Symfony/Dịch: Hỗ trợ rất nhiều định dạng khác nhau, nhưng khuyên bạn nên sử dụng Verbose Xliff. Không bao gồm các chức năng trợ giúp cũng như một trình trích xuất tích hợp, nhưng hỗ trợ các trình giữ chỗ bằng cách sử dụng
    brew unlink php
    brew link --overwrite 
    
    86 trong nội bộ.
  • laminas/laminas-i18n: hỗ trợ các tệp mảng và ini hoặc định dạng gettext. Thực hiện một lớp bộ nhớ đệm để cứu bạn khỏi việc đọc hệ thống tập tin mỗi lần. Nó cũng bao gồm Trợ lý xem và bộ lọc và trình xác nhận đầu vào nhận biết địa phương. Tuy nhiên, nó không có trình trích xuất tin nhắn.

Các khung khác cũng bao gồm các mô -đun I18N, nhưng chúng không có sẵn bên ngoài cơ sở mã của chúng:

  • Laravel hỗ trợ các tệp mảng cơ bản, không có trình trích xuất tự động nhưng bao gồm trình trợ giúp
    brew unlink php
    brew link --overwrite 
    
    87 cho các tệp mẫu.
  • YII hỗ trợ mảng, getText và dịch dựa trên cơ sở dữ liệu và bao gồm một trình trích xuất tin nhắn. Nó được hỗ trợ bởi tiện ích mở rộng
    brew unlink php
    brew link --overwrite 
    
    88, có sẵn từ Php 5.3 và dựa trên dự án ICU; Điều này cho phép YII chạy các thay thế mạnh mẽ, như đánh vần các số, ngày định dạng, thời gian, khoảng thời gian, tiền tệ và thứ tự.

Nếu bạn quyết định truy cập một trong các thư viện không cung cấp trình trích xuất, bạn có thể muốn sử dụng các định dạng getText, vì vậy bạn có thể sử dụng công cụ gettext gốc (bao gồm cả poEdit) như được mô tả trong phần còn lại của chương.

GetText

Cài đặt

Bạn có thể cần cài đặt GetText và thư viện PHP liên quan bằng cách sử dụng trình quản lý gói của bạn, như

brew unlink php
brew link --overwrite 
89 hoặc
brew unlink php
brew link --overwrite 
90. Sau khi được cài đặt, bật nó bằng cách thêm
brew unlink php
brew link --overwrite 
91 (Linux/UNIX) hoặc
brew unlink php
brew link --overwrite 
92 (Windows) vào
brew unlink php
brew link --overwrite 
93 của bạn.

Ở đây chúng tôi cũng sẽ sử dụng PoEdit để tạo các tệp dịch. Bạn có thể sẽ tìm thấy nó trong Trình quản lý gói hệ thống của bạn; Nó có sẵn cho Unix, Mac và Windows và cũng có thể được tải xuống miễn phí trên trang web của họ.

Kết cấu

Các loại tệp

Có ba tập tin bạn thường xử lý khi làm việc với GetText. Các tệp chính là các tệp PO (đối tượng di động) và MO (đối tượng máy), đầu tiên là danh sách các đối tượng dịch có thể đọc được và thứ hai, nhị phân tương ứng sẽ được GetText giải thích khi thực hiện nội địa hóa. Ngoài ra, còn có một tệp POT (mẫu), chỉ đơn giản là chứa tất cả các khóa hiện có từ các tệp nguồn của bạn và có thể được sử dụng làm hướng dẫn để tạo và cập nhật tất cả các tệp PO. Các tệp mẫu đó không bắt buộc: tùy thuộc vào công cụ bạn đang sử dụng để làm L10N, bạn có thể chỉ hoạt động tốt chỉ với các tệp PO/MO. Bạn sẽ luôn có một cặp tệp PO/MO cho mỗi ngôn ngữ và vùng, nhưng chỉ có một nồi mỗi tên miền.

Miền

Có một số trường hợp, trong các dự án lớn, nơi bạn có thể cần phân tách các bản dịch khi cùng một từ truyền đạt ý nghĩa khác nhau được đưa ra một bối cảnh. Trong những trường hợp đó, bạn chia chúng thành các lĩnh vực khác nhau. Về cơ bản, chúng được đặt tên là các nhóm các tệp POT/PO/MO, trong đó tên tệp là miền dịch nói trên. Các dự án vừa và nhỏ thường, để đơn giản, chỉ sử dụng một miền; Tên của nó là tùy ý, nhưng chúng tôi sẽ sử dụng các loại chính cho các mẫu mã của chúng tôi. Ví dụ, trong các dự án Symfony, các tên miền được sử dụng để phân tách bản dịch cho các thông báo xác thực.

Mã địa phương

Một ngôn ngữ chỉ đơn giản là một mã xác định một phiên bản của ngôn ngữ. Nó được xác định theo thông số kỹ thuật ISO 639-1 và ISO 3166-1 Alpha-2: hai chữ cái chữ thường cho ngôn ngữ, tùy chọn theo sau là một dòng chữ và hai chữ cái trên xác định mã quốc gia hoặc mã khu vực. Đối với các ngôn ngữ hiếm, ba chữ cái được sử dụng.

Đối với một số người nói, phần đất nước có vẻ dư thừa. Trên thực tế, một số ngôn ngữ có phương ngữ ở các quốc gia khác nhau, chẳng hạn như tiếng Đức Áo (

brew unlink php
brew link --overwrite 
94) hoặc tiếng Bồ Đào Nha Brazil (
brew unlink php
brew link --overwrite 
95). Phần thứ hai được sử dụng để phân biệt giữa các phương ngữ đó - khi nó không có mặt, nó được coi là một phiên bản ngôn ngữ chung của ngôn ngữ.

Cấu trúc thư mục

Để sử dụng GetText, chúng ta sẽ cần phải tuân thủ một cấu trúc cụ thể của các thư mục. Đầu tiên, bạn sẽ cần chọn một gốc tùy ý cho các tệp L10N của mình trong kho lưu trữ nguồn của bạn. Bên trong nó, bạn sẽ có một thư mục cho mỗi địa phương cần thiết và một thư mục

brew unlink php
brew link --overwrite 
96 cố định sẽ chứa tất cả các cặp PO/MO của bạn. Thí dụ:

brew unlink php
brew link --overwrite 
7

Hình thức số nhiều

Như chúng tôi đã nói trong phần giới thiệu, các ngôn ngữ khác nhau có thể thể hiện các quy tắc số nhiều khác nhau. Tuy nhiên, GetText cứu chúng ta khỏi rắc rối này một lần nữa. Khi tạo một tệp

brew unlink php
brew link --overwrite 
97 mới, bạn sẽ phải khai báo các quy tắc số nhiều cho ngôn ngữ đó và các phần được dịch có tính nhạy cảm với số nhiều sẽ có một dạng khác nhau cho mỗi quy tắc đó. Khi gọi getText trong mã, bạn sẽ phải chỉ định số liên quan đến câu và nó sẽ thực hiện đúng biểu mẫu để sử dụng - thậm chí sử dụng thay thế chuỗi nếu cần.

Các quy tắc số nhiều bao gồm số lượng số nhiều có sẵn và thử nghiệm boolean với

brew unlink php
brew link --overwrite 
98 sẽ xác định trong đó quy tắc số lượng đã cho giảm (bắt đầu số lượng với 0). Ví dụ:

  • Tiếng Nhật:
    brew unlink php
    brew link --overwrite 
    
    99 - Chỉ có một quy tắc
  • Tiếng Anh:
    brew unlink php
    brew link --overwrite 
    
    00 - Hai quy tắc, thứ nhất nếu n là một, quy tắc thứ hai khác
  • Người Bồ Đào Nha Brazil:
    brew unlink php
    brew link --overwrite 
    
    01 - Hai quy tắc, thứ hai nếu n lớn hơn một, trước tiên

Bây giờ bạn đã hiểu cơ sở của cách thức hoạt động của các quy tắc số nhiều - và nếu bạn đã làm, xin vui lòng xem một lời giải thích sâu sắc hơn về hướng dẫn biệt ngữ -, bạn có thể muốn sao chép những cái bạn cần từ một danh sách thay vì viết chúng bằng tay.

Khi gọi ra getText để thực hiện nội địa hóa trên các câu với các bộ đếm, bạn cũng sẽ phải cung cấp cho nó số liên quan. GetText sẽ tìm ra quy tắc nào nên có hiệu lực và sử dụng phiên bản bản địa hóa chính xác. Bạn sẽ cần phải bao gồm trong tệp

brew unlink php
brew link --overwrite 
97 Một câu khác nhau cho mỗi quy tắc số nhiều được xác định.

Thực hiện mẫu

Sau tất cả lý thuyết đó, hãy để có một chút thực tế. Ở đây, một đoạn trích của một tệp

brew unlink php
brew link --overwrite 
97 - hãy làm tâm trí với định dạng của nó, nhưng thay vào đó là nội dung tổng thể; Bạn sẽ học cách chỉnh sửa nó một cách dễ dàng sau:

brew unlink php
brew link --overwrite 
8

Phần đầu tiên hoạt động giống như một tiêu đề, có

brew unlink php
brew link --overwrite 
04 và
brew unlink php
brew link --overwrite 
05 đặc biệt trống rỗng. Nó mô tả mã hóa tệp, các dạng số nhiều và những thứ khác ít liên quan hơn. Phần thứ hai dịch một chuỗi đơn giản từ tiếng Anh sang người Bồ Đào Nha Brazil và phần thứ ba cũng vậy, nhưng tận dụng sự thay thế chuỗi từ
brew unlink php
brew link --overwrite 
06 để bản dịch có thể chứa tên người dùng và ngày truy cập. Phần cuối cùng là một mẫu các hình thức đa nguyên hóa, hiển thị phiên bản số ít và số nhiều là
brew unlink php
brew link --overwrite 
04 trong tiếng Anh và các bản dịch tương ứng của chúng là
brew unlink php
brew link --overwrite 
05 0 và 1 (theo số được đưa ra bởi quy tắc số nhiều). Ở đó, thay thế chuỗi cũng được sử dụng để số có thể được nhìn thấy trực tiếp trong câu, bằng cách sử dụng
brew unlink php
brew link --overwrite 
09. Các hình thức số nhiều luôn có hai
brew unlink php
brew link --overwrite 
04 (số ít và số nhiều), do đó, không nên sử dụng một ngôn ngữ phức tạp làm nguồn dịch.

Thảo luận về các khóa L10N

Như bạn có thể nhận thấy, chúng tôi đang sử dụng làm ID nguồn trong câu thực tế bằng tiếng Anh. Rằng

brew unlink php
brew link --overwrite 
04 là giống nhau được sử dụng trong tất cả các tệp
brew unlink php
brew link --overwrite 
97 của bạn, có nghĩa là các ngôn ngữ khác sẽ có cùng định dạng và cùng các trường
brew unlink php
brew link --overwrite 
04 nhưng được dịch các dòng
brew unlink php
brew link --overwrite 
05.

Nói về các khóa dịch, có hai trường học chính ở đây:

  1. brew unlink php
    brew link --overwrite 
    
    04 như một câu thực sự. Ưu điểm chính là:
    • Nếu có các phần của phần mềm chưa được dịch trong bất kỳ ngôn ngữ nào, khóa được hiển thị vẫn sẽ duy trì một số ý nghĩa. Ví dụ: Nếu bạn tình cờ dịch bằng trái tim từ tiếng Anh sang tiếng Tây Ban Nha nhưng cần trợ giúp để dịch sang tiếng Pháp, bạn có thể xuất bản trang mới với các câu tiếng Pháp bị thiếu và các phần của trang web sẽ được hiển thị bằng tiếng Anh;
    • Người dịch dễ dàng hơn nhiều để hiểu những gì diễn ra và thực hiện một bản dịch thích hợp dựa trên
      brew unlink php
      brew link --overwrite 
      
      04;
    • Nó cung cấp cho bạn miễn phí, L10N L10N cho một ngôn ngữ - nguồn gốc;
    • Nhược điểm duy nhất: Nếu bạn cần thay đổi văn bản thực tế, bạn sẽ cần thay thế cùng một
      brew unlink php
      brew link --overwrite 
      
      04 trên một số tệp ngôn ngữ.
  2. brew unlink php
    brew link --overwrite 
    
    04 như một khóa duy nhất, có cấu trúc. Nó sẽ mô tả vai trò câu trong ứng dụng theo cách có cấu trúc, bao gồm mẫu hoặc phần nơi chuỗi được đặt thay vì nội dung của nó.
    • Đó là một cách tuyệt vời để có mã được tổ chức, tách nội dung văn bản với logic mẫu.
    • Tuy nhiên, điều đó có thể mang lại vấn đề cho người dịch sẽ bỏ lỡ bối cảnh. Một tệp ngôn ngữ nguồn sẽ là cơ sở cho các bản dịch khác. Ví dụ: Nhà phát triển lý tưởng sẽ có một tệp
      brew unlink php
      brew link --overwrite 
      
      19, các dịch giả đó sẽ đọc để hiểu những gì cần viết trong
      brew unlink php
      brew link --overwrite 
      
      20 chẳng hạn.
    • Thiếu các bản dịch sẽ hiển thị các khóa vô nghĩa trên màn hình (
      brew unlink php
      brew link --overwrite 
      
      21 thay vì
      brew unlink php
      brew link --overwrite 
      
      22 trên trang tiếng Pháp chưa được dịch). Điều đó thật tốt vì nó sẽ buộc dịch thuật phải hoàn thành trước khi xuất bản - tuy nhiên, xấu vì các vấn đề dịch thuật sẽ là khủng khiếp đáng kể trong giao diện. Tuy nhiên, một số thư viện bao gồm một tùy chọn để chỉ định một ngôn ngữ nhất định là Fall Fallback, có một hành vi tương tự như cách tiếp cận khác.

Hướng dẫn sử dụng GetText ủng hộ cách tiếp cận đầu tiên vì nói chung, người dùng và người dùng dễ dàng hơn trong trường hợp gặp rắc rối. Đó là cách chúng tôi cũng sẽ làm việc ở đây. Tuy nhiên, tài liệu Symfony ủng hộ bản dịch dựa trên từ khóa, để cho phép các thay đổi độc lập của tất cả các bản dịch mà không ảnh hưởng đến các mẫu.

Sử dụng hàng ngày

Trong một ứng dụng điển hình, bạn sẽ sử dụng một số hàm getText trong khi viết văn bản tĩnh trong các trang của bạn. Những câu đó sau đó sẽ xuất hiện trong các tệp

brew unlink php
brew link --overwrite 
97, được dịch, biên dịch thành các tệp
brew unlink php
brew link --overwrite 
24 và sau đó, được sử dụng bởi GetText khi hiển thị giao diện thực tế. Cho rằng, hãy để mối quan hệ với nhau những gì chúng ta đã thảo luận cho đến nay trong một ví dụ từng bước:

1. Một tệp mẫu mẫu, bao gồm một số cuộc gọi getText khác nhau

brew unlink php
brew link --overwrite 
9
  • brew unlink php
    brew link --overwrite 
    
    25 chỉ đơn giản là dịch một
    brew unlink php
    brew link --overwrite 
    
    04 thành
    brew unlink php
    brew link --overwrite 
    
    05 tương ứng của nó cho một ngôn ngữ nhất định. Ngoài ra còn có chức năng tốc ký
    brew unlink php
    brew link --overwrite 
    
    28 hoạt động theo cùng một cách;
  • brew unlink php
    brew link --overwrite 
    
    29 làm như vậy nhưng với các quy tắc số nhiều;
  • Ngoài ra còn có
    brew unlink php
    brew link --overwrite 
    
    30 và
    brew unlink php
    brew link --overwrite 
    
    31, cho phép bạn ghi đè tên miền cho một cuộc gọi. Thêm về cấu hình miền trong ví dụ tiếp theo.

2. Một tệp thiết lập mẫu (
brew unlink php
brew link --overwrite 
32 như đã sử dụng ở trên), chọn đúng địa điểm và định cấu hình getText

sudo port install php74
sudo port install php81
0

3. Chuẩn bị dịch cho lần chạy đầu tiên

Một trong những lợi thế tuyệt vời mà GetText có các gói tùy chỉnh I18N là định dạng tệp rộng lớn và mạnh mẽ của nó. Một người đàn ông, người đàn ông đó khá khó hiểu và chỉnh sửa bằng tay, một mảng đơn giản sẽ dễ dàng hơn! Đừng nhầm lẫn, các ứng dụng như Poedit đang ở đây để giúp đỡ - rất nhiều. Bạn có thể nhận được chương trình từ trang web của họ, nó miễn phí và có sẵn cho tất cả các nền tảng. Nó là một công cụ khá dễ dàng để làm quen và một công cụ rất mạnh mẽ cùng một lúc - sử dụng tất cả các tính năng mà GetText có sẵn. Hướng dẫn này dựa trên Poedit 1.8.

Trong lần chạy đầu tiên, bạn nên chọn Tệp Tệp> Mới mới từ menu. Bạn sẽ được hỏi thẳng về phía trước cho ngôn ngữ: Ở đây bạn có thể chọn/lọc ngôn ngữ bạn muốn dịch hoặc sử dụng định dạng mà chúng tôi đã đề cập trước đây, chẳng hạn như

brew unlink php
brew link --overwrite 
33 hoặc
brew unlink php
brew link --overwrite 
95.

Bây giờ, hãy lưu tệp - sử dụng cấu trúc thư mục mà chúng tôi đã đề cập. Sau đó, bạn nên nhấp vào trích xuất từ ​​các nguồn từ các nguồn, và ở đây bạn sẽ định cấu hình các cài đặt khác nhau cho các tác vụ trích xuất và dịch. Bạn có thể tìm thấy tất cả những thứ đó sau đó thông qua Catalog> Thuộc tính.

  • Đường dẫn nguồn: Ở đây bạn phải bao gồm tất cả các thư mục từ dự án trong đó
    brew unlink php
    brew link --overwrite 
    
    25 (và anh chị em) được gọi - đây thường là thư mục mẫu/chế độ xem của bạn. Đây là thiết lập bắt buộc duy nhất;
  • Thuộc tính dịch:
    • Tên dự án và phiên bản, nhóm và nhóm địa chỉ email của nhóm: Thông tin hữu ích có trong tiêu đề tệp .po;
    • Các hình thức số nhiều: Ở đây đi những quy tắc mà chúng tôi đã đề cập trước đây - có một liên kết trong đó với các mẫu. Bạn có thể để nó với tùy chọn mặc định hầu hết thời gian, vì PoEDit đã bao gồm một cơ sở dữ liệu tiện dụng về các quy tắc số nhiều cho nhiều ngôn ngữ.
    • Charsets: UTF-8, tốt nhất là;
    • Mã số mã Nguồn: Đặt ở đây bộ ký tự được sử dụng bởi cơ sở mã của bạn - có lẽ cũng có thể UTF -8, phải không?
  • Từ khóa nguồn: Phần mềm cơ bản biết cách
    brew unlink php
    brew link --overwrite 
    
    25 và các cuộc gọi chức năng tương tự trông giống như trong một số ngôn ngữ lập trình, nhưng bạn cũng có thể tạo các hàm dịch của riêng mình. Nó sẽ ở đây, bạn sẽ thêm các phương pháp khác. Điều này sẽ được thảo luận sau trong phần Tip TIPS.

Sau khi đặt các điểm đó, nó sẽ chạy quét qua các tệp nguồn của bạn để tìm tất cả các cuộc gọi nội địa hóa. Sau mỗi lần quét POEDIT sẽ hiển thị một bản tóm tắt về những gì đã tìm thấy và những gì đã bị xóa khỏi các tệp nguồn. Các mục mới sẽ được đưa trống vào bảng dịch và bạn sẽ bắt đầu gõ vào các phiên bản cục bộ của các chuỗi đó. Lưu nó và một tệp .mo sẽ được biên dịch vào cùng một thư mục và ta-dah: dự án của bạn được quốc tế hóa.

4. Chuỗi dịch

Như bạn có thể nhận thấy trước đây, có hai loại chuỗi chính: các chuỗi đơn giản và những loại có dạng số nhiều. Những cái đầu tiên chỉ đơn giản là hai hộp: chuỗi và chuỗi cục bộ. Chuỗi nguồn không thể được sửa đổi vì getText/poEdit không bao gồm các quyền hạn để thay đổi các tệp nguồn của bạn - bạn nên thay đổi nguồn và giải cứu các tệp. Mẹo: Bạn có thể nhấp chuột phải vào một dòng dịch và nó sẽ gợi ý cho bạn các tệp và dòng nguồn nơi chuỗi đó đang được sử dụng. Mặt khác, các chuỗi dạng số nhiều bao gồm hai hộp để hiển thị hai chuỗi nguồn và các tab để bạn có thể định cấu hình các biểu mẫu cuối cùng khác nhau.

Bất cứ khi nào bạn thay đổi nguồn của mình và cần cập nhật các bản dịch, chỉ cần nhấn Refresh và Poedit sẽ hủy bỏ mã, xóa các mục không tồn tại, hợp nhất các mục đã thay đổi và thêm các mục mới. Nó cũng có thể cố gắng đoán một số bản dịch, dựa trên những bản khác mà bạn đã làm. Những dự đoán đó và các mục đã thay đổi sẽ nhận được một điểm đánh dấu mờ, cho biết nó cần xem xét, xuất hiện vàng trong danh sách. Nó cũng hữu ích nếu bạn có một nhóm dịch và ai đó cố gắng viết một cái gì đó mà họ không chắc chắn: chỉ là Mark Fuzzy, và một số người khác sẽ xem xét sau.

Cuối cùng, người ta khuyên nên để lại các mục nhập không được dịch Từ menu đó, bạn cũng có thể mở các phần của giao diện người dùng cho phép bạn để lại thông tin theo ngữ cảnh cho người dịch nếu cần.

Mẹo & Thủ thuật

Các vấn đề bộ nhớ đệm có thể

Nếu bạn đang chạy PHP như một mô -đun trên Apache (

brew unlink php
brew link --overwrite 
37), bạn có thể phải đối mặt với các vấn đề với tệp
brew unlink php
brew link --overwrite 
24 đang được lưu trong bộ đệm. Nó xảy ra lần đầu tiên nó được đọc, và sau đó, để cập nhật nó, bạn có thể cần phải khởi động lại máy chủ. Trên Nginx và PHP5, thường chỉ cần một vài trang làm mới để làm mới bộ đệm dịch và trên PHP7, điều đó hiếm khi cần thiết.

Chức năng trợ giúp bổ sung

Theo sự ưa thích của nhiều người, việc sử dụng

brew unlink php
brew link --overwrite 
28 sẽ dễ dàng hơn thay vì
brew unlink php
brew link --overwrite 
25. Nhiều thư viện i18n tùy chỉnh từ Frameworks cũng sử dụng một cái gì đó tương tự như
brew unlink php
brew link --overwrite 
41, để làm cho mã được dịch ngắn hơn. Tuy nhiên, đó là chức năng duy nhất có một lối tắt. Bạn có thể muốn thêm vào dự án của mình một số người khác, chẳng hạn như
brew unlink php
brew link --overwrite 
42 hoặc
brew unlink php
brew link --overwrite 
43 cho
brew unlink php
brew link --overwrite 
29 hoặc có thể là một
brew unlink php
brew link --overwrite 
45 ưa thích sẽ tham gia các cuộc gọi
brew unlink php
brew link --overwrite 
25 và
brew unlink php
brew link --overwrite 
47. Các thư viện khác, chẳng hạn như Oscarotero, GetText cũng cung cấp các chức năng trợ giúp như thế này.

Trong những trường hợp đó, bạn sẽ cần phải hướng dẫn tiện ích GetText về cách trích xuất các chuỗi từ các chức năng mới đó. Don Tiết sợ; nó rất dễ. Nó chỉ là một trường trong tệp

brew unlink php
brew link --overwrite 
97 hoặc màn hình Cài đặt trên POEDIT. Trong trình soạn thảo, tùy chọn đó nằm trong Catalog> Thuộc tính> Từ khóa nguồn. Hãy nhớ rằng: GetText đã biết các hàm mặc định cho nhiều ngôn ngữ, vì vậy đừng sợ nếu danh sách đó có vẻ trống. Bạn cần bao gồm các thông số kỹ thuật của các chức năng mới đó, theo một định dạng cụ thể:

  • Nếu bạn tạo một cái gì đó như
    brew unlink php
    brew link --overwrite 
    
    41 chỉ cần trả về bản dịch cho một chuỗi, bạn có thể chỉ định nó là
    brew unlink php
    brew link --overwrite 
    
    50. GetText sẽ biết đối số chức năng duy nhất là chuỗi được dịch;
  • Nếu hàm có nhiều hơn một đối số, bạn có thể chỉ định trong đó một chuỗi đầu tiên là - và nếu cần, cũng là dạng số nhiều. Chẳng hạn, nếu chúng ta gọi chức năng của mình như thế này:
    brew unlink php
    brew link --overwrite 
    
    51, đặc điểm kỹ thuật sẽ là
    brew unlink php
    brew link --overwrite 
    
    52, có nghĩa là biểu mẫu đầu tiên là đối số đầu tiên và biểu mẫu thứ hai là đối số thứ hai. Nếu số của bạn là đối số đầu tiên thay vào đó, thông số kỹ thuật sẽ là
    brew unlink php
    brew link --overwrite 
    
    53, chỉ ra biểu mẫu đầu tiên là đối số thứ hai, v.v.

Sau khi đưa các quy tắc mới đó vào tệp

brew unlink php
brew link --overwrite 
97, một lần quét mới sẽ mang lại chuỗi mới của bạn dễ dàng như trước.

Người giới thiệu

  • Wikipedia: I18N và L10N
  • Wikipedia: GetText
  • LINGOHUB: Quốc tế hóa PHP với hướng dẫn GetText
  • Hướng dẫn sử dụng PHP: GetText
  • Hướng dẫn sử dụng getText

Tiêm phụ thuộc

Từ Wikipedia:

Tiêm phụ thuộc là một mô hình thiết kế phần mềm cho phép loại bỏ các phụ thuộc được mã hóa cứng và giúp thay đổi chúng, cho dù trong thời gian chạy hay thời gian biên dịch.

Trích dẫn này làm cho khái niệm âm thanh phức tạp hơn nhiều so với thực tế. Tiêm phụ thuộc đang cung cấp một thành phần với sự phụ thuộc của nó thông qua tiêm hàm tạo, các cuộc gọi phương thức hoặc thiết lập các thuộc tính. Nó là đơn giản.

Khái niệm cơ bản

Chúng ta có thể chứng minh khái niệm với một ví dụ đơn giản nhưng ngây thơ.

Ở đây chúng tôi có một lớp

brew unlink php
brew link --overwrite 
55 yêu cầu một bộ chuyển đổi để nói chuyện với cơ sở dữ liệu. Chúng tôi khởi tạo bộ điều hợp trong hàm tạo và tạo ra một sự phụ thuộc cứng. Điều này làm cho việc kiểm tra khó khăn và có nghĩa là lớp
brew unlink php
brew link --overwrite 
55 được ghép rất chặt với bộ chuyển đổi.

sudo port install php74
sudo port install php81
1

Mã này có thể được tái cấu trúc để sử dụng tiêm phụ thuộc và do đó nới lỏng sự phụ thuộc.

sudo port install php74
sudo port install php81
2

Bây giờ chúng tôi đang cung cấp cho lớp

brew unlink php
brew link --overwrite 
55 sự phụ thuộc của nó thay vì tự tạo ra nó. Chúng tôi thậm chí có thể tạo một phương thức chấp nhận một đối số về sự phụ thuộc và đặt nó theo cách đó hoặc nếu thuộc tính
brew unlink php
brew link --overwrite 
58 là
brew unlink php
brew link --overwrite 
59, chúng tôi có thể đặt nó trực tiếp.

Vấn đề phức tạp

Nếu bạn đã từng đọc về việc tiêm phụ thuộc thì có lẽ bạn đã thấy các thuật ngữ đảo ngược của điều khiển, hoặc nguyên tắc đảo ngược phụ thuộc. Đây là những vấn đề phức tạp mà tiêm phụ thuộc.

Đảo ngược kiểm soát

Đảo ngược của sự kiểm soát là như người ta nói, việc đảo ngược sự kiểm soát của một hệ thống bằng cách giữ quyền kiểm soát tổ chức hoàn toàn tách biệt với các đối tượng của chúng ta. Về mặt tiêm phụ thuộc, điều này có nghĩa là nới lỏng sự phụ thuộc của chúng tôi bằng cách kiểm soát và khởi tạo chúng ở nơi khác trong hệ thống.

Trong nhiều năm, các khung PHP đã đạt được sự đảo ngược của kiểm soát, tuy nhiên, câu hỏi đã trở thành, phần nào của sự kiểm soát chúng ta đang đảo ngược, và ở đâu? Ví dụ, các khung MVC thường sẽ cung cấp một bộ điều khiển siêu đối tượng hoặc cơ sở mà các bộ điều khiển khác phải mở rộng để có quyền truy cập vào các phụ thuộc của nó. Tuy nhiên, đây là sự đảo ngược của kiểm soát, thay vì nới lỏng các phụ thuộc, phương pháp này chỉ đơn giản là di chuyển chúng.is Inversion of Control, however, instead of loosening dependencies, this method simply moved them.

Tiêm phụ thuộc cho phép chúng ta giải quyết vấn đề này một cách tao nhã bằng cách chỉ tiêm các phụ thuộc mà chúng ta cần, khi chúng ta cần chúng, mà không cần bất kỳ sự phụ thuộc nào được mã hóa cứng.

S.O.L.I.D.

Nguyên tắc trách nhiệm duy nhất

Nguyên tắc trách nhiệm duy nhất là về các diễn viên và kiến ​​trúc cấp cao. Nó nói rằng một lớp học chỉ nên có một lý do để thay đổi. Điều này có nghĩa là mọi lớp chỉ nên có trách nhiệm đối với một phần của chức năng do phần mềm cung cấp. Lợi ích lớn nhất của phương pháp này là nó cho phép tái sử dụng mã được cải thiện. Bằng cách thiết kế lớp học của chúng tôi để làm một điều, chúng tôi có thể sử dụng (hoặc sử dụng lại) trong bất kỳ chương trình nào khác mà không thay đổi nó.

Nguyên tắc mở/đóng

Nguyên tắc mở/đóng là về thiết kế lớp và các phần mở rộng tính năng. Nó nói rằng các thực thể phần mềm của người Viking (các lớp, mô -đun, chức năng, v.v.) nên được mở để mở rộng, nhưng đóng để sửa đổi. Điều này có nghĩa là chúng ta nên thiết kế các mô -đun, lớp và chức năng của mình theo cách mà khi cần một chức năng mới, chúng ta không nên sửa đổi mã hiện tại mà chỉ viết mã mới sẽ được sử dụng bởi mã hiện có. Thực tế nói, điều này có nghĩa là chúng ta nên viết các lớp thực hiện và tuân thủ các giao diện, sau đó loại gợi ý với các giao diện đó thay vì các lớp cụ thể.

Lợi ích lớn nhất của phương pháp này là chúng tôi có thể rất dễ dàng mở rộng mã của mình với sự hỗ trợ cho một cái gì đó mới mà không phải sửa đổi mã hiện có, nghĩa là chúng tôi có thể giảm thời gian QA và rủi ro về tác động tiêu cực đến ứng dụng giảm đáng kể. Chúng tôi có thể triển khai mã mới, nhanh hơn và với sự tự tin hơn.

Nguyên tắc thay thế Liskov

Nguyên tắc thay thế Liskov là về phân nhóm và thừa kế. Nó nói rằng các lớp trẻ con không bao giờ nên phá vỡ các định nghĩa loại phụ huynh. Hoặc, trong các từ của Robert C. Martin, các phân nhóm phải được thay thế cho các loại cơ sở của chúng.

Ví dụ: nếu chúng ta có giao diện

brew unlink php
brew link --overwrite 
60 xác định phương thức
brew unlink php
brew link --overwrite 
61 và chúng ta có các lớp
brew unlink php
brew link --overwrite 
62 và
brew unlink php
brew link --overwrite 
63 mà cả hai đều thực hiện giao diện
brew unlink php
brew link --overwrite 
60, thì chúng ta có thể mong đợi rằng việc sử dụng phương thức
brew unlink php
brew link --overwrite 
61 sẽ luôn thực hiện điều mà chúng ta dự định. Nếu sau này chúng ta tạo một lớp
brew unlink php
brew link --overwrite 
66 hoặc lớp
brew unlink php
brew link --overwrite 
67 thực hiện giao diện
brew unlink php
brew link --overwrite 
60, chúng ta sẽ biết và hiểu phương thức
brew unlink php
brew link --overwrite 
61 sẽ làm gì. Lợi ích lớn nhất của phương pháp này là chúng tôi có khả năng xây dựng các chương trình linh hoạt và dễ cấu hình, bởi vì khi chúng tôi thay đổi một đối tượng của một loại (ví dụ:
brew unlink php
brew link --overwrite 
60) sang một đối tượng khác, chúng tôi không cần phải thay đổi bất cứ điều gì khác trong chương trình của chúng tôi.

Nguyên tắc phân biệt giao diện

Nguyên tắc phân biệt giao diện (ISP) là về giao tiếp kinh doanh-logic-to-cilent. Nó nói rằng không có khách hàng nào bị buộc phải phụ thuộc vào các phương pháp mà nó không sử dụng. Điều này có nghĩa là thay vì có một giao diện nguyên khối duy nhất mà tất cả các lớp phù hợp cần phải thực hiện, thay vào đó chúng ta nên cung cấp một tập hợp các giao diện nhỏ hơn, cụ thể theo khái niệm mà một lớp phù hợp thực hiện một hoặc nhiều.

Ví dụ: lớp

brew unlink php
brew link --overwrite 
71 hoặc
brew unlink php
brew link --overwrite 
72 sẽ quan tâm đến phương pháp
brew unlink php
brew link --overwrite 
73, nhưng lớp
brew unlink php
brew link --overwrite 
74 hoặc
brew unlink php
brew link --overwrite 
75 sẽ không. Ngược lại, lớp
brew unlink php
brew link --overwrite 
74 hoặc
brew unlink php
brew link --overwrite 
75 sẽ quan tâm đến phương pháp
brew unlink php
brew link --overwrite 
78, nhưng lớp
brew unlink php
brew link --overwrite 
71 hoặc
brew unlink php
brew link --overwrite 
72 sẽ không. Không cần phải có tất cả các loại phương tiện này thực hiện hỗ trợ cho cả
brew unlink php
brew link --overwrite 
73 cũng như
brew unlink php
brew link --overwrite 
78, vì vậy chúng ta nên phá vỡ giao diện nguồn.

Nguyên tắc đảo ngược phụ thuộc

Nguyên tắc đảo ngược phụ thuộc là về việc loại bỏ các liên kết cứng giữa các lớp riêng biệt để chức năng mới có thể được tận dụng bằng cách vượt qua một lớp khác. Nó nói rằng người ta nên phụ thuộc vào sự trừu tượng. Không phụ thuộc vào bê tông. Nói một cách đơn giản, điều này có nghĩa là các phụ thuộc của chúng tôi nên là giao diện/hợp đồng hoặc các lớp trừu tượng thay vì triển khai cụ thể. Chúng ta có thể dễ dàng tái cấu trúc ví dụ trên để tuân theo nguyên tắc này.

sudo port install php74
sudo port install php81
3

Có một số lợi ích cho lớp

brew unlink php
brew link --overwrite 
55 hiện tùy thuộc vào giao diện thay vì cụ thể.

Hãy xem xét rằng chúng tôi đang làm việc trong một nhóm và bộ điều hợp đang được một đồng nghiệp làm việc. Trong ví dụ đầu tiên của chúng tôi, chúng tôi sẽ phải chờ đồng nghiệp nói để hoàn thành bộ chuyển đổi trước khi chúng tôi có thể chế giễu nó để kiểm tra đơn vị. Bây giờ, sự phụ thuộc là một giao diện/hợp đồng, chúng tôi có thể vui vẻ chế giễu giao diện đó khi biết rằng đồng nghiệp của chúng tôi sẽ xây dựng bộ chuyển đổi dựa trên hợp đồng đó.

Một lợi ích thậm chí còn lớn hơn cho phương pháp này là mã của chúng tôi hiện có thể mở rộng hơn nhiều. Nếu một năm xuống dòng, chúng tôi quyết định rằng chúng tôi muốn chuyển sang một loại cơ sở dữ liệu khác, chúng tôi có thể viết một bộ chuyển đổi thực hiện giao diện ban đầu và việc đưa vào đó, không cần phải tái cấu trúc nữa vì chúng tôi có thể đảm bảo rằng bộ điều hợp theo Hợp đồng được thiết lập bởi giao diện.

Hộp đựng

Điều đầu tiên bạn nên hiểu về các thùng chứa phụ thuộc là chúng không giống như tiêm phụ thuộc. Một container là một tiện ích tiện lợi giúp chúng tôi thực hiện tiêm phụ thuộc, tuy nhiên, chúng có thể và thường bị sử dụng sai để thực hiện một vị trí dịch vụ chống nhân mẫu. Việc tiêm một container DI như một công cụ định vị dịch vụ vào các lớp của bạn có thể tạo ra sự phụ thuộc khó hơn vào container so với sự phụ thuộc mà bạn đang thay thế. Nó cũng làm cho mã của bạn ít minh bạch hơn và cuối cùng khó kiểm tra hơn.

Hầu hết các khung hiện đại đều có thùng chứa tiêm phụ thuộc riêng cho phép bạn kết nối các phụ thuộc của mình với nhau thông qua cấu hình. Điều này có nghĩa là trong thực tế là bạn có thể viết mã ứng dụng sạch sẽ và được kết hợp như khung được xây dựng.

Đọc thêm

  • Tiêm phụ thuộc là gì?
  • Tiêm phụ thuộc: Một sự tương tự
  • Tiêm phụ thuộc: Huh?
  • Tiêm phụ thuộc như một công cụ để thử nghiệm

Cơ sở dữ liệu

Nhiều lần mã PHP của bạn sẽ sử dụng cơ sở dữ liệu để thông tin tồn tại. Bạn có một vài tùy chọn để kết nối và tương tác với cơ sở dữ liệu của bạn. Tùy chọn được đề xuất cho đến khi Php 5.1.0 là sử dụng trình điều khiển gốc như MySQLI, PGSQL, MSSQL, v.v.until PHP 5.1.0 was to use native drivers such as mysqli, pgsql, mssql, etc.

Trình điều khiển gốc rất tuyệt nếu bạn chỉ sử dụng một cơ sở dữ liệu trong ứng dụng của mình, nhưng nếu, ví dụ, bạn đang sử dụng MySQL và một chút MSSQL hoặc bạn cần kết nối với cơ sở dữ liệu Oracle, thì bạn sẽ không thể sử dụng Các trình điều khiển giống nhau. Bạn cần phải học một API hoàn toàn mới cho mỗi cơ sở dữ liệu - và điều đó có thể trở nên ngớ ngẩn.

Mở rộng MySQL

Tiện ích mở rộng MySQL cho PHP cực kỳ cũ và đã được thay thế bởi hai phần mở rộng khác:

  • mysqli
  • PDO

Sự phát triển không chỉ dừng lại từ lâu trên MySQL, mà nó còn bị phản đối kể từ Php 5.5.0, và đã bị xóa chính thức trong Php 7.0.has been officially removed in PHP 7.0.

Để lưu đào vào cài đặt

brew unlink php
brew link --overwrite 
93 của bạn để xem bạn đang sử dụng mô -đun nào, một tùy chọn là tìm kiếm
brew unlink php
brew link --overwrite 
85 trong trình soạn thảo bạn chọn. Nếu bất kỳ chức năng nào như
brew unlink php
brew link --overwrite 
86 và
brew unlink php
brew link --overwrite 
87 hiển thị, thì
brew unlink php
brew link --overwrite 
88 sẽ được sử dụng.

Ngay cả khi bạn chưa sử dụng PHP 7.x, việc không xem xét nâng cấp này càng sớm càng tốt sẽ dẫn đến khó khăn lớn hơn khi bản nâng cấp PHP 7.x xảy ra. Tùy chọn tốt nhất là thay thế việc sử dụng MySQL bằng MySQLI hoặc PDO trong các ứng dụng của bạn trong lịch trình phát triển của riêng bạn để bạn giành chiến thắng sau này.

Nếu bạn đang nâng cấp từ MySQL thành MySQLI, hãy cẩn thận với hướng dẫn nâng cấp lười biếng đề nghị bạn có thể tìm kiếm và thay thế

brew unlink php
brew link --overwrite 
85 bằng
brew unlink php
brew link --overwrite 
90. Không chỉ là một sự đơn giản hóa quá mức, nó còn bỏ lỡ những lợi thế mà MySQLI cung cấp, chẳng hạn như ràng buộc tham số, cũng được cung cấp trong PDO.

  • MySQLI đã chuẩn bị các tuyên bố
  • PHP: Chọn API cho MySQL

Tiện ích mở rộng PDO

PDO là thư viện trừu tượng kết nối cơ sở dữ liệu - được tích hợp vào PHP kể từ 5.1.0 - cung cấp một giao diện chung để nói chuyện với nhiều cơ sở dữ liệu khác nhau. Ví dụ: bạn có thể sử dụng mã giống hệt nhau để giao diện với MySQL hoặc SQLite:

sudo port install php74
sudo port install php81
4

PDO sẽ không dịch các truy vấn SQL của bạn hoặc mô phỏng các tính năng bị thiếu; Nó hoàn toàn là để kết nối với nhiều loại cơ sở dữ liệu với cùng một API.

Quan trọng hơn,

brew unlink php
brew link --overwrite 
91 cho phép bạn tiêm đầu vào nước ngoài một cách an toàn (ví dụ: ID) vào các truy vấn SQL của bạn mà không phải lo lắng về các cuộc tấn công tiêm cơ sở dữ liệu SQL. Điều này là có thể sử dụng các câu lệnh PDO và các tham số ràng buộc.

Hãy để giả sử một tập lệnh PHP nhận được ID số làm tham số truy vấn. ID này nên được sử dụng để tìm nạp bản ghi người dùng từ cơ sở dữ liệu. Đây là cách

brew unlink php
brew link --overwrite 
92 để làm điều này:

sudo port install php74
sudo port install php81
5

Đây là mã khủng khiếp. Bạn đang chèn một tham số truy vấn thô vào truy vấn SQL. Điều này sẽ khiến bạn bị hack trong tích tắc, bằng cách sử dụng một thực hành gọi là SQL tiêm. Chỉ cần tưởng tượng nếu một hacker đi qua tham số

brew unlink php
brew link --overwrite 
93 sáng tạo bằng cách gọi một URL như
brew unlink php
brew link --overwrite 
94. Điều này sẽ đặt biến
brew unlink php
brew link --overwrite 
95 thành
brew unlink php
brew link --overwrite 
96 sẽ xóa tất cả người dùng của bạn! Thay vào đó, bạn nên vệ sinh đầu vào ID bằng các tham số giới hạn PDO.

sudo port install php74
sudo port install php81
6

Đây là mã chính xác. Nó sử dụng một tham số ràng buộc trên một câu lệnh PDO. Điều này thoát khỏi ID đầu vào nước ngoài trước khi nó được giới thiệu vào cơ sở dữ liệu ngăn chặn các cuộc tấn công tiêm SQL tiềm năng.

Để ghi, chẳng hạn như chèn hoặc cập nhật, nó đặc biệt quan trọng để vẫn lọc dữ liệu của bạn trước và vệ sinh nó cho những thứ khác (loại bỏ thẻ HTML, JavaScript, v.v.). PDO sẽ chỉ vệ sinh nó cho SQL, không phải cho ứng dụng của bạn.

  • Tìm hiểu về PDO

Bạn cũng nên lưu ý rằng các kết nối cơ sở dữ liệu sử dụng hết tài nguyên và không có gì chưa từng thấy khi có tài nguyên cạn kiệt nếu các kết nối không được đóng hoàn toàn, tuy nhiên điều này phổ biến hơn trong các ngôn ngữ khác. Sử dụng PDO, bạn có thể ngầm đóng kết nối bằng cách phá hủy đối tượng bằng cách đảm bảo tất cả các tham chiếu còn lại cho nó bị xóa, tức là đặt thành NULL. Nếu bạn không làm điều này một cách rõ ràng, PHP sẽ tự động đóng kết nối khi tập lệnh của bạn kết thúc - trừ khi tất nhiên bạn đang sử dụng các kết nối liên tục.

  • Tìm hiểu về kết nối PDO

Tương tác với cơ sở dữ liệu

Khi các nhà phát triển lần đầu tiên bắt đầu học PHP, họ thường kết thúc việc trộn lẫn tương tác cơ sở dữ liệu của họ với logic trình bày của họ, sử dụng mã có thể trông như thế này:

sudo port install php74
sudo port install php81
7

Đây là thực tế xấu vì tất cả các loại lý do, chủ yếu là nó khó gỡ lỗi, khó kiểm tra, khó đọc và nó sẽ xuất hiện rất nhiều trường nếu bạn không đặt giới hạn ở đó.

Mặc dù có nhiều giải pháp khác để thực hiện việc này - tùy thuộc vào việc bạn thích chương trình OOP hay lập trình chức năng - phải có một số yếu tố phân tách.

Xem xét bước cơ bản nhất:

sudo port install php74
sudo port install php81
8

Đó là một khởi đầu tốt. Đặt hai mục đó vào hai tệp khác nhau và bạn đã có một số tách biệt.

Tạo một lớp để đặt phương thức đó vào và bạn có một mô hình của người dùng. Tạo một tệp

brew unlink php
brew link --overwrite 
97 đơn giản để đưa logic trình bày vào và bạn có một chế độ xem trực tuyến, gần như MVC - một kiến ​​trúc OOP phổ biến cho hầu hết các khung.

foo.php

sudo port install php74
sudo port install php81
9

models/FooModel.php

sudo port select --set php php81
0

views/foo-list.php

sudo port select --set php php81
1

Điều này về cơ bản giống như những gì hầu hết các khung hiện đại đang làm, mặc dù thủ công hơn một chút. Bạn có thể không cần phải làm tất cả những điều đó mỗi lần, nhưng trộn lẫn quá nhiều logic và tương tác cơ sở dữ liệu trình bày có thể là một vấn đề thực sự nếu bạn muốn kiểm tra đơn vị ứng dụng của mình.

Lớp trừu tượng

Nhiều khung cung cấp lớp trừu tượng của riêng họ có thể hoặc không thể ngồi trên PDO. Chúng thường sẽ mô phỏng các tính năng cho một hệ thống cơ sở dữ liệu bị thiếu từ một hệ thống khác bằng cách gói các truy vấn của bạn trong các phương thức PHP, cung cấp cho bạn sự trừu tượng hóa cơ sở dữ liệu thực tế thay vì chỉ là sự trừu tượng hóa kết nối mà PDO cung cấp. Điều này tất nhiên sẽ thêm một chút chi phí, nhưng nếu bạn đang xây dựng một ứng dụng di động cần làm việc với MySQL, PostgreSQL và SQLite thì một chút chi phí sẽ có giá trị vì sự sạch sẽ của mã.

Một số lớp trừu tượng đã được xây dựng bằng cách sử dụng các tiêu chuẩn không gian tên PSR-0 hoặc PSR-4 để có thể được cài đặt trong bất kỳ ứng dụng nào bạn thích:

  • bản đồ
  • Aura SQL
  • Học thuyết2 Dbal
  • Medoo
  • Đẩy
  • Zend-db

Tạo khuôn

Các mẫu cung cấp một cách thuận tiện để tách bộ điều khiển và logic miền của bạn với logic trình bày của bạn. Các mẫu thường chứa HTML của ứng dụng của bạn, nhưng cũng có thể được sử dụng cho các định dạng khác, chẳng hạn như XML. Các mẫu thường được gọi là các chế độ xem trên mạng, nơi tạo thành một phần của thành phần thứ hai của mẫu kiến ​​trúc phần mềm của Model View View, MVC).part of the second component of the model–view–controller (MVC) software architecture pattern.

Lợi ích

Lợi ích chính khi sử dụng các mẫu là sự phân tách rõ ràng mà chúng tạo ra giữa logic trình bày và phần còn lại của ứng dụng của bạn. Các mẫu có trách nhiệm duy nhất là hiển thị nội dung được định dạng. Họ không chịu trách nhiệm tra cứu dữ liệu, kiên trì hoặc các nhiệm vụ phức tạp hơn khác. Điều này dẫn đến mã sạch hơn, dễ đọc hơn, đặc biệt hữu ích trong môi trường nhóm nơi các nhà phát triển làm việc trên mã phía máy chủ (bộ điều khiển, mô hình) và nhà thiết kế làm việc trên mã phía máy khách (đánh dấu).

Mẫu cũng cải thiện tổ chức mã trình bày. Các mẫu thường được đặt trong một thư mục xem trên mạng, mỗi mẫu được xác định trong một tệp. Cách tiếp cận này khuyến khích tái sử dụng mã trong đó các khối mã lớn hơn được chia thành các mảnh nhỏ hơn, có thể tái sử dụng, thường được gọi là một phần. Ví dụ: tiêu đề và chân trang của trang web của bạn có thể được định nghĩa là các mẫu, sau đó được bao gồm trước và sau mỗi mẫu trang.

Cuối cùng, tùy thuộc vào thư viện bạn sử dụng, các mẫu có thể cung cấp nhiều bảo mật hơn bằng cách tự động thoát khỏi nội dung do người dùng tạo. Một số thư viện thậm chí còn cung cấp hộp cát, trong đó các nhà thiết kế mẫu chỉ được cấp quyền truy cập vào các biến và chức năng được liệt kê trong danh sách trắng.

Mẫu PHP đơn giản

Các mẫu PHP đơn giản chỉ đơn giản là các mẫu sử dụng mã PHP gốc. Chúng là một lựa chọn tự nhiên vì PHP thực sự là một ngôn ngữ mẫu. Điều đó chỉ đơn giản là bạn có thể kết hợp mã PHP trong mã khác, như HTML. Điều này có lợi cho các nhà phát triển PHP vì không có cú pháp mới để tìm hiểu, họ biết các chức năng có sẵn cho họ và các trình chỉnh sửa mã của họ đã có cú pháp làm nổi bật và tự động hoàn thành tự động. Hơn nữa, các mẫu PHP đơn giản có xu hướng rất nhanh vì không cần giai đoạn biên dịch.

Mỗi khung PHP hiện đại sử dụng một số loại hệ thống mẫu, hầu hết sử dụng PHP đơn giản theo mặc định. Bên ngoài các khung, các thư viện như tấm hoặc Aura.View giúp làm việc với các mẫu PHP đơn giản dễ dàng hơn bằng cách cung cấp chức năng mẫu hiện đại như kế thừa, bố cục và phần mở rộng.

Ví dụ đơn giản về mẫu PHP đơn giản

Sử dụng thư viện tấm.

sudo port select --set php php81
2

Ví dụ về các mẫu PHP đơn giản sử dụng kế thừa

Sử dụng thư viện tấm.

sudo port select --set php php81
3
sudo port select --set php php81
4

Ví dụ về các mẫu PHP đơn giản sử dụng kế thừa

Các mẫu tổng hợp

Mặc dù PHP đã phát triển thành một ngôn ngữ trưởng thành, theo định hướng đối tượng, nhưng nó đã được cải thiện nhiều như một ngôn ngữ khuôn mẫu. Các mẫu biên dịch, như cành cây, Brainy hoặc Smarty*, lấp đầy khoảng trống này bằng cách cung cấp một cú pháp mới được hướng đến đặc biệt để tạo khuôn. Từ việc thoát tự động, kế thừa và cấu trúc điều khiển đơn giản hóa, các mẫu biên dịch được thiết kế để dễ viết hơn, sạch hơn để đọc và an toàn hơn để sử dụng. Các mẫu được biên dịch thậm chí có thể được chia sẻ trên các ngôn ngữ khác nhau, ria mép là một ví dụ tốt về điều này. Vì các mẫu này phải được biên dịch nên có một hiệu suất nhỏ, tuy nhiên điều này rất tối thiểu khi sử dụng bộ đệm thích hợp.

*Trong khi Smarty cung cấp tự động thoát ra, tính năng này không được bật theo mặc định.

Ví dụ đơn giản về một mẫu được biên dịch

sudo port select --set php php81
5

Sử dụng thư viện cành.

Ví dụ đơn giản về một mẫu được biên dịch

sudo port select --set php php81
6
sudo port select --set php php81
7

Sử dụng thư viện cành.

Ví dụ về các mẫu được biên dịch sử dụng kế thừa

  • Đọc thêm
  • Bài viết & hướng dẫn
  • Động cơ tạo khuôn trong PHP
  • Giới thiệu về Quan điểm & Templating trong Codeigniter
  • Bắt đầu với khuôn mẫu PHP
  • Cuộn hệ thống khuôn mẫu của riêng bạn trong PHP
  • Trang chính

Làm việc với các mẫu trong Symfony 2

  • Viết mẫu an toàn hơn
  • Thư viện
  • Aura.view (bản địa)
  • Blade (biên soạn, khung cụ thể)
  • Brainy (biên soạn)
  • Latte (biên soạn)
  • Ria mép (được biên dịch)
  • Phptal (biên soạn)
  • Tấm (bản địa)
  • Smarty (biên soạn)

Cành cây (biên soạn)

Zend \ View (Bản địa, Khung cụ thể)

Lỗi và ngoại lệ

Lỗi

sudo port select --set php php81
8

Trong nhiều ngôn ngữ lập trình nặng ngoại lệ của người Viking, bất cứ khi nào có bất cứ điều gì sai, một ngoại lệ sẽ bị ném. Đây chắc chắn là một cách khả thi để làm mọi thứ, nhưng PHP là một ngôn ngữ lập trình ngoại lệ của người Hồi giáo. Mặc dù nó có ngoại lệ và nhiều cốt lõi hơn đang bắt đầu sử dụng chúng khi làm việc với các đối tượng, hầu hết các PHP sẽ cố gắng tiếp tục xử lý bất kể điều gì xảy ra, trừ khi xảy ra lỗi nghiêm trọng.

sudo port select --set php php81
9

Sự khác biệt thực sự duy nhất là Python sẽ hoảng loạn về bất kỳ điều nhỏ nhặt nào, để các nhà phát triển có thể rất chắc chắn về bất kỳ vấn đề tiềm năng hoặc trường hợp cạnh nào, trong khi PHP sẽ tiếp tục xử lý trừ khi có điều gì đó cực đoan xảy ra, tại thời điểm đó, nó sẽ ném một lỗi và báo cáo nó.

Mức độ nghiêm trọng của lỗi

PHP có một số mức độ nghiêm trọng của lỗi. Ba loại tin nhắn phổ biến nhất là lỗi, thông báo và cảnh báo. Chúng có mức độ nghiêm trọng khác nhau;

brew unlink php
brew link --overwrite 
98,
brew unlink php
brew link --overwrite 
99 và
sudo port install php74
sudo port install php81
00. Lỗi là lỗi thời gian chạy nghiêm trọng và thường được gây ra bởi các lỗi trong mã của bạn và cần được sửa chữa vì chúng sẽ khiến PHP ngừng thực thi. Thông báo là thông báo tư vấn do mã có thể hoặc không gây ra vấn đề trong quá trình thực thi tập lệnh, việc thực thi không bị dừng lại. Cảnh báo là các lỗi không gây tử vong, việc thực thi tập lệnh sẽ không bị dừng lại.

Một loại thông báo lỗi khác được báo cáo tại thời điểm biên dịch là các thông báo

sudo port install php74
sudo port install php81
01. Những thông điệp này được sử dụng để đề xuất các thay đổi đối với mã của bạn để giúp đảm bảo khả năng tương tác tốt nhất và khả năng tương thích chuyển tiếp với các phiên bản PHP sắp tới của PHP.

Thay đổi hành vi báo cáo lỗi PHP

Có thể thay đổi báo cáo lỗi bằng cách sử dụng cài đặt PHP và/hoặc các cuộc gọi chức năng PHP. Sử dụng hàm được tích hợp trong hàm PHP

sudo port install php74
sudo port install php81
02, bạn có thể đặt mức độ lỗi trong suốt thời gian thực hiện tập lệnh bằng cách truyền một trong các hằng số mức lỗi được xác định trước, có nghĩa là nếu bạn chỉ muốn thấy lỗi và cảnh báo - nhưng không thông báo - thì bạn có thể định cấu hình cái đó:

phpcs -sw --standard=PSR1 file.php
0

Bạn cũng có thể kiểm soát xem các lỗi có được hiển thị trên màn hình hay không (tốt để phát triển) hoặc ẩn và ghi lại (tốt để sản xuất). Để biết thêm thông tin về điều này, hãy xem phần báo cáo lỗi.

Ức chế lỗi nội tuyến

Bạn cũng có thể yêu cầu PHP ngăn chặn các lỗi cụ thể với toán tử điều khiển lỗi

sudo port install php74
sudo port install php81
03. Bạn đặt toán tử này ở đầu một biểu thức và bất kỳ lỗi nào mà một kết quả trực tiếp của biểu thức đều bị im lặng.

phpcs -sw --standard=PSR1 file.php
1

Điều này sẽ xuất ra

sudo port install php74
sudo port install php81
04 nếu nó tồn tại, nhưng sẽ đơn giản là trả về một null và không in gì nếu biến
sudo port install php74
sudo port install php81
05 hoặc
sudo port install php74
sudo port install php81
06 không tồn tại. Nếu không có toán tử điều khiển lỗi, biểu thức này có thể tạo lỗi
sudo port install php74
sudo port install php81
07 hoặc
sudo port install php74
sudo port install php81
08.

Điều này có vẻ như là một ý tưởng tốt, nhưng có một vài sự đánh đổi không mong muốn. PHP xử lý các biểu thức bằng cách sử dụng

sudo port install php74
sudo port install php81
03 theo cách ít hiệu suất hơn các biểu thức mà không có
sudo port install php74
sudo port install php81
03. Tối ưu hóa sớm có thể là gốc rễ của tất cả các đối số lập trình, nhưng nếu hiệu suất đặc biệt quan trọng đối với ứng dụng/thư viện của bạn thì điều quan trọng là phải hiểu ý nghĩa hiệu suất của toán tử kiểm soát lỗi.

Thứ hai, toán tử điều khiển lỗi hoàn toàn nuốt lỗi. Lỗi không được hiển thị và lỗi không được gửi đến nhật ký lỗi. Ngoài ra, các hệ thống Sản xuất/Sản xuất không có cách nào để tắt toán tử kiểm soát lỗi. Mặc dù bạn có thể chính xác rằng lỗi mà bạn thấy là vô hại, một lỗi khác, ít vô hại sẽ chỉ im lặng.completely swallows the error. The error is not displayed, and the error is not sent to the error log. Also, stock/production PHP systems have no way to turn off the error control operator. While you may be correct that the error you’re seeing is harmless, a different, less harmless error will be just as silent.

Nếu có một cách để tránh toán tử triệt tiêu lỗi, bạn nên xem xét nó. Ví dụ: mã của chúng tôi ở trên có thể được viết lại như thế này:

phpcs -sw --standard=PSR1 file.php
2

Một trường hợp mà việc triệt tiêu lỗi có thể có ý nghĩa là khi

sudo port install php74
sudo port install php81
11 không tìm thấy tệp để tải. Bạn có thể kiểm tra sự tồn tại của tệp trước khi bạn cố gắng tải nó, nhưng nếu tệp bị xóa sau khi kiểm tra và trước
sudo port install php74
sudo port install php81
11 (điều này có vẻ không thể, nhưng nó có thể xảy ra) thì
sudo port install php74
sudo port install php81
11 sẽ trả về sai và gây ra lỗi. Đây có khả năng là một cái gì đó PHP nên giải quyết, nhưng là một trường hợp mà việc giảm lỗi có vẻ như là giải pháp hợp lệ duy nhất.

Trước đó, chúng tôi đã đề cập đến việc không có cách nào trong một hệ thống PHP để tắt toán tử kiểm soát lỗi. Tuy nhiên, XDebug có cài đặt INI

sudo port install php74
sudo port install php81
14 sẽ vô hiệu hóa toán tử điều khiển lỗi. Bạn có thể đặt cái này thông qua tệp
brew unlink php
brew link --overwrite 
93 của bạn với phần sau.

phpcs -sw --standard=PSR1 file.php
3

Bạn cũng có thể đặt giá trị này trong thời gian chạy với hàm

sudo port install php74
sudo port install php81
16

phpcs -sw --standard=PSR1 file.php
4

Phần mở rộng PHP của Scream Scream cung cấp chức năng tương tự như XDebug, mặc dù cài đặt Scream, Ini được đặt tên là

sudo port install php74
sudo port install php81
17.

Điều này hữu ích nhất khi bạn gỡ lỗi mã và nghi ngờ một lỗi thông tin bị triệt tiêu. Sử dụng Scream với sự chăm sóc, và như một công cụ gỡ lỗi tạm thời. Có rất nhiều mã thư viện PHP có thể không hoạt động với toán tử điều khiển lỗi bị vô hiệu hóa.

  • Toán tử kiểm soát lỗi
  • Trang web
  • Xdebug
  • La hét

ErrorException

PHP hoàn toàn có khả năng trở thành một ngôn ngữ lập trình rất nặng về ngoại lệ và chỉ yêu cầu một vài dòng mã để thực hiện chuyển đổi. Về cơ bản, bạn có thể ném các lỗi của bạn, vì các trường hợp ngoại lệ của bạn bằng cách sử dụng lớp

sudo port install php74
sudo port install php81
18, mở rộng lớp
sudo port install php74
sudo port install php81
19.

Đây là một thực tế phổ biến được thực hiện bởi một số lượng lớn các khung hiện đại như Symfony và Laravel. Trong chế độ gỡ lỗi (hoặc chế độ Dev), cả hai khung này sẽ hiển thị một dấu vết ngăn xếp đẹp và sạch.

Ngoài ra còn có một số gói có sẵn để xử lý và xử lý ngoại lệ tốt hơn. Giống như Whoops !, Đi kèm với việc cài đặt mặc định của Laravel và cũng có thể được sử dụng trong bất kỳ khung nào.

Bằng cách ném lỗi như là trường hợp ngoại lệ trong quá trình phát triển, bạn có thể xử lý chúng tốt hơn so với kết quả thông thường và nếu bạn thấy một ngoại lệ trong quá trình phát triển, bạn có thể bọc nó trong một tuyên bố bắt với các hướng dẫn cụ thể về cách xử lý tình huống. Mỗi ngoại lệ bạn bắt ngay lập tức làm cho ứng dụng của bạn mạnh mẽ hơn một chút.

Thông tin thêm về điều này và chi tiết về cách sử dụng

sudo port install php74
sudo port install php81
18 với việc xử lý lỗi có thể được tìm thấy tại lớp ErrorException.

  • Toán tử kiểm soát lỗi
  • Hằng số được xác định trước để xử lý lỗi
  • sudo port install php74
    sudo port install php81
    
    02
  • Báo cáo

Ngoại lệ

Ngoại lệ là một phần tiêu chuẩn của hầu hết các ngôn ngữ lập trình phổ biến, nhưng chúng thường bị bỏ qua bởi các lập trình viên PHP. Các ngôn ngữ như Ruby cực kỳ ngoại lệ, vì vậy bất cứ khi nào có sự cố như yêu cầu HTTP không thành công hoặc truy vấn DB đều sai, hoặc ngay cả khi không thể tìm thấy tài sản hình ảnh, Ruby (hoặc Gems đang được sử dụng) sẽ ném một ngoại lệ Đối với màn hình có nghĩa là bạn ngay lập tức biết có một sai lầm.

Bản thân PHP khá lỏng lẻo với điều này, và một cuộc gọi đến

sudo port install php74
sudo port install php81
22 thường sẽ chỉ cho bạn một
sudo port install php74
sudo port install php81
23 và một cảnh báo. Nhiều khung PHP cũ hơn như Codeigniter sẽ chỉ trả lại sai, đăng nhập thông điệp vào nhật ký độc quyền của họ và có thể cho phép bạn sử dụng một phương thức như
sudo port install php74
sudo port install php81
24 để xem điều gì đã xảy ra. Vấn đề ở đây là bạn phải tìm kiếm một lỗi và kiểm tra các tài liệu để xem phương pháp lỗi là gì cho lớp này, thay vì nó trở nên cực kỳ rõ ràng.

Một vấn đề khác là khi các lớp tự động ném lỗi vào màn hình và thoát khỏi quá trình. Khi bạn làm điều này, bạn ngăn chặn một nhà phát triển khác có thể xử lý linh hoạt lỗi đó. Các trường hợp ngoại lệ nên được ném để làm cho một nhà phát triển nhận thức được một lỗi; Sau đó, họ có thể chọn cách xử lý việc này. Ví dụ.:

phpcs -sw --standard=PSR1 file.php
5

Ngoại lệ SPL

Lớp

sudo port install php74
sudo port install php81
19 chung cung cấp rất ít bối cảnh gỡ lỗi cho nhà phát triển; Tuy nhiên, để khắc phục điều này, có thể tạo một loại
sudo port install php74
sudo port install php81
19 chuyên biệt bằng cách phân lớp lớp
sudo port install php74
sudo port install php81
19 chung:

phpcs -sw --standard=PSR1 file.php
6

Điều này có nghĩa là bạn có thể thêm nhiều khối bắt và xử lý các ngoại lệ khác nhau khác nhau. Điều này có thể dẫn đến việc tạo ra rất nhiều ngoại lệ tùy chỉnh, một số trong đó có thể tránh được bằng cách sử dụng các ngoại lệ SPL được cung cấp trong phần mở rộng SPL.

Ví dụ, nếu bạn sử dụng phương pháp ma thuật

> php -i
8 và một phương thức không hợp lệ được yêu cầu sau đó thay vì ném một ngoại lệ tiêu chuẩn mơ hồ hoặc tạo ra một ngoại lệ tùy chỉnh chỉ vì điều đó, bạn chỉ có thể ____329.

  • Đọc về ngoại lệ
  • Đọc về ngoại lệ SPL
  • Ngoại lệ làm tổ trong PHP

Bảo vệ

Tài nguyên tốt nhất mà tôi đã tìm thấy trên PHP Security là hướng dẫn năm 2018 để xây dựng phần mềm PHP an toàn của Paragon Sáng kiến.

Bảo mật ứng dụng web

Điều rất quan trọng đối với mọi nhà phát triển PHP là tìm hiểu những điều cơ bản về bảo mật ứng dụng web, có thể được chia thành một số chủ đề rộng:

  1. Tách dữ liệu mã.
    • Khi dữ liệu được thực thi dưới dạng mã, bạn sẽ tiêm SQL, tập lệnh chéo trang, bao gồm tệp cục bộ/từ xa, v.v.
    • Khi mã được in dưới dạng dữ liệu, bạn sẽ nhận được rò rỉ thông tin (công bố mã nguồn hoặc, trong trường hợp các chương trình C, đủ thông tin để bỏ qua ASLR).
  2. Logic ứng dụng.
    • Thiếu xác thực hoặc kiểm soát ủy quyền.
    • Xác thực đầu vào.
  3. Môi trường hoạt động.
    • Phiên bản PHP.
    • Thư viện bên thứ ba.
    • Hệ điều hành.
  4. Điểm yếu về mật mã.
    • Số ngẫu nhiên yếu.
    • Các cuộc tấn công được chọn-in-mật.
    • Rò rỉ thông tin kênh bên.

Có những người xấu sẵn sàng và sẵn sàng khai thác ứng dụng web của bạn. Điều quan trọng là bạn phải thực hiện các biện pháp phòng ngừa cần thiết để làm cứng bảo mật ứng dụng web của bạn. May mắn thay, những người tốt tại Dự án bảo mật ứng dụng web mở (OWASP) đã biên soạn một danh sách toàn diện về các vấn đề và phương pháp bảo mật đã biết để bảo vệ bạn chống lại họ. Đây là phải đọc cho nhà phát triển có ý thức bảo mật. Sống sót sâu thẳm: Bảo mật PHP của Padraic Brady cũng là một hướng dẫn bảo mật ứng dụng web tốt khác cho PHP.

  • Đọc hướng dẫn bảo mật OWASP

Mật khẩu băm

Cuối cùng, mọi người đều xây dựng một ứng dụng PHP dựa trên đăng nhập người dùng. Tên người dùng và mật khẩu được lưu trữ trong cơ sở dữ liệu và sau đó được sử dụng để xác thực người dùng khi đăng nhập.

Điều quan trọng là bạn có mật khẩu băm đúng cách trước khi lưu trữ chúng. Băm và mã hóa là hai điều rất khác nhau thường bị nhầm lẫn.

Băm là một chức năng một chiều không thể đảo ngược. Điều này tạo ra một chuỗi có độ dài cố định không thể đảo ngược khả thi. Điều này có nghĩa là bạn có thể so sánh hàm băm với người khác để xác định xem cả hai đều đến từ cùng một chuỗi nguồn, nhưng bạn không thể xác định chuỗi gốc. Nếu mật khẩu không được băm và cơ sở dữ liệu của bạn được truy cập bởi bên thứ ba trái phép, tất cả các tài khoản người dùng hiện đang bị xâm phạm.

Không giống như băm, mã hóa có thể đảo ngược (miễn là bạn có khóa). Mã hóa rất hữu ích trong các lĩnh vực khác, nhưng là một chiến lược kém để lưu trữ mật khẩu an toàn.

Mật khẩu cũng nên được muối riêng lẻ bằng cách thêm một chuỗi ngẫu nhiên vào mỗi mật khẩu trước khi băm. Điều này ngăn chặn các cuộc tấn công từ điển và việc sử dụng các bảng cầu vồng của Hồi giáo (một danh sách ngược các băm crytographic cho mật khẩu phổ biến.)

Băm và muối rất quan trọng vì thường người dùng sử dụng cùng một mật khẩu cho nhiều dịch vụ và chất lượng mật khẩu có thể kém.

Ngoài ra, bạn nên sử dụng thuật toán băm mật khẩu chuyên dụng chứ không phải là hàm băm mật mã nhanh, nhanh chóng (ví dụ: SHA256). Danh sách ngắn các thuật toán băm mật khẩu chấp nhận được (tính đến tháng 6 năm 2018) để sử dụng là:

  • Argon2 (có sẵn trong PHP 7.2 và mới hơn)
  • Scrypt
  • BCRYPT (PHP cung cấp cái này cho bạn; xem bên dưới) (PHP provides this one for you; see below)
  • PBKDF2 với HMAC-SHA256 hoặc HMAC-SHA512

May mắn thay, ngày nay PHP làm cho điều này dễ dàng.

Mật khẩu băm với

sudo port install php74
sudo port install php81
30

Trong Php 5.5

sudo port install php74
sudo port install php81
31 đã được giới thiệu. Tại thời điểm này, nó đang sử dụng BCRYPT, thuật toán mạnh nhất hiện đang được PHP hỗ trợ. Nó sẽ được cập nhật trong tương lai để hỗ trợ nhiều thuật toán hơn khi cần thiết. Thư viện
sudo port install php74
sudo port install php81
32 được tạo để cung cấp khả năng tương thích chuyển tiếp cho PHP> = 5.3.7.

Dưới đây chúng tôi băm một chuỗi, và sau đó kiểm tra băm so với một chuỗi mới. Bởi vì hai chuỗi nguồn của chúng tôi là khác nhau (‘Secret-Password, so với‘ Bad-Password), đăng nhập này sẽ thất bại.

phpcs -sw --standard=PSR1 file.php
7

sudo port install php74
sudo port install php81
31 chăm sóc muối mật khẩu cho bạn. Muối được lưu trữ, cùng với thuật toán và chi phí, như một phần của băm.
sudo port install php74
sudo port install php81
34 trích xuất điều này để xác định cách kiểm tra mật khẩu, vì vậy bạn không cần một trường cơ sở dữ liệu riêng để lưu trữ muối của bạn.

  • Tìm hiểu về
    sudo port install php74
    sudo port install php81
    
    31
  • sudo port install php74
    sudo port install php81
    
    32 cho PHP> = 5.3.7 && <5.5
  • Tìm hiểu về việc băm liên quan đến mật mã
  • Tìm hiểu về muối
  • Php
    sudo port install php74
    sudo port install php81
    
    31 RFC

Lọc dữ liệu

Không bao giờ (bao giờ) tin tưởng đầu vào nước ngoài được giới thiệu vào mã PHP của bạn. Luôn luôn vệ sinh và xác nhận đầu vào nước ngoài trước khi sử dụng mã trong mã. Các hàm

sudo port install php74
sudo port install php81
38 và
sudo port install php74
sudo port install php81
39 có thể vệ sinh văn bản và xác nhận các định dạng văn bản (ví dụ: địa chỉ email).

Đầu vào nước ngoài có thể là bất cứ điều gì:

sudo port install php74
sudo port install php81
40 và
sudo port install php74
sudo port install php81
41 Dữ liệu đầu vào hình thức, một số giá trị trong
sudo port install php74
sudo port install php81
42 SuperGlobal và thân yêu cầu HTTP thông qua
sudo port install php74
sudo port install php81
43. Hãy nhớ rằng, đầu vào nước ngoài không giới hạn trong dữ liệu biểu mẫu được gửi bởi người dùng. Được tải lên và tải xuống các tệp, giá trị phiên, dữ liệu cookie và dữ liệu từ các dịch vụ web của bên thứ ba cũng là đầu vào nước ngoài.

Mặc dù dữ liệu nước ngoài có thể được lưu trữ, kết hợp và truy cập sau đó, nó vẫn là đầu vào nước ngoài. Mỗi khi bạn xử lý, đầu ra, concatenate hoặc bao gồm dữ liệu trong mã của bạn, hãy tự hỏi liệu dữ liệu có được lọc đúng không và nó có thể được tin cậy không.

Dữ liệu có thể được lọc khác nhau dựa trên mục đích của nó. Ví dụ: khi đầu vào nước ngoài chưa được lọc được chuyển vào đầu ra trang HTML, nó có thể thực hiện HTML và JavaScript trên trang web của bạn! Điều này được gọi là kịch bản chéo trang (XSS) và có thể là một cuộc tấn công rất nguy hiểm. Một cách để tránh XSS là vệ sinh tất cả dữ liệu do người dùng tạo trước khi xuất nó vào trang của bạn bằng cách xóa các thẻ HTML bằng hàm

sudo port install php74
sudo port install php81
44 hoặc thoát các ký tự có ý nghĩa đặc biệt vào các thực thể HTML tương ứng của chúng với các hàm
brew unlink php
brew link --overwrite 
59 hoặc
brew unlink php
brew link --overwrite 
61.

Một ví dụ khác là chuyển các tùy chọn sẽ được thực thi trên dòng lệnh. Điều này có thể cực kỳ nguy hiểm (và thường là một ý tưởng tồi), nhưng bạn có thể sử dụng chức năng

sudo port install php74
sudo port install php81
47 tích hợp để vệ sinh các đối số lệnh được thực thi.

Một ví dụ cuối cùng là chấp nhận đầu vào nước ngoài để xác định một tệp để tải từ hệ thống tập tin. Điều này có thể được khai thác bằng cách thay đổi tên tệp thành đường dẫn tệp. Bạn cần xóa

sudo port install php74
sudo port install php81
48,
sudo port install php74
sudo port install php81
49, null byte hoặc các ký tự khác khỏi đường dẫn tệp để nó có thể tải các tệp ẩn, không công khai hoặc nhạy cảm.

  • Tìm hiểu về lọc dữ liệu
  • Tìm hiểu về
    sudo port install php74
    sudo port install php81
    
    50
  • Tìm hiểu về
    sudo port install php74
    sudo port install php81
    
    51
  • Tìm hiểu về việc xử lý null byte

Vệ sinh

Vệ sinh loại bỏ (hoặc trốn thoát) các ký tự bất hợp pháp hoặc không an toàn khỏi đầu vào nước ngoài.

Ví dụ: bạn nên vệ sinh đầu vào nước ngoài trước khi bao gồm đầu vào trong HTML hoặc chèn nó vào truy vấn SQL thô. Khi bạn sử dụng các tham số ràng buộc với PDO, nó sẽ vệ sinh đầu vào cho bạn.

Đôi khi cần phải cho phép một số thẻ HTML an toàn trong đầu vào khi bao gồm nó trong trang HTML. Điều này rất khó thực hiện và nhiều người tránh nó bằng cách sử dụng các định dạng hạn chế khác như Markdown hoặc BBCode, mặc dù các thư viện danh sách trắng như máy lọc HTML tồn tại vì lý do này.

Xem bộ lọc vệ sinh

Không có chủ đề

Thật nguy hiểm khi

sudo port install php74
sudo port install php81
52 dữ liệu từ người dùng hoặc các nguồn không đáng tin cậy khác. Làm như vậy có thể cho phép người dùng độc hại để khởi tạo các đối tượng (với các thuộc tính do người dùng xác định) có chất phá hủy sẽ được thực thi, ngay cả khi các đối tượng được sử dụng. Do đó, bạn nên tránh những dữ liệu không đáng tin cậy.even if the objects themselves aren’t used. You should therefore avoid unserializing untrusted data.

Nếu bạn hoàn toàn phải giải phóng dữ liệu từ các nguồn không đáng tin cậy, hãy sử dụng tùy chọn Php 7 ____ ____353 để hạn chế các loại đối tượng nào được phép không bị hủy.

Thẩm định

Xác nhận đảm bảo rằng đầu vào nước ngoài là những gì bạn mong đợi. Ví dụ: bạn có thể muốn xác thực một địa chỉ email, số điện thoại hoặc tuổi khi xử lý gửi đăng ký.

Xem các bộ lọc xác nhận

Tệp cấu hình

Khi tạo tệp cấu hình cho các ứng dụng của bạn, các thực tiễn tốt nhất nên tuân thủ một trong các phương thức sau:

  • Bạn nên lưu trữ thông tin cấu hình của mình, nơi không thể truy cập trực tiếp và kéo qua hệ thống tệp.
  • Nếu bạn phải lưu trữ các tệp cấu hình của mình trong root tài liệu, hãy đặt tên cho các tệp có phần mở rộng
    brew unlink php
    brew link --overwrite 
    
    97. Điều này đảm bảo rằng, ngay cả khi tập lệnh được truy cập trực tiếp, nó sẽ không được xuất như văn bản thuần túy.
  • Thông tin trong các tệp cấu hình phải được bảo vệ phù hợp, thông qua các quyền của mã hóa hoặc nhóm/nhóm người dùng.
  • Bạn nên đảm bảo rằng bạn không cam kết các tệp cấu hình chứa thông tin nhạy cảm, ví dụ: mật khẩu hoặc mã thông báo API để kiểm soát nguồn.

Đăng ký toàn cầu

Lưu ý: Tính đến Php 5.4.0, cài đặt

sudo port install php74
sudo port install php81
55 đã bị xóa và không còn có thể được sử dụng. Điều này chỉ được bao gồm như một cảnh báo cho bất kỳ ai trong quá trình nâng cấp một ứng dụng kế thừa. As of PHP 5.4.0 the
sudo port install php74
sudo port install php81
55 setting has been removed and can no longer be used. This is only included as a warning for anyone in the process of upgrading a legacy application.

Khi được bật, cài đặt cấu hình

sudo port install php74
sudo port install php81
55 tạo ra một số loại biến (bao gồm các loại từ
sudo port install php74
sudo port install php81
41,
sudo port install php74
sudo port install php81
40 và
sudo port install php74
sudo port install php81
59) có sẵn trong phạm vi toàn cầu của ứng dụng của bạn. Điều này có thể dễ dàng dẫn đến các vấn đề bảo mật vì ứng dụng của bạn không thể cho biết dữ liệu đến từ đâu.

Ví dụ:

sudo port install php74
sudo port install php81
60 sẽ có sẵn thông qua
sudo port install php74
sudo port install php81
05, có thể ghi đè các biến đã được khai báo.

Nếu bạn đang sử dụng PHP <5.4.0, hãy đảm bảo rằng

sudo port install php74
sudo port install php81
55 sẽ tắt.make sure that
sudo port install php74
sudo port install php81
55 is off.

  • Đăng ký_globals trong Hướng dẫn sử dụng PHP

Báo cáo lỗi

Ghi nhật ký lỗi có thể hữu ích trong việc tìm các điểm có vấn đề trong ứng dụng của bạn, nhưng nó cũng có thể hiển thị thông tin về cấu trúc ứng dụng của bạn với thế giới bên ngoài. Để bảo vệ hiệu quả ứng dụng của bạn khỏi các vấn đề có thể gây ra bởi đầu ra của các tin nhắn này, bạn cần định cấu hình máy chủ của mình khác nhau trong phát triển so với sản xuất (trực tiếp).

Sự phát triển

Để hiển thị mọi lỗi có thể xảy ra trong quá trình phát triển, hãy định cấu hình các cài đặt sau trong

brew unlink php
brew link --overwrite 
93 của bạn:development, configure the following settings in your
brew unlink php
brew link --overwrite 
93:

phpcs -sw --standard=PSR1 file.php
8

Truyền trong giá trị

sudo port install php74
sudo port install php81
64 sẽ hiển thị mọi lỗi có thể xảy ra, ngay cả khi các cấp độ và hằng số mới được thêm vào các phiên bản PHP trong tương lai. Hằng số
sudo port install php74
sudo port install php81
65 cũng hoạt động theo cách này kể từ Php 5.4. - Php.net

Hằng số mức lỗi

sudo port install php74
sudo port install php81
01 được giới thiệu trong 5.3.0 và không phải là một phần của
sudo port install php74
sudo port install php81
65, tuy nhiên nó đã trở thành một phần của
sudo port install php74
sudo port install php81
65 trong 5.4.0. Điều đó có nghĩa là gì? Về mặt báo cáo, mọi lỗi có thể có trong phiên bản 5.3, điều đó có nghĩa là bạn phải sử dụng
sudo port install php74
sudo port install php81
64 hoặc
sudo port install php74
sudo port install php81
70.

Báo cáo mọi lỗi có thể xảy ra bằng phiên bản PHP

  • < 5.3
    sudo port install php74
    sudo port install php81
    
    64 or
    sudo port install php74
    sudo port install php81
    
    65
  • & nbsp; 5.3
    sudo port install php74
    sudo port install php81
    
    64 hoặc
    sudo port install php74
    sudo port install php81
    
    70
  • > 5.3
    sudo port install php74
    sudo port install php81
    
    64 hoặc
    sudo port install php74
    sudo port install php81
    
    65

Sản xuất

Để ẩn lỗi trên môi trường sản xuất của bạn, hãy định cấu hình

brew unlink php
brew link --overwrite 
93 của bạn như:production environment, configure your
brew unlink php
brew link --overwrite 
93 as:

phpcs -sw --standard=PSR1 file.php
9

Với các cài đặt này trong sản xuất, các lỗi vẫn sẽ được ghi vào nhật ký lỗi cho máy chủ web, nhưng sẽ không được hiển thị cho người dùng. Để biết thêm thông tin về các cài đặt này, hãy xem Hướng dẫn sử dụng PHP:

  • error_reporting
  • display_errors
  • display_startup_errors
  • log_errors

Kiểm tra

Viết các bài kiểm tra tự động cho mã PHP của bạn được coi là một thông lệ tốt nhất và có thể dẫn đến các ứng dụng được xây dựng tốt. Kiểm tra tự động là một công cụ tuyệt vời để đảm bảo ứng dụng của bạn không bị hỏng khi bạn thực hiện các thay đổi hoặc thêm chức năng mới và không nên bỏ qua.

Có một số loại công cụ thử nghiệm khác nhau (hoặc khung) có sẵn cho PHP, sử dụng các phương pháp khác nhau - tất cả đều đang cố gắng tránh thử nghiệm thủ công và nhu cầu về các nhóm đảm bảo chất lượng lớn, chỉ để đảm bảo những thay đổi gần đây không phá vỡ chức năng.

Hướng phát triển thử nghiệm

Từ Wikipedia:

Phát triển theo hướng thử nghiệm (TDD) là một quy trình phát triển phần mềm dựa vào sự lặp lại của một chu kỳ phát triển rất ngắn: Đầu tiên nhà phát triển viết một trường hợp thử nghiệm tự động không thành công xác định một cải tiến mong muốn hoặc chức năng mới, sau đó tạo mã để vượt qua thử nghiệm đó và Cuối cùng, người tái lập mã mới theo tiêu chuẩn chấp nhận được. Kent Beck, người được cho là đã phát triển hoặc tái khám phá kỹ thuật, đã tuyên bố vào năm 2003 rằng TDD khuyến khích các thiết kế đơn giản và truyền cảm hứng cho sự tự tin.

Có một số loại thử nghiệm khác nhau mà bạn có thể làm cho ứng dụng của mình:

Kiểm tra đơn vị

Kiểm tra đơn vị là một cách tiếp cận lập trình để đảm bảo các chức năng, lớp và phương pháp đang hoạt động như mong đợi, từ điểm bạn xây dựng chúng trong suốt chu kỳ phát triển. Bằng cách kiểm tra các giá trị đi vào và ra khỏi các chức năng và phương thức khác nhau, bạn có thể đảm bảo logic nội bộ đang hoạt động chính xác. Bằng cách sử dụng tiêm và xây dựng các lớp và sơ khai của người Hồi giáo, bạn có thể xác minh rằng các phụ thuộc được sử dụng chính xác để bảo hiểm thử nghiệm tốt hơn.

Khi bạn tạo một lớp hoặc chức năng, bạn nên tạo một bài kiểm tra đơn vị cho từng hành vi mà nó phải có. Ở mức độ rất cơ bản, bạn nên đảm bảo rằng nó lỗi nếu bạn gửi nó đối số xấu và đảm bảo rằng nó hoạt động nếu bạn gửi nó đối số hợp lệ. Điều này sẽ giúp đảm bảo rằng khi bạn thay đổi lớp này hoặc chức năng sau này trong chu kỳ phát triển mà chức năng cũ tiếp tục hoạt động như mong đợi. Giải pháp thay thế duy nhất cho điều này sẽ là


if ($argc !== 2) {
    echo "Usage: php hello.php " . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
8 trong một test.php, đó không phải là cách để xây dựng một ứng dụng - lớn hay nhỏ.

Việc sử dụng khác cho các bài kiểm tra đơn vị đang góp phần vào nguồn mở. Nếu bạn có thể viết một bài kiểm tra cho thấy chức năng bị hỏng (tức là thất bại), sau đó sửa nó và hiển thị các lần vượt qua thử nghiệm, các bản vá có nhiều khả năng được chấp nhận. Nếu bạn chạy một dự án chấp nhận các yêu cầu kéo thì bạn nên đề xuất đây là một yêu cầu.

PHPUNIT là khung thử nghiệm de thực tế để viết các bài kiểm tra đơn vị cho các ứng dụng PHP, nhưng có một số lựa chọn thay thế:

  • atoum
  • Kahlan
  • Peridot
  • Đơn giản

Thử nghiệm hội nhập

Từ Wikipedia:

Kiểm tra tích hợp (đôi khi được gọi là tích hợp và thử nghiệm, viết tắt là I & T,) là giai đoạn trong thử nghiệm phần mềm trong đó các mô -đun phần mềm riêng lẻ được kết hợp và thử nghiệm dưới dạng một nhóm. Nó xảy ra sau khi kiểm tra đơn vị và trước khi kiểm tra xác nhận. Kiểm tra tích hợp lấy các mô -đun đầu vào của nó đã được thử nghiệm đơn vị, nhóm chúng theo các tập hợp lớn hơn, áp dụng các thử nghiệm được xác định trong gói kiểm tra tích hợp cho các tập hợp đó và cung cấp khi đầu ra của nó, hệ thống tích hợp sẵn sàng để kiểm tra hệ thống.

Nhiều công cụ tương tự có thể được sử dụng để thử nghiệm đơn vị có thể được sử dụng để kiểm tra tích hợp vì nhiều nguyên tắc tương tự được sử dụng.

Thử nghiệm chức năng

Đôi khi còn được gọi là kiểm tra chấp nhận, thử nghiệm chức năng bao gồm sử dụng các công cụ để tạo các thử nghiệm tự động thực sự sử dụng ứng dụng của bạn thay vì chỉ xác minh rằng các đơn vị mã riêng lẻ đang hoạt động chính xác và các đơn vị riêng lẻ có thể nói chuyện với nhau một cách chính xác. Các công cụ này thường hoạt động bằng cách sử dụng dữ liệu thực và mô phỏng người dùng thực tế của ứng dụng.

Công cụ kiểm tra chức năng

  • Selen
  • Mink
  • CodecePtion là một khung thử nghiệm đầy đủ bao gồm các công cụ kiểm tra chấp nhận
  • StoryPlayer là một khung thử nghiệm đầy đủ bao gồm hỗ trợ tạo và phá hủy môi trường thử nghiệm theo yêu cầu

Phát triển hành vi lái xe

Có hai loại phát triển dựa trên hành vi (BDD) khác nhau: SpecBDD và Storybdd. SpecBDD tập trung vào hành vi kỹ thuật của mã, trong khi StoryBDD tập trung vào kinh doanh hoặc các hành vi hoặc tương tác. PHP có khung cho cả hai loại BDD.

Với Storybdd, bạn viết những câu chuyện có thể đọc được của con người mô tả hành vi của ứng dụng của bạn. Những câu chuyện này sau đó có thể được chạy như các bài kiểm tra thực tế chống lại ứng dụng của bạn. Khung được sử dụng trong các ứng dụng PHP cho StoryBDD là Behat, được lấy cảm hứng từ Dự án Ducumber Ruby, và thực hiện DSL Gherkin để mô tả hành vi tính năng.

Với SpecBDD, bạn viết các thông số kỹ thuật mô tả cách thức hoạt động của mã thực tế của bạn. Thay vì kiểm tra một hàm hoặc phương pháp, bạn đang mô tả cách thức hoạt động hoặc phương thức đó. PHP cung cấp khung PHPSPEC cho mục đích này. Khung này được lấy cảm hứng từ dự án RSPEC cho Ruby.

Liên kết BDD

  • Behat, khung Storybdd cho PHP, lấy cảm hứng từ dự án dưa chuột Ruby,;
  • PHPSPEC, Khung SpecBDD cho PHP, lấy cảm hứng từ dự án Ruby, RSPEC;
  • CodecePtion là một khung thử nghiệm đầy đủ sử dụng các nguyên tắc BDD.

Bên cạnh các khung thử nghiệm và hành vi riêng lẻ, còn có một số khung chung chung và thư viện trợ giúp hữu ích cho bất kỳ cách tiếp cận ưa thích nào được thực hiện.

Liên kết công cụ

  • Selenium là một công cụ tự động hóa trình duyệt có thể được tích hợp với phpunit
  • Khai thác là một khung đối tượng giả có thể được tích hợp với PHPUNIT hoặc PHPSPEC
  • Lời tiên tri là một khung chế nhạo đối tượng PHP rất mạnh mẽ và linh hoạt. Nó được tích hợp với PHPSPEC và có thể được sử dụng với PHPUNIT.
  • PHP-Mock là một thư viện để giúp chế giễu các hàm gốc PHP.
  • Nhiễm trùng là việc thực hiện PHP của xét nghiệm đột biến để giúp đo lường hiệu quả của các xét nghiệm của bạn.
  • Phpunit Polyfills là một thư viện cho phép tạo các thử nghiệm tương thích phiên bản chéo phpunit khi bộ thử nghiệm cần chạy so với một loạt các phiên bản PHPUNIT.

Máy chủ và triển khai

Các ứng dụng PHP có thể được triển khai và chạy trên các máy chủ web sản xuất theo một số cách.

Nền tảng như một dịch vụ (PaaS)

PAAS cung cấp kiến ​​trúc hệ thống và mạng cần thiết để chạy các ứng dụng PHP trên web. Điều này có nghĩa là rất ít hoặc không có cấu hình để khởi chạy các ứng dụng PHP hoặc khung PHP.

Gần đây, PaaS đã trở thành một phương pháp phổ biến để triển khai, lưu trữ và mở rộng các ứng dụng PHP thuộc tất cả các kích cỡ. Bạn có thể tìm thấy một danh sách các nền tảng PHP PAAS là một nhà cung cấp dịch vụ trong phần tài nguyên của chúng tôi.

Máy chủ ảo hoặc chuyên dụng

Nếu bạn cảm thấy thoải mái với quản trị hệ thống hoặc quan tâm đến việc học nó, các máy chủ ảo hoặc chuyên dụng sẽ giúp bạn hoàn toàn kiểm soát môi trường sản xuất ứng dụng của bạn.

NGINX và PHP-FPM

PHP, thông qua Php, FastCGi Process Trình quản lý (FPM), các cặp thực sự độc đáo với NGINX, đây là một máy chủ web hiệu suất cao, nhẹ. Nó sử dụng ít bộ nhớ hơn Apache và có thể xử lý tốt hơn các yêu cầu đồng thời hơn. Điều này đặc biệt quan trọng trên các máy chủ ảo mà don don có nhiều bộ nhớ dự phòng.

  • Đọc thêm về nginx
  • Đọc thêm về PHP-FPM
  • Đọc thêm về việc thiết lập Nginx và PHP-FPM một cách an toàn

Apache và PHP

PHP và Apache có một lịch sử lâu dài cùng nhau. Apache có thể cấu hình cực kỳ và có nhiều mô -đun có sẵn để mở rộng chức năng. Đây là một lựa chọn phổ biến cho các máy chủ được chia sẻ và thiết lập dễ dàng cho các khung PHP và các ứng dụng nguồn mở như WordPress. Thật không may, Apache sử dụng nhiều tài nguyên hơn NGINX theo mặc định và không thể xử lý nhiều người truy cập cùng một lúc.

Apache có một số cấu hình có thể để chạy PHP. Phổ biến nhất và dễ nhất định nhất là MPM prefork với mod_php5. Mặc dù nó không phải là bộ nhớ hiệu quả nhất, nhưng nó là đơn giản nhất để làm việc và sử dụng. Đây có lẽ là lựa chọn tốt nhất nếu bạn không muốn đào sâu vào các khía cạnh quản trị máy chủ. Lưu ý rằng nếu bạn sử dụng mod_php5, bạn phải sử dụng mpm prefork.

Ngoài ra, nếu bạn muốn vắt hiệu suất và ổn định hơn của Apache thì bạn có thể tận dụng cùng một hệ thống FPM như NGINX và chạy công nhân MPM hoặc sự kiện MPM với mod_fastcgi hoặc mod_fcgid. Cấu hình này sẽ hiệu quả hơn đáng kể và nhanh hơn nhiều nhưng nó là công việc nhiều hơn để thiết lập.

Nếu bạn đang chạy Apache 2.4 trở lên, bạn có thể sử dụng mod_proxy_fcgi để có được hiệu suất tuyệt vời dễ dàng để thiết lập.

  • Đọc thêm về Apache
  • Đọc thêm về các mô-đun đa xử lý
  • Đọc thêm trên mod_fastcgi
  • Đọc thêm trên mod_fcgid
  • Đọc thêm trên mod_proxy_fcgi
  • Đọc thêm về việc thiết lập Apache và PHP-FPM với mod_proxy_fcgi

PHP đã chia sẻ máy chủ để cảm ơn sự phổ biến của nó. Thật khó để tìm thấy một máy chủ mà không cần cài đặt PHP, nhưng hãy chắc chắn rằng nó là phiên bản mới nhất. Các máy chủ được chia sẻ cho phép bạn và các nhà phát triển khác triển khai các trang web đến một máy. Mặt trái của điều này là nó đã trở thành một mặt hàng giá rẻ. Nhược điểm là bạn không bao giờ biết loại người thuê nhà lân cận của bạn sẽ tạo ra; Tải xuống máy chủ hoặc mở các lỗ bảo mật là những mối quan tâm chính. Nếu ngân sách dự án của bạn có thể đủ khả năng để tránh các máy chủ được chia sẻ, bạn nên.

Để đảm bảo các máy chủ được chia sẻ của bạn đang cung cấp các phiên bản mới nhất của PHP, hãy xem các phiên bản PHP.

Xây dựng và triển khai ứng dụng của bạn

Nếu bạn thấy mình đang thực hiện các thay đổi lược đồ cơ sở dữ liệu thủ công hoặc chạy thử nghiệm của bạn theo cách thủ công trước khi cập nhật các tệp của bạn (theo cách thủ công), hãy nghĩ hai lần! Với mỗi nhiệm vụ thủ công bổ sung cần thiết để triển khai một phiên bản mới của ứng dụng của bạn, cơ hội cho những sai lầm có khả năng gây tử vong tăng lên. Cho dù bạn đang xử lý một bản cập nhật đơn giản, một quy trình xây dựng toàn diện hoặc thậm chí là một chiến lược tích hợp liên tục, tự động hóa xây dựng là bạn của bạn.

Trong số các nhiệm vụ bạn có thể muốn tự động hóa là:

  • Quản lý phụ thuộc
  • Tổng hợp, thu nhỏ tài sản của bạn
  • Chạy thử nghiệm
  • Tạo tài liệu
  • Bao bì
  • Triển khai

Công cụ triển khai

Các công cụ triển khai có thể được mô tả như là một tập hợp các tập lệnh xử lý các nhiệm vụ phổ biến của triển khai phần mềm. Công cụ triển khai không phải là một phần của phần mềm của bạn, nó hoạt động trên phần mềm của bạn từ ‘bên ngoài.

Có nhiều công cụ nguồn mở có sẵn để giúp bạn tự động hóa và triển khai xây dựng, một số được viết bằng PHP khác aren. Điều này không nên giữ bạn lại từ việc sử dụng chúng, nếu họ phù hợp hơn cho công việc cụ thể. Đây là vài ví dụ:

Phing có thể kiểm soát quá trình bao bì, triển khai hoặc thử nghiệm của bạn từ trong tệp xây dựng XML. Phing (dựa trên Apache Ant) cung cấp một bộ tác vụ phong phú thường cần thiết để cài đặt hoặc cập nhật ứng dụng web và có thể được mở rộng với các tác vụ tùy chỉnh bổ sung, được viết bằng PHP. Nó là một công cụ vững chắc và mạnh mẽ và đã có từ lâu, tuy nhiên công cụ này có thể được coi là một chút lỗi thời vì cách nó xử lý cấu hình (tệp XML).

Capistrano là một hệ thống để các lập trình viên trung cấp đến nâng cao để thực thi các lệnh theo cách có cấu trúc, có thể lặp lại trên một hoặc nhiều máy từ xa. Nó được cấu hình sẵn để triển khai Ruby trên các ứng dụng Rails, tuy nhiên bạn có thể triển khai thành công các hệ thống PHP với nó. Việc sử dụng thành công Capistrano phụ thuộc vào kiến ​​thức làm việc về Ruby và Rake.

Ansistrano là một vài vai trò ansible để dễ dàng quản lý quy trình triển khai (triển khai và quay lại) cho các ứng dụng kịch bản như PHP, Python và Ruby. Nó là một cổng ansible cho Capistrano. Nó đã được sử dụng bởi khá nhiều công ty PHP.

Rocketeer có được nguồn cảm hứng và triết lý từ khung Laravel. Mục tiêu của nó là nhanh chóng, thanh lịch và dễ sử dụng với mặc định thông minh. Nó có nhiều máy chủ, nhiều giai đoạn, triển khai nguyên tử và triển khai có thể được thực hiện song song. Tất cả mọi thứ trong công cụ có thể được hoán đổi hoặc mở rộng nóng, và mọi thứ được viết bằng PHP.

Triển khai là một công cụ triển khai được viết bằng PHP. Nó đơn giản và chức năng. Các tính năng bao gồm các tác vụ chạy song song, triển khai nguyên tử và giữ tính nhất quán giữa các máy chủ. Công thức nấu ăn của các nhiệm vụ phổ biến cho Symfony, Laravel, Zend Framework và YII có sẵn. Bài viết của Younes Rafie, dễ dàng triển khai các ứng dụng PHP với triển khai là một hướng dẫn tuyệt vời để triển khai ứng dụng của bạn với công cụ.

Magallanes là một công cụ khác được viết bằng PHP với cấu hình đơn giản được thực hiện trong các tệp yaml. Nó có hỗ trợ cho nhiều máy chủ và môi trường, triển khai nguyên tử và có một số tác vụ tích hợp mà bạn có thể tận dụng cho các công cụ và khung chung.

Đọc thêm:

  • Tự động hóa dự án của bạn với Apache Ant
  • Triển khai các ứng dụng PHP - Sách trả phí về thực tiễn và công cụ tốt nhất để triển khai PHP.

Cung cấp máy chủ

Quản lý và định cấu hình máy chủ có thể là một nhiệm vụ khó khăn khi phải đối mặt với nhiều máy chủ. Có các công cụ để xử lý việc này để bạn có thể tự động hóa cơ sở hạ tầng của mình để đảm bảo bạn có đúng máy chủ và chúng được cấu hình đúng cách. Họ thường tích hợp với các nhà cung cấp dịch vụ lưu trữ đám mây lớn hơn (Amazon Web Services, Heroku, DigitalOcean, v.v.) để quản lý các trường hợp, giúp cho việc mở rộng một ứng dụng dễ dàng hơn rất nhiều.

Ansible là một công cụ quản lý cơ sở hạ tầng của bạn thông qua các tệp YAML. Nó rất đơn giản để bắt đầu và có thể quản lý các ứng dụng phức tạp và quy mô lớn. Có một API để quản lý các trường hợp đám mây và nó có thể quản lý chúng thông qua hàng tồn kho động bằng cách sử dụng một số công cụ nhất định.

Puppet là một công cụ có ngôn ngữ và loại tệp riêng để quản lý máy chủ và cấu hình. Nó có thể được sử dụng trong thiết lập chính/máy khách hoặc nó có thể được sử dụng trong chế độ không có chủ. Trong chế độ Master/Client, các máy khách sẽ thăm dò (các) Master trung tâm cho cấu hình mới trong các khoảng thời gian đã đặt và tự cập nhật nếu cần thiết. Trong chế độ không có chủ, bạn có thể đẩy các thay đổi vào các nút của mình.

Chef là một khung tích hợp hệ thống dựa trên Ruby mạnh mẽ mà bạn có thể xây dựng toàn bộ môi trường máy chủ hoặc các hộp ảo của mình. Nó tích hợp tốt với Amazon Web Services thông qua dịch vụ của họ có tên là Opsworks.

Đọc thêm:

  • Tự động hóa dự án của bạn với Apache Ant
  • Triển khai các ứng dụng PHP - Sách trả phí về thực tiễn và công cụ tốt nhất để triển khai PHP.
  • Cung cấp máy chủ
  • Quản lý và định cấu hình máy chủ có thể là một nhiệm vụ khó khăn khi phải đối mặt với nhiều máy chủ. Có các công cụ để xử lý việc này để bạn có thể tự động hóa cơ sở hạ tầng của mình để đảm bảo bạn có đúng máy chủ và chúng được cấu hình đúng cách. Họ thường tích hợp với các nhà cung cấp dịch vụ lưu trữ đám mây lớn hơn (Amazon Web Services, Heroku, DigitalOcean, v.v.) để quản lý các trường hợp, giúp cho việc mở rộng một ứng dụng dễ dàng hơn rất nhiều.
  • Ansible là một công cụ quản lý cơ sở hạ tầng của bạn thông qua các tệp YAML. Nó rất đơn giản để bắt đầu và có thể quản lý các ứng dụng phức tạp và quy mô lớn. Có một API để quản lý các trường hợp đám mây và nó có thể quản lý chúng thông qua hàng tồn kho động bằng cách sử dụng một số công cụ nhất định.
  • Puppet là một công cụ có ngôn ngữ và loại tệp riêng để quản lý máy chủ và cấu hình. Nó có thể được sử dụng trong thiết lập chính/máy khách hoặc nó có thể được sử dụng trong chế độ không có chủ. Trong chế độ Master/Client, các máy khách sẽ thăm dò (các) Master trung tâm cho cấu hình mới trong các khoảng thời gian đã đặt và tự cập nhật nếu cần thiết. Trong chế độ không có chủ, bạn có thể đẩy các thay đổi vào các nút của mình.

Chef là một khung tích hợp hệ thống dựa trên Ruby mạnh mẽ mà bạn có thể xây dựng toàn bộ môi trường máy chủ hoặc các hộp ảo của mình. Nó tích hợp tốt với Amazon Web Services thông qua dịch vụ của họ có tên là Opsworks.

Một hướng dẫn ansible

- Martin Fowler

Có nhiều cách khác nhau để thực hiện tích hợp liên tục cho PHP. Travis CI đã thực hiện một công việc tuyệt vời để biến hội nhập liên tục thành hiện thực ngay cả đối với các dự án nhỏ. Travis CI là một dịch vụ tích hợp liên tục được lưu trữ cho cộng đồng nguồn mở. Nó được tích hợp với GitHub và cung cấp hỗ trợ hạng nhất cho nhiều ngôn ngữ bao gồm PHP.

Đọc thêm:

  • Tích hợp liên tục với Jenkins
  • Tích hợp liên tục với PHPCI
  • Tích hợp liên tục với người kiểm duyệt PHP
  • Tích hợp liên tục với Teamcity

Ảo hóa

Chạy ứng dụng của bạn trên các môi trường khác nhau trong phát triển và sản xuất có thể dẫn đến các lỗi kỳ lạ xuất hiện khi bạn phát hành. Nó cũng khó khăn để giữ cho các môi trường phát triển khác nhau được cập nhật với cùng một phiên bản cho tất cả các thư viện được sử dụng khi làm việc với một nhóm các nhà phát triển.

Nếu bạn đang phát triển trên Windows và triển khai đến Linux (hoặc bất cứ thứ gì không phải là cửa sổ) hoặc đang phát triển trong một nhóm, bạn nên xem xét sử dụng một máy ảo. Điều này nghe có vẻ khó khăn, nhưng bên cạnh các môi trường ảo hóa được biết đến rộng rãi như VMware hoặc VirtualBox, còn có các công cụ bổ sung có thể giúp bạn thiết lập một môi trường ảo theo một vài bước dễ dàng.

Người Vagrant

Vagrant giúp bạn xây dựng các hộp ảo của mình trên đầu các môi trường ảo đã biết và sẽ định cấu hình các môi trường này dựa trên một tệp cấu hình duy nhất. Các hộp này có thể được thiết lập thủ công hoặc bạn có thể sử dụng phần mềm cung cấp trên mạng như Puppet hoặc Chef để làm điều này cho bạn. Cung cấp hộp cơ sở là một cách tuyệt vời để đảm bảo rằng nhiều hộp được thiết lập theo cách giống hệt nhau và loại bỏ sự cần thiết của bạn để duy trì các danh sách lệnh thiết lập phức tạp. Bạn cũng có thể phá hủy hộp cơ sở của bạn và tạo lại nó mà không cần nhiều bước thủ công, giúp bạn dễ dàng tạo ra một bản cài đặt mới.

Vagrant tạo các thư mục để chia sẻ mã của bạn giữa máy chủ và máy ảo của bạn, điều đó có nghĩa là bạn có thể tạo và chỉnh sửa các tệp của mình trên máy chủ của bạn và sau đó chạy mã bên trong máy ảo của bạn.

Một sự giúp đỡ nho nhỏ

Nếu bạn cần một chút trợ giúp để bắt đầu sử dụng Vagrant, có một số dịch vụ có thể hữu ích:

  • Puphpet: GUI đơn giản để thiết lập các máy ảo để phát triển PHP. Tập trung nhiều vào PHP. Bên cạnh các máy ảo địa phương, nó cũng có thể được sử dụng để triển khai cho các dịch vụ đám mây. Việc cung cấp được thực hiện với con rối.Heavily focused in PHP. Besides local VMs, it can be used to deploy to cloud services as well. The provisioning is made with Puppet.
  • Phansible: Cung cấp một giao diện dễ sử dụng giúp bạn tạo ra các playbook ansible cho các dự án dựa trên PHP.

Docker

Docker - một giải pháp thay thế nhẹ cho một máy ảo đầy đủ - được gọi là vì nó là tất cả về container trên mạng. Một container là một khối xây dựng, trong trường hợp đơn giản nhất, thực hiện một công việc cụ thể, ví dụ: Chạy một máy chủ web. Một hình ảnh của người Viking là gói bạn sử dụng để xây dựng container - Docker có một kho lưu trữ đầy đủ chúng.

Một ứng dụng đèn điển hình có thể có ba container: máy chủ web, quy trình PHP-FPM và MySQL. Như với các thư mục được chia sẻ trong Vagrant, bạn có thể để các tệp ứng dụng của mình ở nơi chúng và cho Docker biết nơi để tìm chúng.

Bạn có thể tạo các thùng chứa từ dòng lệnh (xem ví dụ bên dưới) hoặc, để dễ bảo trì, xây dựng tệp

sudo port install php74
sudo port install php81
79 cho dự án của bạn chỉ định để tạo và cách chúng giao tiếp với nhau.

Docker có thể giúp nếu bạn đang phát triển nhiều trang web và muốn sự phân tách xuất phát từ việc cài đặt mỗi trang trên máy ảo của riêng mình, nhưng don lồng có không gian đĩa cần thiết hoặc thời gian để cập nhật mọi thứ. Nó hiệu quả: cài đặt và tải xuống nhanh hơn, bạn chỉ cần lưu trữ một bản sao của mỗi hình ảnh tuy nhiên nó thường được sử dụng, các thùng chứa cần ít RAM hơn và chia sẻ cùng một hạt nhân OS, vì vậy bạn có thể có nhiều máy chủ chạy hơn và cần phải có vấn đề trong vài giây để dừng lại và bắt đầu chúng, không cần phải chờ một máy chủ đầy đủ.

Ví dụ: Chạy các ứng dụng PHP của bạn trong Docker

Sau khi cài đặt Docker trên máy của bạn, bạn có thể khởi động một máy chủ web với một lệnh. Sau đây sẽ tải xuống cài đặt Apache đầy đủ chức năng với phiên bản PHP mới nhất, MAP

sudo port install php74
sudo port install php81
80 vào gốc tài liệu mà bạn có thể xem tại
sudo port install php74
sudo port install php81
81:

phpcbf -w --standard=PSR1 file.php
0

Điều này sẽ khởi tạo và khởi chạy container của bạn.

sudo port install php74
sudo port install php81
82 làm cho nó chạy trong nền. Để dừng và bắt đầu, chỉ cần chạy
sudo port install php74
sudo port install php81
83 và
sudo port install php74
sudo port install php81
84 (các tham số khác không cần thiết trở lại).

Tìm hiểu thêm về Docker

Lệnh trên cho thấy một cách nhanh chóng để chạy một máy chủ cơ bản. Có rất nhiều bạn có thể làm (và hàng ngàn hình ảnh được xây dựng sẵn trong trung tâm Docker). Dành thời gian để tìm hiểu thuật ngữ và đọc Hướng dẫn sử dụng Docker để tận dụng tối đa nó và không cần chạy mã ngẫu nhiên mà bạn đã tải xuống mà không kiểm tra nó an toàn - hình ảnh không chính thức có thể không có các bản vá bảo mật mới nhất. Nếu nghi ngờ, hãy gắn bó với các repositiories chính thức.

Trang web PHPDocker.IO sẽ tự động tạo tất cả các tệp bạn cần cho một ngăn xếp đèn/LEMP có tính năng đầy đủ, bao gồm cả việc bạn chọn phiên bản PHP và phần mở rộng của bạn.

  • Trang web Docker
  • Cài đặt Docker
  • Hướng dẫn sử dụng Docker
  • Docker Hub
  • Docker Hub - Hình ảnh chính thức

Bộ nhớ đệm

PHP khá nhanh, nhưng các nút thắt có thể phát sinh khi bạn tạo kết nối từ xa, tải tệp, v.v. cần phải chạy.

Bộ đệm Opcode

Khi một tệp PHP được thực thi, trước tiên nó phải được biên dịch thành các opcodes (hướng dẫn ngôn ngữ máy cho CPU). Nếu mã nguồn không thay đổi, các opcode sẽ giống nhau, vì vậy bước tổng hợp này trở thành một sự lãng phí tài nguyên CPU.

Bộ đệm Opcode ngăn chặn việc biên dịch dự phòng bằng cách lưu trữ các opcode trong bộ nhớ và sử dụng lại chúng trong các cuộc gọi liên tiếp. Nó thường sẽ kiểm tra chữ ký hoặc thời gian sửa đổi của tệp trước, trong trường hợp đã có bất kỳ thay đổi nào.

Nó có khả năng là một bộ đệm opcode sẽ cải thiện tốc độ đáng kể cho ứng dụng của bạn. Vì Php 5.5, có một Opcache được tích hợp trong - Zend Opcache. Tùy thuộc vào gói/phân phối PHP của bạn, nó thường được bật theo mặc định -& nbsp; kiểm tra opcache.enable và đầu ra của


if ($argc !== 2) {
    echo "Usage: php hello.php " . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
1 để đảm bảo. Đối với các phiên bản trước đó, có một phần mở rộng PECL.

Đọc thêm về bộ đệm opcode:

  • Zend Opcache (đi kèm với PHP kể từ 5.5)
  • Zend Opcache (trước đây được gọi là Zend Optimuler+) hiện là nguồn mở
  • APC - Php 5.4 trở lên
  • Xcache
  • Wincache (Tiện ích mở rộng cho MS Windows Server)
  • Danh sách các máy gia tốc PHP trên Wikipedia
  • Tải trước PHP - PHP> = 7.4

Bộ nhớ đệm đối tượng

Có những lúc có thể có lợi cho bộ đệm các đối tượng riêng lẻ trong mã của bạn, chẳng hạn như với dữ liệu tốn kém để nhận hoặc các cuộc gọi cơ sở dữ liệu trong đó kết quả không thể thay đổi. Bạn có thể sử dụng phần mềm bộ đệm đối tượng để giữ các phần dữ liệu này trong bộ nhớ để truy cập cực nhanh sau này. Nếu bạn lưu các mục này vào một kho lưu trữ dữ liệu sau khi bạn truy xuất chúng, sau đó kéo chúng trực tiếp từ bộ đệm cho các yêu cầu sau, bạn có thể có được sự cải thiện đáng kể về hiệu suất cũng như giảm tải trên máy chủ cơ sở dữ liệu của bạn.

Nhiều giải pháp bộ nhớ đệm mã byte phổ biến cũng cho phép bạn lưu trữ dữ liệu tùy chỉnh, do đó, thậm chí còn có nhiều lý do hơn để tận dụng chúng. APCU, XCACHE và Wincache đều cung cấp API để lưu dữ liệu từ mã PHP của bạn vào bộ nhớ cache bộ nhớ của họ.

Các hệ thống bộ nhớ đệm đối tượng bộ nhớ được sử dụng phổ biến nhất là apcu và memcached. APCU là một lựa chọn tuyệt vời cho bộ nhớ đệm đối tượng, nó bao gồm một API đơn giản để thêm dữ liệu của riêng bạn vào bộ nhớ đệm bộ nhớ và rất dễ thiết lập và sử dụng. Một hạn chế thực sự của APCU là nó được gắn với máy chủ mà nó đã cài đặt. Mặt khác, Memcached được cài đặt dưới dạng dịch vụ riêng biệt và có thể được truy cập trên mạng, có nghĩa là bạn có thể lưu trữ các đối tượng trong một kho lưu trữ dữ liệu siêu nhanh ở một vị trí trung tâm và nhiều hệ thống khác nhau có thể lấy từ nó.

Lưu ý rằng khi chạy PHP dưới dạng ứng dụng CGI (nhanh) bên trong máy chủ web của bạn, mọi quy trình PHP sẽ có bộ đệm riêng, tức là dữ liệu APCU không được chia sẻ giữa các quy trình công nhân của bạn. Trong những trường hợp này, bạn có thể muốn xem xét sử dụng memcached thay thế, vì nó không gắn liền với các quy trình PHP.

Trong một cấu hình được nối mạng, APCU thường sẽ vượt trội hơn so với tốc độ truy cập, nhưng Memcached sẽ có thể mở rộng nhanh hơn và xa hơn. Nếu bạn không mong đợi có nhiều máy chủ chạy ứng dụng của mình hoặc không cần các tính năng bổ sung mà Memcached cung cấp thì APCU có lẽ là lựa chọn tốt nhất của bạn để lưu trữ đối tượng.

Ví dụ logic bằng APCU:

phpcbf -w --standard=PSR1 file.php
1

Lưu ý rằng trước Php 5.5, APC cung cấp cả bộ đệm đối tượng và bộ đệm mã byte. APCU là một dự án để đưa bộ đệm đối tượng APC APC đến PHP 5.5+, vì PHP hiện có bộ đệm mã byte tích hợp (OPCache).

Tìm hiểu thêm về các hệ thống bộ nhớ đệm đối tượng phổ biến:

  • Apcu
  • Chức năng APC
  • Memcached
  • Redis
  • API XCache
  • Chức năng wincache

Ghi lại mã của bạn

PHPDOC

PHPDOC là một tiêu chuẩn không chính thức để nhận xét mã PHP. Có rất nhiều thẻ khác nhau có sẵn. Danh sách đầy đủ các thẻ và ví dụ có thể được tìm thấy tại hướng dẫn sử dụng PHPDOC.

Dưới đây là một ví dụ về cách bạn có thể ghi lại một lớp với một vài phương pháp;

phpcbf -w --standard=PSR1 file.php
2

Tài liệu cho toàn bộ lớp có thẻ @Author và thẻ @link. Thẻ @Author được sử dụng để ghi lại tác giả của mã và có thể được lặp lại để ghi lại một số tác giả. Thẻ @link được sử dụng để liên kết đến một trang web cho biết mối quan hệ giữa trang web và mã.

Bên trong lớp, phương thức đầu tiên có thẻ @param ghi lại loại, tên và mô tả của tham số được chuyển đến phương thức. Ngoài ra, nó có thẻ @return và @throws để ghi lại loại trả về và mọi trường hợp ngoại lệ có thể được ném tương ứng.

Các phương thức thứ hai và thứ ba rất giống nhau và có một thẻ @param duy nhất như phương thức đầu tiên. Sự khác biệt quan trọng giữa các phương thức thứ hai và thứ ba Khối Doc Doc là bao gồm/loại trừ thẻ @return.

sudo port install php74
sudo port install php81
86 thông báo rõ ràng cho chúng tôi rằng không có sự trở lại; Trong lịch sử bỏ qua tuyên bố
sudo port install php74
sudo port install php81
86 cũng dẫn đến cùng một hành động (không trả lại).

Tài nguyên

Từ nguồn

  • Trang web PHP
  • Tài liệu PHP

Mọi người để theo dõi

Thật khó để tìm thấy các thành viên cộng đồng PHP thú vị và hiểu biết khi bạn mới bắt đầu. Bạn có thể tìm thấy một danh sách viết tắt của các thành viên cộng đồng PHP để giúp bạn bắt đầu tại:

  • https://www.ogprogrammer.com/2017/06/28/how-to-get-connected-with-the-php-community/
  • https://twitter.com/CalEvans/lists/phpeople

Nhà cung cấp PHP PaaS

  • Appfog
  • Amezmo
  • AWS beanstalk
  • Đám mây
  • Divio
  • Động cơ Đám mây
  • FORTRABBIT
  • Công cụ ứng dụng Google
  • Heroku
  • Đám mây IBM
  • Jelastic
  • Microsoft Azure
  • Nanobox
  • Dịch vụ web Pivotal
  • Platform.sh
  • Mũ đỏ openshift

Để xem phiên bản nào mà các máy chủ PaaS này đang chạy, hãy đến các phiên bản PHP.

Khung

Thay vì phát minh lại bánh xe, nhiều nhà phát triển PHP sử dụng các khung để xây dựng các ứng dụng web. Các khung trừu tượng loại bỏ nhiều mối quan tâm cấp thấp và cung cấp các giao diện hữu ích, dễ sử dụng để hoàn thành các nhiệm vụ phổ biến.

Bạn không cần phải sử dụng một khung cho mọi dự án. Đôi khi PHP đơn giản là cách đúng, nhưng nếu bạn cần một khung thì có ba loại chính có sẵn:

  • Khung vi mô
  • Khung đầy đủ
  • Khung thành phần

Micro FrameWorks về cơ bản là một trình bao bọc để định tuyến yêu cầu HTTP đến một cuộc gọi lại, bộ điều khiển, phương thức, v.v. càng nhanh càng tốt, và đôi khi đi kèm với một vài thư viện bổ sung để hỗ trợ phát triển như trình bao bọc cơ sở dữ liệu cơ bản và tương tự. Chúng được sử dụng nổi bật để xây dựng các dịch vụ HTTP từ xa.

Nhiều khung bổ sung một số lượng đáng kể các tính năng trên đầu những gì có sẵn trong một khung hình vi mô; Chúng được gọi là khung đầy đủ. Chúng thường đi kèm với các orms, gói xác thực, v.v.

Các khung dựa trên thành phần là các bộ sưu tập các thư viện chuyên dụng và một mục đích. Các khung dựa trên thành phần khác nhau có thể được sử dụng cùng nhau để tạo ra một khung vi mô hoặc đầy đủ.

Các thành phần

Như đã đề cập ở trên, các thành phần của người Viking là một cách tiếp cận khác đối với mục tiêu chung là tạo, phân phối và thực hiện mã được chia sẻ. Các kho lưu trữ thành phần khác nhau tồn tại, hai trong số đó là:

  • Packagist

Cả hai kho lưu trữ này đều có các công cụ dòng lệnh được liên kết với chúng để giúp các quy trình cài đặt và nâng cấp và đã được giải thích chi tiết hơn trong phần Quản lý phụ thuộc.

Ngoài ra còn có các khung và nhà cung cấp thành phần dựa trên thành phần không cung cấp khung nào cả. Các dự án này cung cấp một nguồn gói khác mà lý tưởng ít có hoặc không phụ thuộc vào các gói khác hoặc các khung cụ thể.

Ví dụ: bạn có thể sử dụng gói xác thực nhiên liệu, mà không cần sử dụng chính khung nhiên liệu.

  • Hào quang
  • Thành phần CakePHP
    • Bộ sưu tập
    • Cơ sở dữ liệu
    • Nguồn dữ liệu
    • Biến cố
    • I18n
    • Orm
  • Nhiên liệu
  • Dự án HOA
  • Thành phần Symfony
  • Liên minh các gói phi thường
  • Các thành phần chiếu sáng của Laravel
    • Container IOC
    • Orm hùng hồn
    • Xếp hàng

Các thành phần chiếu sáng của Laravel sẽ được tách rời tốt hơn từ khung Laravel. Hiện tại, chỉ có các thành phần được tách rời tốt nhất từ ​​khung Laravel được liệt kê ở trên.

Các tài nguyên hữu ích khác

Gian lận

  • Php Cheatsheets - để so sánh biến, arithmetics và thử nghiệm biến trong các phiên bản PHP khác nhau.
  • Php Cheatsheet hiện đại - Tài liệu hiện đại (PHP 7.0+) trong một tài liệu thống nhất.
  • OWASP Security Cheatheets - Cung cấp một bộ sưu tập ngắn gọn về thông tin có giá trị cao về các chủ đề bảo mật ứng dụng cụ thể.

Thực hành tốt hơn

  • Php thực hành tốt nhất
  • Tại sao bạn nên sử dụng các phiên bản PHP được hỗ trợ

Tin tức xung quanh các cộng đồng phát triển web và PHP

Bạn có thể đăng ký các bản tin hàng tuần để thông báo cho mình trên các thư viện mới, tin tức mới nhất, sự kiện và thông báo chung, cũng như các tài nguyên bổ sung được công bố mỗi bây giờ:

  • PHP hàng tuần
  • JavaScript hàng tuần
  • Frontend Focus
  • Web di động hàng tuần

Ngoài ra còn có các tuần trên các nền tảng khác mà bạn có thể quan tâm; Ở đây, một danh sách một số.

Vũ trụ PHP

  • Blog nhà phát triển PHP

Video hướng dẫn

Kênh YouTube

  • Học viện PHP
  • Boston mới
  • Sherif Ramadan
  • Cấp độ lên tuts

Video trả phí

  • Tiêu chuẩn và thực tiễn tốt nhất
  • Đào tạo PHP về Pluralsight
  • Đào tạo PHP trên Lynda.com
  • Đào tạo PHP trên Tutsplus
  • Laracasts

Sách

Có nhiều sách PHP; Đáng buồn là một số bây giờ khá già và không còn chính xác. Cụ thể, hãy tránh những cuốn sách về Php Php 6, một phiên bản bây giờ sẽ không bao giờ tồn tại. Bản phát hành chính tiếp theo của PHP sau 5.6 là Php Php 7, một phần vì điều này.

Phần này nhằm mục đích trở thành một tài liệu sống cho các cuốn sách được đề xuất về phát triển PHP nói chung. Nếu bạn muốn cuốn sách của mình được thêm vào, hãy gửi PR và nó sẽ được xem xét để có liên quan.

Sách miễn phí

  • PHP Pandas - nhằm mục đích dạy tất cả mọi người cách trở thành một nhà phát triển web.
  • PHP đúng cách - trang web này có sẵn dưới dạng một cuốn sách hoàn toàn miễn phí.
  • Sử dụng libsodium trong các dự án PHP - Hướng dẫn sử dụng tiện ích mở rộng php libsodium cho mật mã hiện đại, an toàn và nhanh chóng.

Sách trả phí

  • Xây dựng API Bạn đã giành được sự ghét bỏ - Mọi người và chú chó của họ đều muốn có một API, vì vậy bạn có lẽ nên học cách xây dựng chúng.
  • PHP hiện đại - bao gồm các tính năng PHP hiện đại, thực tiễn tốt nhất, thử nghiệm, điều chỉnh, triển khai và thiết lập môi trường Dev.
  • Xây dựng các ứng dụng PHP an toàn - Tìm hiểu những điều cơ bản về bảo mật mà một nhà phát triển cao cấp thường có được nhiều năm kinh nghiệm, tất cả đều cô đọng thành một cuốn cẩm nang nhanh chóng và dễ dàng
  • Hiện đại hóa các ứng dụng kế thừa trong PHP - Kiểm soát mã của bạn trong một loạt các bước nhỏ, cụ thể
  • Đảm bảo PHP: Khái niệm cốt lõi - Hướng dẫn về một số thuật ngữ bảo mật phổ biến nhất và cung cấp một số ví dụ về chúng trong mỗi ngày PHP
  • Mở rộng Php - Ngừng chơi sysadmin và quay lại mã hóa
  • Tín hiệu PHP - Tín hiệu PCNLT là một trợ giúp tuyệt vời khi viết các tập lệnh PHP chạy từ dòng lệnh.
  • Các bài kiểm tra khả thi tối thiểu - Thử nghiệm PHP thời gian dài Chris Hartjes vượt qua những gì anh cảm thấy là mức tối thiểu bạn cần biết để bắt đầu.
  • Thiết kế dựa trên tên miền trong PHP-Xem các ví dụ thực được viết trong Php hiển thị các phong cách kiến ​​trúc thiết kế dựa trên miền (kiến trúc hình lục giác, CQRS hoặc tìm nguồn cung ứng sự kiện), mô hình thiết kế chiến thuật và tích hợp bối cảnh bị giới hạn.

Nhóm người dùng PHP

Nếu bạn sống trong một thành phố lớn hơn, tỷ lệ cược là có một nhóm người dùng PHP gần đó. Bạn có thể dễ dàng tìm thấy PUG địa phương của bạn tại Php.ug. Các nguồn thay thế có thể là Meetup.com hoặc tìm kiếm

sudo port install php74
sudo port install php81
88 bằng công cụ tìm kiếm yêu thích của bạn (tức là Google). Nếu bạn sống trong một thị trấn nhỏ hơn, có thể không có một con pug địa phương; Nếu đó là trường hợp, hãy bắt đầu một!

Đề cập đặc biệt nên được tạo ra từ hai nhóm người dùng toàn cầu: nomadphp và phpwomen. Nomadphp cung cấp các cuộc họp nhóm người dùng trực tuyến hai lần hàng tháng với các bài thuyết trình của một số diễn giả hàng đầu trong cộng đồng PHP. Phpwomen là một nhóm người dùng không độc quyền ban đầu nhắm vào phụ nữ trong thế giới PHP. Tư cách thành viên dành cho tất cả những người hỗ trợ một cộng đồng đa dạng hơn. Phpwomen cung cấp một mạng lưới hỗ trợ, cố vấn và giáo dục, và thường thúc đẩy việc tạo ra một bầu không khí chuyên nghiệp và thân thiện với phụ nữ.

Đọc về các nhóm người dùng trên wiki PHP

Hội nghị PHP

Cộng đồng PHP cũng tổ chức các hội nghị khu vực và quốc gia lớn hơn ở nhiều quốc gia trên thế giới. Các thành viên nổi tiếng của cộng đồng PHP thường phát biểu tại các sự kiện lớn hơn này, vì vậy đây là một cơ hội tuyệt vời để học hỏi trực tiếp từ các nhà lãnh đạo ngành.

Tìm một hội nghị PHP

Elephpants

Elephpant là linh vật tuyệt đẹp của dự án PHP với một con voi trong thiết kế của nó. Nó ban đầu được thiết kế cho dự án PHP vào năm 1998 bởi Vincent Pontier - người cha tâm linh của hàng ngàn con voi trên khắp thế giới - và mười năm sau đó, đồ chơi voi sang trọng đáng yêu cũng được sinh ra. Bây giờ Elephpants có mặt tại nhiều hội nghị PHP và với nhiều nhà phát triển PHP tại máy tính của họ để giải trí và cảm hứng.

Phỏng vấn Vincent Pontier

Cách tốt nhất để tạo một trang web với PHP là gì?

Để tạo một trang web bằng PHP, bạn sẽ cần xây dựng ba trang web. Chúng dựa trên cấu trúc cơ bản của tiêu đề, cơ thể và chân trang. Như bạn có thể đoán, tiêu đề bao gồm thông tin tiêu đề. Tuy nhiên, thông tin cho trình duyệt cũng được bao gồm, chẳng hạn như tiêu chuẩn HTML được sử dụng, cùng với các tài liệu tham khảo CSS.construct three web pages. These are based upon the basic structure of header, body, and footer. As you might guess, the header includes title information. However, information for the browser is also included, such as the HTML standard in use, along with CSS references.

Php thực hành tốt nhất là gì?

Thực tiễn tốt nhất để phát triển PHP hiện đại..
Thiết lập và cấu hình.1.1 Giữ hiện tại.1.2 Đặt mặc định hợp lý.....
Sử dụng nhà soạn nhạc.2.1 Cài đặt Trình soạn thảo.2.2 Sử dụng nhà soạn nhạc.....
Thực hiện theo các nguyên tắc thiết kế tốt.3.1 Solid ..
Đối tượng calisthenics.4.1 Không quá một cấp độ thụt trên mỗi phương pháp.....
Kiểm tra đơn vị..

PHP có tốt cho các dự án lớn không?

Việc duy trì các ứng dụng lớn có thể khó khăn vì ngôn ngữ PHP không thể mở rộng so với các ngôn ngữ mã hóa khác.Do đó, việc quản lý một số lượng lớn các ứng dụng có thể là thách thức đối với các nhà phát triển PHP.Bảo vệ.. Thus, managing a large number of applications can be challenging for PHP developers. Security.

Cấu trúc cơ bản của PHP là gì?

Cú pháp php cơ bản Một tệp PHP thường chứa các thẻ HTML và một số mã tập lệnh PHP.Dưới đây, chúng tôi có một ví dụ về một tệp PHP đơn giản, với tập lệnh PHP sử dụng chức năng PHP tích hợp "Echo" để xuất văn bản "Hello World!"A PHP file normally contains HTML tags, and some PHP scripting code. Below, we have an example of a simple PHP file, with a PHP script that uses a built-in PHP function " echo " to output the text "Hello World!"