Tắt bộ đệm đầu ra PHP

Bạn có thể đã nghe nói về bộ đệm đầu ra trong khi bạn viết mã bằng PHP. Tôi sẽ cho bạn biết nó là gì và cách sử dụng nó một cách đơn giản

Ý nghĩa của "Bộ đệm đầu ra"

"Bộ nhớ đệm" trong điện toán có nghĩa là

lưu trữ (dữ liệu) trong bộ đệm trong khi nó đang được xử lý hoặc chuyển giao

Đây chính xác là những gì PHP làm. Nhưng, cơ chế mặc định không phải thế này. Nó được tắt theo mặc định tôi. e

dữ liệu không được lưu trữ trong bộ đệm trong khi nó đang được xử lý hoặc truyền

Tắt đệm đầu ra (Mặc định)

Khi người dùng yêu cầu một trang PHP từ máy chủ của bạn, PHP sẽ xử lý trang đó và ngay lập tức, HTML sẽ được gửi đến trình duyệt (người dùng)

Điều này có nghĩa là trình duyệt nhận được HTML theo từng đoạn trong khi kết nối và kết nối sẽ không đóng cho đến khi quá trình xử lý kết thúc

Đây là cài đặt mặc định trong PHP i. bộ đệm đầu ra e đã tắt

Bật đệm đầu ra

Như ý nghĩa của từ này, HTML đã xử lý được lưu trữ trong một biến cho đến khi quá trình xử lý kết thúc và khi quá trình xử lý kết thúc, nội dung của biến đó sẽ được gửi

Vì vậy, thay vì khối dữ liệu, toàn bộ dữ liệu được gửi ngay lập tức. Đây là những lợi ích nếu bạn bật bộ đệm đầu ra

  • Có thể thực hiện chuyển hướng ngay cả ở cuối trang

    Hello World
    https://subinsb.com");
    ?>

    Thông thường, đoạn mã trên sẽ in "tiêu đề đã gửi lỗi". Tuy nhiên, với bộ đệm đầu ra được bật, lỗi này sẽ không được tạo ra

    • "Cảnh báo. Không thể sửa đổi thông tin tiêu đề – lỗi tiêu đề đã được gửi bởi (đầu ra)" và tất cả các lỗi như vậy sẽ không được tạo ra

Chuyển đổi bộ đệm đầu ra

Bạn có thể chọn bật/tắt bộ đệm đầu ra vĩnh viễn bằng cách chỉnh sửa "php. tập tin ini". Tìm khóa "output_buffering" và đặt giá trị

Đầu ra của cấu hình của bạn. php trong /path/to/nextcloud (đảm bảo bạn xóa mọi thông tin nhận dạng. )

{
    "instanceid": "***REMOVED SENSITIVE VALUE***",
    "passwordsalt": "***REMOVED SENSITIVE VALUE***",
    "secret": "***REMOVED SENSITIVE VALUE***",
    "trusted_domains": [
        "FQDN goes here",
        "192.168.111.120"
    ],
    "datadirectory": "***REMOVED SENSITIVE VALUE***",
    "dbtype": "mysql",
    "version": "20.0.1.1",
    "overwrite.cli.url": "https:\/\/FQDN goes here",
    "dbname": "***REMOVED SENSITIVE VALUE***",
    "dbhost": "***REMOVED SENSITIVE VALUE***",
    "dbport": "",
    "dbtableprefix": "oc_",
    "mysql.utf8mb4": true,
    "dbuser": "***REMOVED SENSITIVE VALUE***",
    "dbpassword": "***REMOVED SENSITIVE VALUE***",
    "installed": true,
    "memcache.local": "\\OC\\Memcache\\APCu",
    "updater.release.channel": "beta",
    "mail_smtpmode": "smtp",
    "mail_smtpsecure": "ssl",
    "mail_sendmailmode": "smtp",
    "mail_from_address": "***REMOVED SENSITIVE VALUE***",
    "mail_domain": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpauth": 1,
    "mail_smtphost": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpport": "465",
    "mail_smtpname": "***REMOVED SENSITIVE VALUE***",
    "mail_smtppassword": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpauthtype": "LOGIN",
    "updater.secret": "***REMOVED SENSITIVE VALUE***",
    "maintenance": false,
    "theme": "",
    "loglevel": 2
}
github. com/nextcloud/máy chủ

sửa chữa. php thiết lập output_buffering kiểm tra các giá trị được phép

nextcloud:masterpReya:fix/output-buffering-php-setup-check

đã mở 06. 26:00 - 31 tháng 10, 20 UTC

preya

+2 -2

Tôi nghĩ rằng cách tiếp cận hiện tại là chính xác và một cái gì đó trên thiết lập của bạn bị hỏng. Bước đầu tiên để xác thực đó là tạo một tệp trong thư mục của nextcloud info.php với

Trong vài ngày qua, tôi đã đi sâu vào thử nghiệm tính năng BigPipe mới thử nghiệm của Drupal 8, cho phép truyền phát và tải các yêu cầu trang Drupal dành cho người dùng đã xác thực theo từng giai đoạn—các phần tử được lưu trong bộ nhớ cache (thường là phần lớn của trang) được tải gần hết

