如何在Laravel项目中为某些路由设置超时



我有一个关于Laravel的项目。我有用于网页的路由和用于 API 的路由。我的问题是:如何为这两个组设置不同的超时?

我尝试使用中间件,只是玩set_time_limit,但它不起作用。

所以我想我可以通过我的 Nginx vhost 文件来做到这一点,我有点坚持这个。到目前为止,我是如何结束的:

server {
    listen 80;
    listen 443 ssl http2;
    server_name mysiste;
    root "/home/vagrant/www/mysite/public";
    index index.html index.htm index.php;
    charset utf-8;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
    access_log off;
    error_log  /var/log/nginx/mysite-error.log error;
    sendfile off;
    client_max_body_size 100m;
    location ~ .php$ {
         fastcgi_split_path_info ^(.+.php)(/.+)$;
         fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
         fastcgi_index index.php;
         include fastcgi_params;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_intercept_errors off;
         fastcgi_buffer_size 16k;
         fastcgi_buffers 4 16k;
         fastcgi_connect_timeout 300;
         fastcgi_send_timeout 300;
         fastcgi_read_timeout 300;
     }
     location ~ ^/api/v1 {
         try_files $uri $uri/ /index.php?$query_string;
         client_body_timeout 1;
         send_timeout 1;
         fastcgi_connect_timeout 300;
         fastcgi_send_timeout 300;
         fastcgi_read_timeout 300;
     }
     location ~ /.ht {
         deny all;
     }
}

(当然,我将超时设置为 1 只是为了做我的研究(。

请问有人对如何处理这个问题有想法吗?

谢谢!

您的配置不起作用的原因是因为 try_files 指令重定向到您的location ~ .php$。为避免这种情况,您必须删除特定路由中的try_files并硬编码您的fastcgi_param SCRIPT_FILENAME

这就是我解决问题的方式,我必须为用于视频上传的路由允许更长的超时:

  • PHP .ini max_execution_time 到 30 年代
  • PHP FPM 的默认request_terminate_timeout(为 0(
  • set_time_limit(1800);在我的 laravel 控制器的顶部(从 /api/posts 中解析(

然后像这样使用 nginx 位置:

location ~ ^/api/posts {
    include fastcgi_params;
    fastcgi_connect_timeout 30s;
    fastcgi_read_timeout 1800s;
    fastcgi_send_timeout 1800s;
    fastcgi_buffers 256 4k;
    fastcgi_param SCRIPT_FILENAME '${document_root}/index.php';
    fastcgi_pass php:9000;
}
location ~ .php$ {
    try_files $uri /index.php?$query_string;
    include fastcgi_params;
    fastcgi_connect_timeout 30s;
    fastcgi_read_timeout 30s;
    fastcgi_send_timeout 30s;
    fastcgi_buffers 256 4k;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass php:9000;
}

您可能需要调整用例的参数。

作为记录,我使用PHP 7.3和nginx 1.12.2

你不能

用nginx做到这一点,你必须在nginx中设置最大超时,并在你的类或php中控制你的应用程序超时.ini

这是答案,包括为什么会这样的信息

因此,在 Nginx 配置的"位置 ~ .php$"部分中,将request_terminate_timeout设置为非常高的值(或者更好的是,将其设置为 0 以禁用超时(。并且还将fastcgi_read_timeout设置为您可能希望任何脚本运行的最高秒数。

然后通过在 php.ini 中设置max_execution_time默认值来设置默认值来微调它。现在,当您有想要允许长时间运行的脚本时,请在这些脚本中使用 set_time_limit(( PHP 命令。

相关内容

  • 没有找到相关文章

最新更新