2012-04-16 62 views
0

我有這個問題,其中cron運行一個php腳本每5分鐘更新一個列表。Fwrite失敗w/PHP Cron

但是,列表未能更新5%的時間,並且列表最終爲空。我不相信它與cron有關,因爲我認爲我沒有像100次嘗試那樣兩次手動生成列表。

我相信它與此相關的是,當網站上有超過50人時,它將無法生成,可能與服務器繁忙有關。我添加了一個檢查,以確保它不是MySQL不返回行(這似乎不可能),但它仍然會導致我相信fwrite失敗。

<?  
$fileHandle = fopen("latest.html", 'w'); 
    $links = array(); 

$query1 = $db_conn -> query("SELECT * FROM `views` ORDER BY `date` DESC LIMIT 0,20"); 
while ($result1 = $db_conn -> fetch_row($query1)) 
{ 
    $result2 = $db_conn -> fetch_query("SELECT * FROM `title` WHERE `id` = '" . $result1['id'] . "'"); 

    array_push($links, "<a href='/title/" . $result2['title'] . "'>" . $result2['title'] . "</a>"); 
} 

if (count($links) > 0) 
    fwrite($fileHandle, implode(" • ", $links)); 
else 
    echo "Didn't work!";  

fclose($fileHandle); 
?> 

難道文件在使用中會有一點點機會,所以最終不能工作並寫入空白列表?

+0

日誌說什麼? – Michal 2012-04-16 17:58:35

+0

在cron或網站的php日誌中找不到任何錯誤(它可能不在那裏,因爲它在技術上不是從站點執行的?)。 – 2012-04-16 18:20:42

回答

1

$ fileHandle =「latest.html」,'w');

我會假設你的意思

$文件句柄=的fopen( 「latest.html」, 'W');

'w'在這裏打開文件,將光標置於開始位置,並將文件截斷爲零長度。

如果在執行此操作之前檢查計數($鏈接),則在沒有任何內容要寫入時不會截斷文件。

<?php 
$links = "QUERY HERE AND HANDLE THE RESULTS (REMOVED)"; 
if (count($links) > 0) 
{ 
    $fileHandle = fopen("latest.html", 'w'); 
    fwrite($fileHandle, implode(" • ", $links)); 
    fclose($fileHandle); 
} 
else 
{ 
    echo "Didn't work!"; 
} 
?> 
+0

啊,我已經做了修改來解決這個問題。我想我將不得不等待現在是否是MySQL錯誤或PHP錯誤。 – 2012-04-16 18:02:16

+0

:)祝你好運冠軍 – Dale 2012-04-16 18:10:39

1

難道還有輕微的機會的文件正在使用中,因此最終沒有 工作,寫一個空白列表?

嗯,是的。我們不知道您運行的其他代碼是否會操縱latest.html,因此我們無法真正對其進行配置。

以下是一些建議:

  1. 修復語法錯誤在你的文件處理程序創建
  2. 您可以獲取的fopen(「W」)處理程序有一個現有的fopen(「R」文件)過程正在進行,所以一定要使用PHP的flock在寫文件,以確保其他進程不會破壞你的清單
  3. 檢查,看看你的日誌不得不說
  4. 寫入字符串,然後使用fwrite的整個字符串,所以你花更少的時間在你的內循環中你的文件處理程序打開(特別是在這種情況下,它不會顯示字符串會是那麼長的鏈接列表)
  5. 嘗試輸出你的鏈接(datetamped)到一個單獨的文件,除了latest.html;在5%的機會失敗時,回頭看看時間戳鏈接,看看他們是如何比較的。您還可以在該文件中包含您的查詢,以便您可以確定問題是否與數據庫有關或與寫入latest.html有關 - 這在您的查詢(不是顯示)可能不會返回結果。
+0

沒有其他代碼操縱latest.html,會涌入仍然是必要的?我查看了我的cron日誌和我的php日誌以查找網站,但沒有發現任何內容,我不認爲我錯過了輸出它的任何地方。在4號,fwrite只被調用一次,所以它不應該是一個問題?我會嘗試#5來隔離php vs mysql錯誤。 – 2012-04-16 18:11:53

1

我覺得你已經開放了查詢返回沒有數據的可能性。您示例中的「已刪除」邏輯可能有助於闡明發生了什麼。解決這個問題的一個好方法是將某些東西寫入日誌文件,並在腳本幾次迭代後檢查該日誌文件。爲了在您的latest.html文件中使用,我會在當前代碼中使用file_put_contents。

<?php 

$links = array(); 
$query = "SELECT links FROM tableA"; 
$result = mysql_query($links); 
while ($row = mysql_fetch_row($result)) { 
    $links[] = $row[0]; 
} 

if (count($links) > 0) { 
    file_put_contents('latest.html', implode(" * ", $links)); 
    file_put_contents('linkupdate.log', "got links: " . count($links) . "\n", FILE_APPEND); 
} else { 
    file_put_contents('linkupdate.log', "No links? [(" . mysql_errno() . ") " . mysql_error() . "]\n", FILE_APPEND); 
} 

?> 

如果我們發現沒有鏈接,我們不會覆蓋以前的數據文件。如果我們遇到可能導致問題的MySQL錯誤,它會顯示在日誌輸出中。

對文件的讀取不應該阻止寫入,但切換到file_put_contents將有助於減少文件打開和空閒的時間(在執行查詢和獲取結果時存在一些延遲)。

隨意匿名化您的查詢和發佈,以及 - 你肯定可以有一個問題的結果集,因爲你的代碼,否則似乎應該工作。

+0

用SQL查詢更新了我的帖子,它非常簡單,所以我看不出它會失敗 – 2012-04-16 18:15:54