Đây là bản trình diễn rất nhanh về một trường hợp cực đoan, trong đó một phần nội dung cụ thể mất năm giây để tải;

Tắt bộ đệm đầu ra PHP

Bản demo Drupal BigPipe - nhấp để chơi lại

BigPipe tận dụng lợi thế của việc truyền trực tuyến các phản hồi PHP (sử dụng flush() để xóa bộ đệm đầu ra vào các thời điểm khác nhau trong khi tải trang), nhưng để đảm bảo luồng được phân phối hoàn toàn từ PHP đến máy khách, bạn cần đảm bảo toàn bộ máy chủ web của mình và . Vì tôi duy trì máy ảo Drupal và hỗ trợ Apache và Nginx dưới dạng máy chủ web, cũng như Varnish dưới dạng proxy bộ nhớ đệm ngược, nên tôi đã thử nghiệm nhiều cấu hình khác nhau để tìm ra cách tối ưu để truyền phản hồi qua bất kỳ phần nào của ngăn xếp mã nguồn mở này

Và bởi vì nghiên cứu của tôi đã tìm ra một loạt các giả định đúng một nửa, hầu như chưa được kiểm chứng về bộ đệm đầu ra với các yêu cầu PHP, nên tôi nghĩ rằng mình sẽ đặt mọi thứ thẳng thắn trong một bài đăng blog toàn diện

Kiểm tra bộ đệm đầu ra

Tôi đã thấy một số lượng lớn các tập lệnh ví dụ được sử dụng để kiểm tra output_buffering trên Stack Overflow và các nơi khác, và nhiều tập lệnh cho rằng bộ đệm đầu ra bị vô hiệu hóa hoàn toàn. Thay vì làm điều đó, tôi quyết định tạo một tập lệnh mạnh mẽ hơn một chút cho mục đích thử nghiệm của mình và cũng để ghi lại tất cả các bit khác nhau cho đầy đủ

// Set a valid header so browsers pick it up correctly.
header('Content-type: text/html; charset=utf-8');

// Emulate the header BigPipe sends so we can test through Varnish.
header('Surrogate-Control: BigPipe/1.0');

// Explicitly disable caching so Varnish and other upstreams won't cache.
header("Cache-Control: no-cache, must-revalidate");

// Setting this header instructs Nginx to disable fastcgi_buffering and disable
// gzip for this request.
header('X-Accel-Buffering: no');

$string_length = 32;
echo
'Begin test with an ' . $string_length . ' character string...
'
. "\r\n";

// For 3 seconds, repeat the string.
for ($i = 0; $i < 3; $i++) {
 
$string = str_repeat('.', $string_length);
  echo
$string . '
'
. "\r\n";
  echo
$i . '
'
. "\r\n";
 
flush();
 
sleep(1);
}

echo
'End test.
'
. "\r\n";
?>

Nếu bạn đặt tệp này vào một tài liệu gốc có thể truy cập web, sau đó tải tập lệnh trong thiết bị đầu cuối của bạn bằng cách sử dụng cli của PHP, bạn sẽ thấy đầu ra như thế nào (nhấp để phát lại)

Tắt bộ đệm đầu ra PHP

Truyền phát phản hồi PHP qua CLI của PHP - nhấp để phát lại

Và nếu bạn xem nó trong trình duyệt? . Thay vào đó, bạn sẽ không thấy gì cho đến khi tải toàn bộ trang (bấm để phát lại)

Tắt bộ đệm đầu ra PHP

Phản hồi PHP không phát trực tuyến qua máy chủ web trong trình duyệt - nhấp để phát lại

Tuy nhiên, điều đó cũng tốt—chúng ta hiện có một đường cơ sở. Chúng tôi biết rằng tập lệnh hoạt động trên PHP CLI, nhưng máy chủ web của bạn hoặc PHP không truyền trực tiếp phản hồi đến máy khách. Nếu bạn thay đổi $string_length thành 4096 và đang sử dụng cấu hình PHP/Apache/Nginx bình thường, bạn sẽ thấy thông tin sau (bấm để phát lại)

Tắt bộ đệm đầu ra PHP

Truyền phát phản hồi PHP qua máy chủ web trong trình duyệt - nhấp để phát lại

Phần còn lại của bài đăng này sẽ thực hiện các bước cần thiết để đảm bảo phản hồi được truyền trực tuyến qua toàn bộ ngăn xếp của bạn

PHP và output_buffering

Một số hướng dẫn nói rằng bạn phải đặt

