2009-10-19 22 views
0

如何讓shell會話保持打開狀態,直到用PHP關閉它爲止?用PHP打開shell以允許多個調用?

在我的例子中,我想使用NcFtp通過shell命令發佈一些文件。我想離開PHP內置的FTP,因爲它速度慢得多,性能也是一個問題。

使用ncftpput可以很容易地發佈文件或目錄。但如果我想循環訪問10個文件的數組,那麼腳本將不得不登錄,發佈,註銷,登錄,發佈,註銷...

如果類似的東西會更方便這可以工作。

shell_exec('ncftp -u username -p password'); 

foreach ($files as $file) 
{ 
    shell_exec('put '.$file['local_path'].' '.$file['remote_path']); 
} 

shell_exec('quit'); 

這可能嗎?

謝謝!

+0

看看expect:http://expect.nist.gov/ – Eddy 2009-10-19 15:09:09

+0

你不能在ncftp中嵌套命令,對不對?比如:ncftp -u用戶名-p密碼&& put ... && put ... – 2009-10-19 15:14:03

回答

1

如果你只需要訪問一個進程,你可以使用popen()proc_open()來做到這一點。

像這樣的東西可能工作:

$handle = popen('ncftp -u username -p password' , 'w'); 

foreach ($files as $file) { 
    fwrite($handle, 'put ' . $file['local_path']. ' '.$file['remote_path'] . "\n"); 
} 

pclose($handle); 
+0

謝謝。看起來proc_open()可能是正確的。 – Christoffer 2009-10-20 06:03:51

0

我不認爲你可以這樣做,但你可以做的是將第二個執行包裝在一個shell腳本中,它將接受多個參數,或者從STDIN獲得文件名的提要。
通常這些事情都是針對PHP的心態,我相信(這是一個Web請求的生命期)。
你也可以檢查你想做什麼的一部分可以用現有的PHP函數或包裝器完成。

1

看起來這可能是PHP的工作內置FTP功能或Expect

+0

我已經使用PHP的內置FTP構建了一個工作實現,但它比通過shell執行運行NcFtp要慢很多。 – Christoffer 2009-10-20 06:42:15

+0

出於好奇,哪部分昂貴?連接?你需要連接到多個主機?轉賬實際上是較慢的? – 2009-10-20 17:43:36