2013-03-06 89 views
2

我正在使用PHP腳本來閱讀收到我的應用程序的退回地址的電子郵件,並與他們做東西。該腳本計劃運行cron作業,但我無法控制它,並且我沒有權限在服務器上寫入文件(這樣幾乎消除了文件鎖定機制)。是否有另一種方法可以確保我只有一個腳本實例在任何特定時間運行?服務器正在運行linux。PHP:我該如何檢查一下php腳本是否已經運行?

+0

你不允許寫'/ tmp'?真的嗎?什麼'sys_get_temp_dir()'給你,你可以寫在那裏? – Wrikken 2013-03-06 13:40:43

+0

Memcache,Redis,地獄 - 如果必須的話,甚至MySQL。您無權訪問_ANY_數據存儲引擎? – 2013-03-06 13:43:40

+0

是否有'posix_mkfifo'選項?它優於memcached,APC和co。它是默認啓用的。 – Jon 2013-03-06 13:45:59

回答

1

我想你可以試試這個:

// we use ourselves as the lock file 
if (false === ($f = fopen(__FILE__, 'r'))) { 
    die("Could not open lock file"); 
} 
if (false === flock($f, LOCK_EX)) { 
    die("Could not obtain lock"); 
} 
// do your stuff 
flock($f, LOCK_UN); 
fclose($f); 

你不需要寫訪問與諮詢鎖工作;這當然假定在您的配置中啓用了flock()

+0

我試過這個,可以運行2個或更多的實例就好(使用睡眠,因爲當流量很小時腳本非常快)。羣似乎很好。此外,它似乎是他們等待彼此,因爲第二次只在第一次睡眠後睡覺(可能與睡着的東西有關,我很少使用它) – Bogdan 2013-03-06 14:00:32

+0

更多信息以上評論:似乎等待發生在羣($ f,LOCK_EX)行,所以不是完全阻止第二個實例它只是延遲它? – Bogdan 2013-03-06 14:05:13

+0

@Bogdan是的,LOCK_EX和LOCK_UN之間的任何東西都可以看作是關鍵部分。 – 2013-03-06 14:06:12

0

它有點髒,但

if(file_exists("block.bin")) { 
    //already running 
} 

file_put_contents("block.bin", 1); 

//do stuff 

unlink("block.bin"); 
+0

「我沒有權限在服務器上寫文件」... – Jon 2013-03-06 13:41:57

+0

你有沒有mysql訪問權限?取而代之的是將該塊作爲一行存儲在表中。你也可以使用APC或memcached。 – bizzehdee 2013-03-06 13:42:49

相關問題