{
    "instanceid": "***REMOVED SENSITIVE VALUE***",
    "passwordsalt": "***REMOVED SENSITIVE VALUE***",
    "secret": "***REMOVED SENSITIVE VALUE***",
    "trusted_domains": [
        "FQDN goes here",
        "192.168.111.120"
    ],
    "datadirectory": "***REMOVED SENSITIVE VALUE***",
    "dbtype": "mysql",
    "version": "20.0.1.1",
    "overwrite.cli.url": "https:\/\/FQDN goes here",
    "dbname": "***REMOVED SENSITIVE VALUE***",
    "dbhost": "***REMOVED SENSITIVE VALUE***",
    "dbport": "",
    "dbtableprefix": "oc_",
    "mysql.utf8mb4": true,
    "dbuser": "***REMOVED SENSITIVE VALUE***",
    "dbpassword": "***REMOVED SENSITIVE VALUE***",
    "installed": true,
    "memcache.local": "\\OC\\Memcache\\APCu",
    "updater.release.channel": "beta",
    "mail_smtpmode": "smtp",
    "mail_smtpsecure": "ssl",
    "mail_sendmailmode": "smtp",
    "mail_from_address": "***REMOVED SENSITIVE VALUE***",
    "mail_domain": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpauth": 1,
    "mail_smtphost": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpport": "465",
    "mail_smtpname": "***REMOVED SENSITIVE VALUE***",
    "mail_smtppassword": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpauthtype": "LOGIN",
    "updater.secret": "***REMOVED SENSITIVE VALUE***",
    "maintenance": false,
    "theme": "",
    "loglevel": 2
}
0 trong php của mình. ini để truyền phát phản hồi PHP. Trong một số trường hợp, điều này hữu ích, nhưng thông thường, nếu bạn đang gọi flush() trong mã PHP của mình, PHP sẽ xóa bộ đệm đầu ra ngay sau khi bộ đệm được lấp đầy (giá trị mặc định là
{
    "instanceid": "***REMOVED SENSITIVE VALUE***",
    "passwordsalt": "***REMOVED SENSITIVE VALUE***",
    "secret": "***REMOVED SENSITIVE VALUE***",
    "trusted_domains": [
        "FQDN goes here",
        "192.168.111.120"
    ],
    "datadirectory": "***REMOVED SENSITIVE VALUE***",
    "dbtype": "mysql",
    "version": "20.0.1.1",
    "overwrite.cli.url": "https:\/\/FQDN goes here",
    "dbname": "***REMOVED SENSITIVE VALUE***",
    "dbhost": "***REMOVED SENSITIVE VALUE***",
    "dbport": "",
    "dbtableprefix": "oc_",
    "mysql.utf8mb4": true,
    "dbuser": "***REMOVED SENSITIVE VALUE***",
    "dbpassword": "***REMOVED SENSITIVE VALUE***",
    "installed": true,
    "memcache.local": "\\OC\\Memcache\\APCu",
    "updater.release.channel": "beta",
    "mail_smtpmode": "smtp",
    "mail_smtpsecure": "ssl",
    "mail_sendmailmode": "smtp",
    "mail_from_address": "***REMOVED SENSITIVE VALUE***",
    "mail_domain": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpauth": 1,
    "mail_smtphost": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpport": "465",
    "mail_smtpname": "***REMOVED SENSITIVE VALUE***",
    "mail_smtppassword": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpauthtype": "LOGIN",
    "updater.secret": "***REMOVED SENSITIVE VALUE***",
    "maintenance": false,
    "theme": "",
    "loglevel": 2
}
2, có nghĩa là PHP sẽ xóa bộ đệm của nó trong 4096

Đối với nhiều ứng dụng, bộ đệm 4096 byte mang lại sự đánh đổi tốt để có hiệu suất vận chuyển tốt hơn so với. phản hồi sinh động hơn, nhưng bạn có thể giảm giá trị nếu bạn cần gửi lại nhiều phản hồi nhỏ hơn (e. g. các phản hồi JSON nhỏ như

{
    "instanceid": "***REMOVED SENSITIVE VALUE***",
    "passwordsalt": "***REMOVED SENSITIVE VALUE***",
    "secret": "***REMOVED SENSITIVE VALUE***",
    "trusted_domains": [
        "FQDN goes here",
        "192.168.111.120"
    ],
    "datadirectory": "***REMOVED SENSITIVE VALUE***",
    "dbtype": "mysql",
    "version": "20.0.1.1",
    "overwrite.cli.url": "https:\/\/FQDN goes here",
    "dbname": "***REMOVED SENSITIVE VALUE***",
    "dbhost": "***REMOVED SENSITIVE VALUE***",
    "dbport": "",
    "dbtableprefix": "oc_",
    "mysql.utf8mb4": true,
    "dbuser": "***REMOVED SENSITIVE VALUE***",
    "dbpassword": "***REMOVED SENSITIVE VALUE***",
    "installed": true,
    "memcache.local": "\\OC\\Memcache\\APCu",
    "updater.release.channel": "beta",
    "mail_smtpmode": "smtp",
    "mail_smtpsecure": "ssl",
    "mail_sendmailmode": "smtp",
    "mail_from_address": "***REMOVED SENSITIVE VALUE***",
    "mail_domain": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpauth": 1,
    "mail_smtphost": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpport": "465",
    "mail_smtpname": "***REMOVED SENSITIVE VALUE***",
    "mail_smtppassword": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpauthtype": "LOGIN",
    "updater.secret": "***REMOVED SENSITIVE VALUE***",
    "maintenance": false,
    "theme": "",
    "loglevel": 2
}
3)

Tuy nhiên, một cài đặt mà bạn chắc chắn cần phải tắt là

{
    "instanceid": "***REMOVED SENSITIVE VALUE***",
    "passwordsalt": "***REMOVED SENSITIVE VALUE***",
    "secret": "***REMOVED SENSITIVE VALUE***",
    "trusted_domains": [
        "FQDN goes here",
        "192.168.111.120"
    ],
    "datadirectory": "***REMOVED SENSITIVE VALUE***",
    "dbtype": "mysql",
    "version": "20.0.1.1",
    "overwrite.cli.url": "https:\/\/FQDN goes here",
    "dbname": "***REMOVED SENSITIVE VALUE***",
    "dbhost": "***REMOVED SENSITIVE VALUE***",
    "dbport": "",
    "dbtableprefix": "oc_",
    "mysql.utf8mb4": true,
    "dbuser": "***REMOVED SENSITIVE VALUE***",
    "dbpassword": "***REMOVED SENSITIVE VALUE***",
    "installed": true,
    "memcache.local": "\\OC\\Memcache\\APCu",
    "updater.release.channel": "beta",
    "mail_smtpmode": "smtp",
    "mail_smtpsecure": "ssl",
    "mail_sendmailmode": "smtp",
    "mail_from_address": "***REMOVED SENSITIVE VALUE***",
    "mail_domain": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpauth": 1,
    "mail_smtphost": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpport": "465",
    "mail_smtpname": "***REMOVED SENSITIVE VALUE***",
    "mail_smtppassword": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpauthtype": "LOGIN",
    "updater.secret": "***REMOVED SENSITIVE VALUE***",
    "maintenance": false,
    "theme": "",
    "loglevel": 2
}
4. Đặt nó thành
{
    "instanceid": "***REMOVED SENSITIVE VALUE***",
    "passwordsalt": "***REMOVED SENSITIVE VALUE***",
    "secret": "***REMOVED SENSITIVE VALUE***",
    "trusted_domains": [
        "FQDN goes here",
        "192.168.111.120"
    ],
    "datadirectory": "***REMOVED SENSITIVE VALUE***",
    "dbtype": "mysql",
    "version": "20.0.1.1",
    "overwrite.cli.url": "https:\/\/FQDN goes here",
    "dbname": "***REMOVED SENSITIVE VALUE***",
    "dbhost": "***REMOVED SENSITIVE VALUE***",
    "dbport": "",
    "dbtableprefix": "oc_",
    "mysql.utf8mb4": true,
    "dbuser": "***REMOVED SENSITIVE VALUE***",
    "dbpassword": "***REMOVED SENSITIVE VALUE***",
    "installed": true,
    "memcache.local": "\\OC\\Memcache\\APCu",
    "updater.release.channel": "beta",
    "mail_smtpmode": "smtp",
    "mail_smtpsecure": "ssl",
    "mail_sendmailmode": "smtp",
    "mail_from_address": "***REMOVED SENSITIVE VALUE***",
    "mail_domain": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpauth": 1,
    "mail_smtphost": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpport": "465",
    "mail_smtpname": "***REMOVED SENSITIVE VALUE***",
    "mail_smtppassword": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpauthtype": "LOGIN",
    "updater.secret": "***REMOVED SENSITIVE VALUE***",
    "maintenance": false,
    "theme": "",
    "loglevel": 2
}
5 trong php. ini và khởi động lại PHP-FPM để đảm bảo tính năng nén gzip đã bị tắt

Có những trường hợp cạnh mà điều trên không hoàn toàn đúng. nhưng trong hầu hết các tình huống trong thế giới thực, bạn sẽ không cần phải tắt output_buffering của PHP để bật phản hồi phát trực tuyến

cấu hình Nginx

Tôi khuyên bạn nên sử dụng Nginx với PHP-FPM để có cấu hình hiệu quả và linh hoạt nhất, nhưng vẫn chạy cả Apache và Nginx trong sản xuất vì nhiều lý do. Nginx có một lợi thế nhỏ so với Apache đối với việc sử dụng PHP ở chỗ nó không có cách tiếp cận // Set a valid header so browsers pick it up correctly.
header('Content-type: text/html; charset=utf-8');

// Emulate the header BigPipe sends so we can test through Varnish.
header('Surrogate-Control: BigPipe/1.0');

// Explicitly disable caching so Varnish and other upstreams won't cache.
header("Cache-Control: no-cache, must-revalidate");

// Setting this header instructs Nginx to disable fastcgi_buffering and disable
// gzip for this request.
header('X-Accel-Buffering: no');

$string_length = 32;
echo
'Begin test with an ' . $string_length . ' character string...
'
. "\r\n";

// For 3 seconds, repeat the string.
for ($i = 0; $i < 3; $i++) {
 
$string = str_repeat('.', $string_length);
  echo
$string . '
'
. "\r\n";
  echo
$i . '
'
. "\r\n";
 
flush();
 
sleep(1);
}

echo
'End test.
'
. "\r\n";
?>
1 cũ, nơi PHP được tích hợp chủ yếu với máy chủ web, nghĩa là cách tiếp cận yêu cầu ủy quyền (sử dụng FastCGI) luôn là mặc định và là

Tất cả những gì bạn phải làm để làm cho phản hồi phát trực tuyến hoạt động với Nginx là đặt tiêu đề // Set a valid header so browsers pick it up correctly.
header('Content-type: text/html; charset=utf-8');

// Emulate the header BigPipe sends so we can test through Varnish.
header('Surrogate-Control: BigPipe/1.0');

// Explicitly disable caching so Varnish and other upstreams won't cache.
header("Cache-Control: no-cache, must-revalidate");

// Setting this header instructs Nginx to disable fastcgi_buffering and disable
// gzip for this request.
header('X-Accel-Buffering: no');

$string_length = 32;
echo
'Begin test with an ' . $string_length . ' character string...
'
. "\r\n";

// For 3 seconds, repeat the string.
for ($i = 0; $i < 3; $i++) {
 
$string = str_repeat('.', $string_length);
  echo
$string . '
'
. "\r\n";
  echo
$i . '
'
. "\r\n";
 
flush();
 
sleep(1);
}

echo
'End test.
'
. "\r\n";
?>
2 trong phản hồi của bạn. Khi Nginx nhận ra tiêu đề đó, nó sẽ tự động vô hiệu hóa // Set a valid header so browsers pick it up correctly.
header('Content-type: text/html; charset=utf-8');

// Emulate the header BigPipe sends so we can test through Varnish.
header('Surrogate-Control: BigPipe/1.0');

// Explicitly disable caching so Varnish and other upstreams won't cache.
header("Cache-Control: no-cache, must-revalidate");

// Setting this header instructs Nginx to disable fastcgi_buffering and disable
// gzip for this request.
header('X-Accel-Buffering: no');

$string_length = 32;
echo
'Begin test with an ' . $string_length . ' character string...
'
. "\r\n";

// For 3 seconds, repeat the string.
for ($i = 0; $i < 3; $i++) {
 
$string = str_repeat('.', $string_length);
  echo
$string . '
'
. "\r\n";
  echo
$i . '
'
. "\r\n";
 
flush();
 
sleep(1);
}

echo
'End test.
'
. "\r\n";
?>
3 và // Set a valid header so browsers pick it up correctly.
header('Content-type: text/html; charset=utf-8');

// Emulate the header BigPipe sends so we can test through Varnish.
header('Surrogate-Control: BigPipe/1.0');

// Explicitly disable caching so Varnish and other upstreams won't cache.
header("Cache-Control: no-cache, must-revalidate");

// Setting this header instructs Nginx to disable fastcgi_buffering and disable
// gzip for this request.
header('X-Accel-Buffering: no');

$string_length = 32;
echo
'Begin test with an ' . $string_length . ' character string...
'
. "\r\n";

// For 3 seconds, repeat the string.
for ($i = 0; $i < 3; $i++) {
 
$string = str_repeat('.', $string_length);
  echo
$string . '
'
. "\r\n";
  echo
$i . '
'
. "\r\n";
 
flush();
 
sleep(1);
}

echo
'End test.
'
. "\r\n";
?>
4 chỉ cho phản hồi đó

// Set a valid header so browsers pick it up correctly.
header('Content-type: text/html; charset=utf-8');

// Emulate the header BigPipe sends so we can test through Varnish.
header('Surrogate-Control: BigPipe/1.0');

// Explicitly disable caching so Varnish and other upstreams won't cache.
header("Cache-Control: no-cache, must-revalidate");

// Setting this header instructs Nginx to disable fastcgi_buffering and disable
// gzip for this request.
header('X-Accel-Buffering: no');

$string_length = 32;
echo
'Begin test with an ' . $string_length . ' character string...
'
. "\r\n";

// For 3 seconds, repeat the string.
for ($i = 0; $i < 3; $i++) {
 
$string = str_repeat('.', $string_length);
  echo
$string . '
'
. "\r\n";
  echo
$i . '
'
. "\r\n";
 
flush();
 
sleep(1);
}

echo
'End test.
'
. "\r\n";
?>
5

Bạn cũng có thể vô hiệu hóa gzip (_______76) và bộ đệm (// Set a valid header so browsers pick it up correctly.
header('Content-type: text/html; charset=utf-8');

// Emulate the header BigPipe sends so we can test through Varnish.
header('Surrogate-Control: BigPipe/1.0');

// Explicitly disable caching so Varnish and other upstreams won't cache.
header("Cache-Control: no-cache, must-revalidate");

// Setting this header instructs Nginx to disable fastcgi_buffering and disable
// gzip for this request.
header('X-Accel-Buffering: no');

$string_length = 32;
echo
'Begin test with an ' . $string_length . ' character string...
'
. "\r\n";

// For 3 seconds, repeat the string.
for ($i = 0; $i < 3; $i++) {
 
$string = str_repeat('.', $string_length);
  echo
$string . '
'
. "\r\n";
  echo
$i . '
'
. "\r\n";
 
flush();
 
sleep(1);
}

echo
'End test.
'
. "\r\n";
?>
7) theo cách thủ công cho toàn bộ lệnh // Set a valid header so browsers pick it up correctly.
header('Content-type: text/html; charset=utf-8');

// Emulate the header BigPipe sends so we can test through Varnish.
header('Surrogate-Control: BigPipe/1.0');

// Explicitly disable caching so Varnish and other upstreams won't cache.
header("Cache-Control: no-cache, must-revalidate");

// Setting this header instructs Nginx to disable fastcgi_buffering and disable
// gzip for this request.
header('X-Accel-Buffering: no');

$string_length = 32;
echo
'Begin test with an ' . $string_length . ' character string...
'
. "\r\n";

// For 3 seconds, repeat the string.
for ($i = 0; $i < 3; $i++) {
 
$string = str_repeat('.', $string_length);
  echo
$string . '
'
. "\r\n";
  echo
$i . '
'
. "\r\n";
 
flush();
 
sleep(1);
}

echo
'End test.
'
. "\r\n";
?>
8, nhưng điều đó là quá mức cần thiết và sẽ gây hại cho hiệu suất trong bất kỳ trường hợp nào mà bạn không cần truyền phát phản hồi

cấu hình apache

Vì có nhiều cách khác nhau để tích hợp PHP với Apache, nên tốt nhất bạn nên thảo luận về cách hoạt động của luồng với từng kỹ thuật

' . "\r\n";// For 3 seconds, repeat the string.for ($i = 0; $i < 3; $i++) {  $string = str_repeat('.', $string_length);  echo $string . '
' . "\r\n";  echo $i . '
' . "\r\n";  flush();  sleep(1);}echo 'End test.
' . "\r\n";?>1

Apache's // Set a valid header so browsers pick it up correctly.
header('Content-type: text/html; charset=utf-8');

// Emulate the header BigPipe sends so we can test through Varnish.
header('Surrogate-Control: BigPipe/1.0');

// Explicitly disable caching so Varnish and other upstreams won't cache.
header("Cache-Control: no-cache, must-revalidate");

// Setting this header instructs Nginx to disable fastcgi_buffering and disable
// gzip for this request.
header('X-Accel-Buffering: no');

$string_length = 32;
echo
'Begin test with an ' . $string_length . ' character string...
'
. "\r\n";

// For 3 seconds, repeat the string.
for ($i = 0; $i < 3; $i++) {
 
$string = str_repeat('.', $string_length);
  echo
$string . '
'
. "\r\n";
  echo
$i . '
'
. "\r\n";
 
flush();
 
sleep(1);
}

echo
'End test.
'
. "\r\n";
?>
1 dường như có thể xử lý phát trực tuyến mà không vô hiệu hóa giảm phát/gzip cho các yêu cầu ngoài hộp. Không cần thay đổi cấu hình

$string_length1

Khi định cấu hình $string_length1, bạn phải thêm tùy chọn $string_length3 vào lệnh $string_length4 của mình, nếu không, nếu bạn đã bật $string_length5/gzip, Apache sẽ lưu vào bộ đệm toàn bộ phản hồi và trì hoãn cho đến khi kết thúc để gửi nó tới máy khách

$string_length6

$string_length7

Tôi chưa bao giờ định cấu hình Apache và PHP-FPM bằng cách sử dụng $string_length7 và việc làm như vậy có vẻ hơi rườm rà;

$string_length9

output_buffering0

Nếu bạn sử dụng output_buffering0 với PHP-FPM, thì bạn phải tắt gzip để truyền phát phản hồi

output_buffering2

Trong tất cả các trường hợp trên, bộ đệm đầu ra riêng của PHP sẽ có hiệu lực cho đến cài đặt output_buffering mặc định là 4096 byte. Bạn luôn có thể thay đổi giá trị này thành giá trị thấp hơn nếu thực sự cần thiết, nhưng trong các ứng dụng trong thế giới thực (như việc sử dụng BigPipe của Drupal), nhiều tải trọng phản hồi sẽ có các khối đầu ra lớn hơn 4096 byte, vì vậy bạn có thể không cần thay đổi cài đặt

cấu hình vecni

Varnish đầu ra bộ đệm theo mặc định và bạn phải vô hiệu hóa rõ ràng hành vi này đối với các phản hồi được truyền trực tuyến bằng cách đặt output_buffering4 trên phản hồi phụ trợ bên trong output_buffering5. Drupal, theo sự dẫn dắt của Facebook, sử dụng tiêu đề output_buffering6 để gắn cờ phản hồi là cần được phát trực tuyến. Bạn cần sử dụng Varnish 3. 0 trở lên (xem bài đăng trên blog Varnish thông báo hỗ trợ phát trực tuyến trong 3. 0) và thực hiện các thay đổi sau

Bên trong Varnish VCL của bạn

output_buffering7

Sau đó, đảm bảo bạn xuất tiêu đề ở bất kỳ đâu bạn cần truyền phản hồi

output_buffering8

Gỡ lỗi luồng đầu ra

Trong quá trình thử nghiệm của mình, tôi đã gặp phải một số sự cố mạng kỳ lạ và khó chịu với hộp mơ hồ của VMware, điều này khiến các phản hồi HTTP được gửi qua mạng ảo của VM bị đệm bất kể điều gì, trong khi các phản hồi bên trong VM vẫn hoạt động tốt. Sau khi cố gắng gỡ lỗi trong một hoặc hai giờ, tôi đã bỏ cuộc, xây dựng lại VM trong VirtualBox thay vì VMware, không thể tạo lại sự cố, sau đó xây dựng lại trong VMware, không thể tạo lại. vì vậy tôi chỉ coi đó như một lời cảnh báo—toàn bộ ngăn xếp của bạn (bao gồm mọi lớp hệ điều hành, mạng và lớp ảo hóa) phải hoạt động bình thường để tính năng phát trực tuyến hoạt động

Để tự gỡ lỗi PHP và đảm bảo rằng PHP đang phân phối luồng ngay cả khi máy chủ web ngược dòng hoặc proxy của bạn không hoạt động, bạn có thể phân tích lưu lượng gói được định tuyến qua PHP-FPM trên cổng 9000 (việc gỡ lỗi qua ổ cắm UNIX khó hơn rất nhiều, đây là một . Tôi đã sử dụng lệnh sau để đánh hơi cổng 9000 trên máy chủ cục bộ trong khi thực hiện các yêu cầu thông qua Apache, Nginx và Varnish

output_buffering9

Bạn có thể nhấn

{
    "instanceid": "***REMOVED SENSITIVE VALUE***",
    "passwordsalt": "***REMOVED SENSITIVE VALUE***",
    "secret": "***REMOVED SENSITIVE VALUE***",
    "trusted_domains": [
        "FQDN goes here",
        "192.168.111.120"
    ],
    "datadirectory": "***REMOVED SENSITIVE VALUE***",
    "dbtype": "mysql",
    "version": "20.0.1.1",
    "overwrite.cli.url": "https:\/\/FQDN goes here",
    "dbname": "***REMOVED SENSITIVE VALUE***",
    "dbhost": "***REMOVED SENSITIVE VALUE***",
    "dbport": "",
    "dbtableprefix": "oc_",
    "mysql.utf8mb4": true,
    "dbuser": "***REMOVED SENSITIVE VALUE***",
    "dbpassword": "***REMOVED SENSITIVE VALUE***",
    "installed": true,
    "memcache.local": "\\OC\\Memcache\\APCu",
    "updater.release.channel": "beta",
    "mail_smtpmode": "smtp",
    "mail_smtpsecure": "ssl",
    "mail_sendmailmode": "smtp",
    "mail_from_address": "***REMOVED SENSITIVE VALUE***",
    "mail_domain": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpauth": 1,
    "mail_smtphost": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpport": "465",
    "mail_smtpname": "***REMOVED SENSITIVE VALUE***",
    "mail_smtppassword": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpauthtype": "LOGIN",
    "updater.secret": "***REMOVED SENSITIVE VALUE***",
    "maintenance": false,
    "theme": "",
    "loglevel": 2
}
00 để thoát sau khi đã dò xong các gói

đọc thêm

  • Apache, fastcgi, proxy_fcgi và các nội dung POST trống với chuyển khối

  • Tước 'Vary. Host' từ phản hồi của Apache bằng cách sử dụng Varnish

  • Sử dụng Thẻ bộ đệm Drupal 8 với Varnish và Purge

Sơn dầu

cây khô héo

nguồn sáng

đệm đầu ra

phát trực tuyến

php

drupal

ống lớn

nginx

apache

hành tinh drupal

Bình luận

Dave Wikoff

thông tin tuyệt vời. Tôi chắc chắn đã có những vấn đề này trong quá khứ

Bạn đã chuyển sang VMWare cho các hộp ảo chưa?

  • Hồi đáp

Jeff Geerling

Trả lời bởi Dave Wikoff

Có, phần lớn là do hiệu suất tốt hơn một chút (xem VMware có tốt hơn VirtualBox để phát triển web Vagrant không?);

VirtualBox đã trở nên ổn định/đáng tin cậy hơn rất nhiều đến mức tôi không cảm thấy quá tệ khi sử dụng nó khi phải dùng nữa

  • Hồi đáp

David Snopek

Có bất kỳ hình thức nén hoặc kế hoạch nào cho các cách nén mới có thể hoạt động với các phản hồi phát trực tuyến không? . Hay kích thước của những khối đó quá nhỏ nên việc nén cuối cùng không đáng?

  • Hồi đáp

Jeff Geerling

Trả lời bởi David Snopek

Đó là một câu hỏi hay. Tôi chưa thực sự tìm hiểu quá sâu ở đó, nhưng có vẻ như đó có thể là điều bạn nghi ngờ—chi phí từ việc nén các khối nhỏ như vậy có thể không đáng để đạt được hiệu quả truyền tải nhỏ. Nhưng tôi muốn nghe từ một người đã tìm hiểu sâu hơn về mã trong Apache và Nginx

  • Hồi đáp

Rasta

Bạn đang sử dụng phiên bản NGINX nào? . Bạn có thể xuất bản toàn bộ cấu hình nginx không? . btw. chúng tôi đang sử dụng 1. 10. 1 phiên bản

  • Hồi đáp

Robin Marx

Tôi đã thực hiện một số thử nghiệm của riêng mình trong tuần qua với một số kết quả thú vị. Tôi đã sử dụng PHP7. 0 với php7. 0-fpm và mod_proxy_fcgi để chạy cả nginx 1. 10 và apache 2. 4. 23 trong Ubuntu 16. Bộ chứa Docker dựa trên 04

Tôi đã thử nghiệm cả tập lệnh từ bài đăng này, cũng như chính mô-đun big_pipe drupal

TL;DR
- mod_proxy_fcgi hoạt động với gzip và hỗ trợ giảm phát
- mô-đun big_pipe drupal qua HTTP/2 không thành công trên Apache

Phiên bản dài.
- Apache mod_proxy_fcgi hoạt động tốt với gzip và deflate được bật tại đây. Đối với tôi, cài đặt php output_buffering dường như là giới hạn lớn. Đặc biệt đối với mô-đun big_pipe_demo, điều này tạo ra sự khác biệt lớn, vì Khối demo nhỏ hơn 4096 và với cài đặt mặc định, luồng bigpipe không hiển thị. Giảm xuống 512 mang lại kết quả như mong đợi cho big_pipe_demo. Nginx cũng chỉ hoạt động vượt trội đối với tôi.

Mẹo thay đổi/kiểm tra output_buffering.
nginx. chế tạo. người dùng. ini trong thư mục gốc (cạnh. htaccess) với nội dung. output_buffering=512
apache. thay đổi/thực hiện. htaccess để bao gồm php_value output_buffering 512 và đảm bảo rằng tệp cấu hình apache của bạn bao gồm AllowOverride tất cả trong
-> kiểm tra qua phpinfo() (tìm kiếm output_buffering)

- Nó hoạt động trên HTTP/2 với bản kiểm tra từ bài đăng này, nhưng KHÔNG hoạt động với mô-đun big_pipe/big_pipe_demo trong Apache (nginx hoạt động tốt trong cả hai trường hợp). Vì vậy, có vẻ như Drupal/big_pipe đang làm điều gì đó kỳ lạ xung đột với mod_http2. Điều kỳ lạ là nó thậm chí không phát nội dung chính. trang vẫn trắng cho đến khi tất cả các trình giữ chỗ đã được giải quyết (như thể big_pipe/chunking đã bị tắt). Tôi vẫn chưa tìm ra vấn đề cốt lõi, nhưng sẽ đăng một bình luận khác ở đây khi tôi tìm ra và tôi sẵn sàng nhận các đề xuất;)

Làm cách nào để bật bộ đệm đầu ra trong PHP?

Bạn có thể bật tính năng đệm đầu ra cho tất cả các tệp bằng cách đặt lệnh này thành 'Bật' . Nếu bạn muốn giới hạn kích thước của bộ đệm ở một kích thước nhất định - bạn có thể sử dụng số byte tối đa thay vì 'Bật', làm giá trị cho chỉ thị này (e. g. , output_buffering=4096). Lệnh này luôn Tắt trong PHP-CLI.

Làm cách nào để tắt bộ đệm đầu ra trong PHP Joomla?

Làm cách nào để tắt tính năng đệm đầu ra của Joomla? .
Điều hướng đến phần Quản trị Trang web của trang web Joomla của bạn
Chọn tab Tùy chọn
Trong tiêu đề Đầu ra, bỏ chọn hộp bên cạnh Bộ đệm đầu ra
Nhấp vào Lưu thay đổi
Trang web Joomla của bạn bây giờ sẽ xuất tất cả nội dung trực tiếp ra màn hình mà không cần bất kỳ bộ đệm nào

Bộ đệm đầu ra PHP là gì?

Bộ đệm đầu ra là cơ chế kiểm soát lượng dữ liệu đầu ra (không bao gồm tiêu đề và cookie) mà PHP nên lưu giữ nội bộ trước khi đẩy dữ liệu đó tới máy khách. If your application's output exceeds this setting, PHP will send that data in chunks of roughly the size you specify.

Ob_start() trong PHP là gì?

Hàm ob_start() tạo bộ đệm đầu ra . Một chức năng gọi lại có thể được chuyển vào để xử lý nội dung của bộ đệm trước khi nó bị xóa khỏi bộ đệm. Cờ có thể được sử dụng để cho phép hoặc hạn chế những gì bộ đệm có thể làm.