Tối ưu hóa php này

Tuy nhiên, nó không được biết đến chính xác với khả năng hiệu suất cao, đặc biệt là khi nói đến các hệ thống đồng thời cao. Và đó là lý do mà đối với những trường hợp sử dụng chuyên biệt như vậy, các ngôn ngữ như Node (vâng, tôi biết, nó không phải là ngôn ngữ), Go và Elixir đang chiếm ưu thế

Điều đó nói rằng, có RẤT NHIỀU điều bạn có thể làm để cải thiện hiệu suất PHP trên máy chủ của mình. Bài viết này tập trung vào khía cạnh php-fpm, đây là cách tự nhiên để định cấu hình trên máy chủ của bạn nếu bạn đang sử dụng Nginx

Trong trường hợp bạn biết php-fpm là gì, vui lòng chuyển sang phần về tối ưu hóa

PHP-fpm là gì?

Không nhiều nhà phát triển quan tâm đến khía cạnh DevOps của mọi thứ và ngay cả trong số những người quan tâm, rất ít người biết điều gì đang diễn ra bên trong. Điều thú vị là, khi trình duyệt gửi yêu cầu đến một máy chủ đang chạy PHP, thì không phải PHP tạo thành điểm tiếp xúc đầu tiên; . Sau đó, các “máy chủ web” này phải quyết định cách kết nối với PHP và chuyển loại yêu cầu, dữ liệu và tiêu đề cho nó

request-response-in-php-e1542398057451Chu kỳ yêu cầu-phản hồi trong trường hợp của PHP (Tín dụng hình ảnh. ProinerTech)

Trong các ứng dụng PHP hiện đại, phần "tìm tệp" ở trên là index.php, mà máy chủ được định cấu hình để ủy quyền tất cả các yêu cầu cho

Bây giờ, máy chủ web kết nối với PHP đã phát triển chính xác như thế nào và bài viết này sẽ dài ra nếu chúng ta đi sâu vào tất cả các chi tiết cơ bản. Nhưng nói một cách đại khái, trong thời gian Apache thống trị với tư cách là máy chủ web được lựa chọn, PHP là một mô-đun được bao gồm bên trong máy chủ

Vì vậy, bất cứ khi nào nhận được yêu cầu, máy chủ sẽ bắt đầu một quy trình mới, quy trình này sẽ tự động bao gồm PHP và thực thi nó. Phương pháp này được gọi là mod_php, viết tắt của “PHP as a module. ” Cách tiếp cận này có những hạn chế của nó, mà Nginx đã khắc phục bằng php-fpm

Trong php-fpm trách nhiệm quản lý PHP, các quy trình thuộc về chương trình PHP trong máy chủ. Nói cách khác, máy chủ web (trong trường hợp của chúng tôi là Nginx), không quan tâm đến việc PHP ở đâu và nó được tải như thế nào, miễn là nó biết cách gửi và nhận dữ liệu từ nó. Nếu muốn, bạn có thể coi PHP trong trường hợp này như một máy chủ khác, tự quản lý một số quy trình PHP con cho các yêu cầu đến (vì vậy, chúng tôi có yêu cầu đến máy chủ, được máy chủ nhận và chuyển đến máy chủ -khá điên. . -P)

Nếu bạn đã thực hiện bất kỳ thiết lập Nginx nào hoặc thậm chí mới bắt đầu sử dụng chúng, bạn sẽ bắt gặp một số thứ như thế này

     location ~ .php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+.php)(/.+)$;
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

Dòng chúng tôi quan tâm là đây.

 ;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix (/usr). This prefix can be dynamically changed by using the
; '-p' argument from the command line.

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Note: the default prefix is /var
; Default Value: none
pid = /run/php/php7.2-fpm.pid

; Error log file
; If it's set to "syslog", log is sent to syslogd instead of being written
; into a local file.
; Note: the default prefix is /var
; Default Value: log/php-fpm.log
error_log = /var/log/php7.2-fpm.log
2, yêu cầu Nginx giao tiếp với quy trình PHP thông qua ổ cắm có tên
 ;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix (/usr). This prefix can be dynamically changed by using the
; '-p' argument from the command line.

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Note: the default prefix is /var
; Default Value: none
pid = /run/php/php7.2-fpm.pid

