2011-11-18 58 views
1

我有合併2個文件,並上傳使腳本等待產生稀疏文件

1)小文件的腳本 - LITERAL

2)大文件(其中規模< = 2GB) - GENERATED

# $file_size is <= 2GB 

    # generate sparse 
    $block_size = $file_size/10; 
    exec("dd if=/dev/zero of=sparse bs=" . $block_size . " count=0 seek=" . ($file_size - 32768),$tmp_array); 

    sleep(12); 

    # merge files 
    exec("cat temp_file sparse > mergedFile"); 

    # remove temporary files 
    exec("rm temp_file sparse"); 

    # upload the file now 

我的問題是,它合併文件時,它需要很多時間。

跳過合併過程並且文件已經上傳,在整個稀疏文件和臨時文件被合併之前不應該這樣做。

感謝幫助

〜macki

+0

您還可能有權限問題,你確定的命令是在所有正在執行的? – perreal

+0

是的我是root用戶 – macki

回答

1

exec("cat temp_file sparse > mergedFile");不等待命令完成,因爲您正在將cat命令的標準輸出重定向到文件。如果在exec()中運行這樣的命令,該命令將在後臺運行,PHP將立即移動到下一行。兩種可能的解決方案:將cat temp_file sparse >mergedFile包裝到另一個shell腳本中,或者在PHP本身內部進行文件連接。

+0

我將不得不等待mergedFile完成,我該怎麼做? – macki

0

而是執行每個程序行一個接一個寫一個shell腳本,並通過變量BLOCK_SIZE,尋求作爲一個參數。命令行參數或殼sciprt如$ 1,$ 2等。例如參考:

exec("myscript " . $one . " " .$two); 

和外殼腳本:

#!/bin/bash 
echo $1 
echo $2 
+0

這是怎麼在代碼? – macki

+0

修復了我的通話。 – Bytemain

1

看一看稀疏文件附加到temp_file代替:

exec("cat sparse >> temp_file");

更新#1:

你正在做的一件事是從兩個其他文件生成一個新文件,實際上你正在製作它們中的每一個的副本。要減少磁盤活動量,可以執行的操作是將sparse文件附加到temp_file的末尾。然後,您可以將temp_file與您在示例中的mergedFile相同。另一個增加的好處是,你只需要刪除sparse文件。

以下是您可能遇到的一些基本bash命令的simple tutorial

+0

這是什麼意思? – macki

+0

@macki取決於腳本執行的時間長短,您可能需要考慮將php超時設置爲更大的值,這樣腳本不會中途停止。見http://php.net/manual/en/function.set-time-limit.php – hafichuk

1

您是否嘗試過使用條件運算符?作爲一個快速和骯髒的例子:

cat temp_file sparse > mergedFile && rm temp_file sparse

+0

這不是我的問題,我的問題是我想知道mergedFile是否已經完成,以便我可以立即上傳 – macki