2016-03-18 185 views
0

我有基於此數據使用的NuSOAP的API請求數據時,它建立一個大〜1000-4000行插入查詢長時間運行的腳本(從30到160秒,根據設置的任何地方)。它比截斷表並插入大查詢。防止PHP腳本同時運行多次的最佳方法?

當我運行的腳本過於緊密定時一前一後它會創建它丟失數據的問題。我想阻止這個腳本同時運行兩次。

該腳本將在未來還可以通過cron /任務調度每隔〜運轉5-10分鐘。

<?php 
    header('content-type: application/json'); 
    ignore_user_abort(true); 

    if (!file_exists('lock.txt')) { 
     $lock = fopen('lock.txt','w'); 
     fclose($lock); 

     //~450 API requests using NuSOAP. 
     //TRUNCATE `table` 
     //INSERT ~1000-4000 rows into `table 

     $jsonArray = array(utf8_encode('script')=>utf8_encode('finished')); 
     unlink('lock.txt'); 
    } else { 
     $jsonArray = array(utf8_encode('script')=>utf8_encode('locked')); 
    } 
    echo json_encode($jsonArray); 
?> 

這是阻止被同時運行的腳本的安全方式:

目前我阻斷文件是否存在,檢查同時運行的腳本?是不是更好地檢查一個MySQL列是否包含'true'或'false,而不是文件?

有沒有更好的辦法?

+0

使用帶時間戳的數據庫條目會更好。 – shikhar

+0

在文件/ db中使用事務和存儲運行狀態。 – Gogol

+0

您是否可以不使用數據庫事務(可能是'DELETE'而不是'TRUNCATE'?)來確保您的數據不會以不一致的狀態結束? –

回答

0

我認爲鎖定文件可能不是理想的,我寧願創建一個臨時會話變量來檢查'True'或'False'來查找腳本是否運行。

可選,我還要跟蹤執行每個腳本,可以檢查不必要的時間日期和總的平均時間採取有效的實際時間。

即使通過CRON Scheduler運行腳本,在使用session_start()之前通過手動指定session_id(),仍應該可以使用會話。

然而,餅乾將是依賴於瀏覽器,也不會通過計劃工作。

+0

由cron作業運行的腳本不會有會話。 – Yoshi

+0

不是每個用戶類型的會話變量?該腳本將由cron/task和用戶運行。 – displaynn