2016-03-17 28 views
0

我只是不確定......執行(....)的腳本是否等待exec()完成後再繼續?Exec()命令和腳本流程

比如我的腳本會流像這樣....從AWS

  1. 複製PDF文件的Web服務器
  2. 轉換PDF文件爲JPG(EXEC())
  3. 上傳JPG到AWS
  4. 從服務器中刪除這兩個文件。

重複10000次......

我是否需要寫些東西來停止代碼,直到EXEC完成?或者可以使用exec命令,移動文件,然後刪除文件?我擔心的是程序會在轉換之前嘗試刪除這些文件。

我希望這是明確的,感謝...

+0

PHP通常遵循嚴格同步的方法。然而,你應該考慮的是,鏈接10 000個這樣的覆蓋和上傳是一個值得懷疑的事情。您應該將這些任務排列到由「作業排隊系統」控制的「作業」。這將更加強大。 – arkascha

回答

0

AFAIK exec()(如果你談論的是系統調用)是一個阻塞調用,因此腳本的進一步執行(這是什麼語言!)將被阻止。 您可以使用&並將Stderr/Stdout重定向到/ dev/null,以在後臺運行進程並等待完成。

最好的辦法是做異步:

fork() --- Child Process 
if fork returns 0 
exec() --- Command you want to process your jpegs with 
in parent wait() for exec to complete 
0

從PHP文檔:http://se1.php.net/manual/en/function.exec.php

注:

如果程序開始使用此功能,以便它到 繼續在後臺運行,程序的輸出必須是 重定向到一個文件或另一個輸出流。如果不這樣做, 會導致PHP掛起,直到程序執行結束。

如果你是在一個循環中,你要刪除的文件後,爲什麼不循環結束後刪除文件(如果你有足夠的存儲空間)

還可以監控的回報3操作,並在確定文件已上傳時刪除。

symfony的組件的方法,可以幫助你管理這個流程http://symfony.com/doc/current/components/process.html

希望幫助

+0

感謝尼古拉斯。該行是 - exec(「convert -density 100x100 -quality 60 -compress jpeg 3.pdf 3.jpg」); - 所以命令是輸出到文件(10,000次)。這是我的測試網站 - 因此EC2實例很小 - 它無法處理所有這些。雖然 - 也許我可以創建一個CRONE作業,每20分鐘運行一次,或者根據20-30個文件進行轉換。 –

+0

你需要處理與PHP的轉換? 我的意思是你需要用戶數據輸入嗎? 如果沒有,你可以做一個小的bash腳本與cron執行而不涉及PHP – Nicolas