; Error log file
; If it's set to "syslog", log is sent to syslogd instead of being written
; into a local file.
; Note: the default prefix is /var
; Default Value: log/php-fpm.log
error_log = /var/log/php7.2-fpm.log
3. Vì vậy, đối với mọi yêu cầu đến, Nginx ghi dữ liệu thông qua tệp này và khi nhận được đầu ra, sẽ gửi lại cho trình duyệt

Một lần nữa, tôi phải nhấn mạnh rằng đây không phải là bức tranh đầy đủ nhất hoặc chính xác nhất về những gì đang diễn ra, nhưng nó hoàn toàn chính xác đối với hầu hết các tác vụ DevOps

Bỏ vấn đề đó sang một bên, hãy tóm tắt lại những gì chúng ta đã học được cho đến nay

  • PHP không trực tiếp nhận các yêu cầu được gửi bởi trình duyệt. Các máy chủ web như Nginx trước hết chặn các
  • Máy chủ web biết cách kết nối với quy trình PHP và chuyển tất cả dữ liệu yêu cầu (dán mọi thứ theo nghĩa đen) sang PHP
  • Khi PHP hoàn thành phần việc của mình, nó sẽ gửi phản hồi trở lại máy chủ web, máy chủ này sẽ gửi phản hồi lại cho máy khách (hoặc trình duyệt, trong hầu hết các trường hợp)

Hoặc đồ họa

php-and-nginxPHP và Nginx hoạt động cùng nhau như thế nào (Tín dụng hình ảnh. DataDog)

Tuyệt vời cho đến nay, nhưng bây giờ đến câu hỏi triệu đô. chính xác thì PHP-FPM là gì?

Phần “FPM” trong PHP là viết tắt của “Fast Process Manager”, đây chỉ là một cách nói hoa mỹ rằng PHP chạy trên máy chủ không phải là một quy trình đơn lẻ, mà là một số quy trình PHP được sinh ra, bộ điều khiển và bị giết tắt bởi trình quản lý quy trình FPM này. Chính trình quản lý quy trình này mà máy chủ web chuyển các yêu cầu tới

Bản thân PHP-FPM là một lỗ hổng hoàn toàn, vì vậy hãy thoải mái khám phá nếu bạn muốn, nhưng với mục đích của chúng tôi, phần giải thích này sẽ đủ. 🙂

Tại sao phải tối ưu hóa PHP-fpm?

Vì vậy, tại sao phải lo lắng về tất cả các điệu nhảy này khi mọi thứ đang hoạt động tốt?

Trớ trêu thay, đó chính xác là lời khuyên tôi đưa ra cho hầu hết các trường hợp sử dụng. Nếu thiết lập của bạn đang hoạt động tốt và không có trường hợp sử dụng đặc biệt, hãy sử dụng giá trị mặc định. Tuy nhiên, nếu bạn đang muốn mở rộng quy mô ra ngoài một máy duy nhất, thì việc vắt kiệt tối đa từ một máy là điều cần thiết vì nó có thể cắt giảm một nửa hóa đơn máy chủ (hoặc thậm chí nhiều hơn). )

Một điều khác cần nhận ra là Nginx được xây dựng để xử lý khối lượng công việc khổng lồ. Nó có khả năng xử lý hàng nghìn kết nối cùng một lúc, nhưng nếu điều tương tự không đúng với thiết lập PHP của bạn, thì bạn sẽ lãng phí tài nguyên vì Nginx sẽ phải đợi PHP hoàn thành quy trình hiện tại và chấp nhận tiếp theo, chắc chắn phủ nhận bất kỳ lợi thế nào mà Nginx được xây dựng để cung cấp

Vì vậy, ngoài vấn đề đó ra, hãy xem chính xác những gì chúng ta sẽ thay đổi khi cố gắng tối ưu hóa php-fpm

Làm cách nào để tối ưu hóa PHP-FPM?

Vị trí tệp cấu hình cho php-fpm có thể khác nhau trên máy chủ, vì vậy bạn cần thực hiện một số nghiên cứu để định vị nó. Bạn có thể sử dụng lệnh find nếu trên UNIX. Trên Ubuntu của tôi, đường dẫn là

 ;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix (/usr). This prefix can be dynamically changed by using the
; '-p' argument from the command line.

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Note: the default prefix is /var
; Default Value: none
pid = /run/php/php7.2-fpm.pid

