0

cron が 5 分ごとに php スクリプトを実行してリストを更新するという問題があります。

ただし、リストは 5% の確率で更新に失敗し、リストは空白になります。cron に関連しているとは思えません。100 回ほど試行して、リストを手動で生成するのに 2 回失敗したと思うからです。

これに関連していると私が信じているのは、サイトに 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);
?>

ファイルが使用されているためにファイルが機能せず、空白のリストが書き込まれる可能性がわずかにありますか?

4

3 に答える 3

1

$fileHandle = "latest.html", 'w');

私はあなたが意味すると仮定するつもりです

$fileHandle = fopen("latest.html", 'w');

ここで「w」はファイルを開き、カーソルを先頭に置き、ファイルの長さをゼロに切り捨てます。

これを行う前に count($links) をチェックすると、ファイルに書き込むものが何もない場合でもファイルが切り捨てられません。

<?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!";
}
?>
于 2012-04-16T17:59:01.723 に答える
1

ファイルが使用されているためにファイルが機能せず、空白のリストが書き込まれる可能性がわずかにありますか?

はい、そうです。latest.html を操作する他のコードが実行されているかどうかはわかりません。そのため、実際にプロファイリングすることはできません。

以下にいくつかの提案を示します。

  1. ファイル ハンドラー作成時の構文エラーを修正する
  2. 既存の fopen('r') プロセスが進行中のファイルへの fopen('w') ハンドラーを取得できます。そのため、ファイルへの書き込み中は PHP のflockを使用して、他のプロセスがリストを破損しないようにしてください。
  3. ログの内容を確認してください
  4. 文字列に書き込み、次に文字列全体を書き込みます。そのため、ファイル ハンドラーを開いた状態で内側のループに費やす時間が短縮されます (特に、文字列がそれほど長くないと思われる場合、つまりリンクのリスト)。
  5. あなたのリンク (日付スタンプ付き) を latest.html 以外の別のファイルに出力してみてください。失敗する可能性が 5% の場合は、タイムスタンプ付きのリンクを振り返って、それらがどのように比較されるかを確認してください。そのファイルにクエリを含めることもできるため、問題がDBに関係しているのか、latest.htmlへの書き込みに関係しているのかを特定できます。これは、クエリが(そうではない)場合に特に役立ちます示されている) は、結果を返さない可能性があります。
于 2012-04-16T18:05:49.740 に答える
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 に切り替えると、ファイルが開いていて空である時間を短縮できます (クエリを実行して結果を取得している間は、ある程度の待ち時間が発生します)。

クエリを匿名化して投稿することもお気軽に。そうでなければコードは正常に動作するように見えるため、結果セットに問題が発生する可能性は間違いありません。

于 2012-04-16T18:10:45.363 に答える