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+、...)实现了所有同步脚本。

请注意,我登录时不需要等待同步的结果。

所以我在这里有两个问题:

  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

一种选择是使用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 回答