簡體   English   中英

為什么我的單個 jquery .ajax GET 調用在 apache 日志中出現多次?

[英]why is my single jquery .ajax GET call showing up multiple times in apache log?

我遇到了一個問題,我對 .ajax 的單次調用每 60 秒重復一次,直到遠程端返回。 當我以這種方式寫出我的問題時,它讓我想到了某種長時間響應的電話——但我沒有做任何事情來設置或請求它。

我的應用程序在 Linux 上運行,由 Apache 提供服務,並調用由同一台 Apache 服務器在本地托管的 CGI 腳本。 該 CGI 腳本進行后端調用並僅在后端調用完成后返回。 最近,遠程服務器偶爾需要幾分鍾而不是幾秒鍾才能返回。

我的 webapp 日志顯示一個調用,我的 Apache access_log 顯示該調用每 60 秒重復一次。 所以我向 CGI 腳本發出一個 GET 請求,Apache 日志顯示該請求每 60 秒重復一次,無論后端返回需要多長時間。

而且因為 cgi 被一遍又一遍地調用,我一直在向遠程服務發出多個請求,這非常糟糕。

到底是怎么回事?

相關的 javascript 片段

let call = {
  callName: 'AddWithFulfillment',
  cardholder: 'cardholderRecord',
  cardholderHash: 'cardholderHash',
  transactionNumber: 6206419,
};

console.log(new Date().toString(), 'call:', JSON.stringify(call));
$.ajax({
  data: {
    task: JSON.stringify(call)
  },
  url: '/cgi-bin/makeCall.sh',
  dataType: 'json',
  cache: false
}).then(
  function success(data, textStatus, jqXHR) {
    console.log(new Date().toString(), 'success:', JSON.stringify(data));
  },
  function fail(jqXHR, textStatus, errorThrown) {
    console.log(new Date().toString(), 'fail:', errorThrown.message, JSON.stringify(data));
  }
);

相關的 bash 腳本

#!/bin/bash
# extract the task from the query string into a workfile
q_str=$(echo -e ${QUERY_STRING//%/\\x} | sed 's/+/ /g')
task=$(echo "$q_str" | sed -n 's/^.*task=\([^&]*\).*$/\1/p' | sed "s/%20/ /g")
echo "${task}" > /tmp/workfile.txt 
rm -f /tmp/workfile.result 
touch /tmp/workfile.result

# wait for the result file, dump it into stdout & exit
while [[ 1 ]] ; do
    if [[ -s /tmp/workfile.result ]] ; then
        echo -e $(cat /tmp/workfile.result)
        exit 0
    fi
    sleep 1
done
exit 1

代表性控制台日志

"Sun Oct 15 2017 13:13:56 GMT-0400 (EDT)" call: {"callName":"AddWithFulfillment","cardholder":" <...omitted...> ","transactionNumber":6206419}
"Sun Oct 15 2017 14:07:30 GMT-0400 (EDT)" success: {"callName":"AddWithFulfillment","cardholder":" <...omitted...> ","transactionNumber":6206419, "resultId": -1}

實際訪問日志

127.0.0.1 - - [15/Oct/2017:13:56:24 -0400] "GET /cgi-bin/logger.sh?txt1=%22calling.addWithFufilment+sending%3A%22%2C%22%7B%5C%22isProdCall%5C%22%3Atrue%2C%5C%22deviceAlias%5C%22%3A%5C%22JS-0589.1%5C%22%2C%5C%22callName%5C%22%3A%5C%22AddWithFulfillment%5C%22%2C%5C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%5C%22%3A6206419%7D%22&_=1508040892538 HTTP/1.1" 200 20 "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"
127.0.0.1 - - [15/Oct/2017:13:56:24 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"
127.0.0.1 - - [15/Oct/2017:13:57:24 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"
127.0.0.1 - - [15/Oct/2017:13:58:24 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"
127.0.0.1 - - [15/Oct/2017:13:59:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"
127.0.0.1 - - [15/Oct/2017:14:00:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"
127.0.0.1 - - [15/Oct/2017:14:01:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"
127.0.0.1 - - [15/Oct/2017:14:02:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"
127.0.0.1 - - [15/Oct/2017:14:03:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"
127.0.0.1 - - [15/Oct/2017:14:04:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"
127.0.0.1 - - [15/Oct/2017:14:05:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"
127.0.0.1 - - [15/Oct/2017:14:06:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"
127.0.0.1 - - [15/Oct/2017:14:07:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 242 "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"
127.0.0.1 - - [15/Oct/2017:14:07:30 -0400] "GET /cgi-bin/logger.sh?txt1=%22recording.addWithFufilment+params%22%2C%22%7B%5C%22isProdCall%5C%22%3Atrue%2C%5C%22deviceAlias%5C%22%3A%5C%22JS-0589.1%5C%22%2C%5C%22callName%5C%22%3A%5C%22AddWithFulfillment%5C%22%2C%5C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> resultId%5C%22%3A-1%2C%5C%22TransactionNumber%5C%22%3A6206419%7D%22&_=1508040897606 HTTP/1.1" 200 20 "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"

考慮到 Apache 日志沒有說謊,您的瀏覽器肯定會重復該請求。 即使我們認為 jQuery 通過$.ajaxSetup()配置了超時(因為我可以從你的代碼中看到$.ajax()不是),jQuery 不會自動重試失敗的請求 AFAIK。 那么也許您的瀏覽器出於某種原因每 60 秒刷新一次頁面,使 ajax 請求再次發生? 也許某些瀏覽器插件正在刷新您的頁面,我不知道。

無論如何,我將針對這個問題提出一種不同的方法:不要依賴長時間的AJAX 調用,因為它可能無法在不同的瀏覽器中正常工作。 例如,我聽說 IE 會在 60 秒后超時。 最好的方法可能是立即返回一個響應,說明工作已被安排進行處理。 然后客戶端會定期輪詢同一個端點,這次傳遞一些請求 id,服務器會立即回復,要么通知處理仍在等待中,要么在完成時返回結果。 說得通?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM