Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php背景脚本_Php_Multithreading_Background_Synchronization - Fatal编程技术网

php背景脚本

php背景脚本,php,multithreading,background,synchronization,Php,Multithreading,Background,Synchronization,这是我的问题:我有一个应用程序,允许用户将他们的数据与社交网络同步。问题是每次同步可能需要10秒。因此,我想在“后台”任务中触发同步,如果可能,将所有同步并行化 目前,我的脚本如下所示: $user = user::login($username, $password); /* Do some treatments, display the home page */ $user->synchronize(); /* END OF LOGIN SCRIPT */ 在我的user.cla

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

    谢谢。

    有两种方法

  • 使用
    exec()
    进行多个系统调用,如
    exec(“php/path/to/script?networkId=1>/dev/null 2>/dev/null&”)
  • 使用只在Linux中工作的
    pcntl\u fork()
    一种选择是使用,并将此工作转移给it员工


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

    她是一篇关于使用php进行异步处理的博客文章:

    
    
    如果并行运行,事情永远不会变得更快。实际上,它们会变慢。@arkascha在这种情况下,大部分时间都花在等待远程服务器上,因此如果并行等待,操作将更快完成。是的,瓶颈不在于同步脚本,而在于远程服务器。然后,处理方法就是检查来自远程应用程序的一些数据与本地数据库中的数据。这看起来非常有趣。如果我很好地理解了我读到的第一篇文章,我可以将每个任务卸载到Gearman服务器,然后发送给它的工作人员,我可以等待结果(如果我需要做进一步的处理),也可以不等待(这只是初始同步),为一个或多个Gearman服务器使用专用虚拟机是一个好主意吗?第一条评论:是的第二条评论:通常您将有一个Gearman服务器,可能还有多个工作人员。您可以在同一台机器或多台机器上运行所有这些。从oe机器开始,然后在必要时添加运行工人的新机器。如果答案解决了您的问题,您应该投票并接受它。我认为pcntl_fork不能用于Web服务器。可能吗?@Jean MarcDormoy only
    CGI
    /
    CLI
    。可以使用
    php fpm
    ,但需要技巧。
        <?php
          include 'AsynchronousProcessing.php'
    
          launchBackgroundProcess('php /path/to/task1.php');
          launchBackgroundProcess('php /path/to/task2.php');
          $class->SomeWork();
          $class->SomeOtherWork();
    ?>