13

同じ関数が同時に実行されないように、PHP の関数を同期させる方法は? 2 番目のユーザーは、1 番目のユーザーが機能を完了するまで待つ必要があります。その後、2 番目のユーザーが機能を実行できます。

ありがとう

4

4 に答える 4

15

これは基本的に、関数がロックされ、最初の呼び出し元がその関数から戻るまで実行できないというフラグをどこかに設定することになります。これは、いくつかの方法で行うことができます。

  • ロック ファイルを使用します (最初の関数はファイル名 "f.lok" をロックし、2 番目の関数はロック ファイルが存在するかどうかを確認し、その評価に基づいて実行するかどうかを確認します)
  • データベースにフラグを設定する (非推奨)
  • @JvdBergが提案したようにセマフォを使用します(最速)

並行アプリケーションをコーディングするときは、常に競合状態とデッドロックに注意してください!

セマフォを使用したUPDATE (未テスト):

<?php

define('SEM_KEY', 1000);

function noconcurrency() {
    $semRes = sem_get(SEM_KEY, 1, 0666, 0); // get the resource for the semaphore

    if(sem_acquire($semRes)) { // try to acquire the semaphore. this function will block until the sem will be available
        // do the work 
        sem_release($semRes); // release the semaphore so other process can use it
    }
}

sem_* 関数を使用するには、sysvsem をサポートするように PHP をコンパイルする必要があります。

PHP でセマフォを使用するためのより詳細なチュートリアルを次に示します。

http://www.re-cycledair.com/php-dark-arts-semaphores

于 2012-09-19T11:10:47.130 に答える
12

セマフォを探しています

セマフォ (またはその他のブロッキング メカニズム) を使用すると、セマフォが起動している間は要求を処理できないため、重大なパフォーマンスの問題が発生する可能性があることに注意してください。

于 2012-09-19T11:07:02.217 に答える
0

私の頭の上から:

  • 関数は、isFunctionRunning というデータベース フィールドが 1 に等しいかどうかをチェックします。そうでない場合は、実行を開始します。
  • isFunctionRunning というデータベース フィールドを 1 に更新します。
  • 関数はここで魔法を行います
  • isFunctionRunning というデータベース フィールドを 0 に更新します。

しかし、どういうわけか、あなたがやろうとしていることは「間違っている」ので、別の方法で達成できると思います。詳細を教えていただければ助かります

編集:phpセマフォを認識していませんでした。上記の回答の方がはるかに高速です。

于 2012-09-19T11:07:56.957 に答える