PHP之CURL和Socket

一、CURL

1.基本流程

(1)初始化

  • $ch = curl_init():初始化curl,生成curl句柄

(2)向服务器发送请求

  • curl_setopt($ch, $option, $value):设置变量
    参数:$ch:curl句柄; $option:需要设置的CURLOPT_XXX选项; $value:将设置再option选项上的值

(3)向服务器发送请求

  • curl_exec($ch):执行curl,并获取结果

(4)关闭curl

  • curl_close($ch):关闭并释放curl句柄
$curlobj = curl_init();
curl_seropt($curlobj, CURLOPT_URL, 'http://www.yyfs.com');	//设置要访问的url
curl_seropt($curlobj, CURLOPT_RETURNTRANSFER, 1);			//执行之后不打印
//…… …… 其他众多参数 …… ……
$output = curl_exec($curlobj);		//执行,可获取内容
if(!curl_errno($curlobj)){
	echo $output;
}else{
	echo 'curl error:'.curl_error($curlobj);
}
curl_close($curlobj);

2.CURLOPT参数

  • CURLOPT_URL:请求的地址
  • CURLOPT_RETURNTRANSFER:将curl_exec()获取的信息以文件流的形式返回,而不是直接输出
  • CURLOPT_HEADER:启用时会将头文件的信息作为数据流输出
  • CURLOPT_POST:启用时会发送一个常规的POST请求,类型为application/x-www-form-urlencoded,就像表单提交的一样
  • CURLOPT_POSTFIELDS:全部数据使用HTTP协议中的POST操作来发送,要发送文件,则需要在文件名前面加上@前缀并使用完整的路径,如果value是一个数组,则Content-Type头将会被设置成multipart/form-data
  • CURLOPT_CONNECTTIMEOUT:设置一个最长的连接时间,单位为秒
    .
    .
    .

记得写一个文件curl上传的例子

记得写一个json上传的例子

curl_setopt($ch,.CURLOPT_HTTPHEADER,[‘Content-Type:application/json’,‘Content-Length:’ . strlen($data)])

3.CURL批处理

  • curl_multi_init:返回一个新cURL批处理句柄
  • curl_multi_close:关闭一组cURL句柄
  • curl_multi_add/remove_handle:向curl批处理会话中添加/剔除单独的curl句柄
  • curl_multi_exec($mh, &$still_running ) :运行当前 cURL 句柄的子连接,$still_running:用来判断操作是否仍在执行的标识的引用
  • curl_multi_select:阻塞等待所有cURL批处理中的活动连接
  • curl_multi_getcontent:如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流
    curl_multi实现并发及其优化
$ch1 = curl_init();		//创建两个url资源
$ch2 = curl_init();
//…… …… 指定URL和适当的参数 …… ……
curl_seropt($ch1, CURLOPT_URL, 'http://www.yyfs.com');	//设置要访问的url
curl_seropt($ch1, CURLOPT_HEADER, 0);
curl_seropt($ch2, CURLOPT_URL, 'http://www.baidu.com');	//设置要访问的url
curl_seropt($ch2, CURLOPT_HEADER, 0);
//…… …… 其他众多参数 …… ……
$mh = curl_multi_init();		    //创建curl批处理句柄
curl_multi_add_handle($mh, $ch1);	//加上前面两个资源句柄
curl_multi_add_handle($mh, $ch2);
$actice = null; 		//预定义一个状态变量
do{
	$mrc = curl_multi_exec($mh, $active);			//执行批处理
}while($mrc == CURLM_CALL_MULTI_PERFORM);
while($active && $mrc == CURLM_OK){
	if(curl_multi_select($mh) != -1){
		do{
			$mrc = curl_multi_exec($mh, $active);	//执行批处理
		}while($mrc == CURLM_CALL_MULTI_PERFORM);
	}
}
curl_multi_remove_handle($mh, $ch1);	//关闭各个句柄
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

二、Socket

1.基本流程

(1)创建socket句柄

  • socket_create($domain, $type, $protocol ):创建socket资源句柄
  • 参数:
    1)$domain:指定socket使用的网络协议
          AF_INET:IPv4 网络协议。TCP 和 UDP 都可使用此协议
          AF_INET6:IPv6 网络协议。TCP 和 UDP 都可使用此协议
          AF_UNIX:本地通讯协议。具有高性能和低成本的 IPC(进程间通讯)
    2)$type:用于选择socket的使用类型
         SOCK_STREAM提供一个顺序化的、可靠的、全双工的、基于连接的字节流。支持数据传送流量控制机制。TCP 协议即基于这种流式套接字
         SOCK_DGRAM提供数据报文的支持。(无连接,不可靠、固定最大长度).UDP协议即基于这种数据报文套接字
         SOCK_SEQPACKET提供一个顺序化的、可靠的、全双工的、面向连接的、固定最大长度的数据通信;数据端通过接收每一个数据段来读取整个数据包
         SOCK_RAW 提供读取原始的网络协议。这种特殊的套接字可用于手工构建任意类型的协议。一般使用这个套接字来实现 ICMP 请求(例如 ping)
         SOCK_RDM 提供一个可靠的数据层,但不保证到达顺序。一般的操作系统都未实现此功能
    3)$protocol :指定domain下的具体socket协议
         SOL_TCP:TCP
         SOL_UDP:UDP
  • 返回值:正确时返回一个套接字,失败时返回 FALSE。要读取错误代码,可以调用 socket_last_error()。这个错误代码可以通过 socket_strerror() 读取文字的错误说明

(2)其他

  • socket_bind($socket, $ip, $port):给socket句柄绑定地址,$socket为socket_create创建的资源句柄
  • socket_listen($socket[, $backlog = 0]):监听外部链接,$backlog为设置请求排队的最大长度
  • $msgsocket = socket_accept($socket):接收链接请求并调用另一个子socket来处理客户与服务器间的信息
  • socket_read($msgsocket, $length):当一个链接建立后,服务器会等待客户端发送$length长度的输入信息
  • socket_write($socket, $buffer[, $length = 0 ] ):把数据写入socket中,$buffer为对应的数据,$length为数据长度
  • socket_connect($socket, $ip, $port):链接socket服务器,创建客户端
  • socket_close($msgsocket):关闭socket
  • socket_shutdown($socket[, $how = 2]):关闭一个正在读或者写的socket,$how:0读,1写,2读写
    shutdown是一种优雅地单方向或者双方向关闭socket的方法。 而close则立即双方向强制关闭socket并释放相关资源
    如果有多个进程共享一个socket,shutdown影响所有进程,而close只影响本进程
  • fsockopen($hostname[, $port = -1[, &$errno[, &$errstr[,$timeout = ini_get(“default_socket_timeout”)]]]]):打开一个网络连接或者一个Unix套接字连接
    fsockopen例子文章

记得写一个socket对话的

  • 28
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值