Trong điều kiện nào nó buộc php dừng tập lệnh?
Hàm này trả về một giá trị khác 0 nếu cuộc gọi bị gián đoạn bởi tín hiệu. Trên Windows, giá trị này sẽ luôn là 192, là giá trị của hằng số WAIT_IO_COMPLETION trong Windows API. Trên các nền tảng khác, giá trị trả về sẽ là số giây còn lại để ngủ Show
- Tôi có một tập lệnh chỉ cần tải F3 để tôi có thể sử dụng lớp \DB\SQL\Mapper và gửi dữ liệu được trả về từ API Infusion tới bảng cơ sở dữ liệu của tôi - Tôi có tệp CSV được phân tích cú pháp và các hàng được chuẩn bị thành một mảng - Tôi xử lý mảng đã chuẩn bị và gửi dữ liệu đến Infusion, đồng thời chèn/cập nhật bản ghi với thông tin hàng cập nhật - Tập lệnh chạy trong vài giây và sau đó tôi gặp 500 Lỗi máy chủ nội bộ - Nhật ký của tôi không có lỗi. Nhà cung cấp dịch vụ lưu trữ của tôi đã tìm thấy một lỗi trong nhật ký của họ báo cáo rằng tập lệnh đã hết thời gian chờ - Tôi có thể thấy các hàng mới được thêm vào cơ sở dữ liệu sau khi tập lệnh được báo cáo là hết thời gian chờ - Tôi đã xác nhận với máy chủ của mình rằng tập lệnh tiếp tục được xử lý cho đến khi hoàn thành và lỗi 500 là không có thật Kịch bản đầu tiên của tôi không sử dụng F3 hoặc cơ sở dữ liệu và ổn định khi thực thi Tôi có một tập lệnh xử lý CSV và giao tiếp với Infusions bằng API của họ. Infusion điều chỉnh API của họ, do đó, tập lệnh sẽ ngủ (1) rồi tiếp tục. Tập lệnh sẽ thực hiện hơn 100 nghìn lần lặp lại và không bao giờ hết thời gian. Đây là nơi tôi gặp vấn đề. Tập lệnh này được định cấu hình hơi khác một chút, chúng không giống nhau và tập lệnh này sử dụng F3 và cơ sở dữ liệu. Infusion iSDK là các tệp thư viện giống như trong kịch bản 1. Tập lệnh này không thể chạy 30 lần lặp lại trước khi báo cáo rằng nó đã hết thời gian chờ. Trên thực tế, tôi chỉ có thể thực hiện thành công qua 28 lần lặp mà không gặp phải Lỗi 500 Tôi đoán rằng câu hỏi duy nhất tôi có, là F3 có thể bị lỗi trong trường hợp này theo cách nào đó, có thể gây ra lỗi 500 sớm không? Toàn bộ tình huống này khiến tôi bối rối nghiêm trọng và khiến quá trình di chuyển dữ liệu mà tôi đang thực hiện mất nhiều thời gian hơn bình thường Có rất nhiều thông tin lỗi thời trên Web khiến người dùng PHP mới lạc hướng, truyền bá các thực tiễn xấu và mã không an toàn. PHP. The Right Way là một tài liệu tham khảo nhanh, dễ đọc về các tiêu chuẩn mã hóa phổ biến của 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 hiện nay Không có cách kinh điển nào để sử dụng PHP. Trang web này nhằm mục đích giới thiệu cho các nhà phát triển PHP mới một số chủ đề mà họ có thể không khám phá ra cho đến khi quá muộn và nhằm mục đích cung cấp cho các chuyên gia dày dặn kinh nghiệm một số ý tưởng mới về những chủ đề mà họ đã làm trong nhiều năm mà chưa từng xem xét lại. Trang web này cũng sẽ không cho bạn biết nên sử dụng công cụ nào mà thay vào đó đưa ra đề 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ịchPHP. The Right Way được dịch ra nhiều ngôn ngữ khác nhau SáchPhiên bản mới nhất của PHP. Con Đường Đúng Cách cũng có sẵn ở định dạng PDF, EPUB và MOBI. Tới Leanpub Làm thế nào để đóng gópGiú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 Sử dụng Phiên bản ổn định hiện tại (8. 2)Nếu bạn đang 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. 2. PHP8. x bổ sung nhiều hơn so với 7 cũ hơn. x và 5. phiên bản x. Cô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à một bản cập nhật lớn 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 nhanh chóng nâng cấp lên phiên bản ổn định mới nhất - PHP 7. 4 đã là End of Life. Việc nâng cấp rất dễ dàng vì không có nhiều lỗi tương thích ngược với PHP 8. 0, PHP8. 1, PHP8. 2. Nếu bạn không chắc chức năng hoặc tính năng của phiên bản nào, bạn có thể kiểm tra tài liệu PHP trên trang web php. trang mạng Máy chủ web tích hợpVới PHP5. 4 hoặc mới hơ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 chính thức. Để 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 thư mục gốc của dự án
Cài đặt máy MacmacOS được đóng gói sẵn với PHP nhưng nó thường chậm hơn một chút so với bản phát hành ổn định mới nhất. There are multiple ways to install the latest PHP version on macOS Install PHP via HomebrewHomebrew is a package manager for macOS that helps you easily install PHP and various extensions. The Homebrew core repository provides “formulae” for PHP 7. 4, 8. 0, 8. 1 and PHP 8. 2. Install the latest version with this command You can switch between Homebrew PHP versions by modifying your 3 variable. Alternatively, you can use brew-php-switcher to switch PHP versions automaticallyYou can also switch between PHP versions manually by unlinking and linking the wanted version
Install PHP via MacportsThe MacPorts Project is an open-source community initiative to design an easy-to-use system for compiling, installing, and upgrading either command-line, X11 or Aqua based open-source software on the OS X operating system MacPorts supports pre-compiled binaries, so you don’t need to recompile every dependency from the source tarball files, it saves your life if you don’t have any package installed on your system At this point, you can install 4, 5, 6, 7, 8, 9, 0, 1, 2, 3 or 4 using the 5 command, for example
And you can run 6 command to switch your active PHP
Install PHP via phpbrewphpbrew is a tool for installing and managing multiple PHP versions. Đ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 của LiipMột tùy chọn phổ biến khác là php-osx. liip. ch cung cấp một phương pháp cài đặt lót cho các phiên bản 5. 3 đến 7. 3. Nó không ghi đè lên các tệp nhị phân PHP do Apple cài đặt mà cài đặt mọi thứ ở một vị trí riêng biệt (/usr/local/php5) Biên dịch từ NguồnMột tùy chọn khác cho phép bạn kiểm soát phiên bản PHP mà 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 Xcode hoặc công cụ thay thế “Command Line Tools for XCode” của Apple có thể tải xuống từ Trung tâm nhà phát triển Mac của Apple Trình cài đặt tất cả trong mộtCác giải pháp được liệt kê ở trên chủ yếu xử lý chính 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” như MAMP và XAMPP sẽ cài đặt các phần mềm khác này cho bạn và liên kết tất cả chúng lại với nhau, nhưng việc dễ dàng thiết lập đi kèm với sự đánh đổi về tính linh hoạt cài đặt WindowsBạn có thể tải xuống các tệp nhị phân từ windows. php. mạng/tải xuống. Sau khi giải nén PHP, bạn nên đặt PATH vào thư mục gốc của thư mục PHP (trong đó php. exe) để bạn có thể thực thi PHP từ bất cứ đâu Để học tập và phát triển địa phương, bạn có thể sử dụng máy chủ web tích hợp với PHP 5. 4+ nên bạn không cần lo cấu hình. Nếu bạn muốn một “tất cả trong một” bao gồm máy chủ web toàn diện và cả MySQL thì các công cụ như XAMPP, EasyPHP, OpenServer và WAMP sẽ giúp thiết lập và chạy nhanh môi trường phát triển Windows. Điều đó nói rằng, những 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 lê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 nhất và tốt nhất. Bạn có thể sử dụng phpmanager (một plugin GUI cho IIS7) để cấu hình và quản lý PHP đơn giản. IIS7 đi kèm với FastCGI được tích hợp sẵn và sẵn sàng hoạt động, bạn chỉ cần định cấu hình PHP làm trình xử lý. Để được hỗ trợ và các tài nguyên bổ sung, có một khu vực dành riêng trên iis. mạng 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 quá trình phát triển và sản xuất có thể dẫn đến các lỗi lạ xuất hiện khi bạn phát hành trực tiếp. Nếu bạn đang phát triển trên Windows và triển khai lên Linux (hoặc bất kỳ thứ gì không phải Windows) thì bạn nên cân nhắc sử dụng Chris Tankersley có một bài đăng trên blog rất hữu ích về những công cụ mà anh ấy sử dụng để phát triển PHP bằng Windows Cấu trúc thư mục chungMột câu hỏi phổ biến đối với những người bắt đầu viết chương trình cho web là "tôi đặt nội dung của mình ở đâu?" . ” Mặc dù câu trả lời này chưa hoàn chỉnh, nhưng đó là một nơi tuyệt vời để bắt đầu Vì lý do bảo mật, khách truy cập trang web không thể truy cập tệp cấu hình; Đối với mỗi nhóm, CMS hoặc khung mà một người làm việc, một cấu trúc thư mục tiêu chuẩn được sử dụng bởi từng 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 sử dụng cấu trúc hệ thống tệp nào 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 chung của hàng chục nghìn dự án github trong lĩnh vực PHP. Ông đã biên soạn một cấu trúc thư mục và tệp 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, 7 phải trỏ đến 9, các bài kiểm tra đơn vị phải nằm trong thư mục 0 và các thư viện của bên thứ ba, như được cài đặt bởi , thuộc thư mục 1. Đối với các tệp và thư mục khác, việc tuân thủ Bộ khung gói PHP tiêu chuẩn sẽ có ý nghĩa nhất đối với những người đóng góp cho dự ánCộng đồng PHP lớn và đa dạng, bao gồm vô số thư viện, khung và thành phần. Các nhà phát triển PHP thường chọn một vài 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 phải tuân thủ (càng gần càng tốt) với một kiểu mã phổ biến để giúp các nhà phát triển dễ dàng kết hợp và kết hợp các thư viện khác nhau cho các dự án của họ Framework Interop Group đã đề xuất và phê duyệt một loạt các đề xuất về phong cách. Không phải tất cả chúng đều liên quan đến kiểu mã, nhưng những thứ đó là PSR-1, PSR-12 và PSR-4. Những đề xuất này chỉ đơn thuần 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 mình hoặc tiếp tục sử dụng phong cách cá nhân của riêng bạn Tốt nhất, bạn nên viết mã PHP tuân theo 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 do PEAR hoặc Zend tạo ra. Đ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 Bạn có thể sử dụng PHP_CodeSniffer để kiểm tra mã dựa trên bất kỳ đề xuất nào trong số này và các plugin dành cho trình soạn thảo văn bản như Sublime Text để nhận phản hồi theo 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 Và bạn có thể chạy thủ công phpcs từ shell
Nó sẽ hiển thị các lỗi và mô tả cách khắc phục chúng. Cũng có thể hữu ích khi đưa lệnh này vào hook git. Theo cách đó, các nhánh có vi phạm tiêu chuẩn đã chọn không thể vào kho lưu trữ cho đến khi những vi phạm đó được khắc phục Nếu bạn có PHP_CodeSniffer, thì bạn có thể tự động khắc phục các sự cố về bố cục mã do nó báo cáo bằng Trình sửa lỗi và làm đẹp mã PHP
Một tùy chọn khác là sử dụng Trình sửa lỗi tiêu chuẩn mã hóa PHP. Nó sẽ hiển thị loại lỗi mà cấu trúc mã có trước khi sửa chúng
Tiếng Anh được ưu tiên cho tất cả các tên ký hiệu 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 mà tất cả các bên hiện tại và tương lai có thể đang làm việc trên cơ sở mã đều có thể đọc được dễ dàng Cuối cùng, một tài nguyên bổ sung tốt để viết mã PHP sạch là Clean Code PHP Mô hình lập trìnhPHP 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 vượt bậc 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ượngPHP 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, lớp trừu tượng, giao diện, kế thừa, hàm tạo, nhân bản, ngoại lệ, v.v. Lập trình chức năngPHP hỗ trợ các hàm hạng nhất, nghĩa là một hàm có thể được gán cho một biến. Cả hàm do người dùng định nghĩa và hàm tích hợp đều có thể được tham chiếu bởi một biến và được gọi động. Các hàm có thể được truyền dưới dạng đối số cho các hàm khác (một tính năng được gọi là Hàm bậc cao hơn) và các hàm có thể trả về các hàm khác Đệ quy, một tính năng cho phép một hàm gọi chính nó, được ngôn ngữ hỗ trợ, nhưng hầu hết mã PHP tập trung vào phép lặp Các hàm ẩn danh mới (có hỗ trợ đóng) đã có từ PHP 5. 3 (2009) PHP5. 4 đã thêm khả năng liên kết các bao đóng với phạm vi của đối tượng và cũng cải thiện hỗ trợ cho các hàm có thể gọi được để chúng có thể được sử dụng thay thế cho nhau với các hàm ẩn danh trong hầu hết các trường hợp PHP hỗ trợ nhiều dạng lập trình meta khác nhau thông qua các cơ chế như Reflection API và Magic Methods. Có rất nhiều Phương pháp ma thuật có sẵn như 2, 3, 4, 5, 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 thiếu 7, nhưng nó có sẵn dưới dạng 8 và 9không gian tênNhư đã đề cập ở trên, cộng đồng PHP có rất nhiều nhà phát triển tạo ra rất nhiều mã. Điều này có nghĩa là mã PHP của một thư viện có thể sử dụng cùng tên lớp với một thư việ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 xung đột và gây ra sự cố 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 chứa các tệp không gian tên; . 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 cho mã của mình để các nhà phát triển khác có thể sử dụng mã đó mà không sợ xung đột với các thư viện khác Một cách được đề xuất để sử dụng không gian tên được nêu trong PSR-4, nhằm mục đích cung cấp một quy ước không gian tên, lớp và tệp tiêu chuẩn để cho phép mã plug-and-play Vào tháng 10 năm 2014, PHP-FIG đã ngừng sử dụng tiêu chuẩn tự động tải trước đó. PSR-0. Both PSR-0 and PSR-4 are still perfectly usable. Cái sau yêu cầu PHP 5. 3, rất nhiều PHP 5. Các dự án chỉ có 2 người triển khai PSR-0 Nếu bạn định sử dụng tiêu chuẩn trình tải tự động cho một ứng dụng hoặc gói mới, hãy xem PSR-4 Thư viện PHP chuẩnThư viện PHP chuẩn (SPL) được đóng gói với PHP và cung cấp một tập hợp các lớp và giao diện. Nó chủ yếu được tạo thành từ các lớp cấu trúc cơ sở dữ liệu thường cần thiết (ngăn xếp, hàng đợi, đống, v.v.) và các trình vòng lặp có thể duyệt qua các cấu trúc cơ sở dữ liệu này hoặc các lớp của riêng bạn triển khai các giao diện SPL Giao diện dòng lệnhPHP được tạo ra để 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ư thử nghiệm, 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 trực tiếp mã ứng dụng của mình mà không cần phải tạo và bảo mật GUI web cho nó. Chỉ cần đảm bảo không đặt các tập lệnh PHP CLI của bạn vào thư mục gốc web công cộng của bạn Hãy thử chạy PHP từ dòng lệnh của bạn
Tùy chọn 0 sẽ in cấu hình PHP của bạn giống như hàm 1Tùy chọn 2 cung cấp một shell tương tác, tương tự như IRB của ruby hoặc shell tương tác của python. Ngoài ra còn có một số tùy chọn dòng lệnh hữu ích khácHãy viết một chương trình CLI “Xin chào, $name” đơn giản. Để dùng thử, hãy tạo một tệp có tên 3, như bên dưới
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 cùng. 4 là biến số nguyên chứa số đối số và 5 là biến mảng chứa giá trị của từng đối số. Đối số đầu tiên luôn là tên của tệp script PHP của bạn, trong trường hợp này là 3Biểu thức 7 được sử dụng với một số khác 0 để cho trình bao 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 0XdebugMột trong những công cụ hữu ích nhất trong phát triển phần mềm là trình sửa lỗi thích hợp. Nó cho phép bạn theo dõi quá trình thực thi mã của mình và theo dõi nội dung của ngăn xếp. Xdebug, trình sửa lỗi của PHP, có thể được sử dụng bởi nhiều IDE khác nhau để cung cấp Đ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 phạm vi mã và lập hồ sơ mã Nếu bạn thấy mình bị ràng buộc, sẵn sàng dùng đến 8/ 9 mà vẫn không thể tìm ra giải pháp - có thể bạn cần sử dụng trình gỡ lỗiViệc cài đặt Xdebug có thể phức tạp, 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 máy ảo hoặc trên một máy chủ khác, thì tính năng 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 Apache Vhost hoặc. htaccess với các giá trị này 1“Máy chủ 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 trên đó. Sau đó, vấn đề chỉ là đặt IDE của bạn ở chế độ “lắng nghe kết nối” và tải URL 2IDE 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ớ Trình gỡ lỗi đồ họa giúp dễ dàng chuyển qua mã, kiểm tra các biến và đánh giá mã so với thời gian chạy trực tiếp. Nhiều IDE có hỗ trợ tích hợp sẵn hoặc dựa trên plugin để gỡ lỗi đồ họa với Xdebug. MacGDBp là GUI Xdebug độc lập, mã nguồn mở, miễn phí dành cho Mac Có rất nhiều thư viện, khung và thành phần PHP để lựa chọn. Dự án của bạn có thể sẽ sử dụng một vài trong số chúng — đây là những phần phụ thuộc của 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ề trình tải tự động. Đó không còn là vấn đề Hiện tại có hai hệ thống quản lý gói chính cho PHP - và. Trình soạn thảo hiện là trình 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à trình quản lý gói chính được sử dụng. Biết lịch sử của PEAR là một ý tưởng hay, vì bạn vẫn có thể tìm thấy các tài liệu tham khảo về nó ngay cả khi bạn không bao giờ sử dụng nó Nhà soạn nhạc và PackagistTrình soạn thảo là trình quản lý phụ thuộc được đề xuất cho PHP. Liệt kê các phần phụ thuộc của dự án trong tệp 00 và với một vài lệnh đơn giản, Trình soạn thảo sẽ tự động tải xuống các phần phụ thuộc của dự án và thiết lập tự động tải cho bạn. Trình soạn thảo tương tự như NPM trong nút. js hoặc Bundler trong thế giới RubyCó rất nhiều thư viện PHP tương thích với Composer và sẵn sàng để 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 Composer Cách cài đặt Trình soạn nhạcCách an toàn nhất để tải xuống trình soạn nhạc là làm theo 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 sẽ cài đặt tệp nhị phân 01 trong thư mục làm việc hiện tại của bạnChúng tôi khuyên bạn nên cài đặt Composer trên toàn cầu (e. g. một bản duy nhất trong 02). Để làm như vậy, hãy chạy lệnh này tiếp theo 3Ghi chú. Nếu cách trên không thành công do quyền, hãy thêm tiền tố vào 03Để chạy Trình soạn thảo được cài đặt cục bộ, bạn sẽ sử dụng 04, trên toàn cầu, nó chỉ đơn giản là 05Cài đặt trên WindowsĐối với người dùng Windows, cách dễ dàng nhất để khởi động và chạy là sử dụng trình cài đặt ComposerSetup, trình cài đặt này thực hiện cài đặt toàn cầu và thiết lập 06 của bạn để bạn có thể chỉ cần gọi 05 từ bất kỳ thư mục nào trong dòng lệnh của mìnhCách xác định và cài đặt các phụ thuộcTrình soạn thảo theo dõi các phụ thuộc của dự án của bạn trong một tệp có tên là 00. Bạn có thể quản lý nó bằng tay nếu muốn hoặc sử dụng chính Composer. Lệnh 09 thêm một phụ thuộc dự án và nếu bạn không có tệp 00, một tệp sẽ được tạo. Đây là một ví dụ thêm Twig làm phụ thuộc cho dự án của bạn 4Ngoài ra, lệnh 11 sẽ hướng dẫn bạn cách tạo tệp 00 đầy đủ cho dự án của bạn. Dù bằng cách nào, khi bạn đã tạo tệp 00 của mình, bạn có thể yêu cầu Trình soạn thảo tải xuống và cài đặt các phụ thuộc của bạn vào thư mục 1. Điều này cũng áp dụng cho các dự án bạn đã tải xuống đã cung cấp tệp 00 5Tiếp theo, thêm dòng này vào tệp PHP chính của ứng dụng của bạn; 6 16 lưu trữ phiên bản chính xác của từng gói mà nó đã tải xuống khi bạn chạy lần đầu tiên 17. Nếu bạn chia sẻ dự án của mình với người khác, hãy đảm bảo bao gồm tệp 18, để khi họ chạy 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 20. Không sử dụng 20 khi triển khai, chỉ sử dụng 17, nếu không, bạn có thể nhận được 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 mình một cách linh hoạt. Chẳng hạn, yêu cầu về phiên bản của 23 có nghĩa là “bất cứ thứ gì mới hơn 24, nhưng ít hơn 25”. Bạn cũng có thể sử dụng ký tự đại diện 26 như trong 27. Bây giờ, lệnh 20 của Nhà soạn nhạc 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Để nhận thông báo về các bản phát hành phiên bản mới, bạn có thể đăng ký thư viện. io, một dịch vụ web có thể giám sát các phụ thuộc và gửi cho bạn thông báo về các bản cập nhật Kiểm tra các phụ thuộc của bạn để tìm các vấn đề bảo mậtLocal PHP Security Checker là một công cụ dòng lệnh, sẽ kiểm tra tệp 18 của bạn và cho bạn biết liệu bạn có cần cập nhật bất kỳ tệp phụ thuộc nào khôngXử lý các phụ thuộc toàn cầu với ComposerTrình soạn thảo cũng có thể xử lý các phụ thuộc toàn cầu và các tệp nhị phân của chúng. Cách sử dụng rất đơn giản, tất cả những gì bạn cần làm là thêm tiền tố vào lệnh của bạn với 30. Ví dụ: nếu bạn muốn cài đặt PHPUnit và nó có sẵn trên toàn cầu, bạn sẽ chạy lệnh sau 7Thao tác này sẽ tạo một thư mục 31 nơi chứa các phần phụ thuộc toàn cầu của bạn. Để các tệp nhị phân của các gói đã cài đặt có sẵn ở mọi nơi, sau đó bạn sẽ thêm thư mục 32 vào biến 06 của mình 34 và thực thi nó. Tài liệu PEAR có hướng dẫn cài đặt chi tiết cho mọi hệ điều hànhNế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 mình. Ví dụ, Debian và Ubuntu có gói apt 35Làm thế nào để cài đặt một góiNếu gói được liệt kê trong danh sách gói PEAR, bạn có thể cài đặt nó bằng cách chỉ định tên chính thức 8Nếu gói được lưu trữ trên một kênh khác, trước tiên bạn cần phải 36 kênh và cũng chỉ định kênh đó khi cài đặt. Xem tài liệu Sử dụng kênh để biết thêm thông tin về chủ đề nàyXử lý các phụ thuộc PEAR với ComposerNếu bạn đang sử dụng và bạn cũng muốn cài đặt một số mã PEAR, bạn có thể sử dụng Trình soạn thảo để xử lý các phụ thuộc PEAR của mình. Ví dụ này sẽ cài đặt mã từ 37 9Phần đầu tiên 38 sẽ được sử dụng để cho Composer biết rằng nó nên “khởi tạo” (hoặc “khám phá” theo thuật ngữ PEAR) kho lưu trữ lê. Sau đó, phần 39 sẽ thêm tiền tố vào tên gói như thế này
Tiền tố “lê” được mã hóa cứng để tránh bất kỳ xung đột nào, chẳng hạn như kênh lê có thể giống với tên nhà cung cấp gói khác, sau đó, tên ngắn của kênh (hoặc URL đầy đủ) có thể được sử dụng để tham chiếu gói đó nằm trong 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 Trình soạn thảo
Để sử dụng gói PEAR này, chỉ cần tham khảo nó như vậy 6 40 phương pháp xuất xưởng hoặc thực hiện 41 để lấy ngày giờ hiện tại. Sử dụng phương pháp 42 để chuyển đổi DateTime trở lại chuỗi cho đầu ra 1Có thể tính toán với DateTime với lớp DateInterval. DateTime có các phương thức như 43 và 44 lấy DateInterval làm đối số. Không viết mã có cùng 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 đó. Thay vào đó hãy sử dụng khoảng thời gian ngày. Để tính chênh lệch ngày, hãy sử dụng phương pháp 45. Nó sẽ trả về DateInterval mới, rất dễ hiển thị 2Bạn có thể sử dụng phép so sánh tiêu chuẩn trên các đối tượng DateTime 6 46 47 và 48, cần được xem xét đặc biệt. Các chức năng này thường có một đối tác 49. ví dụ: 50 và 51. Các chuỗi 49 này được cung cấp cho bạn thông qua Tiện ích mở rộng chuỗi nhiều byte và được thiết kế đặc biệt để hoạt động trên các chuỗi UnicodeBạn phải sử dụng hàm 49 bất cứ khi nào bạn thao tác trên chuỗi Unicode. Ví dụ: nếu bạn sử dụng 54 trên chuỗi UTF-8, rất có thể kết quả sẽ bao gồm một số nửa ký tự bị cắt xén. Hàm chính xác để sử dụng sẽ là đối tác nhiều byte, 55Phần khó là nhớ sử dụng các hàm 49 mọi lúc. Nếu bạn quên dù chỉ một lần, chuỗi Unicode của bạn có khả năng bị cắt xén trong quá trình xử lý tiếp theoKhông phải tất cả các hàm chuỗi đều có đối tác 49. Nếu không có ai cho những gì bạn muốn làm, thì bạn có thể không gặp mayBạn nên sử dụng hàm 58 ở đầu mỗi tập lệnh PHP mà bạn viết (hoặc ở đầu tập lệnh bao gồm chung của bạn) và hàm 59 ngay sau nó nếu tập lệnh của bạn xuất ra trình duyệt. Việc xác định rõ ràng mã hóa các chuỗi của bạn trong mọi tập lệnh sẽ giúp bạn đỡ phải đau đầu hơn rất nhiềuNgoài ra, nhiều hàm PHP hoạt động trên 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 chỉ rõ ràng UTF-8 khi được cung cấp tùy chọn. Ví dụ: 60 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 60 và 62Cuố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 63 sẽ được bật hay không, thì hãy cân nhắc sử dụng gói symfony/polyfill-mbstring Composer. Điều này sẽ sử dụng 63 nếu có sẵn và quay lại các chức năng không phải UTF-8 nếu khôngUTF-8 ở cấp Cơ sở dữ liệuNếu tập lệnh PHP của bạn truy cập MySQL, thì có khả năng chuỗi của bạn có thể được lưu trữ dưới dạng chuỗi không phải 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 chuỗi của bạn chuyển từ PHP sang MySQL dưới dạng UTF-8, hãy đảm bảo rằng cơ sở dữ liệu và bảng của bạn đều được đặt thành bộ ký tự và đối chiếu 65, đồng thời bạn sử dụng bộ ký tự 65 trong chuỗi kết nối PDO. Xem mã ví dụ bên dưới. Điều này cực kỳ quan trọngLưu ý rằng bạn phải sử dụng bộ ký tự 65 để hỗ trợ UTF-8 hoàn chỉnh, không phải bộ ký tự 68. Xem phần Đọc thêm để biết tại saoUTF-8 ở cấp độ trình duyệtSử dụng hàm 59 để đảm bảo rằng tập lệnh PHP của bạn xuất chuỗi UTF-8 cho trình duyệt của bạnSau đó, trình duyệt sẽ cần được thông báo bằng phản hồi HTTP rằng trang này phải đượ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 Thẻ 6 70 trong thẻ trang của bạn 6đọc thêm 71. 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. Thật dễ dàng để chạy, trong khi vẫn có các công cụ hỗ trợ mạnh mẽ. Đó là về Gettext chúng ta sẽ nói ở đây. Ngoài ra, để giúp bạn không gặp rắc rối với dòng lệnh, chúng tôi sẽ giới thiệu một ứng dụng GUI tuyệt vời có thể được sử dụng để cập nhật nguồn l10n của bạn một cách dễ dàngCó các 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ễ cài đặt hơn hoặc có 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 cùng với lõi PHP, nhưng ở đây chúng tôi liệt kê các công cụ khác để hoàn thiện
Other frameworks also include i18n modules, but those are not available outside of their codebases
If you decide to go for one of the libraries that provide no extractors, you may want to use the gettext formats, so you can use the original gettext toolchain (including Poedit) as described in the rest of the chapter GettextInstallationYou might need to install Gettext and the related PHP library by using your package manager, like 78 or 79. After installed, enable it by adding 80 (Linux/Unix) or 81 (Windows) to your 82Here we will also be using Poedit to create translation files. You will probably find it in your system’s package manager; it is available for Unix, Mac, and Windows, and can be downloaded for free on their website as well StructureTypes of filesThere are three files you usually deal with while working with gettext. The main ones are PO (Portable Object) and MO (Machine Object) files, the first being a list of readable “translated objects” and the second, the corresponding binary to be interpreted by gettext when doing localization. There’s also a POT (Template) file, which simply contains all existing keys from your source files, and can be used as a guide to generate and update all PO files. Those template files are not mandatory. depending on the tool you are using to do l10n, you can go just fine with only PO/MO files. You will always have one pair of PO/MO files per language and region, but only one POT per domain DomainsThere are some cases, in big projects, where you might need to separate translations when the same words convey different meaning given a context. In those cases, you split them into different domains. They are, basically, named groups of POT/PO/MO files, where the filename is the said translation domain. Small and medium-sized projects usually, for simplicity, use only one domain; its name is arbitrary, but we will be using “main” for our code samples. In Symfony projects, for example, domains are used to separate the translation for validation messages Locale codeA locale is simply a code that identifies one version of a language. It is defined following the ISO 639-1 and ISO 3166-1 alpha-2 specs. two lower-case letters for the language, optionally followed by an underline and two upper-case letters identifying the country or regional code. For , three letters are used For some speakers, the country part may seem redundant. In fact, some languages have dialects in different countries, such as Austrian German ( 83) or Brazilian Portuguese ( 84). The second part is used to distinguish between those dialects - when it is not present, it is taken as a “generic” or “hybrid” version of the languageDirectory structureTo use Gettext, we will need to adhere to a specific structure of folders. First, you will need to select an arbitrary root for your l10n files in your source repository. Inside it, you will have a folder for each needed locale, and a fixed 85 folder that will contain all your PO/MO pairs. Example 7Hình thức số nhiềuAs we said in the introduction, different languages might sport different plural rules. However, gettext saves us from this trouble once again. When creating a new 86 file, you will have to declare the plural rules for that language, and translated pieces that are plural-sensitive will have a different form for each of those rules. When calling Gettext in code, you will have to specify the number related to the sentence, and it will work out the correct form to use - even using string substitution if neededPlural rules include the number of plurals available and a boolean test with 87 that would define in which rule the given number falls (starting the count with 0). For example
Now that you understood the basis of how plural rules works - and if you didn’t, please look at a deeper explanation on the -, you might want to copy the ones you need from a list instead of writing them by hand When calling out Gettext to do localization on sentences with counters, you will have to provide it the related number as well. Gettext will work out what rule should be in effect and use the correct localized version. You will need to include in the 86 file a different sentence for each plural rule definedSample implementationAfter all that theory, let’s get a little practical. Here’s an excerpt of a 86 file - don’t mind with its format, but with the overall content instead; you will learn how to edit it easily later 8The first section works like a header, having the 93 and 94 especially empty. It describes the file encoding, plural forms and other things that are less relevant. The second section translates a simple string from English to Brazilian Portuguese, and the third does the same, but leveraging string replacement from 95 so the translation may contain the user name and visit date. The last section is a sample of pluralization forms, displaying the singular and plural version as 93 in English and their corresponding translations as 94 0 and 1 (following the number given by the plural rule). There, string replacement is used as well so the number can be seen directly in the sentence, by using 98. The plural forms always have two 93 (singular and plural), so it is advised not to use a complex language as the source of translationDiscussion on l10n keysAs you might have noticed, we are using as source ID the actual sentence in English. That 93 is the same used throughout all your 86 files, meaning other languages will have the same format and the same 93 fields but translated 94 linesTalking about translation keys, there are two main “schools” here
The Gettext manual favors the first approach as, in general, it is easier for translators and users in case of trouble. That is how we will be working here as well. However, the favors keyword-based translation, to allow for independent changes of all translations without affecting templates as well Everyday usageIn a typical application, you would use some Gettext functions while writing static text in your pages. Those sentences would then appear in 86 files, get translated, compiled into 13 files and then, used by Gettext when rendering the actual interface. Given that, let’s tie together what we have discussed so far in a step-by-step example1. A sample template file, including some different gettext calls 9
2. A sample setup file (brew unlink php
brew link --overwrite [email protected]
|