2011-10-31 79 views
1

我有一個簡單的perl子例程,用於檢查是否仍在託管jQuery 1.6的副本,然後決定是否打印鏈接到它的腳本或我們的本地託管副本。爲什麼Perl的LWP :: Simple自帶的head命令只能在命令行中調用它時才起作用?

這是我正在使用的代碼的副本。

my $jquery_host = "http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"; 
my $header = LWP::Simple::head($jquery_host); 

if(defined $header) { 
    return qq{<script type="text/javascript" src="$jquery_host"></script>}; 
} 
else { 
    return qq{<script type="text/javascript" src="$localPath"></script>}; 
} 

當我運行此命令行的代碼,我沒有問題,檢索的響應,並適當地打印出腳本標籤鏈接到jQuery的谷歌的副本。但是,當我從構建html頁面的perl腳本實際調用它時,它每次都找不到任何內容,並打印出鏈接到我們自己副本的腳本標記。

什麼權限或其他類型的障礙可能會暫停此連接?

感謝您的幫助。

注意:這隻能在我們的本地測試服務器上運行到目前爲止。命令行也在測試服務器上運行。

+0

也許當添加到您的其他腳本$ jquery_host不再是你所期望的在該點的頭()請求。添加一個打印()來查看。 – JRFerguson

+0

該谷歌的jquery副本的URL是正確的。每當我從命令行運行函數時,頭部都會返回信息。 –

回答

1

我可以確認你的代碼是獨立工作的。嘗試將分配包裝到if語句中;實際上也是內聯url字符串。唯一可能與你搞混的另一件事是你的服務器腳本運行在使用一些代理或tcp封裝的機器上,而這些代理或tcp封裝並不允許你從google.com獲取jQuery。我們無法真正幫助您解決這些非常具體的當地問題。

如果我只是在猜測,我會說你有多個Perl環境正在進行,而且你的命令行使用了一個很好的版本,但是你的web服務器正在調用另一個版本,一個可能會以破壞你正在做的事情的方式硬化,比如爲use in AppEngine提出的建議。但是我上面的建議是基於這樣的想法,即圍繞此代碼段的代碼可能會混淆正在使用的變量。看起來這kind of issue雖然圍繞使用io sockets in mod_perl確實出現。

節目片段:

$ perl -MLWP::Simple -e ' 
if(head("http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js")) { 
    print qq{<script type="text/javascript" 
     src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"> 
    </script>}; 
} else { 
    print qq{<script type="text/javascript" src="$localPath"></script>}; 
}' 

輸出:

<script type="text/javascript" 
    src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"> 
</script> 

我也寫這使一些$scriptPath被分配到jQuery的路徑或$localPath,然後過去的if語句我只使用現在確定的$scriptPath打印腳本標記一次。但這也許只是我。

+0

我同意它可能是一個特定的本地問題,所以我想我問的是什麼可能是擾亂我的能力使用我的本地主機上運行的網站上的perl腳本中的頭部命令的問題,但仍然會允許我在從命令行調用它時建立連接。 –

+0

您應該更新您的問題,並詳細說明如何將此代碼集成到您的網絡服務器中。這個Apache的mod_cgi運行的是包含這個代碼的perl cgi腳本嗎,Apache的mod_perl是否做了類似的事情?它是一個像催化劑一樣的perl web框架,還是使用完全不同的web服務器?我會用一兩個建議更新我的答案。 – dlamblin

+1

mod_perl中的io套接字是問題。我只是切換到LWP :: UserAgent並使用其頭部命令和問題解決。非常感謝您的幫助! –

1

我不知道爲什麼你的代碼不工作,但你不應該使用它:只是因爲你的服務器可以達到ajax.googleapis.com並不意味着用戶的瀏覽器可以。

只需在客戶端上使用JavaScript進行回退即可。下面是基於this answer一些示例代碼:

return <<"END"; 
<script type="text/javascript" src="$jquery_host"></script> 
<script type="text/javascript"> 
if (typeof jQuery == 'undefined') document.write(
    '<'+'script type="text/javascript" src="$localPath"><'+'/script>' 
); 
</script> 
END 
+0

這是一個很好的答案,並且是我對我們問題的原始解決方案,但我們的客戶正在使用很多非常慢的計算機,並且在jquery加載之前我們的onReady函數正在執行,當我嘗試像這樣包含它時。我並不是說爲了適應這種情況而重寫我們的頁面是不可能的,但它是一個非常低的優先級。對於一個很少運行維護的站點,我只需要一個5年的檢查,看看谷歌是否仍然在這個URL上託管jquery。 –

+0

令人驚訝。據我所知,'