1

これが私の問題です。ユーザーが自分のデータをソーシャルネットワークと同期できるようにするアプリケーションがあります。問題は、各同期に最大10秒かかる可能性があることです。したがって、「バックグラウンド」タスクで同期をトリガーし、可能であればすべての同期を並列化します。

現在、私のスクリプトは次のようになっています。

$user =  user::login($username, $password);
/* Do some treatments, display the home page */ 
$user->synchronize();
/* END OF LOGIN SCRIPT */

そして私のuser.class.phpには、次のようなものがあります

public function synchronize(){
 $Networks = socialNetworks::getByUserId($this->userid);
 foreach($Networks as $n) $n->synchronize();
}

そして最後に、socialNetworks.class.phpで、各ソーシャルネットワーク(fb、linkedin、google +、...)のすべての同期スクリプトを実装しました。

ログイン時に同期の結果を待つ必要がないことに注意してください。

だから私はここで2つの問題があります:

  1. $ user-> synchronize();を呼び出すとき。ログインスクリプトは、ループが終了するまでブロックされます
  2. ループ自体は非常に長いので、synchronize()メソッドを呼び出すときに高速化するために並列の「スレッド」を起動したいと思います(このアクションをトリガーするAjaxがいくつかあります)。

これを最適化するために何を提案しますか?

ありがとう。

4

3 に答える 3

0

2つの方法があります。

  1. exec()次のような複数のシステムコールを作成するために使用しますexec("php /path/to/script?networkId=1 > /dev/null 2>/dev/null &")
  2. Linuxでのみ動作するpcntl_fork() 関数を使用してください。
于 2012-11-20T13:21:16.360 に答える
0

1つのオプションは、Gearmanを使用し、この作業をその作業者にオフロードすることです。

基本的に、いくつかの作業を行うPHPスクリプトを作成します。次に、ログインスクリプトからその作業を行うように指示すると、作業はリクエストの外部でバックグラウンドで実行されます。

于 2012-11-20T13:23:14.840 に答える
0

彼女は、phpを使用した非同期処理に関するブログ投稿です。

http://robert.accettura.com/blog/2006/09/14/asynchronous-processing-with-php/

    <?php
      include 'AsynchronousProcessing.php'

      launchBackgroundProcess('php /path/to/task1.php');
      launchBackgroundProcess('php /path/to/task2.php');
      $class->SomeWork();
      $class->SomeOtherWork();
?>
于 2012-11-20T13:23:57.430 に答える