Serverworker似乎在使Ajax请求非常慢

时间:2019-03-14 07:52:08

标签: javascript php mysql ajax service-worker

因此,我这里有一个PHP应用程序,其中包含许多JS,它们将ajax请求返回给PHP,以进行数据库请求。我正在添加一个服务工作人员,主要是为了缓存事物并启用推送通知,但是这些ajax请求最多需要3-4到5秒钟才能返回。

我已经直接在mysql和phpmyadmin中运行了相同的请求,例如,它们在0.000081秒内返回。所以我不确定是什么原因造成了这种延迟。

数据库相对简单,有5-6个表。一张表大约有10列和120行,其余的只有3-4列和50-60行。本地主机上的数据库(在配置中定义为127.0.0.1),我已经在完成JOIN或WHERE的所有字段上添加了索引。

一些示例代码:

Ajax请求:

    var dCIDQ = $("#company").val();
    $.ajax({
            type: 'GET',
            url: 'api?aedCIDc='+dCIDQ
        }).then(function (data) {
        $('.dcid3').select2({
            multiple: true,
            placeholder: 'Select CID',
            data: data,
            debug: true
        });
        });

        $('.company').select2();
    });

PHP:

if (isset($_GET['aedCIDc'])) {

    /*****************************************
     * Add Edit - Get derenCID options
     *****************************************/

    $dCIDcompany = mysqli_real_escape_string($dbhandle, $_GET['aedCIDc']);

    $dCIDcompanyArray = array();

    $result = mysqli_query($dbhandle, "SELECT  lieferantCID.id as id, \
lieferantCID.derenCID as text FROM lieferantCID LEFT JOIN companies ON \
lieferantCID.lieferant = companies.id WHERE lieferantCID.lieferant LIKE \
'$dCIDcompany'") or die(mysqli_error($dbhandle));

    while($resultsrows = mysqli_fetch_assoc($result)) {
      $dCIDcompanyArray[] = $resultsrows;
    }

    echo json_encode($dCIDcompanyArray);

  }

Serviceworker Fetch:

self.addEventListener('fetch', event => {
     if ((/js$/.test(event.request.url)) || \
(/css$/.test(event.request.url)) || (/jpg$/.test(event.request.url)) || \
(/png$/.test(event.request.url)) || (/svg$/.test(event.request.url)) || \
(/svg$/.test(event.request.url)) || (/woff2$/.test(event.request.url))) { 
      // stale while revalidate
      event.respondWith(
        caches.open(RUNTIME).then(function(cache) {
          return cache.match(event.request).then(function(response) {
            var fetchPromise = fetch(event.request).then(function(networkResponse) {
              cache.put(event.request, networkResponse.clone());
              return networkResponse;
            })
            return response || fetchPromise;
          })
        })
      );
    } 
    else {
      event.respondWith(fetch(event.request));
      return;
    }
});

(在此处添加换行符只是为了提高可读性)

^^我只想在重新验证静态资产(仍处于开发阶段,并且这些atm经常更改时)过时,然后直接从网络中获取其余信息。

有什么想法吗?

编辑:以下是示例网络时间轴:

chrome devtool screenshot

编辑:因此,我删除了serviceworker,并将MySQL响应作为硬编码变量复制到了PHP中,只是返回了该响应,而计时仍然很糟糕。返回该请求的时间约为2-4秒。 WTF。

编辑:所以这变得越来越陌生了。我已经了解了性能api并设置了一些测量标记。我在ajax调用中将beforeSend设置为开始,然后在整个ajax块之后立即将结束标记设置为0.4ms。我还在整个脚本周围设置了另一组标记,这是索引页面上两个ajax调用所在的位置,其中还包括一些数学运算和初始化chart.js图表​​。整个脚本平均大约需要400毫秒才能运行。

因此,对于chrome开发工具中的“等待”计时器所显示的“完成”呼叫并显示图表需要2-4秒的时间,我现在更加困惑。

1 个答案:

答案 0 :(得分:0)

好的,通常我会删除它-但我认为我会将解决方案发布在这里,供其他可能遇到类似问题的人使用。

因此,当然这实际上不是ajax或mysql出现问题。.这只是我在发出这些请求之前加载的另一部分代码。我通过启用php-fpm慢日志并观看它来找到它。可以在/etc/php/[version number]/fpm/pool.d/www.conf下启用(在基于Ubuntu / Debian的发行版中)。