PHP curl函数制 exec_ch和get_headers

昨日,在项目中,有人在判断Youtube下的某个视频是否能够播放,写下了如下的代码:       $request_url = ‘http://youtube.com/get_video_info?video_id=‘ . $vid . ‘&el=vevo&fmt=18&asv=2&hd=1‘;
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $request_url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, True);
            $data = curl_exec($ch);
            curl_close($ch);
            unset($ch);
            if ($data === false) {
                $this->deleteVideo($video[‘id‘]);
                echo "节目: " . $vid . " 节目id" . $video[‘id‘] . "无效,删除.\n";
                continue;
            }
            parse_str($data, $details);
            unset($data);
            if (!isset($details[‘url_encoded_fmt_stream_map‘]) || empty($details[‘url_encoded_fmt_stream_map‘])) {
                $this->deleteVideo($video[‘id‘]);
                echo "节目: " . $vid . " 节目id" . $video[‘id‘] . "无效,删除.\n";
                continue;
            }
            $newstr = explode(",", $details[‘url_encoded_fmt_stream_map‘]);
            $str1 = explode("&", $newstr[0]);
            $obj = array();
            for ($j = 0; $j < count($str1); $j++) {
                $str2 = explode("=", $str1[$j]);
                if (!isset($obj[$str2[0]])) {
                    $obj[$str2[0]] = $str2[1];
                }
            }
            $ary_re[‘source_url‘] = urldecode($obj[‘url‘]);
            if (empty($ary_re[‘source_url‘]) || !isset($ary_re[‘source_url‘])) {
                $this->deleteVideo($video[‘id‘]);
                echo "节目: " . $vid . " 节目id" . $video[‘id‘] . "无效,删除.\n";
                continue;
            } else {
                $bool = $this->getMobileCurl($ary_re[‘source_url‘]);  //不能够播放
                if ($bool === false) {
                    $this->deleteVideo($video[‘id‘]);
                    echo "节目: " . $vid . " 节目id" . $video[‘id‘] . "无效,删除.\n";
                    continue;
                }
            }
            $right_nums++;
getMobileCurl的函数定义如下:
       $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $request_url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, True);
            $data = curl_exec($ch);
            curl_close($ch);
            unset($ch);
            if ($data === false) {
                return false
            }

使用 curl_exec判断当前连接能否播放,这样就出现了一个问题:

  提示内存溢出!

我专门调试了一下,发现$data的数据占的内存很大,打开那个$request_url,也就是Youtube的视频的实际播放地址,才发现,视频是高清1080P,而且是有1个多小时的长度,这才发现问题的原因是$data这是是视频的内容,所以会溢出,

果断将getMobileCurl的函数处理成获取服务器的响应头信息:

function getMobileCurl($url)
    {
        $res = get_headers($url, 1);
        $response_status = $res[0];
        if (strpos($response_status, "200") !== false || strpos($response_status, "302") !== false || strpos($response_status, "301") !== false) {
            return true;
        } else {
            return false;
        }
    }

问题解决:

  在使用Curl函数进行爬虫处理的时候,要注意目标是否是个视频,文件等比较大的目标,以及自己的需求。

时间: 2024-11-07 10:33:56

PHP curl函数制 exec_ch和get_headers的相关文章

curl教程

转载自:http://inspire.twgg.org/c/programming/php-curl-teaching.html 目前最完整的CURL中文说明,学PHP的要好好掌握,有很多的参数,大部份都很有用,真正掌握了它和正则,一定就是个采集高手了. PHP中的CURL函式库(Client URL Library Function) curl_close 关闭一个curl会话 curl_copy_handle 拷贝一个curl连接资源的所有内容和参数 curl_errno 返回一个包含当前会

PHP CURL库学习

基本请求步骤 : // 1. 初始化 $ch = curl_init(); // 2. 设置选项,包括URL curl_setopt($ch, CURLOPT_URL, "http://www.doucube.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. 执行并获取HTML文档内容 $output = curl_exec($ch); // 4.

php远程获取图片或文件信息(get_headers, fsocketopen, curl)

<?php if(!function_exists("remote_filesize")){ /** * 获取远程或本地文件信息 * @param string $strUrl 远程文件或本地文件地址 * @param integer $intType 调用方式(1:get_headers 2:fsocketopen 3:curl 4:本地文件) * @param array $arrOptional * @return array * @author mengdj<[em

pycurl,Python cURL library

pycurl — A Python interface to the cURL library Pycurl包是一个libcurl的Python接口.pycurl已经成功的在Python2.2到Python2.5版编译测试过了. Libcurl是一个支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 和 LDAP的客户端URL传输库.libcurl也支持HTTPS认证,HTTP POST,HTTP PUT,FTP上传,代理,Cookies,基

使用curl获取Location:重定向后url

在php获取http头部信息上,php有个自带的函数get_headers(),我以前也是用这个的,听说效率在win上不咋地,再加上最近研究百度url无果,写了cURL获取重定向url的php代码来折腾.以前我是用get_headers来获取跳转后的url get_headers的代码 1 2 3 4 5 6 7 8 9 10 11 //curl的百度百科 $url = 'http://www.baidu.com/link?url=77I2GJqjJ4zBBpC8yDF8xDhiqDSn1JZj

微信支付错误两个问题的解决:curl出错,错误码:60

如下是运行微信支付测试代码时出错代码: Warning: curl_setopt() expects parameter 2 to be long, string given in D:\wwwroot\weixinpaytest\pay\WxPay.JsApiPay.php on line 99 Fatal error: Uncaught exception 'WxPayException' with message 'curl出错,错误码:60' in D:\wwwroot\weixinpa

php curl 伪造IP来源的实例代码

curl发出请求的文件fake_ip.php: 代码 代码如下: <?php $ch = curl_init(); $url = "http://localhost/target_ip.php"; $header = array( 'CLIENT-IP:58.68.44.61', 'X-FORWARDED-FOR:58.68.44.61', ); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPH

计算机系统的数制

----------siwuxie095 数制 即 数位与进制 1.概述 2.十进制 3.二进制 4.十六进制 1.概述: 2.十进制: 十进制与其它进制的转换: a.转二进制 b.转十六进制 3.二进制: 二进制与其它进制的转换: a.转十进制 b.转十六进制数 c.转十进制数 先创建项目: Test,包:com.siwuxie095.test,类:Test01 代码: package com.siwuxie095.test; public class Test01 { // /**+回车,快

Linux系统curl命令

curl命令 curl  -I  网址    //-I :省略源代码查看,内容如下: 我们查看的是HTTP/1.1 200 OK 这一行 常用状态吗有:200 301 302 404 403 502 503 上述状态码中,只有  200 是OK 的 如果出现301 302 ,它可能是因为在服务端设置了  跳转 ,内容如下: 上图显示,HTTP/1.1 301 设置了跳转,跳转到了下面:Location:http://www.aminglinux.com/bbs/forum.php -x  可以指