Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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_Sockets_Curl_Callback - Fatal编程技术网

如何在PHP中打开多个套接字连接和执行回调

如何在PHP中打开多个套接字连接和执行回调,php,sockets,curl,callback,Php,Sockets,Curl,Callback,我正在写一些处理一个项目队列的代码。其工作方式如下: 将下一个项目标记为需要 要从mysql进行处理 数据库行 从谷歌API请求一些信息 使用Curl,等待信息显示出来 返回 完成剩余的处理 基于返回的信息 将项目标记为已在中处理 db,进入下一项 问题是在第二步。谷歌有时需要10-15秒来返回请求的信息,在此期间,我的脚本必须保持暂停并等待 我想知道是否可以更改代码以执行以下操作: 获取接下来要处理的5项 像往常一样 项目1-5的请求信息来自 谷歌,一个接一个 当项目1的信息为 返回时,应返回

我正在写一些处理一个项目队列的代码。其工作方式如下:

  • 将下一个项目标记为需要 要从mysql进行处理 数据库行
  • 从谷歌API请求一些信息 使用Curl,等待信息显示出来 返回
  • 完成剩余的处理 基于返回的信息
  • 将项目标记为已在中处理 db,进入下一项
  • 问题是在第二步。谷歌有时需要10-15秒来返回请求的信息,在此期间,我的脚本必须保持暂停并等待

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

  • 获取接下来要处理的5项 像往常一样
  • 项目1-5的请求信息来自 谷歌,一个接一个
  • 当项目1的信息为 返回时,应返回“回调” 调用函数或 否则调用一些代码 是否执行其余的处理 关于项目1-5
  • 然后脚本重新开始 直到数据库中的所有挂起项都被删除 标记为已处理

  • 如何实现这样的目标?

    您可以将其分为两种流程类型

  • Worker进程(其中许多正在运行):知道正在处理的数据库行,进行并等待googleapi调用,然后执行作业,并将结果保存到数据库中

  • 调度器(一个且仅一个):定期(比如说,每隔几秒钟)检查是否有工作要做,并确保有N个(5个或任何最佳)工作人员在运行。如果运行的辅助进程少于N个,则启动更多辅助进程(使用
    exec
    )以保持其为N,直到所有工作完成


  • 您可以将其分为两种进程类型

  • Worker进程(其中许多正在运行):知道正在处理的数据库行,进行并等待googleapi调用,然后执行作业,并将结果保存到数据库中

  • 调度器(一个且仅一个):定期(比如说,每隔几秒钟)检查是否有工作要做,并确保有N个(5个或任何最佳)工作人员在运行。如果运行的辅助进程少于N个,则启动更多辅助进程(使用
    exec
    )以保持其为N,直到所有工作完成


  • 我真的不知道这是否是一种优雅的方法,但从理论上讲,您可以使用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!
    

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

    我真的不知道这是否是一种优雅的方法,但在理论上,您可以使用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!
    

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

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

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