; Error log file
; If it's set to "syslog", log is sent to syslogd instead of being written
; into a local file.
; Note: the default prefix is /var
; Default Value: log/php-fpm.log
error_log = /var/log/php7.2-fpm.log
6. 7. Tất nhiên, 2 là phiên bản PHP mà tôi đang chạy

Đây là một vài dòng đầu tiên của tệp này trông như thế nào

 ;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix (/usr). This prefix can be dynamically changed by using the
; '-p' argument from the command line.

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Note: the default prefix is /var
; Default Value: none
pid = /run/php/php7.2-fpm.pid

; Error log file
; If it's set to "syslog", log is sent to syslogd instead of being written
; into a local file.
; Note: the default prefix is /var
; Default Value: log/php-fpm.log
error_log = /var/log/php7.2-fpm.log

Một vài điều nên rõ ràng ngay lập tức. dòng

 ;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix (/usr). This prefix can be dynamically changed by using the
; '-p' argument from the command line.

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Note: the default prefix is /var
; Default Value: none
pid = /run/php/php7.2-fpm.pid

; Error log file
; If it's set to "syslog", log is sent to syslogd instead of being written
; into a local file.
; Note: the default prefix is /var
; Default Value: log/php-fpm.log
error_log = /var/log/php7.2-fpm.log
7 cho chúng tôi biết tệp nào chứa id quy trình của quy trình php-fpm

Chúng tôi cũng thấy rằng

 ;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix (/usr). This prefix can be dynamically changed by using the
; '-p' argument from the command line.

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Note: the default prefix is /var
; Default Value: none
pid = /run/php/php7.2-fpm.pid

; Error log file
; If it's set to "syslog", log is sent to syslogd instead of being written
; into a local file.
; Note: the default prefix is /var
; Default Value: log/php-fpm.log
error_log = /var/log/php7.2-fpm.log
9 là nơi mà php-fpm sẽ lưu trữ nhật ký của nó

Bên trong tệp này, thêm ba biến nữa như thế này

emergency_restart_threshold 10
emergency_restart_interval 1m
process_control_timeout 10s

Hai cài đặt đầu tiên là cảnh báo và thông báo cho quy trình php-fpm rằng nếu mười quy trình con không thành công trong vòng một phút, thì quy trình chính php-fpm sẽ tự khởi động lại

Điều này nghe có vẻ không mạnh mẽ, nhưng PHP là một tiến trình tồn tại trong thời gian ngắn và làm rò rỉ bộ nhớ, vì vậy việc khởi động lại tiến trình chính trong trường hợp lỗi cao có thể giải quyết được rất nhiều vấn đề

Tùy chọn thứ ba,

emergency_restart_threshold 10
emergency_restart_interval 1m
process_control_timeout 10s
3, yêu cầu các tiến trình con đợi khoảng thời gian này trước khi thực hiện tín hiệu nhận được từ tiến trình cha. Điều này hữu ích trong trường hợp các tiến trình con đang ở giữa một thứ gì đó khi các tiến trình cha mẹ gửi tín hiệu KILL chẳng hạn. Với mười giây trong tay, họ sẽ có cơ hội tốt hơn để hoàn thành nhiệm vụ của mình và thoát ra một cách nhẹ nhàng

Ngạc nhiên thay, đây không phải là cốt lõi của cấu hình php-fpm. Đó là vì để phục vụ các yêu cầu web, php-fpm tạo ra một nhóm quy trình mới, nhóm này sẽ có cấu hình riêng. Trong trường hợp của tôi, tên nhóm hóa ra là

emergency_restart_threshold 10
emergency_restart_interval 1m
process_control_timeout 10s
6 và tệp tôi muốn chỉnh sửa là
emergency_restart_threshold 10
emergency_restart_interval 1m
process_control_timeout 10s
7

Hãy xem tập tin này bắt đầu như thế nào

; Start a new pool named 'www'.
; the variable $pool can be used in any directive and will be replaced by the
; pool name ('www' here)
[www]

; Per pool prefix
; It only applies on the following directives:
; - 'access.log'
; - 'slowlog'
; - 'listen' (unixsocket)
; - 'chroot'
; - 'chdir'
; - 'php_values'
; - 'php_admin_values'
; When not set, the global prefix (or /usr) applies instead.
; Note: This directive can also be relative to the global prefix.
; Default Value: none
;prefix = /path/to/pools/$pool

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = www-data
group = www-data

