百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

学习CURL扩展功能的使用(二)

bigegpt 2024-09-03 10:53 3 浏览

上回文章中我们已经学习了 CURL 的基本操作,对于一个能够发送 GET 和 POST 数据的远程请求扩展来说,经常也会使用 CURL 来进行爬虫或是自动操作的一些项目的开发,在这其中,还有许多功能也是我们经常会使用到的,比如文件上传以及多个请求同时发送。这个在笔者的实际工作开发中也都是做过的东西,相对来说,CURL 的这些功能肯定不如直接的 POST 请求之类的功能常用,但它们的出镜率也着实不低。

文件上传

首先就是文件上传功能,PHP5.5 之前和之后的语法是不一样的,这里我们当然是以最新的方式来演示文件上传功能的实现。

$file = "./1.学习一个PHP中用于检测危险函数的扩展Taint.php";

$ch = curl_init("http://localhost:9001");
$cfile = new CURLFile($file, 'text/plain', 'phpfile.php');

curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_POST => 1,
    // CURLOPT_POSTFIELDS => ['a' =>' post测试', 'files' => curl_file_create($file, 'text/plain', 'phpfile.php')],
    CURLOPT_POSTFIELDS => ['a' => 'post测试', 'files' => $cfile],
]);

$res = curl_exec($ch);

curl_close($ch);

var_dump($res);
// string(244) "测试数据
// post测试
// Array
// (
//     [files] => Array
//         (
//             [name] => phpfile.php
//             [type] => text/plain
//             [tmp_name] => /private/tmp/phpvKyesy
//             [error] => 0
//             [size] => 1785
//         )

// )
// "

例子非常简单,也是文件上传最基本的实现。我们需要的就只是在 POST 字段中添加一个 CURLFile 对象就可以实现文件的上传功能。它在实例化的时候需要三个参数,分别是要上传的文件路径、mime类型以及上传时显示的文件名。关于这个上传时的文件名,我们可以看到在服务端打印 $_FIELS 时,就会显示在 name 字段中。对于最常用的图片文件来说,mime类型就是常用的 image/jpeg 之类的,而对于文本文件,直接使用 text/plain 就可以了,就像我们在这个测试代码中直接上传的 php 文件一样。

除了使用 CURLFile 对象进行实例化以外,我们还可以直接使用一个 curl_file_create() 函数,它的作用也是返回一个 CURLFile 对象,其实就是 CURLFile 对象实例化的面向过程写法而已,作用和参数都是一样的。

批量 CURL 请求

这个功能是我之前在做广告系统时使用过的,对于发出去的广告文章,百度是否收录了,就会使用这种批量的请求来查看多个链接中是否包含我们的广告数据。当然,它并不是并发执行的,而是按顺序请求的。

$ch1 = curl_init();
$ch2 = curl_init();

curl_setopt($ch1, CURLOPT_URL, "https://www.baidu.com/");

curl_setopt($ch2, CURLOPT_URL, "http://localhost:9001");
curl_setopt($ch2, CURLOPT_POST, 1);
curl_setopt($ch2, CURLOPT_POSTFIELDS, ['a' => 'post测试']);

$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

$running=null;
do {
    sleep(2);
    curl_multi_exec($mh,$running);
    echo "============= ", $running, " =============", PHP_EOL;
} while ($running > 0);

curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

// ============= 2 =============
// ============= 2 =============
// ============= 2 =============
// 测试数据
// post测试
// ============= 2 =============
// ============= 1 =============
// <!DOCTYPE html><!--STATUS OK-->
// <html>
// <head>
//  <meta http-equiv="content-type" content="text/html;charset=utf-8">
//  <meta http-equiv="X-UA-Compatible" content="IE=Edge">
//  <link rel="dns-prefetch" href="//s1.bdstatic.com"/>
//  <link rel="dns-prefetch" href="//t1.baidu.com"/>
//  <link rel="dns-prefetch" href="//t2.baidu.com"/>
//  <link rel="dns-prefetch" href="//t3.baidu.com"/>
//  <link rel="dns-prefetch" href="//t10.baidu.com"/>
//  <link rel="dns-prefetch" href="//t11.baidu.com"/>
//  <link rel="dns-prefetch" href="//t12.baidu.com"/>
//  <link rel="dns-prefetch" href="//b1.bdstatic.com"/>
//  <title>百度一下,你就知道</title>
// ………………………………
// ………………………………
// ………………………………
// </body></html>
// ============= 0 =============

通过 curl_multi_init() 获得一个批量执行的 CURL 句柄,然后 curl_multi_add_handle() 添加普通的 CURL 句柄。在执行的时候就会按照添加的顺序依次执行请求。每个请求都可以单独设置自己的各种选项参数,比如我们这里就是分别使用 GET 和 POST 进行不同的请求。

在执行的过程中,可以看出,后添加的请求会先执行。curl_multi_exec() 中的第二个参数是一个引用参数,会不断地返回当前执行的任务,从第 2 个任务开始递减,直到没有任务,也就是我们判断的 running > 0 这个条件。

总结

