文章目录
- 一、CURL
- 1.基本流程
- (1)初始化
- (2)向服务器发送请求
- (3)向服务器发送请求
- (4)关闭curl
- 2.CURLOPT参数
- 记得写一个文件curl上传的例子
- 记得写一个json上传的例子
- 3.CURL批处理
- 二、Socket
- 1.基本流程
- (1)创建socket句柄
- (2)其他
- 记得写一个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例子文章