2013-12-16 27 views
3

我只是想問一下,因爲我正在編寫一個腳本,並且我正在使用time()作爲我正在做的事情的一個鹽。PHP中的Time()函數

現在發生了什麼我正在從服務器1發送到服務器2的數據。服務器2檢查以確定data = submitted_data + time()是否完全匹配。我想知道,因爲我的腳本將在不同的服務器上使用,time()函數將返回相同的值(如果它們位於世界的不同部分?)

客戶端的代碼示例如下:

if($return == md5("true" . time())) 

和代碼示例,其中,如果這是正確提交的數據,將返回此:

echo md5('true' . time()); 

兩者都在世界不同地區的不同的服務器,但我想知道,如果使用time()會搞亂我係統的工作方式..?

+3

我不會依賴它。如果時鐘不同步,則會出現錯誤。 – andrewsi

+0

我可以使用類似時間(小時:分鐘)的東西,而不必包含秒鐘嗎? – Reverb

+4

然後,您可能每60秒就會遇到一個問題。這聽起來對我來說完全不可靠。 –

回答

1

你爲什麼不嘗試以下操作:

回聲日期( 「Y-M-d H:我」) 回聲的strtotime(日期( 「Y-M-d H:我」));

strtotime的值(日期(「​​Y-m-d H:i」));直到你通過下一分鐘纔會改變,或者你可以根據你的要求刪除「我」。

希望有所幫助。

+0

Y m d H我代表什麼?如果我要使用時間鹽醃,這是最好的方法嗎? – Reverb

+0

Y是年份,m =>月份,d代表日期,H =>代表小時,i =>分鐘。爲什麼不根據您的要求查看「mcrypt_create_iv」或「mt_rand」 –

+0

Ohhh , 對。 H:我爲什麼?而且,因爲我會使用日期而不是時間......每個服務器/位置的值是否相同?或者它返回腳本所在服務器的日期? – Reverb

0

這將不起作用,因爲time()依賴於系統的本地時鐘,這幾乎保證不會在任何兩臺計算機/時鐘之間同步。其次,你無法保證操作系統給定進程何時給定運行時間;因此一臺服務器可能會在幾毫秒內關閉,因爲它正在做其他的事情。然後你有網絡延遲等等。

這是分佈式系統的一個重要問題,分佈式系統必須保持事物'同步',而不必準確知道發生了什麼操作。 (如果數據庫分佈在多個服務器之前,數據庫的更新是否應該發生在數據庫之前?)最好不要依賴於這個原因的時間,但可能還需要一些其他的東西,比如修訂號(然後遞增)。例如:

  • 服務器用版本ID = 142(注「142」是任意的在這個例子中)
  • 客戶端進行了更改,遞增版本和散列發送下行數據。
  • 客戶端將數據發送到散列版本號的服務器。
  • 服務器增加它自己的修訂版本ID並散列它。這現在應該等於客戶發送的內容。
  • 如果沒有,服務器拒絕發送數據。

這使您能夠在不依賴不一致的外部資源的情況下模擬時間。

+0

我看到了,但由於某種原因,我的本地主機,我在澳大利亞和我的服務器,這是在美國 - 腳本的作品,但有時並不是每時每刻..但是有沒有其他選項,我可以選擇而不是時間()?有沒有可能的方法有時間(HH:SS)HH是小時,SS是次要的? – Reverb

+0

請參閱我的修訂版,但請注意HH:SS可能因爲同樣的原因偶爾也會失敗;假設發送和處理只需要一微秒,但在那段時間內,「秒」會跳到下一秒? –