Xem nhanh phần cuối của đoạn trích trên sẽ giải đáp được thắc mắc tại sao quy trình máy chủ lại chạy dưới dạng

emergency_restart_threshold 10
emergency_restart_interval 1m
process_control_timeout 10s
8. Nếu bạn gặp phải các vấn đề về quyền đối với tệp khi thiết lập trang web của mình, có thể bạn đã thay đổi chủ sở hữu hoặc nhóm của thư mục thành
emergency_restart_threshold 10
emergency_restart_interval 1m
process_control_timeout 10s
8, do đó cho phép quy trình PHP có thể ghi vào tệp nhật ký và tải tài liệu lên, v.v.

Cuối cùng, chúng tôi đã tìm ra nguồn gốc của vấn đề, cài đặt trình quản lý quy trình (chiều). Nói chung, bạn sẽ thấy các giá trị mặc định giống như thế này

pm = dynamic
pm.max_children = 5
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 200

Vậy, "động" ở đây có nghĩa là gì?

 ; Choose how the process manager will control the number of child processes.
; Possible Values:
;   static  - a fixed number (pm.max_children) of child processes;
;   dynamic - the number of child processes are set dynamically based on the
;             following directives. With this process management, there will be
;             always at least 1 children.
;             pm.max_children      - the maximum number of children that can
;                                    be alive at the same time.
;             pm.start_servers     - the number of children created on startup.
;             pm.min_spare_servers - the minimum number of children in 'idle'
;                                    state (waiting to process). If the number
;                                    of 'idle' processes is less than this
;                                    number then some children will be created.
;             pm.max_spare_servers - the maximum number of children in 'idle'
;                                    state (waiting to process). If the number
;                                    of 'idle' processes is greater than this
;                                    number then some children will be killed.
;  ondemand - no children are created at startup. Children will be forked when
;             new requests will connect. The following parameter are used:
;             pm.max_children           - the maximum number of children that
;                                         can be alive at the same time.
;             pm.process_idle_timeout   - The number of seconds after which
;                                         an idle process will be killed.
; Note: This value is mandatory.

Vì vậy, chúng tôi thấy rằng có ba giá trị có thể

  • tĩnh. Một số quy trình PHP cố định sẽ được duy trì bất kể điều gì
  • năng động. Chúng tôi phải chỉ định số lượng quy trình tối thiểu và tối đa mà php-fpm sẽ tiếp tục hoạt động tại bất kỳ thời điểm nào
  • theo yêu cầu. Các quy trình được tạo và hủy theo yêu cầu

Vì vậy, làm thế nào để các cài đặt quan trọng?

Nói một cách đơn giản, nếu bạn có một trang web có lưu lượng truy cập thấp, cài đặt "động" sẽ gây lãng phí tài nguyên trong hầu hết thời gian. Giả sử rằng bạn đã đặt

; Start a new pool named 'www'.
; the variable $pool can be used in any directive and will be replaced by the
; pool name ('www' here)
[www]

; Per pool prefix
; It only applies on the following directives:
; - 'access.log'
; - 'slowlog'
; - 'listen' (unixsocket)
; - 'chroot'
; - 'chdir'
; - 'php_values'
; - 'php_admin_values'
; When not set, the global prefix (or /usr) applies instead.
; Note: This directive can also be relative to the global prefix.
; Default Value: none
;prefix = /path/to/pools/$pool

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = www-data
group = www-data
1 thành 3, ba quy trình PHP sẽ được tạo và duy trì ngay cả khi không có lưu lượng truy cập trên trang web. Trong những trường hợp như vậy, "theo yêu cầu" là một lựa chọn tốt hơn, cho phép hệ thống quyết định khi nào khởi chạy các quy trình mới

Mặt khác, các trang web xử lý lượng truy cập lớn hoặc phải phản hồi nhanh chóng sẽ bị trừng phạt trong cài đặt này. Tạo một quy trình PHP mới, biến nó thành một phần của nhóm và giám sát nó, là chi phí bổ sung tốt nhất nên tránh

Sử dụng

; Start a new pool named 'www'.
; the variable $pool can be used in any directive and will be replaced by the
; pool name ('www' here)
[www]

