【问题标题】:How to open multiple socket connections and do callbacks in PHP如何在 PHP 中打开多个套接字连接并进行回调
【发布时间】:2011-01-07 15:07:21
【问题描述】:

我正在编写一些处理项目队列的代码。它的工作方式是这样的:

  1. 获取标记为需要的下一个项目 从mysql处理 数据库行。
  2. 从 google API 请求一些信息 使用 Curl,等到信息 返回。
  3. 执行剩余的处理 根据返回的信息。
  4. 将项目标记为在 db,继续下一项。

问题在于,在第 2 步。Google 有时需要 10-15 秒才能返回请求的信息,在此期间我的脚本必须保持暂停并等待。

我想知道是否可以更改代码以执行以下操作:

  1. 获取接下来要处理的 5 个项目 像往常一样。
  2. 请求项目 1-5 的信息 谷歌,一个接一个。
  3. 当第 1 项的信息是 返回,“回调”应该是 done 调用一个函数或 否则调用一些代码,然后 完成剩余的处理 关于第 1-5 项。
  4. 然后脚本重新开始 直到 db 中的所有待处理项目都 标记为已处理。

这样的事情是如何实现的?

【问题讨论】:

    标签: php sockets curl callback


    【解决方案1】:

    您可以将其拆分为 2 种流程类型。

    1. 工作进程(其中有很多正在运行):知道正在处理的数据库行,进行并等待 Google API 调用,然后执行工作,并将结果保存到数据库中。

    2. 调度程序(只有一个):定期(例如,每隔几秒)检查是否有工作要做,并确保有 N 个(5 个或任何最佳)工作人员在运行。如果少于 N 个正在运行的工作人员,则启动更多工作人员(使用exec)以保持 N 个工作,直到所有工作完成。

    【讨论】:

      【解决方案2】:

      我真的不知道这是否是一种优雅的方法,但理论上您可以使用 fork() 为每个项目分叉 PHP 进程。这将允许所有代码都在一个文件中。

      // Get items from DB
      $items = get_items_from_db();
      foreach($items as $item) {
          $pid = pcntl_fork();
          if($pid == -1) die("Couldn't fork!");
          if(!$pid) {
            // Process the item in the child process
            process_item($item);
            exit();
          }
      }
      // Wait for all child processes to end
      pcntl_wait();
      // We're done!
      

      但是是的,这个解决方案很可能会让一些人尖叫;)

      【讨论】:

        【解决方案3】:

        我认为您可以创建一个主脚本,该脚本将在同一台机器上为特定项目调用子脚本。子脚本将向 google API 发送请求并相应地工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-13
          • 1970-01-01
          • 2014-09-29
          • 2015-01-07
          • 1970-01-01
          相关资源
          最近更新 更多