我有一個PHP腳本(我使用Laravel開發)將用於下載存儲在webroot之外的文件。 我現在想要控制正在進行的下載的傳輸速度(例如,根據傳遞到正在運行的腳本的某個值,在while(fread())調用中執行usleep(),以便可以在外部更改傳輸速度實時),但我無法將值傳遞給正在運行的php腳本。如何將值傳遞給正在運行的腳本?
while($buffer = fread($fp, 2048)) {
print $buffer;
flush();
$this->bytes_transferred += strlen($buffer);
usleep($this->transfer_delay);
}
因此,這裏是我的問題: - 我怎麼傳遞,可以在一段時間()週期內被截獲的值?
我能想到的一些理論的解決方案,但他們都有問題:
理論解#1 - 使控制器類有一個類全局變量(如$這個 - > transfer_delay)來控制速度
- 註冊事件偵聽器,將,不知何故,改變全局變量的值,然後while循環可以簡單的叫usleep($這個 - > transfer_delay)
理論解決方案#1問題 - 我試過使用事件,但我的事件似乎沒有運行。
此外,我懷疑事件運行在不同的上下文中,而不是在實例化的方法/類中運行。
理論解決方案#2 - 打開套接字並收聽活動!
- 在進入while循環之前,請打開套接字並偵聽事件!
問題理論解#2 - 插座要求您阻塞等待新的連接,所以在等待一個新的方面,我將無法傳送文件
- 也許我fork()可以處理接受新連接並處理它們的部分代碼?但後來我無法將價值回傳給父母,對吧? (或者我可以使用某種信號處理程序嗎?)
理論解#3 - 從DB每次我通過我的週期循環時間
- 有外部進程的值推到一個數據庫,並具備同時拉事件()循環讀取從每次迭代
問題理論解#3數據庫 - 它讓我覺得髒內:O)
- 我不認爲這是很好的做法,多次打一個數據庫每秒鐘在「高速而()循環」得到一個值
理論解#4 - 使用命名管道
- 創建一個fifo文件並在每次迭代時從中讀取。
問題理論解#4 - 這其實在我看來是最好的解決辦法:○\
- 老實說,我想不出有什麼優於這一點,但...必有做我能做的事嗎?
有關如何完成我想要做的事情的任何想法?
只要您在每次讀取後關閉文件,就可以讓PHP從文本文件讀取速度,然後在腳本運行時更改速度。 –
使用第三種理論,但使用內存中緩存而不是數據庫。在學術上,這似乎是好的,實際上,這似乎是這個問題的錯誤語言。 – user602525