2011-03-23 141 views
22

我需要實現一種方法來POST調用位於同一臺服務器或另一臺服務器上的頁面。我們不能使用包含,因爲我們調用的文件通常會調用不同的數據庫或具有相同名稱的函數。我可以對同一臺服務器執行CURL請求嗎?

我一直在努力實現這個使用捲曲,而它從另一個服務器調用文件時完美的作品,我讓到該文件是在同一臺服務器呼叫時獲得絕對沒有。

編輯添加一些代碼: 的我在做什麼的簡化版本:

File1.php

<?php 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "www.myserver.com/File2.php"); 
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
$result = curl_exec($ch); 
curl_close($ch); 
echo $result; 
?> 

File2.php

<?php 
echo "I'M IN!!"; 
?> 

調用File1.php後,我什麼也沒得到,但是如果File2.php在另一臺服務器上,那麼我會得到一個結果。 有什麼幫助嗎?

我嘗試使用在服務器URL(HTTP ...)和文件的總地址(/家/ WWWW ....)

+0

不固定在一些哈克解決方法 – 2011-03-23 21:55:38

+0

真正的問題是粘性可以正常申請,但不更改URL作爲本地文件。使用網址作爲遠程服務器,例如:http://site.com ..我可以看到你的代碼嗎? – 2011-03-23 21:56:06

+0

而不是像「http://mysite.com」使用完整的地址,使用「本地主機」。它在我的情況下工作。 – MKatleast3 2012-07-19 09:15:17

回答

44

要知道,如果你發出捲曲請求你自己的網站,你正在使用默認的會話處理程序,並且你通過CURL請求的頁面使用與產生請求的頁面相同的會話,你將遇到死鎖情況。

默認的會話處理程序鎖定的頁面請求期間的會議文件。當您嘗試使用同一個會話請求另一個頁面時,該後續請求將掛起,直到請求超時或會話文件變爲可用。由於您正在執行內部CURL,因此運行CURL的腳本將鎖定會話文件,並且CURL請求無法完成,因爲目標頁面無法加載會話。

+0

所以,我不能做一個CURL請求到同一臺服務器?有沒有辦法解決這個問題? – Trialien 2011-03-23 22:41:06

+21

您可以確保執行CURL請求的腳本在'curl_exec()'之前立即使用'session_write_close()'關閉會話。如果需要更改會話中的任何內容,可以隨後再次執行'session_start()'。 – 2011-03-24 00:45:42

+3

我想馬克的評論應該在答案中,因爲它只是在這裏解決了我的問題 – 2012-06-14 12:54:56

1

你應該重構你的代碼。除了Marc B提到的之外,這種方法將不必要地拖慢你的腳本速度(可能會大幅度降低)並引起很多混淆。沒有冒犯性,但這只是一個令人難以置信的不良邏輯修復。

+0

我明白你的意思,但這不是我們在生產服務器上做的事情,這將用於後臺進程,其中性能不是問題。仍然感謝您的意見。 – Trialien 2011-03-24 13:35:36

2

因爲當你試圖請求與公網IP的本地服務器,Apache的無法解析其地域。所以你必須檢查哪個本地ip apache使用該域名。然後,您需要編輯/ etc/hosts文件,並使用本地ip加上您的域添加新行。例如:

我在Apache的虛擬主機域名本地IP爲:172.190.1.120,我的域名是mydomain.com 所以我要補充:

172.190.1.120 mydomain.com

然後你的捲曲會正常工作。

+0

這發生在我身上:)捲曲請求工作到所有的url,但我的和這做了伎倆。感謝您的解決方案 – Sogeking 2017-02-23 08:56:56

相關問題