Overview

Namespaces

  • None
  • sinacloud
    • sae

Classes

  • SaeADPNS
  • SaeAPNS
  • SaeChannel
  • SaeDeferredJob
  • SaeFetchInternal
  • SaeKV
  • SaeMail
  • SaeMysql
  • SaeSegment
  • SaeTAdvance
  • SaeTaskQueue
  • SaeTClientV2
  • SaeTOAuthV2
  • SaeVCode
  • sinacloud\sae\Storage
  • vDisk

Exceptions

  • OAuthException
  • sinacloud\sae\StorageException
  • Overview
  • Namespace
  • Class
  1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 
<?php


/**
 * SAE Internal Curl 服务 API,用于通过内网请求SAE的应用接口
 *
 * <code>
 * <?php
 * $fetch_instance = new SaeFetchInternal();
 * // 设置需要抓取的应用
 * $fetch_instance->setAppname('www');
 * // 设置需要抓取的版本
 * $fetch_instance->setVersion('1');
 * // 设置使用的域名后缀,默认为applinzi.com
 * $fetch_instance->setDomain('appchizi.com');
 * // 设置请求超时时间,单位秒
 * $fetch_instance->setTimeout(5);
 *
 * // 发送GET请求
 * $ret = $fetch_instance->get("/");
 * if ($ret === false) {
 *      var_dump($fetch_instance->errno(), $fetch_instance->errmsg());
 * } else {
 *      var_dump($ret);
 * }
 *
 * // 发送POST请求
 * $ret = $fetch_instance->post("/a.php", array('b' => 1, 'c'=> 2), array('content-type: application/json', 'other: example'));
 * if ($ret === false) {
 *      var_dump($fetch_instance->errno(), $fetch_instance->errmsg());
 * } else {
 *      var_dump($ret);
 * }
 *
 * // 获取curl请求返回的header头信息
 * $ret = $fetch_instance->getOutHeaders();
 * var_dump($ret);
 *
 * // 获取curl请求的状态信息,例如获取curl请求的状态码。
 * $ret = $fetch_instance->curlInfo();
 * var_dump($ret["http_code"]);
 * ?>
 * </code>
 *
 * @author Minghe
 * @package sae
 **/


class SaeFetchInternal extends SaeObject
{

    /**
     * 应用的 access key
     */
    private $ak = SAE_ACCESSKEY;

    /**
     * 应用的 secret key
     */
    public $sk = SAE_SECRETKEY;

    /**
     * 需要访问的应用名
     */
    private $appname = SAE_APPNAME;

    /**
     * 当前的应用名
     */
    private $name = SAE_APPNAME;


    /**
     * 应用所属的域
     */
    private $subDomain = "applinzi.com";

    /**
     * 访问应用的版本
     */
    private $version = '';

    /**
     * 超时时间
     */
    private $timeout = 5;

    /**
     * curl Info
     */
    private $_curlInfo = array();

    private $_errno = SAE_Success;
    private $_errmsg = "OK";

    /**
     * curl请求返回的header头信息
     */
    private $headers_out = array();

    /**
     * SaeFetchInternal constructor.
     * @param string $appname 应用名
     * @param string $version 应用的版本
     * @param int $timeout 超时时间,单位秒
     */
    function __construct($appname = '', $version = '', $timeout = 0)
    {
        parent::__construct();
        if ($appname != '') {
            $this->appname = $appname;
        }
        if ($version) {
            $this->version = $version;
        }
        $timeout = intval($timeout);
        if ($timeout > 0) {
            $this->timeout = $timeout;
        }
    }

    /**
     * 设置需要访问的应用名称
     * @param string $appname 要访问的应用名称
     * @return bool 如果返回false表示设置失败
     */
    public function setAppname($appname)
    {
        if ($appname) {
            $this->appname = $appname;
            return true;
        } else {
            return false;
        }
    }

    /**
     * 设置需要访问的应用版本
     * @param string $version 要访问的应用版本
     * @return bool 如果返回false表示设置失败
     */
    public function setVersion($version)
    {
        if ($version) {
            $this->version = $version;
            return true;
        } else {
            return false;
        }
    }

    /**
     * 设置超时时间
     * @param int $timeout 超时时间
     * @return bool 如果返回false表示设置失败
     */
    public function setTimeout($timeout)
    {
        $timeout = intval($timeout);
        if ($timeout) {
            $this->timeout = $timeout;
            return true;
        } else {
            return false;
        }
    }

    /**
     * 设置访问时使用的域名,例如applinzi.com
     * @param string $subDomain 访问时使用的域名
     * @return bool
     */
    public function setDomain($subDomain)
    {
        if ($subDomain) {
            $this->subDomain = $subDomain;
            return true;
        } else {
            return false;
        }
    }


    /**
     * @ignore
     */
    private function genSignHeaders()
    {
        $timestamp = date('Y-m-d H:i:s');
        $content = "ACCESSKEY" . $this->ak . "TIMESTAMP" . $timestamp . $this->sk;
        return array(
            "TimeStamp: $timestamp",
            "AccessKey: " . $this->ak,
            "Signature: " . md5($content),
            "Appname: " . $this->name
        );
    }

    private function curlHeaderCallback($resURL, $strHeader)
    {
        if (strstr($strHeader, ':')) {
            $explode_ret = explode(':', $strHeader, 2);
            $this->headers_out[strtolower($explode_ret[0])] = trim($explode_ret[1]);
        }
        return strlen($strHeader);
    }

