Laravel 5.6中的PHP 7.2 SoapClient超时

如何解决Laravel 5.6中的PHP 7.2 SoapClient超时

我正在使用加拿大渔业和海洋局SOAP Web服务(https://tides.gc.ca/eng/info/WebServicesWLDhttps://ws-shc.qc.dfo-mpo.gc.ca/predictions?wsdl)设置潮汐观测端点。它涉及到查看使用原始PHP的旧应用程序,并将其移植到Laravel中。 vanilla和Laravel版本都可以使用,但是由于某种原因,在Laravel中,如果没有请求超时,我不能将结果的最大大小设置为50-100以上,但是在旧应用程序中,它设置为1000。本地,结果有所不同,唯一的区别似乎是使用Laravel。


我在PHP操场上举了一些例子。示例1和示例2在PHP操场上的最大大小为1000,并且响应时间相等,这似乎表明Laravel可能是问题所在。

示例1-旧的应用程序代码: https://www.tehplayground.com/XYXERmL9kHmdTvLD

示例2-新的应用程序代码,但已精简为原始PHP,以确保不是我自己的代码成为问题 https://www.tehplayground.com/N2T3PTQSBfaWSQPh


Laravel中的实现,在不超时的情况下最大大小不能超过50-100,而且我不知道为什么或如何解决它。

示例3-Laravel代码:

我包括了我正在使用的完整Laravel控制器,因为在我从存储请求的文件之外,它不依赖任何内容,可以运行,并且可以用来确认它是否是问题,或者可能会发生什么。最后,我将文件的一些输出包含在存储中。

<?php

namespace Ctow\Http\Controllers;

use SoapClient;
use Illuminate\Support\Facades\Log;
use Illuminate\Contracts\Filesystem\FileNotFoundException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class MarineTidalController extends Controller
{
    // ... Abridge for brevity

    /**
     * Get the observations for a marine tidal region.
     *
     * @see https://tides.gc.ca/eng/info/WebServicesWLD
     * @see https://ws-shc.qc.dfo-mpo.gc.ca/predictions?wsdl
     *
     * @param \Illuminate\Http\Request $request
     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\Http\Response
     */
    public function regionObservations(Request $request)
    {
        $this->validate($request,[
            'region_index' => 'required|integer','start_date' => 'required|string','end_date' => 'required|string',]);

        try {
            $file = $this->getTidalRegions();
        } catch (FileNotFoundException $ex) {
            return response('File Not Found',404);
        }

        $regionIndex = $request->get('region_index');
        $region = json_decode($file)->regions[$regionIndex];
        $startDate = $request->get('start_date');
        $endDate = $request->get('end_date');

        try {
            $stations = $this->searchPredications($region,$startDate,$endDate);
        } catch (\Exception $ex) {
            return response('Service Unavailable',503);
        }

        return response()->json([
            'stations' => $stations
        ]);
    }

    /**
     * Get the tidal regions from storage.
     *
     * @return string
     * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
     */
    private function getTidalRegions()
    {
        try {
            return Storage::disk('local')->get('/Data/tidal-regions.json');
        } catch (FileNotFoundException $ex) {
            Log::error($ex);

            throw $ex;
        }
    }

    /**
     * Perform the search for the marine tidal predications.
     *
     * @param $region
     * @param $startDate
     * @param $endDate
     * @return mixed
     * @throws \SoapFault
     */
    private function searchPredications($region,$endDate)
    {
        $wsdl = 'https://ws-shc.qc.dfo-mpo.gc.ca/predictions?wsdl';
        $params = [
            'hilo',// High and low water-levels (tides)
            $region->min_latitude,// Geospatial boundary
            $region->max_latitude,$region->min_longitude,$region->max_longitude,0.0,// Depth min
            0.0,// Depth max
            $startDate,// Date min
            $endDate,// Date max
            1,// Start

            // ISSUE in the old application size max is set to 1000 and response is
            // prompt like the examples in PHP playground,but can't get higher than 
            // 50-100 without timing out in Laravel,which greatly decreases the result 
            // set. Both these examples work using a size max of 1000,but when used
            // in Laravel the response timesout.
            //
            // Example fiddle using old code:
            // https://www.tehplayground.com/XYXERmL9kHmdTvLD
            //
            // Example fiddle using paired down code from this class in Laravel:
            // https://www.tehplayground.com/N2T3PTQSBfaWSQPh
            50,// Size max

            true,// Metadata
            '',// Specific fields in result (CSV)
            'asc' // Sort order
        ];

        try {
            $client = new SoapClient($wsdl);
            return $client->search(...$params);
        } catch (\Exception $ex) {
            Log::error($ex);

            throw $ex;
        }
    }
}

getTidalRegions返回的数据示例,如果有人愿意测试控制器,则可以直接从getTidalRegions返回该数据,并替换来自Storage的请求。

[
  [
    "region_name" => "Vancouver Island","min_latitude" => 48.195,"max_latitude" => 51.048,"min_longitude" => -128.54,"max_longitude" => -122.728
  ],[
    "region_name" => "Prince Edward Island","min_latitude" => 45.622,"max_latitude" => 47.122,"min_longitude" => -65.544,"max_longitude" => -59.634
  ],[
    "region_name" => "Newfoundland","min_latitude" => 46.559,"max_latitude" => 52.052,"min_longitude" => -59.502,"max_longitude" => -52.427
  ],[
    "region_name" => "Nova Scotia","min_latitude" => 43.533,"max_latitude" => 46.012,"min_longitude" => -66.473,"max_longitude" => -60.546
  ],[
    "region_name" => "Quebec","min_latitude" => 46.21,"max_latitude" => 50.149,"min_longitude" => -72.949,"max_longitude" => -66.819
  ],[
    "region_name" => "Anticosti Island","min_latitude" => 47.115,"max_latitude" => 50.444,"min_longitude" => -66.742,"max_longitude" => -60.875
  ]
]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-