2010-10-07 81 views
1

我掙扎了半天,終於認定它不能完成。我扔掉了我的php腳本,並在perl中重寫了它,它從一開始就按照我希望的方式工作。不過,我想知道是否可以在PHP中正確完成這樣簡單的任務。 問題:我已經長時間(在大小和時間)上傳文件(通過原始數據POST),我只需要使用PHP將它保存到文件中。它與PHP一起工作的方式是它完全處理髮布的數據,將其保存到文件中,然後開始執行我的腳本(我的文件上傳持續30分鐘)。即使我嘗試fopen(「php:/ stdin」或php://輸入),它仍然以這種遲緩的方式工作。我真正需要的是能夠按順序處理傳入的發佈數據。我嘗試過:1)modphp,2)php-cgi,3)php-cli作爲cgi可執行文件運行。即使php-cgi被用來使用cgi,它仍然會預處理髮布的數據(這樣$ _POST變得可用)並且不能像普通的momphp一樣工作。 CLI版本作爲cgi腳本運行並不奏效,因爲它無法從php:// stdin或php://輸入中讀取!無論我嘗試了什麼,都沒有爲我工作,我得出的結論是,它不能用PHP完成......或者它可以?用PHP處理HTTP POST

謝謝

回答

0

當然PHP可以做到這一點。上傳的文件存儲在臨時目錄中,直到PHP腳本可以與它們交互。這樣做的必要信息在$_FILES陣列中。

$field_name = 'file'; # from the HTML form control 

$move_result = move_uploaded_file(
    $_FILES[$field_name]['tmp_name'], 
    $real_destfile 
); 

if ($move_result) { 
    print "successfully uploaded file (originally called '$_FILES[$field_name]['name']' to $real_destfile"; 
} else { 
    print "failed to receive uploaded file."; 
} 
+0

這不是OP要求的。他希望在長期上傳過程結束之前訪問文件/運行他的腳本。 – nico 2010-10-07 07:09:59

0

它聽起來像你想流數據。要做到這一點,你將不得不建立一個套接字,準備好將數據作爲一個數據流進行恢復。即,替換Apache Web服務器。

你的問題不是語言,它是網絡服務器。 Web服務器監聽端口80,然後執行它的操作。例如,將文章數據寫入文件,然後啓動php腳本。

您可以像創建Pearl一樣創建自定義端口程序。你也可以用PHP做同樣的事情,並且使用一個命令行驅動的php腳本來監聽端口80,而不是在apache裏面。但是PHP並不是最好的語言。我會建議Python。

HTTP通信附帶有一個開銷,可能會使用一個更精簡的協議,它可能會減少您的上傳時間。

如果您的上傳時間太長,您可以通過AJAX方法完成,並在您的客戶端應用程序仍處於活動狀態時繼續。客戶端AJAX應用程序也可以完成將它分成塊的工作。

+0

是的,我正在傳輸數據。我不想使用$ _FILES的原因是它不適用於BIG和LONG上傳(流式傳輸到服務器看起來像PHP)。命令行PHP是有史以來最糟糕的主意,我真不敢相信它有多糟糕!我非常喜歡php,但是當我嘗試在CLI模式下使用它時,我意識到這是一堆廢話:它拋出了太多錯誤,我看不到任何日誌。我最終編寫了一個perl cgi腳本。它比打開套接字更好:apache調用cgi腳本並將所有套接字處理交給cgi程序。 – Pavel 2010-10-08 06:43:49

+0

我根本不知道Python,所以它不是我的解決方案。我發現如何做到這一點(通過cgi-perl),我知道所有的tcp-listeners的方式來做到這一點,但我真的想知道,如果這可以通過處理原始輸入/後處理數據用php來完成。有些php://輸入可能會讓一些人認爲它允許直接訪問輸入流,這是非常沒用的。 – Pavel 2010-10-08 06:50:31