2011-03-15 131 views
7

問題摘要:我已經成功地加速了大幅上傳圖片時的圖片縮略圖,代價是使用併發。現在我需要確保針對競爭條件的併發性。我打算讓獨立腳本爲獨立狀態輪詢正常文件,但後來決定命名管道會更好。管道避免輪詢並命名,因爲我無法從打開它們的腳本中獲得PID(這是我需要使用管道進行交談的那個)。非阻塞命名管道

所以當一個圖像上傳時,客戶端通過AJAX發送POST到一個腳本1)保存圖像2)產生一個並行腳本(獨立)拇指圖像和3)返回圖像的JSON到客戶端。然後,客戶立即請求翻譯版本,我們希望有足夠的時間在響應發送時做好準備。但是,如果它沒有準備好,Apache mod_將路徑指向第二個腳本(依賴項),該腳本將等待拇指完成並返回圖像數據。

我預計這是非常簡單的,但是,同時通過終端單獨測試獨立的腳本,我得到這個:

$ php -f thumb.php -- img=3g1pad.jpg 
successSegmentation fault 

源是在這裏:http://codepad.org/JP9wkuba我懷疑我得到一個段錯誤,因爲FIFO我做了仍然是開放的,現在成了孤兒。但我需要在那裏爲依賴腳本來看,對吧?並不是它應該是非阻塞的?我想這是因爲腳本的其餘部分可以運行....但它不能完成?這將是一個正常文件的工作,正如我一開始就想到的,除非兩者都是開放的,我不想投票。我想最多進行一次輪詢並完成它。我是否需要投票並忽略醜陋?

+3

我意識到這不會直接回答你的問題,但你爲什麼選擇這個*令人難以置信的奇怪的路線,而不是使用像Gearman這樣的工作/消息隊列(http://gearman.org/)? – Charles 2011-03-15 20:33:14

+0

@Charles:嗯,我聽說過,但不知道它做了什麼。但我現在真的不需要另一個API來學習。 – Grault 2011-03-15 21:41:43

+8

你需要擔心的2-4個方法與挖掘你自己發現的crashtastic命名管道泥潭所需的努力相比是微不足道的。:) Gearman甚至可以讓你[發送狀態數據回來而處理](http://www.php.net/manual/en/gearmanjob.sendstatus.php),你似乎有一個很好的例子在這裏。 (發送狀態信息實際上顯着增加了作業檢索過程的複雜性 - 它從火再遺忘/火災等待到處理火焰和回火的標誌。) – Charles 2011-03-15 22:39:35

回答

1

您需要刪除已創建的FIFO文件,然後完成所有腳本。