php后台脚本



我的问题是:我有一个应用程序,允许用户将他们的数据与社交网络同步。问题是,每次同步可能需要长达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触发此操作)

您对此有何优化建议?

谢谢。

一个选项是使用Gearman,并将此工作卸载给它的工作人员。

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

Her是一篇关于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();
?>

有两种方法。

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