Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.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_Curl - Fatal编程技术网

从内部PHP函数保存数据

从内部PHP函数保存数据,php,curl,Php,Curl,我使用PHP库从带有JSON的API中获取数据 在Rolling CURL库文档中,我尝试了以下示例,效果非常好: $rollingCurl = new \RollingCurl\RollingCurl(); $rollingCurl ->get('https://www.google.com') ->get('http://www.msn.com') ->setCallback(function(\RollingCurl\Request $reques

我使用PHP库从带有JSON的API中获取数据

在Rolling CURL库文档中,我尝试了以下示例,效果非常好:

$rollingCurl = new \RollingCurl\RollingCurl();
$rollingCurl
    ->get('https://www.google.com')
    ->get('http://www.msn.com')
    ->setCallback(function(\RollingCurl\Request $request, \RollingCurl\RollingCurl $rollingCurl) {
        // parsing html with regex is evil (http://bit.ly/3x9sQX), but this is just a demo
        if (preg_match("#<title>(.*)</title>#i", $request->getResponseText(), $out)) {
            $title = $out[1];
        }
        else {
            $title = '[No Title Tag Found]';
        }
        echo "Fetch complete for (" . $request->getUrl() . ") $title " . PHP_EOL;
    })
    ->setSimultaneousLimit(3)
    ->execute();
所以我的问题是:

  • 如何在此函数之外保存数据数组

  • 我可以在没有回调的情况下(在执行之后)获取每个API调用的内容吗


  • 我认为在回调闭包中初始化
    $data
    使用它应该可以解决您的问题。如果没有此选项,
    $data
    数组仅在闭包的范围内设置(注意声明回调函数时
    使用(&$data)
    ):

    我喜欢的另一个很好的特性是闭包范围绑定,这只是一个快速且未经测试的示例(如果需要更多信息,请告诉我:):

    最后但并非最不重要的一点是,直接在CurlHandler类上构造一个回调,在本例中,这可能是我最喜欢的:

    class CurlHandler {
        $data = array();
        public function processOutput(\RollingCurl\Request $request, \RollingCurl\RollingCurl $rollingCurl) {
            $output = json_decode($request->getResponseText());
            $this->data[] = $output;
        }
        public function getData() { return $this->data; }
    }
    
    $curlResponseHandler = new CurlHandler();
    
    $rollingCurl = new \RollingCurl\RollingCurl();
    $rollingCurl
        ->get('https://www.myapi.com')
        ->get('https://www.myapi2.com')
        ->setCallback(array($curlResponseHandler, 'processOutput'))
        ->setSimultaneousLimit(3)
        ->execute();
    
    // Get all your outputs from your CurlHandler class now:
    print_r($curlResponseHandler->getData());
    
    最后一个选项假定
    setCallback()
    通常接受可调用项,而不仅仅是
    Closure
    s

    希望有帮助,干杯

    /** IMPORTANT **/
    $data = array();
    /***************/
    
    $rollingCurl = new \RollingCurl\RollingCurl();
    $rollingCurl
        ->get('https://www.myapi.com')
        ->get('https://www.myapi2.com')
        ->setCallback(function(\RollingCurl\Request $request, \RollingCurl\RollingCurl $rollingCurl) use (&$data) {
            $output = json_decode($request->getResponseText());
            $data[$x++] = $output;
        })
        ->setSimultaneousLimit(3)
        ->execute();
    // Yes, you can!
    print_r($data);
    
    class CurlHandler {
        $data = array();
        public function processOutput($data) {
            // Do something with the data retrieved here
            $this->data[] = $data;
        }
        public function getData() { return $this->data; }
    }
    
    $curlResponseHandler = new CurlHandler();
    
    // Your callback to be passed into \RollingCurl\RollingCurl::setCallback()
    $closure = function(\RollingCurl\Request $request, \RollingCurl\RollingCurl $rollingCurl) {
        $output = json_decode($request->getResponseText());
        $this->processOutput($output);
    }
    
    // Bind your callback Closure to your CurlHandler scope
    // => the scope binding makes $this inside your callback Closure refer to your CurlHandler instance
    $closure->bindTo($curlResponseHandler);
    
    $rollingCurl = new \RollingCurl\RollingCurl();
    $rollingCurl
        ->get('https://www.myapi.com')
        ->get('https://www.myapi2.com')
        ->setCallback($closure)
        ->setSimultaneousLimit(3)
        ->execute();
    
    // Get all your outputs from your CurlHandler class now:
    print_r($curlResponseHandler->getData());
    
    class CurlHandler {
        $data = array();
        public function processOutput(\RollingCurl\Request $request, \RollingCurl\RollingCurl $rollingCurl) {
            $output = json_decode($request->getResponseText());
            $this->data[] = $output;
        }
        public function getData() { return $this->data; }
    }
    
    $curlResponseHandler = new CurlHandler();
    
    $rollingCurl = new \RollingCurl\RollingCurl();
    $rollingCurl
        ->get('https://www.myapi.com')
        ->get('https://www.myapi2.com')
        ->setCallback(array($curlResponseHandler, 'processOutput'))
        ->setSimultaneousLimit(3)
        ->execute();
    
    // Get all your outputs from your CurlHandler class now:
    print_r($curlResponseHandler->getData());