首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP请求在输出和PHP完成后挂起。

PHP请求在输出和PHP完成后挂起。
EN

Stack Overflow用户
提问于 2022-04-12 09:51:45
回答 1查看 428关注 0票数 2

Instana追踪问题:

The problem:与正常情况相比,有些请求需要额外20到60多个时间才能完成。

手动运行CURL显示了以下行为:

没有输出(我预计这是example.com/api

  • 2处理时间)

  • 0.5-1秒-很多JSON输出突然停止,比如在中间div class="aa

  • 20+秒-没有输出

  • 最后一秒钟-请求输出的其余1-2行是displayed

  • request完成

我希望在没有发生任何事情的情况下不会有20+秒的延迟。

捕获了通信的tcpdump

要注意的是,lat FCGI_STDOUT数据包延迟了50+秒,它包含几个字节(在本例中是json结束标记“]}”):

代码语言:javascript
复制
FastCGI (FCGI_STDOUT)
Version: 1
Type: FCGI_STDOUT (6)
Request ID: 1
Content Length: 6
Padding Length: 2
Content Data: 5c6e225d5d7d
Padding Data: 0000

FastCGI (FCGI_STDOUT)
Version: 1
Type: FCGI_STDOUT (6)
Request ID: 1
Content Length: 6
Padding Length: 2
Content Data: 5c6e225d5d7d
Padding Data: 0000

My fpm设置:

代码语言:javascript
复制
# php-fpm -v
PHP 7.4.28 (fpm-fcgi) (built: Mar 29 2022 03:26:54)
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.28, Copyright (c), by Zend Technologies


[www]
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data
listen = 0.0.0.0:9000
listen.backlog = 1024
process.priority = 0
pm = dynamic
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.process_idle_timeout = 55
pm.max_children = 100
pm.start_servers = 10
pm.max_requests = 10000
slowlog = /var/log/php-fpm/slowlog.log
request_slowlog_timeout = 10
request_terminate_timeout = 600
user = www-data
catch_workers_output = yes
security.limit_extensions = .php .phar
pm.status_path = /status
php_admin_value[memory_limit] = 512M
php_admin_value[post_max_size] = 256M
php_admin_value[upload_max_filesize] = 256M
php_admin_value[max_execution_time] = 60
php_admin_value[opcache.revalidate_freq] = 0
php_admin_value[opcache.validate_timestamps] = 0
php_admin_value[opcache.max_accelerated_files] = 32531
php_admin_value[opcache.memory_consumption] = 512M
php_admin_value[opcache.interned_strings_buffer] = 128
php_admin_value[opcache.huge_code_pages] = 0
php_admin_value[zend.assertions] = 0
php_admin_value[max_input_vars] = 2000

我的nginx设置:

代码语言:javascript
复制
# nginx -v
nginx version: nginx/1.20.1


upstream php {
server 127.0.0.1:9000;
}

server_tokens off;
server_names_hash_bucket_size 256;
client_max_body_size 256m;

server {
listen 80;
server_name xxx;

root /usr/share/xxx/public_api;
index index.php;
try_files $uri $uri/ /index.php?$args;

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

client_header_timeout 120;
client_body_timeout 120;
send_timeout 120;
keepalive_timeout 60;

gzip on;
gzip_comp_level 4;
gzip_proxied any;
gzip_types application/atom+xml application/javascript application/json application/rss+xml
application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json
application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css
text/plain text/x-component;

location ~ \.php$ {
fastcgi_connect_timeout 60s;
fastcgi_read_timeout 120s;
fastcgi_send_timeout 120s;

fastcgi_pass php;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;

fastcgi_param APPLICATION_ENV live;
fastcgi_param HTTPS off;

opentracing_fastcgi_propagate_context;
}
}

更新:我设法追踪到Instana监控端的资源争用问题。在特定的条件下,使用TCP和悬挂php发送度量。

EN

回答 1

Stack Overflow用户

发布于 2022-04-12 10:15:08

没有看到您的应用程序,但看看这些问题,我会猜测它可能是自动的输出缓冲区刷新。

当缓冲区“满”时,它将自动输出到客户端。然后,使用现在为空的缓冲区,它将收集新的输入,直到缓冲区再次满为止,这可以解释您得到的间隔网络响应。

尝试将所有输出放入一个数组中,然后在最后返回一个implode(PHP_EOL, $response_data);

或者使用ob_get_contents()来创建自己的缓冲区。

代码语言:javascript
复制
ob_start();
echo "Hello World!";
$contents = ob_get_contents();
ob_end_clean();

echo "The contents of the buffer are: ";
echo $contents;

这将防止过早输出,并可能实际上加快您的反应,因为回声是犯罪的慢与小字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71840569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档