php背景脚本

时间:2012-11-20 13:17:11

标签: php multithreading background synchronization

这是我的问题:我有一个应用程序,允许用户将他们的数据与社交网络同步。问题是每次同步最多可能需要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触发此操作)。
  3. 您建议您对此进行优化?

    感谢。

3 个答案:

答案 0 :(得分:0)

有两种方式。

  1. 使用exec()制作多个系统调用,例如exec("php /path/to/script?networkId=1 > /dev/null 2>/dev/null &")
  2. 使用仅适用于Linux的pcntl_fork() function

答案 1 :(得分:0)

一种选择是使用Gearman,并将此工作卸载给工作人员。

您基本上创建了一个可以完成某项工作的PHP脚本。然后你告诉它从你的登录脚本做这项工作,工作将在请求之外的后台完成。

答案 2 :(得分: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();
?>