    /**
     * @ignore
     * @param $url
     * @param $method
     * @param $headers
     * @param null $data
     * @param null $customMethod
     * @return bool|string
     */
    private function doCurl($url, $method, $headers, $data = NULL, $customMethod = NULL)
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_PORT, 81);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->timeout);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        if ($method == CURLOPT_NOBODY) {
            curl_setopt($ch, CURLOPT_HEADER, True);
        }
        if ($customMethod == "DELETE") {
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
        } elseif ($customMethod == "PUT") {
            if (strlen($data) > 0) {
                array_push($headers, "Content-Length: " . strlen($data));
            }
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
        } else {
            curl_setopt($ch, $method, True);
        }
        if ($data != NULL) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        /*reset out headers*/
        $this->headers_out = array();
        curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, 'curlHeaderCallback'));
        $result = curl_exec($ch);
        $this->_curlInfo = curl_getinfo($ch);
        $curl_error = curl_error($ch);
        $curl_errno = curl_errno($ch);
        curl_close($ch);
        if ($curl_errno) {
            $this->setError(800, $curl_error);
            return false;
        }
        if ($this->_curlInfo["http_code"] >= 700 and $this->_curlInfo["http_code"] < 800) {
            $this->setError($this->_curlInfo["http_code"], $result ?: 'unknown error');
            return false;
        }
        return $result;
    }

    /**
     * @ignore
     */
    private function genRequestUrl($url)
    {
        if ($this->version) {
            return sprintf("http://%s.%s.intra.%s/%s", $this->version, $this->appname,
                $this->subDomain, ltrim($url, "/"));
        } else {
            return sprintf("http://%s.intra.%s/%s", $this->appname, $this->subDomain, ltrim($url, "/"));
        }
    }

    /**
     * 发送一个 GET 请求
     * @param string $url 设置请求的URL,例如/b.php?c=1
     * @param array $headers 设置自定义请求头
     * @return bool|string
     */
    public function get($url, $headers = array())
    {
        $requestUrl = $this->genRequestUrl($url);
        $signHeaders = $this->genSignHeaders();
        $requestHeaders = array_merge($headers, $signHeaders);
        return $this->doCurl($requestUrl, CURLOPT_HTTPGET, $requestHeaders);
    }


    /**
     * 发送一个 HEAD 请求
     * @param string $url 设置请求的URL
     * @param array $headers 设置自定义请求的头部
     * @return bool|string
     */
    public function head($url, $headers = array())
    {
        $requestUrl = $this->genRequestUrl($url);
        $signHeaders = $this->genSignHeaders();
        if (!$headers) {
            $headers = array();
        }
        $requestHeaders = array_merge($headers, $signHeaders);
        return $this->doCurl($requestUrl, CURLOPT_NOBODY, $requestHeaders);
    }


    /**
     * 发送一个 POST 请求
     * @param string $url 请求的URL,例如/a.php
     * @param array $postData 设置post的数据,例如array('a' => 1);
     * @param array $headers 设置自定义请求头,例如array('content-type:application/json', 'other:example');
     * @return bool|string
     */
    public function post($url, $postData = NULL, $headers = array())
    {
        $requestUrl = $this->genRequestUrl($url);
        $signHeaders = $this->genSignHeaders();
        $requestHeaders = array_merge($headers, $signHeaders);
        return $this->doCurl($requestUrl, CURLOPT_POST, $requestHeaders, $postData);
    }

    /**
     * 发送一个PUT 请求
     * @param string $url 请求的URL,例如/a.php
     * @param array $putData 设置PUT的数据
     * @param array $headers 设置自定义请求头,例如array('content-type:application/json', 'other:example')
     * @return bool|string
     */
    public function put($url, $putData = NULL, $headers = array())
    {
        $requestUrl = $this->genRequestUrl($url);
        $signHeaders = $this->genSignHeaders();
        if (!$headers) {
            $headers = array();
        }
        $requestHeaders = array_merge($headers, $signHeaders);
        return $this->doCurl($requestUrl, 0, $requestHeaders, $putData, "PUT");
    }

    /**
     * 发送一个 DELETE 请求
     * @param string $url 请求的URL,例如/a.php
     * @param array $headers 设置自定义请求头,例如array('content-type:application/json', 'other:example');
     * @return bool|string
     */
    public function delete($url, $headers = array())
    {
        $requestUrl = $this->genRequestUrl($url);
        $signHeaders = $this->genSignHeaders();
        if (!$headers) {
            $headers = array();
        }
        $requestHeaders = array_merge($headers, $signHeaders);
        return $this->doCurl($requestUrl, 0, $requestHeaders, NULL, "DELETE");
    }

    /**
     * 获取 curl 调用后的curl_info获取的信息
     * @return array
     */
    public function curlInfo()
    {
        return $this->_curlInfo;
    }

    /**
     * 获取curl请求返回的header头信息
     * @return array
     */
    public function getOutHeaders()
    {
        return $this->headers_out;
    }

    /**
     * 获取错误码
     * @return int
     */
    public function errno()
    {
        return $this->_errno;
    }

    /**
     * 获取错误信息
     * @return string
     */
    public function errmsg()
    {
        return $this->_errmsg;
    }

    /**
     * @ignore
     * @param $error_no
     * @param $error_message
     */
    private function setError($error_no, $error_message)
    {
        $this->_errno = $error_no;
        $this->_errmsg = $error_message;
    }
}
API documentation generated by ApiGen