; Per pool prefix
; It only applies on the following directives:
; - 'access.log'
; - 'slowlog'
; - 'listen' (unixsocket)
; - 'chroot'
; - 'chdir'
; - 'php_values'
; - 'php_admin_values'
; When not set, the global prefix (or /usr) applies instead.
; Note: This directive can also be relative to the global prefix.
; Default Value: none
;prefix = /path/to/pools/$pool

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = www-data
group = www-data
2 khắc phục số lượng quy trình con, cho phép sử dụng tài nguyên hệ thống tối đa để phục vụ các yêu cầu thay vì quản lý PHP. Nếu bạn đi theo con đường này, hãy lưu ý rằng nó có những nguyên tắc và cạm bẫy. Một bài viết khá dày đặc nhưng rất hữu ích về nó là ở đây

Từ cuối cùng

Vì các bài viết về hiệu suất web có thể châm ngòi cho các cuộc chiến tranh hoặc gây nhầm lẫn cho mọi người, tôi cảm thấy rằng nên có một vài từ trước khi chúng ta kết thúc bài viết này. Điều chỉnh hiệu suất liên quan nhiều đến phỏng đoán và nghệ thuật hắc ám cũng như kiến ​​​​thức hệ thống

Ngay cả khi tất cả các bạn đều thuộc lòng các cài đặt php-fpm, thì thành công vẫn không được đảm bảo. Nếu bạn không biết gì về sự tồn tại của php-fpm, thì bạn không cần lãng phí thời gian để lo lắng về nó. Chỉ cần tiếp tục làm những gì bạn đang làm và tiếp tục

Đồng thời, tránh kết cục là một người nghiện biểu diễn. Có, bạn có thể đạt hiệu suất cao hơn nữa bằng cách biên dịch lại PHP từ đầu và xóa tất cả các mô-đun mà bạn sẽ không sử dụng, nhưng cách tiếp cận này không đủ lành mạnh trong môi trường sản xuất. Toàn bộ ý tưởng tối ưu hóa thứ gì đó là xem xét liệu nhu cầu của bạn có khác với mặc định hay không (điều mà họ hiếm khi làm. ) và thực hiện các thay đổi nhỏ nếu cần

Nếu bạn chưa sẵn sàng dành thời gian tối ưu hóa các máy chủ PHP của mình, thì bạn có thể cân nhắc tận dụng một nền tảng đáng tin cậy như Kinsta đảm nhiệm việc tối ưu hóa hiệu suất và bảo mật

Làm cách nào để tối ưu hóa mã PHP?

Trong bài viết này, chúng ta sẽ tìm hiểu cách tăng hiệu suất trang web bằng PHP. .
Sử dụng các hàm PHP gốc
Kích hoạt OPCache trên Máy chủ PHP
Giảm thiểu nội dung tĩnh & bộ nhớ đệm
Nâng cấp lên phiên bản PHP mới nhất
Hiểu tắc nghẽn hiệu suất
Tối ưu hóa mã

Làm cách nào để PHP chạy nhanh hơn?

Cải thiện 300% tốc độ ứng dụng PHP của bạn . Bạn cũng có thể đóng kết nối DB và giới hạn số lần truy cập DB. Để quản lý nội dung, bạn có thể thêm CDN để phân phối nội dung nhanh chóng. take advantage of native functions, use JSON except for XML, use caching systems, configure OPcache, PHP-FPM, Memcached properly. You can also close the DB connection and limit the DB hits. For asset management, you can add CDNs for fast content delivery.

Làm cách nào để tăng tốc PHP trong Windows?

Sử dụng tiện ích mở rộng bộ nhớ cache của Windows . Windows Cache Extension for PHP là một trình tăng tốc PHP được sử dụng để tăng đáng kể tốc độ của các ứng dụng PHP chạy trên hệ điều hành Windows®.

Max_input_time là gì?

max_input_time — Điều này đặt thời gian tối đa tính bằng giây mà tập lệnh được phép phân tích cú pháp dữ liệu đầu vào, như POST và GET . Điều này thường được tăng lên để cho phép tải lên tệp lớn hơn. Cài đặt mặc định là -1, có nghĩa là max_execution_time được sử dụng thay thế. Đặt nó thành 0 để cho phép thời gian không giới hạn.