我的问题是:我有一个应用程序,允许用户将他们的数据与社交网络同步。问题是,每次同步可能需要长达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+…)的所有同步脚本
请注意,登录时我不需要等待同步的结果
所以我有两个问题:
- 调用$user->synchronize()时;登录脚本将被阻止,直到循环结束
- 循环本身很长,我想启动并行的"线程",以便在调用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();
?>
有两种方法。
- 使用
exec()
进行多个系统调用,如exec("php /path/to/script?networkId=1 > /dev/null 2>/dev/null &")
- 使用仅适用于Linux的
pcntl_fork()
函数