CURL 中其实还有其它的一些功能,比如 curl_share_init() 这种共享句柄,不过使用的频率不高,但它是可以在不同的请求句柄之间共享一些数据的,比如说 cookie 数据。有需要的同学可以自己查阅相关的文档。对于 CURL 的功能就简单的介绍到这里,因为它的使用还是比较频繁的,而且更多的是在于各种 opt 常量的设置,这块除了常用的那些之外,更多的情况还是去文档中查找自己需要的内容,毕竟记忆的成本太大了。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/02/source/5.学习CURL扩展功能的使用(二).php

参考文档:

https://www.php.net/manual/zh/ref.curl.php

相关推荐

如何使用Java API操作HDFS系统?(hdfs java api的常见环境准备?)

1.搭建项目环境打开Eclipse选择FileàNewàMavenProject创建Maven工程,选择“Createasimpleproject”选项,点击【Next】按钮,会进入“New...

DataX写插件开发-集成阿里云RocketMQ

在上一期我们对datax进行了技术调研DataX数据异构、数据同步神器,这一次我们集成一个RocketMQ写插件,能够非常方便对将mysql数据同步到MQ中,下面来总结下具体步骤。1.下载datax源...

以SpringMVC+Shiro+Mybatis为核心开发的精简后台系统源码分享

项目说明源码获取方式:关注转发之后私信回复【源码】即可免费获取到以SpringMVC+Shiro+Mybatis为核心开发的精简后台基础系统。包含用户管理,角色管理,部门管理,权限管理,菜单管理,日志...

手把手教小伙伴们使用 Nginx 部署 TienChin 项目!

今天我就来手把手教小伙伴们部署TienChin项目,一起把这个项目跑起来,看看到底是个什么样的项目。小伙伴们知道,对于这种前后端分离的项目,我们在实际部署的时候,可以按照前后端分离的方式来部署,也...

推荐一款超棒的SpringCloud 脚手架项目

之前接个私活,在网上找了好久没有找到合适的框架,不是版本低没人维护了,在不就是组件相互依赖较高。所以我自己搭建一个全新spingCloud框架,里面所有组件可插拔的,集成多个组件供大家选择,喜欢哪个用...

SpringCloud 微服务迁移到 Kubernetes 容器化完整流程

k8s容器部署流程具体步骤:第一步:熟悉SpringCloud微服务项目第二步:源代码编译构建第三步:构建项目镜像并推送到镜像仓库第四步:K8s服务编排第五步:部署服务所需的基础环境第六步:部署微服...

SpringBoot 实现动态配置及项目打包部署上线

一、动态配置文件我们需要了解Spring动态指定配置文件的方式,来提高我们的部署效率。1.1、概述在实际企业开发中,开发环境、测试环境、生产环境通常采用不同的数据库等中间件的连接方式。如果此时我们按照...

3.5 源码安装ONOS1.3.0(源码包怎么安装)

ONOS是由ON.Lab使用Java及Apache实现发布的首款开源的SDN网络操作系统,主要面向服务提供商和企业骨干网。近日笔者在学习ONOS的过程中写下了这篇文章,希望可以对刚接触ONOS的同学们...

jenkins+gitlab 实现自动化部署(jenkins配置git自动部署)

目录1、安装jdk,要记住安装路径2、安装maven,要记住安装路径3、安装git,要记住安装路径4、安装gitlab5、安装jenkins(centos7)创建安装目录下载通用war包启动和关闭Je...

CI&amp;CD落地实践6-Jenkins接入maven构建后端springboot项目

前言在前面一篇《CI&CD落地实践5-Jenkins分布式环境搭建及多节点运行》中,我们介绍了如何在Windows及Linux系统上部署Jenkins从节点,本章节介绍如何在Jenkins创建mave...

从0到1体验Jenkins+Docker+Git+Registry实现CI自动化发布

阅读目录:一、前言二、发布流程三、环境准备四、部署思路梳理五、三台机器上操作六、Git机器上操作七、Docker机器上操作八、Jenkins机器上操作九、上传JAVA项目代码到Git仓库十、Jenki...

微服务架构实战:使用Jenkins实现自动化构建

使用Jenkins实现自动化构建一个大型平台的微服务架构设计通常会产生很多项目工程,因此会有很多服务和应用需要部署,并且需要不断地迭代和更新,这是一个庞大的工程,所以我们需要借助自动化工具,实现各个微...

Jenkins 自动化部署实例讲解(jenkins自动化部署git 项目)

前言你平常在做自己的项目时,是否有过部署项目太麻烦的想法?如果你是单体项目,可能没什么感触,但如果你是微服务项目,相信你应该是有过这种感触的。这种情况下,我一般会劝你了解一下Jenkins这个玩意...

多模块的微服务项目容器化与Git追踪发布记录

在使用了微服务后,一个项目往往由多个模块组成,而容器化发布的建议是单个容器尽量只运行单个进程。所以我们会把每个模块单独打包成镜像运行。如果每个模块都单独配置Dockerfile会让我们维护起来很麻烦。...

手把手教你使用 Jenkins+Docker 实现持续集成

作者:乐之终曲来源:https://blog.csdn.net/qq_37143673/对于Jenkins我只能用两个字形容,难用。就不过多吐槽了,本篇是基于docker环境的使用。1.安...