PHP中同时进行多个API调用

时间:2015-04-09 07:17:37

标签: php multithreading api web-scraping

我正处于search page的工作场景中。

此搜索页面必须同时为5个以下搜索引擎进行API调用:

  1. http://www.kijiji.ca/
  2. http://www.lespac.com/
  3. http://www.autonet.ca/
  4. http://www.autotrader.ca/
  5. http://www.carpages.ca/
  6. 我们的想法是从所有5个API调用中收集数据并存储并将其呈现给用户以获取匹配的数据。

    让我举一个搜索引擎API调用的例子,让我们为KIJIJI'。

    示例网址 http://www.kijiji.ca/b-autos-camions/grand-{CITY}/autre+type+de+carrosserie__berline__bicorps__cabriolet__coupe__familiale-{MAKE}-{MODEL}-{MIN YEAR}__/c174l80002a138a54a1000054a68?price=__{Max Price}&kilometres=__{MAX KM}

    令牌{CITY},{MAKE}等将被用户输入的搜索值替换。

    搜索具有实际价值的网址

    http://www.kijiji.ca/b-autos-camions/grand-montreal/autre+type+de+carrosserie__berline__bicorps__cabriolet__coupe__familiale-Honda-Accord-2010__/c174l80002a138a54a1000054a68?price=__5000&kilometres=__13000
    

    PAGE EXTRACTOR网址:

    https://api.import.io/store/data/7ddb89d9-1dba-464f-a8e1-d522b50e8c4c/_query?input/webpage/url=http://www.kijiji.ca/b-autos-camions/grand-montreal/autre+type+de+carrosserie__berline__bicorps__cabriolet__coupe__familiale-Honda-Accord-2010__/c174l80002a138a54a1000054a68?price=__5000&kilometres=__13000&_user=8df097bf-2f5d-4509-b13e-299d05bad826&_apikey=H76otVMlVTG2KIW9fCZjWPtf4KzWFmlNBzbD2WIy9qOKSwIPgGxmUFVmTV9dDrORwcTtMBS1zZVLXSdEd9yfPQ%3D%3D
    

    基本上,搜索URL进入页面提取器URL以获取所有找到的结果的列表。 api调用将大量网址返回到页面。

    个人结果提取器:

    https://api.import.io/store/data/e51c6ba5-fbf0-4614-b6a1-4d522b6b6ecf/_query?input/webpage/url=http://www.kijiji.ca/v-autos-camions/laval-rive-nord/2013-honda-accord-sport-sedan/1062203732?siteLocale=en_CA&_user=8df097bf-2f5d-4509-b13e-299d05bad826&_apikey=H76otVMlVTG2KIW9fCZjWPtf4KzWFmlNBzbD2WIy9qOKSwIPgGxmUFVmTV9dDrORwcTtMBS1zZVLXSdEd9yfPQ%3D%3D
    

    第二个api调用返回每个URL的信息。

    您可以通过将示例,页面提取器和单个结果提取器复制并粘贴到浏览器中来进行实时测试。返回json结果。

    现在问题是我必须将所有上述5个搜索引擎调用为单个搜索查询。我为每个搜索引擎提供了api url。

    请看下面的图片。

    enter image description here

    如何通过调用单个搜索查询的多个api调用来实现此目的?它涉及多线程吗?

2 个答案:

答案 0 :(得分:2)

要在PHP中同时发布某些内容,您需要某种非阻塞I / O - 类似于node.js或javascript中的ajax。您可以按顺序(逐个)执行所有操作,但根据所有服务的响应时间(5 x响应时间+最终处理)将耗费时间。对于非阻塞I / O,您可以尝试ReactPHP或直接使用PHP扩展名libevlibevent。从PHP 5.5开始,您可以使用yield for async simulation

它不是完全多线程而是异步处理。我个人从未需要在PHP中使用任何这些技术,因此我无法提供代码示例或其他经验。

答案 1 :(得分:0)

Please read this article

它说明了如何使用curl方法

<div class="x-column-header x-column-header-checkbox x-column-header-align-left x-box-item x-column-header-default x-unselectable x-column-header-first" style="border-width: 1px; width: 24px; right: auto; left: 0px; top: 0px; margin: 0px; height: 24px;" id="gridcolumn-1658"><div id="gridcolumn-1658-titleEl" class="x-column-header-inner" style="padding-top: 6px; padding-bottom: 6px;"><span id="gridcolumn-1658-textEl" class="x-column-header-text">&nbsp;</span></div></div>

<div id="gridcolumn-1658-titleEl" class="x-column-header-inner" style="padding-top: 6px; padding-bottom: 6px;"><span id="gridcolumn-1658-textEl" class="x-column-header-text">&nbsp;</span></div>

<span id="gridcolumn-1658-textEl" class="x-column-header-text">&nbsp;</span>